From 33063f992a8fff4af9e8cdfa54317c61f7727be3 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 30 Sep 2024 20:34:15 -0500 Subject: [PATCH 001/145] fix dynamic paths for chi --- cli/htmgo/tasks/astgen/entry.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index a0577241..e11ef0b2 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -293,6 +293,17 @@ func formatRoute(path string) string { path = strings.ReplaceAll(path, "_", "/") path = strings.ReplaceAll(path, ".", "/") path = strings.ReplaceAll(path, "\\", "/") + + parts := strings.Split(path, "/") + + for i, part := range parts { + if strings.HasPrefix(part, ":") { + parts[i] = fmt.Sprintf("{%s}", part[1:]) + } + } + + path = strings.Join(parts, "/") + if path == "" { return "/" } From 5b60b9e915afc540c774e15168d7ecd209cb5451 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 1 Oct 2024 23:04:04 -0500 Subject: [PATCH 002/145] fixes for error handling --- examples/chat/chat/broadcast.go | 4 +-- examples/chat/pages/chat.$id.go | 2 +- examples/chat/ws/handler.go | 26 ++++++++-------- examples/chat/ws/manager.go | 36 ++++++++++++++++------- framework/assets/dist/htmgo.js | 4 +-- framework/assets/js/htmxextensions/sse.ts | 6 ++-- 6 files changed, 47 insertions(+), 31 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 312eb7b1..014f68ae 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -47,14 +47,14 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { room, _ := m.service.GetRoom(e.RoomId) if room == nil { - m.socketManager.CloseWithError(e.Id, 1008, "invalid room") + m.socketManager.CloseWithMessage(e.Id, "invalid room") return } user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { - m.socketManager.CloseWithError(e.Id, 1008, "invalid user") + m.socketManager.CloseWithMessage(e.Id, "invalid user") return } diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 4191e160..2f9938a4 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -28,7 +28,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.HxOnSseClose( js.EvalJs(fmt.Sprintf(` - const reason = e.detail.event.reason + const reason = e.detail.event.data if(['invalid room', 'no session', 'invalid user'].includes(reason)) { window.location.href = '/?roomId=%s'; } else if(e.detail.event.code === 1011) { diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 0f3ce68e..0e9af55d 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -12,25 +12,32 @@ import ( func Handle() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { + // Set the necessary headers + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + w.Header().Set("Access-Control-Allow-Origin", "*") // Optional for CORS + cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) + locator := cc.ServiceLocator() + manager := service.Get[SocketManager](locator) + // Flush the headers immediately + flusher, ok := w.(http.Flusher) sessionCookie, _ := r.Cookie("session_id") if sessionCookie == nil { - slog.Error("session cookie not found") + manager.writeCloseRaw(w, flusher, "no session") return } - locator := cc.ServiceLocator() - manager := service.Get[SocketManager](locator) - sessionId := sessionCookie.Value roomId := chi.URLParam(r, "id") if roomId == "" { slog.Error("invalid room", slog.String("room_id", roomId)) - manager.CloseWithError(sessionId, 1008, "invalid room") + manager.writeCloseRaw(w, flusher, "invalid room") return } @@ -43,15 +50,6 @@ func Handle() http.HandlerFunc { manager.Disconnect(sessionId) }() - // Set the necessary headers - w.Header().Set("Content-Type", "text/event-stream") - w.Header().Set("Cache-Control", "no-cache") - w.Header().Set("Connection", "keep-alive") - w.Header().Set("Access-Control-Allow-Origin", "*") // Optional for CORS - - // Flush the headers immediately - flusher, ok := w.(http.Flusher) - if !ok { http.Error(w, "Streaming unsupported", http.StatusInternalServerError) return diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index fb25f7d3..3c18cd11 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -126,12 +126,13 @@ func (manager *SocketManager) OnClose(id string) { manager.sockets.Delete(id) } -func (manager *SocketManager) CloseWithError(id string, code int, message string) { +func (manager *SocketManager) CloseWithMessage(id string, message string) { conn := manager.Get(id) if conn != nil { - go manager.OnClose(id) + defer manager.OnClose(id) + manager.writeText(*conn, "close", message) conn.Done <- CloseEvent{ - Code: code, + Code: -1, Reason: message, } } @@ -168,18 +169,33 @@ func (manager *SocketManager) Ping(id string) { } } -func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { - if socket.Writer == nil { - return +func (manager *SocketManager) writeCloseRaw(writer http.ResponseWriter, flusher http.Flusher, message string) { + err := manager.writeTextRaw(writer, "close", message) + if err == nil { + flusher.Flush() + } +} + +func (manager *SocketManager) writeTextRaw(writer http.ResponseWriter, event string, message string) error { + if writer == nil { + return nil } var err error if event != "" { - _, err = fmt.Fprintf(socket.Writer, "event: %s\ndata: %s\n\n", event, message) + _, err = fmt.Fprintf(writer, "event: %s\ndata: %s\n\n", event, message) } else { - _, err = fmt.Fprintf(socket.Writer, "data: %s\n\n", message) + _, err = fmt.Fprintf(writer, "data: %s\n\n", message) + } + return err +} + +func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { + if socket.Writer == nil { + return } - if err != nil { - manager.CloseWithError(socket.Id, 1008, "failed to write message") + err := manager.writeTextRaw(socket.Writer, event, message) + if err != nil && event != "close" { + manager.CloseWithMessage(socket.Id, "failed to write message") } socket.Flush <- true } diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index d691193e..f28c22f4 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(F&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=F?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,K=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.onopen=function(r){console.log("EventSource open:",r),h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){console.log("EventSource message:",r.data),h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(F&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=F?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,K=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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Q0FBQUEsQ0FBUzJCLEVBQVcsSUFBSSxDQUFBLENBQ3JDLEtBQ0YsQ0FDRixDQUVKLENBQUMsQ0FFRCxDQUFBLFFBQUEsQ0FBUyxpQkFBaUIsZUFBZSxDQUFBLENBQUUsUUFBU2hHLENBQU8sRUFBQSxDQUN6RCxJQUFJcVYsQ0FBVyxDQUFBLENBQUEsQ0FBQSxDQUNmLFFBQVNyWCxDQUFRZ0MsSUFBQUEsQ0FBQUEsQ0FBRyxtQkFDbEIsQ0FBQSxHQUFJaEMsRUFBSyxVQUFXLENBQUEsc0JBQXNCLEVBQUcsQ0FDM0MsSUFBSWMsRUFBUWQsQ0FBSyxDQUFBLE9BQUEsQ0FBUSx1QkFBd0IsRUFBRSxDQUFBLENBRW5ELEdBRFk2QyxDQUFJLENBQUEsWUFBQSxDQUFhLElBQUkvQixDQUFLLENBQUEsQ0FDM0IsQ0FDVDhULENBQUssQ0FBQSxJQUFBLENBQUs1UyxDQUFJQSxDQUFBQSxDQUFBQSxDQUFHLFlBQWFoQyxDQUFBQSxDQUFJLEdBQUssRUFBSSxDQUFBLENBQ3pDLFVBQVcsV0FDWCxDQUFBLFNBQUEsQ0FBVyxFQUNYLFdBQWEsQ0FBQSxDQUNmLENBQUMsQ0FDRHFYLENBQUFBLENBQUFBLENBQVcsR0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLEVBQVUsQ0FDYixJQUFJQyxFQUFhdFYsQ0FBRyxDQUFBLFlBQUEsQ0FBYSxxQkFBcUIsQ0FDbERzVixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zb2xlLmxvZygnRXZlbnRTb3VyY2Ugb3BlbjonLCBldmVudCk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ0V2ZW50U291cmNlIG1lc3NhZ2U6JywgZXZlbnQuZGF0YSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwge3Rhc2tzOiBbXX0pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMCk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25DLENBQUEsTUFDckIsRUFHQSxNQUFRLENBQUEsSUFBQSxDQUVSLFNBQVUsSUFFVixDQUFBLFdBQUEsQ0FBYSxLQUViLFdBQWEsQ0FBQSxJQUFBLENBRWIsVUFBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsT0FBUSxJQVFSLENBQUEsTUFBQSxDQUFRLENBTU4sY0FBZ0IsQ0FBQSxDQUFBLENBQUEsQ0FNaEIsaUJBQWtCLEVBS2xCLENBQUEsb0JBQUEsQ0FBc0IsR0FNdEIsZ0JBQWtCLENBQUEsV0FBQSxDQU1sQixpQkFBa0IsQ0FNbEIsQ0FBQSxrQkFBQSxDQUFvQixHQU1wQixzQkFBd0IsQ0FBQSxDQUFBLENBQUEsQ0FNeEIsZUFBZ0IsZ0JBTWhCLENBQUEsWUFBQSxDQUFjLGVBTWQsVUFBWSxDQUFBLFlBQUEsQ0FNWixjQUFlLGVBTWYsQ0FBQSxhQUFBLENBQWUsZ0JBTWYsU0FBVyxDQUFBLENBQUEsQ0FBQSxDQU1YLGdCQUFpQixDQU1qQixDQUFBLENBQUEsaUJBQUEsQ0FBbUIsRUFNbkIsQ0FBQSxnQkFBQSxDQUFrQixFQU1sQixDQUFBLGtCQUFBLENBQW9CLENBQUMsT0FBUyxDQUFBLE9BQUEsQ0FBUyxRQUFTLFFBQVEsQ0FBQSxDQU14RCxnQkFBaUIsQ0FLakIsQ0FBQSxDQUFBLE9BQUEsQ0FBUyxFQU1ULGdCQUFrQixDQUFBLGFBQUEsQ0FNbEIsYUFBYyxNQUtkLENBQUEsZUFBQSxDQUFpQixrQ0FLakIsY0FBZ0IsQ0FBQSxTQUFBLENBTWhCLG1CQUFvQixDQU1wQixDQUFBLENBQUEsbUJBQUEsQ0FBcUIsR0FNckIscUJBQXVCLENBQUEsQ0FBQSxDQUFBLENBTXZCLHdCQUF5QixDQUFDLEtBQUEsQ0FBTyxRQUFRLENBTXpDLENBQUEsZ0JBQUEsQ0FBa0IsR0FNbEIsV0FBYSxDQUFBLENBQUEsQ0FBQSxDQU1iLHNCQUF1QixDQU92QixDQUFBLENBQUEsaUJBQUEsQ0FBbUIsS0FFbkIsa0JBQW9CLENBQUEsQ0FBQSxDQUFBLENBRXBCLGlCQUFrQixDQUNoQixDQUFFLEtBQU0sS0FBTyxDQUFBLElBQUEsQ0FBTSxDQUFNLENBQUEsQ0FBQSxDQUMzQixDQUFFLElBQUEsQ0FBTSxTQUFVLElBQU0sQ0FBQSxDQUFBLENBQUssRUFDN0IsQ0FBRSxJQUFBLENBQU0sU0FBVSxJQUFNLENBQUEsQ0FBQSxDQUFBLENBQU8sTUFBTyxDQUFLLENBQUEsQ0FDN0MsRUFNQSxtQkFBcUIsQ0FBQSxDQUFBLENBQ3ZCLEVBRUEsYUFBZSxDQUFBLElBQUEsQ0FFZixFQUFHLElBQ0gsQ0FBQSxPQUFBLENBQVMsT0FDWCxDQUVBLENBQUEsSUFBQSxDQUFLLE9BQVMsWUFDZCxDQUFBLElBQUEsQ0FBSyxRQUFVLFdBQ2YsQ0FBQSxJQUFBLENBQUssR0FBSyxvQkFDVixDQUFBLElBQUEsQ0FBSyxJQUFNLHVCQUNYLENBQUEsSUFBQSxDQUFLLFFBQVUsWUFDZixDQUFBLElBQUEsQ0FBSyxLQUFPLFVBQ1osQ0FBQSxJQUFBLENBQUssS0FBTyxJQUNaLENBQUEsSUFBQSxDQUFLLE9BQVUsQ0FBQSxPQUFBLENBQ2YsSUFBSyxDQUFBLE9BQUEsQ0FBVSxRQUNmLElBQUssQ0FBQSxNQUFBLENBQVMsY0FDZCxJQUFLLENBQUEsUUFBQSxDQUFXLGtCQUNoQixJQUFLLENBQUEsV0FBQSxDQUFjLHVCQUNuQixJQUFLLENBQUEsV0FBQSxDQUFjLHFCQUNuQixJQUFLLENBQUEsU0FBQSxDQUFZLG9CQUNqQixJQUFLLENBQUEsSUFBQSxDQUFPLEtBQ1osSUFBSyxDQUFBLGVBQUEsQ0FBa0IsZ0JBQ3ZCLElBQUssQ0FBQSxlQUFBLENBQWtCLGdCQUN2QixJQUFLLENBQUEsTUFBQSxDQUFTLE9BQ2QsSUFBSyxDQUFBLE9BQUEsQ0FBVSxRQUNmLElBQUssQ0FBQSxhQUFBLENBQWdCLGNBQ3JCLElBQUssQ0FBQSxDQUFBLENBQUksYUFFVCxJQUFNLFdBQUEsQ0FBYyxDQUNsQixpQkFDQSxDQUFBLFlBQUEsQ0FDQSxzQkFDQSxlQUNBLENBQUEsWUFBQSxDQUNBLEtBQ0EsWUFDQSxDQUFBLGlCQUFBLENBQ0EseUJBQ0EsZUFDQSxDQUFBLGlCQUFBLENBQ0EsV0FDQSxjQUNBLENBQUEsZUFBQSxDQUNBLHFCQUNBLGVBQ0EsQ0FBQSxTQUFBLENBQ0EsYUFDQSxZQUNBLENBQUEsY0FBQSxDQUNBLFFBQ0EsZ0JBQ0EsQ0FBQSxpQkFBQSxDQUNBLGFBQ0EsWUFDQSxDQUFBLGlCQUFBLENBQ0EsY0FDRixDQUVNLENBQUEsS0FBQSxDQUFRLENBQUMsS0FBTyxDQUFBLE1BQUEsQ0FBUSxNQUFPLFFBQVUsQ0FBQSxPQUFPLEVBQ2hELGFBQWdCLENBQUEsS0FBQSxDQUFNLElBQUksU0FBU0MsQ0FBQUEsQ0FBTSxDQUM3QyxPQUFPLE1BQUEsQ0FBU0EsRUFBTyxjQUFpQkEsQ0FBQUEsQ0FBQUEsQ0FBTyxHQUNqRCxDQUFDLENBQUEsQ0FBRSxLQUFLLElBQUksQ0FBQSxDQUVOLGNBQWlCLENBQUEsWUFBQSxDQUFhLE1BQU0sQ0FBQSxDQVcxQyxTQUFTLFlBQWFDLENBQUFBLENBQUFBLENBQUtDLEVBQVMsQ0FBTyxDQUFBLENBQUEsQ0FDekMsT0FBTyxJQUFJLE1BQUEsQ0FBTyxJQUFJRCxDQUFHLENBQUEsNkJBQUEsRUFBZ0NBLENBQUcsQ0FDMURDLENBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQVMsTUFBUSxJQUFJLENBQ3pCLENBWUEsU0FBUyxhQUFBLENBQWNDLEVBQUssQ0FDMUIsR0FBSUEsR0FBTyxJQUNULENBQUEsT0FHRixJQUFJQyxDQUFXLENBQUEsR0FBQSxDQUNmLE9BQUlELENBQUksQ0FBQSxLQUFBLENBQU0sRUFBRSxDQUFLLEVBQUEsSUFBQSxDQUNuQkMsRUFBVyxVQUFXRCxDQUFBQSxDQUFBQSxDQUFJLE1BQU0sQ0FBRyxDQUFBLENBQUEsQ0FBRSxDQUFDLENBQzdCQSxDQUFBQSxDQUFBQSxDQUFJLEtBQU0sQ0FBQSxDQUFBLENBQUUsQ0FBSyxFQUFBLEdBQUEsQ0FDMUJDLEVBQVcsVUFBV0QsQ0FBQUEsQ0FBQUEsQ0FBSSxNQUFNLENBQUcsQ0FBQSxDQUFBLENBQUUsQ0FBQyxDQUFJLENBQUEsR0FBQSxDQUNqQ0EsRUFBSSxLQUFNLENBQUEsQ0FBQSxDQUFFLEdBQUssR0FDMUJDLENBQUFBLENBQUFBLENBQVcsV0FBV0QsQ0FBSSxDQUFBLEtBQUEsQ0FBTSxFQUFHLENBQUUsQ0FBQSxDQUFDLEVBQUksR0FBTyxDQUFBLEVBQUEsQ0FFakRDLEVBQVcsVUFBV0QsQ0FBQUEsQ0FBRyxFQUVwQixLQUFNQyxDQUFBQSxDQUFRLEVBQUksS0FBWUEsQ0FBQUEsQ0FBQUEsQ0FDdkMsQ0FPQSxTQUFTLGVBQUEsQ0FBZ0JOLEVBQUtPLENBQU0sQ0FBQSxDQUNsQyxPQUFPUCxDQUFlLFlBQUEsT0FBQSxFQUFXQSxFQUFJLFlBQWFPLENBQUFBLENBQUksQ0FDeEQsQ0FRQSxTQUFTLFlBQUEsQ0FBYVAsRUFBS1EsQ0FBZSxDQUFBLENBQ3hDLE9BQU8sQ0FBQyxDQUFDUixFQUFJLFlBQWlCQSxHQUFBQSxDQUFBQSxDQUFJLGFBQWFRLENBQWEsQ0FBQSxFQUMxRFIsRUFBSSxZQUFhLENBQUEsT0FBQSxDQUFVUSxDQUFhLENBQzVDLENBQUEsQ0FRQSxTQUFTLGlCQUFrQlIsQ0FBQUEsQ0FBQUEsQ0FBS1EsRUFBZSxDQUM3QyxPQUFPLGdCQUFnQlIsQ0FBS1EsQ0FBQUEsQ0FBYSxHQUFLLGVBQWdCUixDQUFBQSxDQUFBQSxDQUFLLFFBQVVRLENBQWEsQ0FDNUYsQ0FNQSxTQUFTLFNBQUEsQ0FBVVIsRUFBSyxDQUN0QixJQUFNUyxFQUFTVCxDQUFJLENBQUEsYUFBQSxDQUNuQixPQUFJLENBQUNTLENBQUFBLEVBQVVULEVBQUksVUFBc0IsWUFBQSxVQUFBLENBQW1CQSxFQUFJLFVBQ3pEUyxDQUFBQSxDQUNULENBS0EsU0FBUyxXQUFBLEVBQWMsQ0FDckIsT0FBTyxRQUNULENBT0EsU0FBUyxXQUFBLENBQVlULEVBQUtJLENBQVEsQ0FBQSxDQUNoQyxPQUFPSixDQUFJLENBQUEsV0FBQSxDQUFjQSxFQUFJLFdBQVksQ0FBQSxDQUFFLFNBQVVJLENBQU8sQ0FBQyxFQUFJLFdBQVksRUFDL0UsQ0FPQSxTQUFTLGVBQUEsQ0FBZ0JKLEVBQUtVLENBQVcsQ0FBQSxDQUN2QyxLQUFPVixDQUFPLEVBQUEsQ0FBQ1UsRUFBVVYsQ0FBRyxDQUFBLEVBQzFCQSxFQUFNLFNBQVVBLENBQUFBLENBQUcsRUFHckIsT0FBT0EsQ0FBQUEsRUFBTyxJQUNoQixDQVFBLFNBQVMsbUNBQUEsQ0FBb0NXLEVBQWdCQyxDQUFVQyxDQUFBQSxDQUFBQSxDQUFlLENBQ3BGLElBQU1DLENBQUFBLENBQWlCLGtCQUFrQkYsQ0FBVUMsQ0FBQUEsQ0FBYSxFQUMxREUsQ0FBYSxDQUFBLGlCQUFBLENBQWtCSCxFQUFVLGVBQWUsQ0FBQSxDQUM5RCxJQUFJSSxDQUFVLENBQUEsaUJBQUEsQ0FBa0JKLEVBQVUsWUFBWSxDQUFBLENBQ3RELEdBQUlELENBQW1CQyxHQUFBQSxDQUFBQSxDQUFVLENBQy9CLEdBQUksSUFBQSxDQUFLLE9BQU8sa0JBQ2QsQ0FBQSxPQUFJSSxJQUFZQSxDQUFZLEdBQUEsR0FBQSxFQUFPQSxFQUFRLEtBQU0sQ0FBQSxHQUFHLEVBQUUsT0FBUUgsQ0FBQUEsQ0FBYSxHQUFLLENBQ3ZFQyxDQUFBQSxDQUFBQSxDQUFBQSxDQUVBLEtBR1gsR0FBSUMsQ0FBQUEsR0FBZUEsQ0FBZSxHQUFBLEdBQUEsRUFBT0EsQ0FBVyxDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQUUsQ0FBQSxPQUFBLENBQVFGLENBQWEsQ0FBSyxFQUFBLENBQUEsQ0FBQSxDQUN2RixPQUFPLE9BRVgsQ0FDQSxPQUFPQyxDQUNULENBT0EsU0FBUyx3QkFBeUJkLENBQUFBLENBQUFBLENBQUthLEVBQWUsQ0FDcEQsSUFBSUksRUFBYyxJQUlsQixDQUFBLEdBSEEsZ0JBQWdCakIsQ0FBSyxDQUFBLFNBQVNrQixFQUFHLENBQy9CLE9BQU8sQ0FBQyxFQUFFRCxDQUFBQSxDQUFjLG9DQUFvQ2pCLENBQUssQ0FBQSxTQUFBLENBQVVrQixDQUFDLENBQUdMLENBQUFBLENBQWEsRUFDOUYsQ0FBQyxDQUFBLENBQ0dJLElBQWdCLE9BQ2xCLENBQUEsT0FBT0EsQ0FFWCxDQU9BLFNBQVMsT0FBUWpCLENBQUFBLENBQUFBLENBQUttQixDQUFVLENBQUEsQ0FHOUIsSUFBTUMsQ0FBa0JwQixDQUFBQSxDQUFBQSxZQUFlLFVBQVlBLENBQUksQ0FBQSxPQUFBLEVBQVdBLEVBQUksZUFBbUJBLEVBQUFBLENBQUFBLENBQUksbUJBQXFCQSxDQUFJLENBQUEsa0JBQUEsRUFBc0JBLEVBQUkscUJBQXlCQSxFQUFBQSxDQUFBQSxDQUFJLGtCQUM3SyxPQUFPLENBQUMsQ0FBQ29CLENBQW1CQSxFQUFBQSxDQUFBQSxDQUFnQixLQUFLcEIsQ0FBS21CLENBQUFBLENBQVEsQ0FDaEUsQ0FNQSxTQUFTLFlBQVlkLENBQUssQ0FBQSxDQUV4QixJQUFNZ0IsQ0FEYSxDQUFBLGdDQUFBLENBQ00sS0FBS2hCLENBQUcsQ0FBQSxDQUNqQyxPQUFJZ0IsQ0FDS0EsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUFDLENBQUUsQ0FBQSxXQUFBLEdBRVQsRUFFWCxDQU1BLFNBQVMsU0FBVUMsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUV2QixPQURlLElBQUksV0FDTCxDQUFBLGVBQUEsQ0FBZ0JBLEVBQU0sV0FBVyxDQUNqRCxDQU1BLFNBQVMsZUFBQSxDQUFnQkMsRUFBVXZCLENBQUssQ0FBQSxDQUN0QyxLQUFPQSxDQUFJLENBQUEsVUFBQSxDQUFXLE9BQVMsQ0FDN0J1QixFQUFBQSxDQUFBQSxDQUFTLE9BQU92QixDQUFJLENBQUEsVUFBQSxDQUFXLENBQUMsQ0FBQyxFQUVyQyxDQU1BLFNBQVMsZUFBQSxDQUFnQndCLEVBQVEsQ0FDL0IsSUFBTUMsRUFBWSxXQUFZLEVBQUEsQ0FBRSxjQUFjLFFBQVEsQ0FBQSxDQUN0RCxlQUFRRCxDQUFPLENBQUEsVUFBQSxDQUFZLFNBQVNFLENBQU0sQ0FBQSxDQUN4Q0QsQ0FBVSxDQUFBLFlBQUEsQ0FBYUMsQ0FBSyxDQUFBLElBQUEsQ0FBTUEsRUFBSyxLQUFLLEVBQzlDLENBQUMsQ0FDREQsQ0FBQUEsQ0FBQUEsQ0FBVSxZQUFjRCxDQUFPLENBQUEsV0FBQSxDQUMvQkMsRUFBVSxLQUFRLENBQUEsQ0FBQSxDQUFBLENBQ2QsS0FBSyxNQUFPLENBQUEsaUJBQUEsR0FDZEEsRUFBVSxLQUFRLENBQUEsSUFBQSxDQUFLLE9BQU8saUJBRXpCQSxDQUFBQSxDQUFBQSxDQUNULENBTUEsU0FBUyxzQkFBQSxDQUF1QkQsRUFBUSxDQUN0QyxPQUFPQSxFQUFPLE9BQVEsQ0FBQSxRQUFRLElBQU1BLENBQU8sQ0FBQSxJQUFBLEdBQVMsbUJBQXFCQSxDQUFPLENBQUEsSUFBQSxHQUFTLFVBQVlBLENBQU8sQ0FBQSxJQUFBLEdBQVMsR0FDdkgsQ0FTQSxTQUFTLG9CQUFvQkQsQ0FBVSxDQUFBLENBQ3JDLEtBQU0sQ0FBQSxJQUFBLENBQUtBLENBQVMsQ0FBQSxnQkFBQSxDQUFpQixRQUFRLENBQUMsQ0FBQSxDQUFFLFFBQWtEQyxDQUFXLEVBQUEsQ0FDM0csR0FBSSxzQkFBdUJBLENBQUFBLENBQU0sRUFBRyxDQUNsQyxJQUFNQyxFQUFZLGVBQWdCRCxDQUFBQSxDQUFNLEVBQ2xDZixDQUFTZSxDQUFBQSxDQUFBQSxDQUFPLFdBQ3RCLEdBQUksQ0FDRmYsRUFBTyxZQUFhZ0IsQ0FBQUEsQ0FBQUEsQ0FBV0QsQ0FBTSxFQUN2QyxDQUFBLE1BQVNOLEVBQUcsQ0FDVixRQUFBLENBQVNBLENBQUMsRUFDWixDQUFBLE9BQUUsQ0FDQU0sQ0FBTyxDQUFBLE1BQUEsR0FDVCxDQUNGLENBQ0YsQ0FBQyxFQUNILENBWUEsU0FBUyxZQUFhRyxDQUFBQSxDQUFBQSxDQUFVLENBRTlCLElBQU1DLENBQXFCRCxDQUFBQSxDQUFBQSxDQUFTLFFBQVEsY0FBZ0IsQ0FBQSxFQUFFLEVBQ3hERSxDQUFXLENBQUEsV0FBQSxDQUFZRCxDQUFrQixDQUUzQ0wsQ0FBQUEsQ0FBQUEsQ0FDSixHQUFJTSxDQUFhLEdBQUEsTUFBQSxDQUFRLENBRXZCTixDQUFtRCxDQUFBLElBQUksaUJBQ3ZELElBQU1PLENBQUFBLENBQU0sVUFBVUgsQ0FBUSxDQUFBLENBQzlCLGdCQUFnQkosQ0FBVU8sQ0FBQUEsQ0FBQUEsQ0FBSSxJQUFJLENBQ2xDUCxDQUFBQSxDQUFBQSxDQUFTLE1BQVFPLENBQUksQ0FBQSxNQUN2QixTQUFXRCxDQUFhLEdBQUEsTUFBQSxDQUFRLENBRTlCTixDQUFtRCxDQUFBLElBQUksaUJBQ3ZELElBQU1PLENBQUFBLENBQU0sVUFBVUYsQ0FBa0IsQ0FBQSxDQUN4QyxnQkFBZ0JMLENBQVVPLENBQUFBLENBQUFBLENBQUksSUFBSSxDQUNsQ1AsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFRTyxDQUFJLENBQUEsTUFDdkIsTUFBTyxDQUVMLElBQU1BLEVBQU0sU0FBVSxDQUFBLGdEQUFBLENBQW1ERixFQUFxQixvQkFBb0IsQ0FBQSxDQUNsSEwsRUFBbURPLENBQUksQ0FBQSxhQUFBLENBQWMsVUFBVSxDQUFFLENBQUEsT0FBQSxDQUVqRlAsRUFBUyxLQUFRTyxDQUFBQSxDQUFBQSxDQUFJLE1BR3JCLElBQUlDLENBQUFBLENBQWVSLEVBQVMsYUFBYyxDQUFBLE9BQU8sRUFDN0NRLENBQWdCQSxFQUFBQSxDQUFBQSxDQUFhLGFBQWVSLENBQzlDUSxHQUFBQSxDQUFBQSxDQUFhLFFBQ2JSLENBQUFBLENBQUFBLENBQVMsTUFBUVEsQ0FBYSxDQUFBLFNBQUEsRUFFbEMsQ0FDQSxPQUFJUixDQUFBQSxHQUNFLEtBQUssTUFBTyxDQUFBLGVBQUEsQ0FDZCxtQkFBb0JBLENBQUFBLENBQVEsQ0FHNUJBLENBQUFBLENBQUFBLENBQVMsaUJBQWlCLFFBQVEsQ0FBQSxDQUFFLFFBQVNDLENBQVdBLEVBQUFBLENBQUFBLENBQU8sUUFBUSxDQUFBLENBQUEsQ0FHcEVELENBQ1QsQ0FLQSxTQUFTLFVBQVVTLENBQU0sQ0FBQSxDQUNuQkEsR0FDRkEsQ0FBSyxHQUVULENBT0EsU0FBUyxNQUFBLENBQU9DLEVBQUdoQyxDQUFNLENBQUEsQ0FDdkIsT0FBTyxNQUFPLENBQUEsU0FBQSxDQUFVLFNBQVMsSUFBS2dDLENBQUFBLENBQUMsSUFBTSxVQUFhaEMsQ0FBQUEsQ0FBQUEsQ0FBTyxHQUNuRSxDQU1BLFNBQVMsV0FBV2dDLENBQUcsQ0FBQSxDQUNyQixPQUFPLE9BQU9BLENBQUFBLEVBQU0sVUFDdEIsQ0FNQSxTQUFTLFdBQVlBLENBQUFBLENBQUFBLENBQUcsQ0FDdEIsT0FBTyxPQUFPQSxDQUFHLENBQUEsUUFBUSxDQUMzQixDQWdEQSxTQUFTLGdCQUFnQmpDLENBQUssQ0FBQSxDQUM1QixJQUFNa0MsQ0FBVyxDQUFBLG9CQUFBLENBQ2JDLEVBQU9uQyxDQUFJa0MsQ0FBQUEsQ0FBUSxFQUN2QixPQUFLQyxDQUFBQSxHQUNIQSxFQUFPbkMsQ0FBSWtDLENBQUFBLENBQVEsRUFBSSxFQUFDLENBQUEsQ0FFbkJDLENBQ1QsQ0FRQSxTQUFTLFFBQVFDLENBQUssQ0FBQSxDQUNwQixJQUFNQyxDQUFZLENBQUEsR0FDbEIsR0FBSUQsQ0FBQUEsQ0FDRixRQUFTRSxDQUFJLENBQUEsQ0FBQSxDQUFHQSxFQUFJRixDQUFJLENBQUEsTUFBQSxDQUFRRSxJQUM5QkQsQ0FBVSxDQUFBLElBQUEsQ0FBS0QsQ0FBSUUsQ0FBQUEsQ0FBQyxDQUFDLENBQUEsQ0FHekIsT0FBT0QsQ0FDVCxDQU9BLFNBQVMsT0FBUUQsQ0FBQUEsQ0FBQUEsQ0FBS0osRUFBTSxDQUMxQixHQUFJSSxFQUNGLElBQVNFLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSUYsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFRRSxDQUM5Qk4sRUFBQUEsQ0FBQUEsQ0FBQUEsQ0FBS0ksRUFBSUUsQ0FBQyxDQUFDLEVBR2pCLENBTUEsU0FBUyxtQkFBbUJDLENBQUksQ0FBQSxDQUM5QixJQUFNQyxDQUFPRCxDQUFBQSxDQUFBQSxDQUFHLHVCQUNWRSxDQUFBQSxDQUFBQSxDQUFVRCxFQUFLLEdBQ2ZFLENBQUFBLENBQUFBLENBQWFGLEVBQUssTUFDeEIsQ0FBQSxPQUFPQyxFQUFVLE1BQU8sQ0FBQSxXQUFBLEVBQWVDLEdBQWMsQ0FDdkQsQ0FNQSxTQUFTLFlBQWExQyxDQUFBQSxDQUFBQSxDQUFLLENBRXpCLElBQU0yQyxDQUFBQSxDQUFXM0MsRUFBSSxXQUFlQSxFQUFBQSxDQUFBQSxDQUFJLGFBQ3hDLENBQUEsT0FBSTJDLEdBQVlBLENBQW9CLFlBQUEsTUFBQSxDQUFPLFdBQ2xDLFdBQVksRUFBQSxDQUFFLEtBQUssUUFBU0EsQ0FBQUEsQ0FBQUEsQ0FBUyxJQUFJLENBRXpDLENBQUEsV0FBQSxHQUFjLElBQUssQ0FBQSxRQUFBLENBQVMzQyxDQUFHLENBRTFDLENBTUEsU0FBUyxpQkFBa0I0QyxDQUFBQSxDQUFBQSxDQUFTLENBQ2xDLE9BQU9BLENBQUFBLENBQVEsTUFBTyxDQUFBLEtBQUEsQ0FBTSxLQUFLLENBQ25DLENBV0EsU0FBUyxZQUFhQyxDQUFBQSxDQUFBQSxDQUFNQyxFQUFNLENBQ2hDLElBQUEsSUFBV0MsQ0FBT0QsSUFBQUEsQ0FBQUEsQ0FDWkEsQ0FBSyxDQUFBLGNBQUEsQ0FBZUMsQ0FBRyxDQUV6QkYsR0FBQUEsQ0FBQUEsQ0FBS0UsQ0FBRyxDQUFJRCxDQUFBQSxDQUFBQSxDQUFLQyxDQUFHLENBSXhCLENBQUEsQ0FBQSxPQUFPRixDQUNULENBTUEsU0FBUyxVQUFVRyxDQUFTLENBQUEsQ0FDMUIsR0FBSSxDQUNGLE9BQU8sS0FBSyxLQUFNQSxDQUFBQSxDQUFPLENBQzNCLENBQVNDLE1BQUFBLENBQUFBLENBQU8sQ0FDZCxPQUFTQSxRQUFBQSxDQUFBQSxDQUFLLEVBQ1AsSUFDVCxDQUNGLENBS0EsU0FBUyxxQkFBQSxFQUF3QixDQUMvQixJQUFNQyxDQUFBQSxDQUFPLHdCQUNiLEdBQUksQ0FDRixvQkFBYSxPQUFRQSxDQUFBQSxDQUFBQSxDQUFNQSxDQUFJLENBQy9CLENBQUEsWUFBQSxDQUFhLFVBQVdBLENBQUFBLENBQUksQ0FDckIsQ0FBQSxDQUFBLENBQ1QsTUFBWSxDQUNWLE9BQU8sRUFDVCxDQUNGLENBTUEsU0FBUyxhQUFjQyxDQUFBQSxDQUFBQSxDQUFNLENBQzNCLEdBQUksQ0FDRixJQUFNQyxDQUFNLENBQUEsSUFBSSxJQUFJRCxDQUFJLENBQUEsQ0FDeEIsT0FBSUMsQ0FDRkQsR0FBQUEsQ0FBQUEsQ0FBT0MsRUFBSSxRQUFXQSxDQUFBQSxDQUFBQSxDQUFJLFFBR3RCLE1BQU8sQ0FBQSxJQUFBLENBQUtELENBQUksQ0FDcEJBLEdBQUFBLENBQUFBLENBQU9BLEVBQUssT0FBUSxDQUFBLE1BQUEsQ0FBUSxFQUFFLENBRXpCQSxDQUFBQSxDQUFBQSxDQUNULE1BQVksQ0FFVixPQUFPQSxDQUNULENBQ0YsQ0FVQSxTQUFTLFlBQWEsQ0FBQSxHQUFBLENBQUssQ0FDekIsT0FBTyxTQUFVLENBQUEsV0FBQSxHQUFjLElBQU0sQ0FBQSxVQUFXLENBQzlDLE9BQU8sSUFBQSxDQUFLLEdBQUcsQ0FDakIsQ0FBQyxDQUNILENBVUEsU0FBUyxhQUFhRSxDQUFVLENBQUEsQ0FJOUIsT0FIYyxJQUFLLENBQUEsRUFBQSxDQUFHLFlBQTZDLFNBQVNDLENBQUFBLENBQUssQ0FDL0VELENBQVNDLENBQUFBLENBQUFBLENBQUksT0FBTyxHQUFHLEVBQ3pCLENBQUMsQ0FFSCxDQU9BLFNBQVMsTUFBUyxFQUFBLENBQ2hCLEtBQUssTUFBUyxDQUFBLFNBQVN0RCxFQUFLdUQsQ0FBT3BCLENBQUFBLENBQUFBLENBQU0sQ0FDbkMsT0FDRixFQUFBLE9BQUEsQ0FBUSxJQUFJb0IsQ0FBT3ZELENBQUFBLENBQUFBLENBQUttQyxDQUFJLEVBRWhDLEVBQ0YsQ0FFQSxTQUFTLE9BQUEsRUFBVSxDQUNqQixJQUFLLENBQUEsTUFBQSxDQUFTLEtBQ2hCLENBV0EsU0FBUyxLQUFLcUIsQ0FBZXJDLENBQUFBLENBQUFBLENBQVUsQ0FDckMsT0FBSSxPQUFPcUMsR0FBa0IsUUFDcEJBLENBQUFBLENBQUFBLENBQWMsY0FBY3JDLENBQVEsQ0FBQSxDQUVwQyxLQUFLLFdBQVksRUFBQSxDQUFHcUMsQ0FBYSxDQUU1QyxDQVdBLFNBQVMsT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBZXJDLEVBQVUsQ0FDeEMsT0FBSSxPQUFPcUMsQ0FBa0IsRUFBQSxRQUFBLENBQ3BCQSxFQUFjLGdCQUFpQnJDLENBQUFBLENBQVEsRUFFdkMsT0FBUSxDQUFBLFdBQUEsR0FBZXFDLENBQWEsQ0FFL0MsQ0FLQSxTQUFTLFNBQVksRUFBQSxDQUNuQixPQUFPLE1BQ1QsQ0FVQSxTQUFTLGFBQWN4RCxDQUFBQSxDQUFBQSxDQUFLeUQsRUFBTyxDQUNqQ3pELENBQUFBLENBQU0sY0FBY0EsQ0FBRyxDQUFBLENBQ25CeUQsRUFDRixTQUFVLEVBQUEsQ0FBRSxXQUFXLFVBQVcsQ0FDaEMsY0FBY3pELENBQUcsQ0FBQSxDQUNqQkEsRUFBTSxLQUNSLENBQUEsQ0FBR3lELENBQUssQ0FFUixDQUFBLFNBQUEsQ0FBVXpELENBQUcsQ0FBRSxDQUFBLFdBQUEsQ0FBWUEsQ0FBRyxFQUVsQyxDQU1BLFNBQVMsU0FBVUEsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUN0QixPQUFPQSxDQUFBQSxZQUFlLFFBQVVBLENBQU0sQ0FBQSxJQUN4QyxDQU1BLFNBQVMsYUFBQSxDQUFjQSxDQUFLLENBQUEsQ0FDMUIsT0FBT0EsQ0FBQUEsWUFBZSxZQUFjQSxDQUFNLENBQUEsSUFDNUMsQ0FNQSxTQUFTLFFBQUEsQ0FBUzBELEVBQU8sQ0FDdkIsT0FBTyxPQUFPQSxDQUFVLEVBQUEsUUFBQSxDQUFXQSxFQUFRLElBQzdDLENBTUEsU0FBUyxZQUFhMUQsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUN6QixPQUFPQSxDQUFBQSxZQUFlLFNBQVdBLENBQWUsWUFBQSxRQUFBLEVBQVlBLGFBQWUsZ0JBQW1CQSxDQUFBQSxDQUFBQSxDQUFNLElBQ3RHLENBV0EsU0FBUyxrQkFBa0JBLENBQUsyRCxDQUFBQSxDQUFBQSxDQUFPRixFQUFPLENBQzVDekQsQ0FBQUEsQ0FBTSxVQUFVLGFBQWNBLENBQUFBLENBQUcsQ0FBQyxDQUM3QkEsQ0FBQUEsQ0FBQUEsR0FHRHlELEVBQ0YsU0FBVSxFQUFBLENBQUUsVUFBVyxDQUFBLFVBQVcsQ0FDaEMsaUJBQUEsQ0FBa0J6RCxFQUFLMkQsQ0FBSyxDQUFBLENBQzVCM0QsRUFBTSxLQUNSLENBQUEsQ0FBR3lELENBQUssQ0FFUnpELENBQUFBLENBQUFBLENBQUksV0FBYUEsQ0FBSSxDQUFBLFNBQUEsQ0FBVSxJQUFJMkQsQ0FBSyxDQUFBLEVBRTVDLENBV0EsU0FBUyxzQkFBQSxDQUF1QkMsRUFBTUQsQ0FBT0YsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUNsRCxJQUFJekQsQ0FBQUEsQ0FBTSxVQUFVLGFBQWM0RCxDQUFBQSxDQUFJLENBQUMsQ0FDbEM1RCxDQUFBQSxDQUFBQSxHQUdEeUQsRUFDRixTQUFVLEVBQUEsQ0FBRSxXQUFXLFVBQVcsQ0FDaEMsdUJBQXVCekQsQ0FBSzJELENBQUFBLENBQUssRUFDakMzRCxDQUFNLENBQUEsS0FDUixFQUFHeUQsQ0FBSyxDQUFBLENBRUp6RCxFQUFJLFNBQ05BLEdBQUFBLENBQUFBLENBQUksVUFBVSxNQUFPMkQsQ0FBQUEsQ0FBSyxFQUV0QjNELENBQUksQ0FBQSxTQUFBLENBQVUsU0FBVyxDQUMzQkEsRUFBQUEsQ0FBQUEsQ0FBSSxnQkFBZ0IsT0FBTyxDQUFBLENBQUEsRUFJbkMsQ0FVQSxTQUFTLG9CQUFBLENBQXFCQSxFQUFLMkQsQ0FBTyxDQUFBLENBQ3hDM0QsRUFBTSxhQUFjQSxDQUFBQSxDQUFHLEVBQ3ZCQSxDQUFJLENBQUEsU0FBQSxDQUFVLE9BQU8yRCxDQUFLLEVBQzVCLENBVUEsU0FBUyxtQkFBQSxDQUFvQjNELEVBQUsyRCxDQUFPLENBQUEsQ0FDdkMzRCxFQUFNLGFBQWNBLENBQUFBLENBQUcsRUFDdkIsT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBSSxjQUFjLFFBQVUsQ0FBQSxTQUFTNkQsRUFBTyxDQUNsRCxzQkFBQSxDQUF1QkEsQ0FBT0YsQ0FBQUEsQ0FBSyxFQUNyQyxDQUFDLEVBQ0QsaUJBQWtCLENBQUEsU0FBQSxDQUFVM0QsQ0FBRyxDQUFHMkQsQ0FBQUEsQ0FBSyxFQUN6QyxDQVdBLFNBQVMsUUFBUTNELENBQUttQixDQUFBQSxDQUFBQSxDQUFVLENBRTlCLEdBREFuQixDQUFBQSxDQUFNLFVBQVUsYUFBY0EsQ0FBQUEsQ0FBRyxDQUFDLENBQzlCQSxDQUFBQSxDQUFBQSxFQUFPQSxFQUFJLE9BQ2IsQ0FBQSxPQUFPQSxFQUFJLE9BQVFtQixDQUFBQSxDQUFRLEVBRzNCLEdBQ0UsR0FBSW5CLEdBQU8sSUFBUSxFQUFBLE9BQUEsQ0FBUUEsRUFBS21CLENBQVEsQ0FBQSxDQUN0QyxPQUFPbkIsQ0FHSkEsQ0FBQUEsTUFBQUEsQ0FBQUEsQ0FBTUEsR0FBTyxTQUFVLENBQUEsU0FBQSxDQUFVQSxDQUFHLENBQUMsQ0FBQSxFQUM1QyxPQUFPLElBRVgsQ0FPQSxTQUFTLFdBQVdLLENBQUt5RCxDQUFBQSxDQUFBQSxDQUFRLENBQy9CLE9BQU96RCxDQUFBQSxDQUFJLFVBQVUsQ0FBR3lELENBQUFBLENBQUFBLENBQU8sTUFBTSxDQUFNQSxHQUFBQSxDQUM3QyxDQU9BLFNBQVMsUUFBQSxDQUFTekQsRUFBSzBELENBQVEsQ0FBQSxDQUM3QixPQUFPMUQsQ0FBSSxDQUFBLFNBQUEsQ0FBVUEsRUFBSSxNQUFTMEQsQ0FBQUEsQ0FBQUEsQ0FBTyxNQUFNLENBQU1BLEdBQUFBLENBQ3ZELENBTUEsU0FBUyxpQkFBQSxDQUFrQjVDLEVBQVUsQ0FDbkMsSUFBTTZDLEVBQWtCN0MsQ0FBUyxDQUFBLElBQUEsR0FDakMsT0FBSSxVQUFBLENBQVc2QyxFQUFpQixHQUFHLENBQUEsRUFBSyxTQUFTQSxDQUFpQixDQUFBLElBQUksQ0FDN0RBLENBQUFBLENBQUFBLENBQWdCLFNBQVUsQ0FBQSxDQUFBLENBQUdBLEVBQWdCLE1BQVMsQ0FBQSxDQUFDLEVBRXZEQSxDQUVYLENBUUEsU0FBUyxtQkFBb0JoRSxDQUFBQSxDQUFBQSxDQUFLbUIsRUFBVWYsQ0FBUSxDQUFBLENBRWxELE9BREFKLENBQU0sQ0FBQSxhQUFBLENBQWNBLENBQUcsQ0FDbkJtQixDQUFBQSxDQUFBQSxDQUFTLFFBQVEsVUFBVSxDQUFBLEdBQU0sRUFDNUIsQ0FBQyxPQUFBLENBQVEsVUFBVW5CLENBQUcsQ0FBQSxDQUFHLGtCQUFrQm1CLENBQVMsQ0FBQSxNQUFBLENBQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUM3REEsQ0FBQUEsQ0FBQUEsQ0FBUyxRQUFRLE9BQU8sQ0FBQSxHQUFNLEVBQ2hDLENBQUMsSUFBQSxDQUFLLGFBQWFuQixDQUFHLENBQUEsQ0FBRyxrQkFBa0JtQixDQUFTLENBQUEsTUFBQSxDQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDN0RBLENBQUFBLENBQUFBLEdBQWEsT0FDZixDQUFDLFNBQUEsQ0FBVW5CLENBQUcsQ0FBRSxDQUFBLGtCQUFrQixFQUNoQ21CLENBQVMsQ0FBQSxPQUFBLENBQVEsT0FBTyxDQUFNLEdBQUEsQ0FBQSxDQUNoQyxDQUFDLGdCQUFpQm5CLENBQUFBLENBQUFBLENBQUssa0JBQWtCbUIsQ0FBUyxDQUFBLE1BQUEsQ0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFHLENBQUMsQ0FBQ2YsQ0FBTSxDQUFDLENBQ3JFZSxDQUFBQSxDQUFBQSxHQUFhLFdBQ2YsQ0FBQyxTQUFBLENBQVVuQixDQUFHLENBQUUsQ0FBQSxzQkFBc0IsRUFDcENtQixDQUFTLENBQUEsT0FBQSxDQUFRLFdBQVcsQ0FBTSxHQUFBLENBQUEsQ0FDcEMsQ0FBQyxrQkFBQSxDQUFtQm5CLENBQUssQ0FBQSxpQkFBQSxDQUFrQm1CLEVBQVMsTUFBTyxDQUFBLENBQUMsQ0FBQyxDQUFHLENBQUEsQ0FBQyxDQUFDZixDQUFNLENBQUMsRUFDdkVlLENBQWEsR0FBQSxVQUFBLENBQ2YsQ0FBQyxRQUFRLENBQUEsQ0FDUEEsSUFBYSxRQUNmLENBQUEsQ0FBQyxNQUFNLENBQ0xBLENBQUFBLENBQUFBLEdBQWEsT0FDZixDQUFDLFFBQUEsQ0FBUyxJQUFJLENBQ1pBLENBQUFBLENBQUFBLEdBQWEsT0FDZixDQUFDLFdBQUEsQ0FBWW5CLEVBQUssQ0FBQyxDQUFDSSxDQUFNLENBQUMsQ0FBQSxDQUN6QmUsRUFBUyxPQUFRLENBQUEsU0FBUyxJQUFNLENBQ2xDLENBQUEsbUJBQUEsQ0FBb0JuQixFQUFLbUIsQ0FBUyxDQUFBLEtBQUEsQ0FBTSxDQUFDLENBQUEsQ0FBRyxDQUFJLENBQUEsQ0FBQSxDQUVoRCxRQUFRLFlBQWEsQ0FBQSxXQUFBLENBQVluQixFQUFLLENBQUMsQ0FBQ0ksQ0FBTSxDQUFDLENBQUEsQ0FBRSxpQkFBaUIsaUJBQWtCZSxDQUFBQSxDQUFRLENBQUMsQ0FBQyxDQUV6RyxDQVFBLElBQUksZ0JBQUEsQ0FBbUIsU0FBUzhDLENBQU81QyxDQUFBQSxDQUFBQSxDQUFPakIsRUFBUSxDQUNwRCxJQUFNOEQsRUFBVSxZQUFhLENBQUEsV0FBQSxDQUFZRCxFQUFPN0QsQ0FBTSxDQUFDLEVBQUUsZ0JBQWlCaUIsQ0FBQUEsQ0FBSyxFQUMvRSxJQUFTaUIsSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJNEIsQ0FBQUEsQ0FBQUEsQ0FBUSxPQUFRNUIsQ0FBSyxFQUFBLENBQUEsQ0FDdkMsSUFBTXRDLENBQU1rRSxDQUFBQSxDQUFBQSxDQUFRNUIsQ0FBQyxDQUFBLENBQ3JCLEdBQUl0QyxDQUFBQSxDQUFJLHdCQUF3QmlFLENBQUssQ0FBQSxHQUFNLEtBQUssMkJBQzlDLENBQUEsT0FBT2pFLENBRVgsQ0FDRixDQUFBLENBUUksbUJBQXFCLFNBQVNpRSxDQUFBQSxDQUFPNUMsRUFBT2pCLENBQVEsQ0FBQSxDQUN0RCxJQUFNOEQsQ0FBVSxDQUFBLFlBQUEsQ0FBYSxZQUFZRCxDQUFPN0QsQ0FBQUEsQ0FBTSxDQUFDLENBQUUsQ0FBQSxnQkFBQSxDQUFpQmlCLENBQUssQ0FDL0UsQ0FBQSxJQUFBLElBQVNpQixFQUFJNEIsQ0FBUSxDQUFBLE1BQUEsQ0FBUyxFQUFHNUIsQ0FBSyxFQUFBLENBQUEsQ0FBR0EsSUFBSyxDQUM1QyxJQUFNdEMsRUFBTWtFLENBQVE1QixDQUFBQSxDQUFDLEVBQ3JCLEdBQUl0QyxDQUFBQSxDQUFJLHdCQUF3QmlFLENBQUssQ0FBQSxHQUFNLEtBQUssMkJBQzlDLENBQUEsT0FBT2pFLENBRVgsQ0FDRixDQUFBLENBT0EsU0FBUyxnQkFBaUJ3RCxDQUFBQSxDQUFBQSxDQUFlckMsRUFBVSxDQUNqRCxPQUFJLE9BQU9xQyxDQUFrQixFQUFBLFFBQUEsQ0FDcEIsb0JBQW9CQSxDQUFlckMsQ0FBQUEsQ0FBUSxFQUFFLENBQUMsQ0FBQSxDQUU5QyxvQkFBb0IsV0FBWSxFQUFBLENBQUUsS0FBTXFDLENBQWEsQ0FBQSxDQUFFLENBQUMsQ0FFbkUsQ0FRQSxTQUFTLGFBQWNBLENBQUFBLENBQUFBLENBQWVXLEVBQVMsQ0FDN0MsT0FBSSxPQUFPWCxDQUFrQixFQUFBLFFBQUEsQ0FDcEIsS0FBSyxZQUFhVyxDQUFBQSxDQUFPLEdBQUssUUFBVVgsQ0FBQUEsQ0FBYSxFQUVyREEsQ0FFWCxDQW1CQSxTQUFTLGdCQUFBLENBQWlCWSxDQUFNQyxDQUFBQSxDQUFBQSxDQUFNQyxFQUFNLENBQzFDLE9BQUksV0FBV0QsQ0FBSSxDQUFBLENBQ1YsQ0FDTCxNQUFRLENBQUEsV0FBQSxHQUFjLElBQ3RCLENBQUEsS0FBQSxDQUFPLFNBQVNELENBQUksQ0FBQSxDQUNwQixTQUFVQyxDQUNaLENBQUEsQ0FFTyxDQUNMLE1BQVEsQ0FBQSxhQUFBLENBQWNELENBQUksQ0FDMUIsQ0FBQSxLQUFBLENBQU8sU0FBU0MsQ0FBSSxDQUFBLENBQ3BCLFNBQVVDLENBQ1osQ0FFSixDQVlBLFNBQVMsb0JBQUEsQ0FBcUJGLEVBQU1DLENBQU1DLENBQUFBLENBQUFBLENBQU0sQ0FDOUMsT0FBTSxLQUFBLENBQUEsVUFBVyxDQUNmLElBQU1DLENBQUFBLENBQVksaUJBQWlCSCxDQUFNQyxDQUFBQSxDQUFBQSxDQUFNQyxDQUFJLENBQUEsQ0FDbkRDLENBQVUsQ0FBQSxNQUFBLENBQU8saUJBQWlCQSxDQUFVLENBQUEsS0FBQSxDQUFPQSxFQUFVLFFBQVEsRUFDdkUsQ0FBQyxDQUNTLENBQUEsVUFBQSxDQUFXRixDQUFJLENBQ2RBLENBQUFBLENBQUFBLENBQU9DLENBQ3BCLENBWUEsU0FBUyx3QkFBd0JGLENBQU1DLENBQUFBLENBQUFBLENBQU1DLEVBQU0sQ0FDakQsT0FBQSxLQUFBLENBQU0sVUFBVyxDQUNmLElBQU1DLEVBQVksZ0JBQWlCSCxDQUFBQSxDQUFBQSxDQUFNQyxFQUFNQyxDQUFJLENBQUEsQ0FDbkRDLEVBQVUsTUFBTyxDQUFBLG1CQUFBLENBQW9CQSxFQUFVLEtBQU9BLENBQUFBLENBQUFBLENBQVUsUUFBUSxFQUMxRSxDQUFDLEVBQ00sVUFBV0YsQ0FBQUEsQ0FBSSxFQUFJQSxDQUFPQyxDQUFBQSxDQUNuQyxDQU1BLElBQU0sU0FBWSxDQUFBLFdBQUEsR0FBYyxhQUFjLENBQUEsUUFBUSxFQU10RCxTQUFTLG9CQUFBLENBQXFCdEUsRUFBS3dFLENBQVUsQ0FBQSxDQUMzQyxJQUFNQyxDQUFhLENBQUEsd0JBQUEsQ0FBeUJ6RSxFQUFLd0UsQ0FBUSxDQUFBLENBQ3pELEdBQUlDLENBQVksQ0FBQSxDQUNkLEdBQUlBLENBQWUsR0FBQSxNQUFBLENBQ2pCLE9BQU8sQ0FBQyxlQUFBLENBQWdCekUsRUFBS3dFLENBQVEsQ0FBQyxFQUNqQyxDQUNMLElBQU1FLEVBQVMsbUJBQW9CMUUsQ0FBQUEsQ0FBQUEsQ0FBS3lFLENBQVUsQ0FDbEQsQ0FBQSxPQUFJQyxFQUFPLE1BQVcsR0FBQSxDQUFBLEVBQ3BCLFNBQVMsZ0JBQW1CRCxDQUFBQSxDQUFBQSxDQUFhLFFBQVVELENBQVcsQ0FBQSx1QkFBdUIsRUFDOUUsQ0FBQyxTQUFTLEdBRVZFLENBRVgsQ0FDRixDQUNGLENBT0EsU0FBUyxnQkFBZ0IxRSxDQUFLMkUsQ0FBQUEsQ0FBQUEsQ0FBVyxDQUN2QyxPQUFPLFNBQUEsQ0FBVSxnQkFBZ0IzRSxDQUFLLENBQUEsU0FBU0EsRUFBSyxDQUNsRCxPQUFPLGtCQUFrQixTQUFVQSxDQUFBQSxDQUFHLEVBQUcyRSxDQUFTLENBQUEsRUFBSyxJQUN6RCxDQUFDLENBQUMsQ0FDSixDQU1BLFNBQVMsVUFBVTNFLENBQUssQ0FBQSxDQUN0QixJQUFNNEUsQ0FBWSxDQUFBLHdCQUFBLENBQXlCNUUsRUFBSyxXQUFXLENBQUEsQ0FDM0QsT0FBSTRFLENBQ0VBLENBQUFBLENBQUFBLEdBQWMsT0FDVCxlQUFnQjVFLENBQUFBLENBQUFBLENBQUssV0FBVyxDQUFBLENBRWhDLGdCQUFpQkEsQ0FBQUEsQ0FBQUEsQ0FBSzRFLENBQVMsQ0FHM0IsQ0FBQSxlQUFBLENBQWdCNUUsQ0FBRyxDQUN2QixDQUFBLE9BQUEsQ0FDQSxhQUFjLENBQUEsSUFBQSxDQUVkQSxDQUdiLENBTUEsU0FBUyxzQkFBc0JPLENBQU0sQ0FBQSxDQUNuQyxJQUFNc0UsQ0FBcUIsQ0FBQSxJQUFBLENBQUssT0FBTyxrQkFDdkMsQ0FBQSxJQUFBLElBQVN2QyxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUl1QyxFQUFtQixNQUFRdkMsQ0FBQUEsQ0FBQUEsRUFBQUEsQ0FDN0MsR0FBSS9CLENBQVNzRSxHQUFBQSxDQUFBQSxDQUFtQnZDLENBQUMsQ0FDL0IsQ0FBQSxPQUFPLEdBR1gsT0FBTyxDQUFBLENBQ1QsQ0FNQSxTQUFTLGVBQUEsQ0FBZ0J3QyxFQUFTQyxDQUFXLENBQUEsQ0FDM0MsUUFBUUQsQ0FBUSxDQUFBLFVBQUEsQ0FBWSxTQUFTcEQsQ0FBQUEsQ0FBTSxDQUNyQyxDQUFDcUQsRUFBVSxZQUFhckQsQ0FBQUEsQ0FBQUEsQ0FBSyxJQUFJLENBQUssRUFBQSxxQkFBQSxDQUFzQkEsRUFBSyxJQUFJLENBQUEsRUFDdkVvRCxFQUFRLGVBQWdCcEQsQ0FBQUEsQ0FBQUEsQ0FBSyxJQUFJLEVBRXJDLENBQUMsRUFDRCxPQUFRcUQsQ0FBQUEsQ0FBQUEsQ0FBVSxXQUFZLFNBQVNyRCxDQUFBQSxDQUFNLENBQ3ZDLHFCQUFzQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxJQUFJLENBQ2pDb0QsRUFBQUEsQ0FBQUEsQ0FBUSxhQUFhcEQsQ0FBSyxDQUFBLElBQUEsQ0FBTUEsRUFBSyxLQUFLLEVBRTlDLENBQUMsRUFDSCxDQU9BLFNBQVMsWUFBYXNELENBQUFBLENBQUFBLENBQVdDLEVBQVEsQ0FDdkMsSUFBTUMsRUFBYSxhQUFjRCxDQUFBQSxDQUFNLENBQ3ZDLENBQUEsSUFBQSxJQUFTM0MsQ0FBSSxDQUFBLENBQUEsQ0FBR0EsRUFBSTRDLENBQVcsQ0FBQSxNQUFBLENBQVE1QyxJQUFLLENBQzFDLElBQU02QyxFQUFZRCxDQUFXNUMsQ0FBQUEsQ0FBQyxFQUM5QixHQUFJLENBQ0YsR0FBSTZDLENBQVUsQ0FBQSxZQUFBLENBQWFILENBQVMsQ0FDbEMsQ0FBQSxPQUFPLEVBRVgsQ0FBUzlELE1BQUFBLENBQUFBLENBQUcsQ0FDVixRQUFTQSxDQUFBQSxDQUFDLEVBQ1osQ0FDRixDQUNBLE9BQU84RCxDQUFjLEdBQUEsV0FDdkIsQ0FRQSxTQUFTLE9BQUEsQ0FBUUksRUFBVUMsQ0FBWUMsQ0FBQUEsQ0FBQUEsQ0FBWSxDQUNqRCxJQUFJbkUsQ0FBQUEsQ0FBVyxJQUFNLGVBQWdCa0UsQ0FBQUEsQ0FBQUEsQ0FBWSxJQUFJLENBRWpETCxDQUFBQSxDQUFBQSxDQUFZLFlBQ1pJLENBQWEsR0FBQSxNQUFBLEdBRU5BLEVBQVMsT0FBUSxDQUFBLEdBQUcsRUFBSSxDQUNqQ0osRUFBQUEsQ0FBQUEsQ0FBWUksRUFBUyxNQUFPLENBQUEsQ0FBQSxDQUFHQSxFQUFTLE9BQVEsQ0FBQSxHQUFHLENBQUMsQ0FDcERqRSxDQUFBQSxDQUFBQSxDQUFXaUUsRUFBUyxNQUFPQSxDQUFBQSxDQUFBQSxDQUFTLFFBQVEsR0FBRyxDQUFBLENBQUksRUFBR0EsQ0FBUyxDQUFBLE1BQU0sR0FFckVKLENBQVlJLENBQUFBLENBQUFBLENBQUFBLENBR2QsSUFBTUcsQ0FBVSxDQUFBLFdBQUEsR0FBYyxnQkFBaUJwRSxDQUFBQSxDQUFRLEVBQ3ZELE9BQUlvRSxDQUFBQSxFQUNGLFFBQ0VBLENBQ0EsQ0FBQSxTQUFTTixFQUFRLENBQ2YsSUFBSTFELEVBQ0VpRSxDQUFrQkgsQ0FBQUEsQ0FBQUEsQ0FBVyxTQUFVLENBQUEsQ0FBQSxDQUFJLENBQ2pEOUQsQ0FBQUEsQ0FBQUEsQ0FBVyxhQUFjLENBQUEsc0JBQUEsR0FDekJBLENBQVMsQ0FBQSxXQUFBLENBQVlpRSxDQUFlLENBQy9CLENBQUEsWUFBQSxDQUFhUixFQUFXQyxDQUFNLENBQUEsR0FDakMxRCxFQUFXLFlBQWFpRSxDQUFBQSxDQUFlLEdBR3pDLElBQU1DLENBQUFBLENBQW9CLENBQUUsVUFBWSxDQUFBLENBQUEsQ0FBQSxDQUFNLE9BQUFSLENBQVEsQ0FBQSxRQUFBLENBQUExRCxDQUFTLENBQzFELENBQUEsWUFBQSxDQUFhMEQsRUFBUSxvQkFBc0JRLENBQUFBLENBQWlCLElBRWpFUixDQUFTUSxDQUFBQSxDQUFBQSxDQUFrQixPQUN2QkEsQ0FBa0IsQ0FBQSxVQUFBLEVBQ3BCLGNBQWNULENBQVdDLENBQUFBLENBQUFBLENBQVFBLEVBQVExRCxDQUFVK0QsQ0FBQUEsQ0FBVSxFQUUvRCxPQUFRQSxDQUFBQSxDQUFBQSxDQUFXLElBQU0sQ0FBQSxTQUFTdEYsQ0FBSyxDQUFBLENBQ3JDLGFBQWFBLENBQUssQ0FBQSxtQkFBQSxDQUFxQnlGLENBQWlCLEVBQzFELENBQUMsR0FDSCxDQUNGLENBQUEsQ0FDQUosRUFBVyxVQUFXLENBQUEsV0FBQSxDQUFZQSxDQUFVLENBRTVDQSxHQUFBQSxDQUFBQSxDQUFXLFdBQVcsV0FBWUEsQ0FBQUEsQ0FBVSxFQUM1QyxpQkFBa0IsQ0FBQSxXQUFBLEdBQWMsSUFBTSxDQUFBLHVCQUFBLENBQXlCLENBQUUsT0FBU0EsQ0FBQUEsQ0FBVyxDQUFDLENBRWpGRCxDQUFBQSxDQUFBQSxDQUNULENBS0EsU0FBUyx1QkFBQSxDQUF3QjdELEVBQVUsQ0FDekMsT0FBQSxDQUFRLFFBQVFBLENBQVUsQ0FBQSxtQ0FBbUMsRUFBRyxTQUFTbUUsQ0FBQUEsQ0FBYyxDQUNyRixJQUFNQyxDQUFBQSxDQUFLLGlCQUFrQkQsQ0FBQUEsQ0FBQUEsQ0FBYyxJQUFJLENBQUEsQ0FDekNFLEVBQVMsV0FBWSxFQUFBLENBQUUsZUFBZUQsQ0FBRSxDQUFBLENBQzFDQyxHQUFVLElBQ1pGLEVBQUFBLENBQUFBLENBQWEsV0FBVyxZQUFhRSxDQUFBQSxDQUFBQSxDQUFRRixDQUFZLEVBRTdELENBQUMsRUFDSCxDQU9BLFNBQVMsaUJBQWlCRyxDQUFZdEUsQ0FBQUEsQ0FBQUEsQ0FBVStELEVBQVksQ0FDMUQsT0FBQSxDQUFRL0QsRUFBUyxnQkFBaUIsQ0FBQSxNQUFNLEVBQUcsU0FBU3VFLENBQUFBLENBQVMsQ0FDM0QsSUFBTUgsQ0FBQUEsQ0FBSyxnQkFBZ0JHLENBQVMsQ0FBQSxJQUFJLEVBQ3hDLEdBQUlILENBQUFBLEVBQU1BLEVBQUcsTUFBUyxDQUFBLENBQUEsQ0FBRyxDQUN2QixJQUFNSSxDQUFBQSxDQUFlSixFQUFHLE9BQVEsQ0FBQSxHQUFBLENBQUssS0FBSyxDQUNwQ0ssQ0FBQUEsQ0FBQUEsQ0FBZ0JGLEVBQVEsT0FBUSxDQUFBLE9BQUEsQ0FBUSxJQUFLLEtBQUssQ0FBQSxDQUNsREcsRUFBWSxZQUFhSixDQUFBQSxDQUFVLEVBQ25DSyxDQUFVRCxDQUFBQSxDQUFBQSxFQUFhQSxFQUFVLGFBQWNELENBQUFBLENBQUFBLENBQWdCLFFBQVVELENBQWUsQ0FBQSxJQUFJLEVBQ2xHLEdBQUlHLENBQUFBLEVBQVdBLElBQVlELENBQVcsQ0FBQSxDQUNwQyxJQUFNRSxDQUFnQkwsQ0FBQUEsQ0FBQUEsQ0FBUSxXQUM5QixDQUFBLGVBQUEsQ0FBZ0JBLEVBQVNJLENBQU8sQ0FBQSxDQUNoQ1osRUFBVyxLQUFNLENBQUEsSUFBQSxDQUFLLFVBQVcsQ0FDL0IsZUFBQSxDQUFnQlEsRUFBU0ssQ0FBYSxFQUN4QyxDQUFDLEVBQ0gsQ0FDRixDQUNGLENBQUMsRUFDSCxDQU1BLFNBQVMsZ0JBQWlCdEMsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUMvQixPQUFPLFVBQVcsQ0FDaEIsc0JBQXVCQSxDQUFBQSxDQUFBQSxDQUFPLEtBQUssTUFBTyxDQUFBLFVBQVUsRUFDcEQsV0FBWSxDQUFBLFNBQUEsQ0FBVUEsQ0FBSyxDQUFDLENBQUEsQ0FDNUIsYUFBYSxZQUFhQSxDQUFBQSxDQUFLLENBQUMsQ0FDaEMsQ0FBQSxZQUFBLENBQWFBLEVBQU8sV0FBVyxFQUNqQyxDQUNGLENBS0EsU0FBUyxhQUFhQSxDQUFPLENBQUEsQ0FDM0IsSUFBTXVDLENBQVksQ0FBQSxhQUFBLENBQ1pDLEVBQWlCLGFBQWMsQ0FBQSxPQUFBLENBQVF4QyxFQUFPdUMsQ0FBUyxDQUFBLENBQUl2QyxDQUFRQSxDQUFBQSxDQUFBQSxDQUFNLGFBQWN1QyxDQUFBQSxDQUFTLENBQUMsQ0FFckdDLENBQUFBLENBQUFBLEVBQWUsUUFFbkIsQ0FRQSxTQUFTLGlCQUFrQlIsQ0FBQUEsQ0FBQUEsQ0FBWVMsRUFBYy9FLENBQVUrRCxDQUFBQSxDQUFBQSxDQUFZLENBRXpFLElBREEsZ0JBQUEsQ0FBaUJPLEVBQVl0RSxDQUFVK0QsQ0FBQUEsQ0FBVSxFQUMxQy9ELENBQVMsQ0FBQSxVQUFBLENBQVcsT0FBUyxDQUFHLEVBQUEsQ0FDckMsSUFBTXNDLENBQVF0QyxDQUFBQSxDQUFBQSxDQUFTLFdBQ3ZCLGlCQUFrQixDQUFBLFNBQUEsQ0FBVXNDLENBQUssQ0FBRyxDQUFBLElBQUEsQ0FBSyxPQUFPLFVBQVUsQ0FBQSxDQUMxRGdDLEVBQVcsWUFBYWhDLENBQUFBLENBQUFBLENBQU95QyxDQUFZLENBQ3ZDekMsQ0FBQUEsQ0FBQUEsQ0FBTSxXQUFhLElBQUssQ0FBQSxTQUFBLEVBQWFBLENBQU0sQ0FBQSxRQUFBLEdBQWEsSUFBSyxDQUFBLFlBQUEsRUFDL0R5QixFQUFXLEtBQU0sQ0FBQSxJQUFBLENBQUssaUJBQWlCekIsQ0FBSyxDQUFDLEVBRWpELENBQ0YsQ0FTQSxTQUFTLFVBQVcwQyxDQUFBQSxDQUFBQSxDQUFRQyxFQUFNLENBQ2hDLElBQUlDLEVBQU8sQ0FDWCxDQUFBLEtBQU9BLEVBQU9GLENBQU8sQ0FBQSxNQUFBLEVBQ25CQyxHQUFRQSxDQUFRLEVBQUEsQ0FBQSxFQUFLQSxFQUFPRCxDQUFPLENBQUEsVUFBQSxDQUFXRSxHQUFNLENBQUksQ0FBQSxDQUFBLENBRTFELE9BQU9ELENBQ1QsQ0FNQSxTQUFTLGFBQWN4RyxDQUFBQSxDQUFBQSxDQUFLLENBQzFCLElBQUl3RyxDQUFBQSxDQUFPLEVBRVgsR0FBSXhHLENBQUFBLENBQUksV0FDTixJQUFTc0MsSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJdEMsQ0FBQUEsQ0FBQUEsQ0FBSSxXQUFXLE1BQVFzQyxDQUFBQSxDQUFBQSxFQUFBQSxDQUFLLENBQzlDLElBQU1xQyxDQUFBQSxDQUFZM0UsRUFBSSxVQUFXc0MsQ0FBQUEsQ0FBQyxFQUM5QnFDLENBQVUsQ0FBQSxLQUFBLEdBQ1o2QixFQUFPLFVBQVc3QixDQUFBQSxDQUFBQSxDQUFVLEtBQU02QixDQUFJLENBQUEsQ0FDdENBLEVBQU8sVUFBVzdCLENBQUFBLENBQUFBLENBQVUsTUFBTzZCLENBQUksQ0FBQSxFQUUzQyxDQUVGLE9BQU9BLENBQ1QsQ0FLQSxTQUFTLGdCQUFBLENBQWlCeEcsRUFBSyxDQUM3QixJQUFNMEcsRUFBZSxlQUFnQjFHLENBQUFBLENBQUcsRUFDeEMsR0FBSTBHLENBQUFBLENBQWEsV0FBWSxDQUMzQixJQUFBLElBQVNwRSxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUlvRSxDQUFhLENBQUEsVUFBQSxDQUFXLE1BQVFwRSxDQUFBQSxDQUFBQSxFQUFBQSxDQUFLLENBQ3ZELElBQU1xRSxDQUFBQSxDQUFjRCxFQUFhLFVBQVdwRSxDQUFBQSxDQUFDLEVBQzdDLHVCQUF3QnRDLENBQUFBLENBQUFBLENBQUsyRyxFQUFZLEtBQU9BLENBQUFBLENBQUFBLENBQVksUUFBUSxFQUN0RSxDQUNBLE9BQU9ELENBQWEsQ0FBQSxXQUN0QixDQUNGLENBS0EsU0FBUyxXQUFXRSxDQUFTLENBQUEsQ0FDM0IsSUFBTUYsQ0FBZSxDQUFBLGVBQUEsQ0FBZ0JFLENBQU8sQ0FDeENGLENBQUFBLENBQUFBLENBQWEsU0FDZixZQUFhQSxDQUFBQSxDQUFBQSxDQUFhLE9BQU8sQ0FFL0JBLENBQUFBLENBQUFBLENBQWEsZUFDZixPQUFRQSxDQUFBQSxDQUFBQSxDQUFhLGNBQWUsU0FBU0csQ0FBQUEsQ0FBTSxDQUM3Q0EsQ0FBSyxDQUFBLEVBQUEsRUFDUCx1QkFBd0JBLENBQUFBLENBQUFBLENBQUssRUFBSUEsQ0FBQUEsQ0FBQUEsQ0FBSyxRQUFTQSxDQUFLLENBQUEsUUFBUSxFQUVoRSxDQUFDLENBQUEsQ0FFSCxpQkFBaUJELENBQU8sQ0FBQSxDQUN4QixRQUFRLE1BQU8sQ0FBQSxJQUFBLENBQUtGLENBQVksQ0FBRyxDQUFBLFNBQVMzRCxFQUFLLENBQUUsT0FBTzJELEVBQWEzRCxDQUFHLEVBQUUsQ0FBQyxFQUMvRSxDQUtBLFNBQVMsY0FBZTZELENBQUFBLENBQUFBLENBQVMsQ0FDL0IsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBUywyQkFBMkIsQ0FDakQsQ0FBQSxVQUFBLENBQVdBLENBQU8sQ0FHZEEsQ0FBQUEsQ0FBQUEsQ0FBUSxVQUVWLE9BQVFBLENBQUFBLENBQUFBLENBQVEsU0FBVSxTQUFTL0MsQ0FBQUEsQ0FBTyxDQUFFLGNBQWVBLENBQUFBLENBQUssRUFBRSxDQUFDLEVBRXZFLENBT0EsU0FBUyxhQUFjb0IsQ0FBQUEsQ0FBQUEsQ0FBUTFELEVBQVUrRCxDQUFZLENBQUEsQ0FDbkQsR0FBSUwsQ0FBa0IsWUFBQSxPQUFBLEVBQVdBLEVBQU8sT0FBWSxHQUFBLE1BQUEsQ0FDbEQsT0FBTyxhQUFjQSxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVUsQ0FBQSxDQUduRCxJQUFJd0IsQ0FDRUMsQ0FBQUEsQ0FBQUEsQ0FBc0I5QixFQUFPLGVBVW5DLENBQUEsSUFUQSxrQkFBa0IsU0FBVUEsQ0FBQUEsQ0FBTSxFQUFHQSxDQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FDN0R5QixDQUFBQSxDQUFBQSxFQUF1QixLQUN6QkQsQ0FBUyxDQUFBLFNBQUEsQ0FBVTdCLENBQU0sQ0FBRSxDQUFBLFVBQUEsQ0FFM0I2QixFQUFTQyxDQUFvQixDQUFBLFdBQUEsQ0FFL0J6QixFQUFXLElBQU9BLENBQUFBLENBQUFBLENBQVcsS0FBSyxNQUFPLENBQUEsU0FBU3BFLEVBQUcsQ0FBRSxPQUFPQSxJQUFNK0QsQ0FBTyxDQUFDLEVBR3JFNkIsQ0FBVUEsRUFBQUEsQ0FBQUEsR0FBVzdCLEdBQ3RCNkIsQ0FBa0IsWUFBQSxPQUFBLEVBQ3BCeEIsRUFBVyxJQUFLLENBQUEsSUFBQSxDQUFLd0IsQ0FBTSxDQUU3QkEsQ0FBQUEsQ0FBQUEsQ0FBU0EsRUFBTyxXQUVsQixDQUFBLGNBQUEsQ0FBZTdCLENBQU0sQ0FDakJBLENBQUFBLENBQUFBLFlBQWtCLFFBQ3BCQSxDQUFPLENBQUEsTUFBQSxHQUVQQSxDQUFPLENBQUEsVUFBQSxDQUFXLFlBQVlBLENBQU0sRUFFeEMsQ0FPQSxTQUFTLGNBQUEsQ0FBZUEsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFBQSxDQUFZLENBQ3BELE9BQU8saUJBQUEsQ0FBa0JMLEVBQVFBLENBQU8sQ0FBQSxVQUFBLENBQVkxRCxDQUFVK0QsQ0FBQUEsQ0FBVSxDQUMxRSxDQU9BLFNBQVMsZUFBZ0JMLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBWSxDQUFBLENBQ3JELE9BQU8saUJBQWtCLENBQUEsU0FBQSxDQUFVTCxDQUFNLENBQUdBLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBVSxDQUMxRSxDQU9BLFNBQVMsYUFBQSxDQUFjTCxFQUFRMUQsQ0FBVStELENBQUFBLENBQUFBLENBQVksQ0FDbkQsT0FBTyxpQkFBQSxDQUFrQkwsRUFBUSxJQUFNMUQsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FDN0QsQ0FPQSxTQUFTLFlBQWFMLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBWSxDQUFBLENBQ2xELE9BQU8saUJBQWtCLENBQUEsU0FBQSxDQUFVTCxDQUFNLENBQUdBLENBQUFBLENBQUFBLENBQU8sWUFBYTFELENBQVUrRCxDQUFBQSxDQUFVLENBQ3RGLENBS0EsU0FBUyxVQUFBLENBQVdMLEVBQVEsQ0FDMUIsT0FBQSxjQUFBLENBQWVBLENBQU0sQ0FDZCxDQUFBLFNBQUEsQ0FBVUEsQ0FBTSxDQUFFLENBQUEsV0FBQSxDQUFZQSxDQUFNLENBQzdDLENBT0EsU0FBUyxhQUFjQSxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVksQ0FBQSxDQUNuRCxJQUFNMEIsQ0FBYS9CLENBQUFBLENBQUFBLENBQU8sV0FFMUIsR0FEQSxpQkFBQSxDQUFrQkEsRUFBUStCLENBQVl6RixDQUFBQSxDQUFBQSxDQUFVK0QsQ0FBVSxDQUN0RDBCLENBQUFBLENBQUFBLENBQVksQ0FDZCxLQUFPQSxDQUFBQSxDQUFXLGFBQ2hCLGNBQWVBLENBQUFBLENBQUFBLENBQVcsV0FBVyxDQUNyQy9CLENBQUFBLENBQUFBLENBQU8sWUFBWStCLENBQVcsQ0FBQSxXQUFXLEVBRTNDLGNBQWVBLENBQUFBLENBQVUsQ0FDekIvQixDQUFBQSxDQUFBQSxDQUFPLFdBQVkrQixDQUFBQSxDQUFVLEVBQy9CLENBQ0YsQ0FTQSxTQUFTLGFBQWNoQyxDQUFBQSxDQUFBQSxDQUFXaEYsRUFBS2lGLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsRUFBWSxDQUNuRSxPQUFRTixHQUNOLElBQUssT0FDSCxPQUNGLElBQUssWUFDSCxhQUFjQyxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVUsQ0FBQSxDQUMxQyxPQUNGLElBQUssWUFBQSxDQUNILGVBQWVMLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsQ0FBVSxDQUMzQyxDQUFBLE9BQ0YsSUFBSyxhQUNILENBQUEsZUFBQSxDQUFnQkwsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFVLEVBQzVDLE9BQ0YsSUFBSyxZQUNILGFBQWNMLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBVSxDQUFBLENBQzFDLE9BQ0YsSUFBSyxVQUFBLENBQ0gsYUFBYUwsQ0FBUTFELENBQUFBLENBQUFBLENBQVUrRCxDQUFVLENBQ3pDLENBQUEsT0FDRixJQUFLLFFBQ0gsQ0FBQSxVQUFBLENBQVdMLENBQU0sQ0FDakIsQ0FBQSxPQUNGLFFBQ0UsSUFBSUMsQ0FBQUEsQ0FBYSxjQUFjbEYsQ0FBRyxDQUFBLENBQ2xDLFFBQVNzQyxDQUFJLENBQUEsQ0FBQSxDQUFHQSxFQUFJNEMsQ0FBVyxDQUFBLE1BQUEsQ0FBUTVDLElBQUssQ0FDMUMsSUFBTTJFLEVBQU0vQixDQUFXNUMsQ0FBQUEsQ0FBQyxFQUN4QixHQUFJLENBQ0YsSUFBTTRFLENBQWNELENBQUFBLENBQUFBLENBQUksV0FBV2pDLENBQVdDLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBVSxDQUFBLENBQzFFLEdBQUk0QixDQUFBQSxDQUFhLENBQ2YsR0FBSSxNQUFNLE9BQVFBLENBQUFBLENBQVcsRUFFM0IsSUFBU0MsSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJRCxDQUFBQSxDQUFBQSxDQUFZLE9BQVFDLENBQUssRUFBQSxDQUFBLENBQzNDLElBQU10RCxDQUFRcUQsQ0FBQUEsQ0FBQUEsQ0FBWUMsQ0FBQyxDQUN2QnRELENBQUFBLENBQUFBLENBQU0sV0FBYSxJQUFLLENBQUEsU0FBQSxFQUFhQSxFQUFNLFFBQWEsR0FBQSxJQUFBLENBQUssY0FDL0R5QixDQUFXLENBQUEsS0FBQSxDQUFNLEtBQUssZ0JBQWlCekIsQ0FBQUEsQ0FBSyxDQUFDLEVBRWpELENBRUYsTUFDRixDQUNGLENBQUEsTUFBUzNDLEVBQUcsQ0FDVixRQUFBLENBQVNBLENBQUMsRUFDWixDQUNGLENBQ0k4RCxDQUFjLEdBQUEsV0FBQSxDQUNoQixhQUFjQyxDQUFBQSxDQUFBQSxDQUFRMUQsQ0FBVStELENBQUFBLENBQVUsRUFFMUMsYUFBYyxDQUFBLElBQUEsQ0FBSyxPQUFPLGdCQUFrQnRGLENBQUFBLENBQUFBLENBQUtpRixFQUFRMUQsQ0FBVStELENBQUFBLENBQVUsRUFFbkYsQ0FDRixDQU1BLFNBQVMsc0JBQXVCL0QsQ0FBQUEsQ0FBQUEsQ0FBVStELEVBQVksQ0FDcEQsSUFBSThCLEVBQVUsT0FBUTdGLENBQUFBLENBQUFBLENBQVUsbUNBQW1DLENBQ25FLENBQUEsT0FBQSxPQUFBLENBQVE2RixFQUFTLFNBQVMvQixDQUFBQSxDQUFZLENBQ3BDLEdBQUksSUFBQSxDQUFLLE9BQU8sbUJBQXVCQSxFQUFBQSxDQUFBQSxDQUFXLGdCQUFrQixJQUFNLENBQUEsQ0FDeEUsSUFBTUQsQ0FBVyxDQUFBLGlCQUFBLENBQWtCQyxFQUFZLGFBQWEsQ0FBQSxDQUN4REQsR0FBWSxJQUNkLEVBQUEsT0FBQSxDQUFRQSxDQUFVQyxDQUFBQSxDQUFBQSxDQUFZQyxDQUFVLEVBRTVDLE1BQ0VELENBQVcsQ0FBQSxlQUFBLENBQWdCLGFBQWEsQ0FDeENBLENBQUFBLENBQUFBLENBQVcsZ0JBQWdCLGtCQUFrQixFQUVqRCxDQUFDLENBQ00rQixDQUFBQSxDQUFBQSxDQUFRLE9BQVMsQ0FDMUIsQ0FVQSxTQUFTLElBQUtuQyxDQUFBQSxDQUFBQSxDQUFRb0MsRUFBU0MsQ0FBVUMsQ0FBQUEsQ0FBQUEsQ0FBYSxDQUMvQ0EsQ0FDSEEsR0FBQUEsQ0FBQUEsQ0FBYyxFQUdoQnRDLENBQUFBLENBQUFBLENBQUFBLENBQVMsY0FBY0EsQ0FBTSxDQUFBLENBRzdCLElBQU11QyxDQUFZLENBQUEsUUFBQSxDQUFTLGNBQ3ZCQyxDQUFnQixDQUFBLEdBQ3BCLEdBQUksQ0FDRkEsRUFBZ0IsQ0FDZCxHQUFBLENBQUtELEVBRUwsS0FBT0EsQ0FBQUEsQ0FBQUEsQ0FBWUEsRUFBVSxjQUFpQixDQUFBLElBQUEsQ0FFOUMsSUFBS0EsQ0FBWUEsQ0FBQUEsQ0FBQUEsQ0FBVSxhQUFlLElBQzVDLEVBQ0YsTUFBWSxFQUdaLElBQU1sQyxDQUFhLENBQUEsY0FBQSxDQUFlTCxDQUFNLENBR3hDLENBQUEsR0FBSXFDLEVBQVMsU0FBYyxHQUFBLGFBQUEsQ0FDekJyQyxFQUFPLFdBQWNvQyxDQUFBQSxDQUFBQSxDQUFBQSxLQUVoQixDQUNMLElBQUk5RixDQUFBQSxDQUFXLGFBQWE4RixDQUFPLENBQUEsQ0FLbkMsR0FIQS9CLENBQVcsQ0FBQSxLQUFBLENBQVEvRCxFQUFTLEtBR3hCZ0csQ0FBQUEsQ0FBQUEsQ0FBWSxVQUFXLENBQ3pCLElBQU1HLEVBQWtCSCxDQUFZLENBQUEsU0FBQSxDQUFVLE1BQU0sR0FBRyxDQUFBLENBQ3ZELFFBQVNqRixDQUFJLENBQUEsQ0FBQSxDQUFHQSxDQUFJb0YsQ0FBQUEsQ0FBQUEsQ0FBZ0IsTUFBUXBGLENBQUFBLENBQUFBLEVBQUFBLENBQUssQ0FDL0MsSUFBTXFGLENBQUFBLENBQWlCRCxFQUFnQnBGLENBQUMsQ0FBQSxDQUFFLE1BQU0sR0FBSyxDQUFBLENBQUMsRUFDbERxRCxDQUFLZ0MsQ0FBQUEsQ0FBQUEsQ0FBZSxDQUFDLENBQUUsQ0FBQSxJQUFBLEdBQ3ZCaEMsQ0FBRyxDQUFBLE9BQUEsQ0FBUSxHQUFHLENBQU0sR0FBQSxDQUFBLEdBQ3RCQSxFQUFLQSxDQUFHLENBQUEsU0FBQSxDQUFVLENBQUMsQ0FFckIsQ0FBQSxDQUFBLElBQU1QLEVBQVd1QyxDQUFlLENBQUEsQ0FBQyxHQUFLLE1BQ2hDdEMsQ0FBQUEsQ0FBQUEsQ0FBYTlELEVBQVMsYUFBYyxDQUFBLEdBQUEsQ0FBTW9FLENBQUUsQ0FDOUNOLENBQUFBLENBQUFBLEVBQ0YsUUFBUUQsQ0FBVUMsQ0FBQUEsQ0FBQUEsQ0FBWUMsQ0FBVSxFQUU1QyxDQUNGLENBV0EsR0FUQSxzQkFBdUIvRCxDQUFBQSxDQUFBQSxDQUFVK0QsQ0FBVSxDQUMzQyxDQUFBLE9BQUEsQ0FBUSxRQUFRL0QsQ0FBVSxDQUFBLFVBQVUsRUFBK0MsU0FBU3FHLENBQUFBLENBQVUsQ0FDaEcsc0JBQXVCQSxDQUFBQSxDQUFBQSxDQUFTLFFBQVN0QyxDQUFVLENBQUEsRUFFckRzQyxFQUFTLE1BQU8sR0FFcEIsQ0FBQyxDQUdHTCxDQUFBQSxDQUFBQSxDQUFZLE9BQVEsQ0FDdEIsSUFBTU0sRUFBYyxXQUFZLEVBQUEsQ0FBRSx3QkFDbEMsQ0FBQSxPQUFBLENBQVF0RyxFQUFTLGdCQUFpQmdHLENBQUFBLENBQUFBLENBQVksTUFBTSxDQUFHLENBQUEsU0FBUzNELEVBQU0sQ0FDcEVpRSxDQUFBQSxDQUFZLFlBQVlqRSxDQUFJLEVBQzlCLENBQUMsQ0FDRHJDLENBQUFBLENBQUFBLENBQVdzRyxFQUNiLENBQ0EsdUJBQXdCdEcsQ0FBQUEsQ0FBUSxFQUNoQyxhQUFjK0YsQ0FBQUEsQ0FBQUEsQ0FBUyxVQUFXQyxDQUFZLENBQUEsY0FBQSxDQUFnQnRDLEVBQVExRCxDQUFVK0QsQ0FBQUEsQ0FBVSxFQUM1RixDQUdBLEdBQUltQyxFQUFjLEdBQ2hCLEVBQUEsQ0FBQyxhQUFhQSxDQUFjLENBQUEsR0FBRyxHQUMvQixlQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBYyxJQUFLLElBQUksQ0FBQSxDQUFHLENBQzFDLElBQU1LLENBQUFBLENBQWUsU0FBUyxjQUFlLENBQUEsZUFBQSxDQUFnQkwsRUFBYyxHQUFLLENBQUEsSUFBSSxDQUFDLENBQy9FTSxDQUFBQSxDQUFBQSxDQUFlLENBQUUsYUFBZVQsQ0FBQUEsQ0FBQUEsQ0FBUyxjQUFnQixLQUFZLENBQUEsQ0FBQSxDQUFDQSxFQUFTLFdBQWMsQ0FBQSxDQUFDLEtBQUssTUFBTyxDQUFBLGtCQUFtQixFQUNuSSxHQUFJUSxDQUFBQSxDQUFjLENBRWhCLEdBQUlMLENBQUFBLENBQWMsT0FBU0ssQ0FBYSxDQUFBLGlCQUFBLENBQ3RDLEdBQUksQ0FFRkEsQ0FBQUEsQ0FBYSxrQkFBa0JMLENBQWMsQ0FBQSxLQUFBLENBQU9BLEVBQWMsR0FBRyxFQUN2RSxNQUFZLEVBSWRLLEVBQWEsS0FBTUMsQ0FBQUEsQ0FBWSxFQUNqQyxDQUNGLENBRUE5QyxFQUFPLFNBQVUsQ0FBQSxNQUFBLENBQU8sS0FBSyxNQUFPLENBQUEsYUFBYSxFQUNqRCxPQUFRSyxDQUFBQSxDQUFBQSxDQUFXLEtBQU0sU0FBU3RGLENBQUFBLENBQUssQ0FDakNBLENBQUksQ0FBQSxTQUFBLEVBQ05BLEVBQUksU0FBVSxDQUFBLEdBQUEsQ0FBSSxJQUFLLENBQUEsTUFBQSxDQUFPLGFBQWEsQ0FBQSxDQUU3QyxhQUFhQSxDQUFLLENBQUEsZ0JBQUEsQ0FBa0J1SCxFQUFZLFNBQVMsRUFDM0QsQ0FBQyxDQUNHQSxDQUFBQSxDQUFBQSxDQUFZLG1CQUNkQSxDQUFZLENBQUEsaUJBQUEsR0FJVEQsQ0FBUyxDQUFBLFdBQUEsRUFDWixZQUFZaEMsQ0FBVyxDQUFBLEtBQUssRUFJOUIsSUFBTTBDLENBQUFBLENBQVcsVUFBVyxDQVcxQixHQVZBLFFBQVExQyxDQUFXLENBQUEsS0FBQSxDQUFPLFNBQVMyQyxDQUFNLENBQUEsQ0FDdkNBLEVBQUssSUFBSyxHQUNaLENBQUMsQ0FDRCxDQUFBLE9BQUEsQ0FBUTNDLEVBQVcsSUFBTSxDQUFBLFNBQVN0RixFQUFLLENBQ2pDQSxDQUFBQSxDQUFJLFdBQ05BLENBQUksQ0FBQSxTQUFBLENBQVUsTUFBTyxDQUFBLElBQUEsQ0FBSyxNQUFPLENBQUEsYUFBYSxFQUVoRCxZQUFhQSxDQUFBQSxDQUFBQSxDQUFLLG1CQUFvQnVILENBQVksQ0FBQSxTQUFTLEVBQzdELENBQUMsQ0FBQSxDQUVHQSxFQUFZLE1BQVEsQ0FBQSxDQUN0QixJQUFNVyxDQUFlLENBQUEsU0FBQSxDQUFVLGNBQWMsR0FBTVgsQ0FBQUEsQ0FBQUEsQ0FBWSxNQUFNLENBQUMsQ0FBQSxDQUNsRVcsR0FDRkEsQ0FBYSxDQUFBLGNBQUEsQ0FBZSxDQUFFLEtBQU8sQ0FBQSxPQUFBLENBQVMsU0FBVSxNQUFPLENBQUMsRUFFcEUsQ0FFQSxpQkFBQSxDQUFrQjVDLEVBQVcsSUFBTWdDLENBQUFBLENBQVEsRUFDdkNDLENBQVksQ0FBQSxtQkFBQSxFQUNkQSxFQUFZLG1CQUFvQixHQUVwQyxFQUVJRCxDQUFTLENBQUEsV0FBQSxDQUFjLENBQ3pCLENBQUEsU0FBQSxFQUFZLENBQUEsVUFBQSxDQUFXVSxFQUFVVixDQUFTLENBQUEsV0FBVyxFQUVyRFUsQ0FBUyxHQUViLENBT0EsU0FBUyxtQkFBQSxDQUFvQkcsRUFBS0MsQ0FBUXBJLENBQUFBLENBQUFBLENBQUssQ0FDN0MsSUFBTXFJLENBQUFBLENBQWNGLEVBQUksaUJBQWtCQyxDQUFBQSxDQUFNLEVBQ2hELEdBQUlDLENBQUFBLENBQVksUUFBUSxHQUFHLENBQUEsR0FBTSxFQUFHLENBQ2xDLElBQU1DLEVBQVcsU0FBVUQsQ0FBQUEsQ0FBVyxFQUN0QyxJQUFXRSxJQUFBQSxDQUFBQSxJQUFhRCxFQUN0QixHQUFJQSxDQUFBQSxDQUFTLGVBQWVDLENBQVMsQ0FBQSxDQUFHLENBQ3RDLElBQUlDLENBQUFBLENBQVNGLEVBQVNDLENBQVMsQ0FBQSxDQUMzQixZQUFZQyxDQUFNLENBQUEsQ0FFcEJ4SSxFQUFNd0ksQ0FBTyxDQUFBLE1BQUEsR0FBVyxPQUFZQSxDQUFPLENBQUEsTUFBQSxDQUFTeEksRUFFcER3SSxDQUFTLENBQUEsQ0FBRSxNQUFPQSxDQUFPLENBQUEsQ0FFM0IsYUFBYXhJLENBQUt1SSxDQUFBQSxDQUFBQSxDQUFXQyxDQUFNLEVBQ3JDLENBRUosTUFBTyxDQUNMLElBQU1DLEVBQWFKLENBQVksQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUN4QyxDQUFBLElBQUEsSUFBUyxFQUFJLENBQUcsQ0FBQSxDQUFBLENBQUlJLEVBQVcsTUFBUSxDQUFBLENBQUEsRUFBQSxDQUNyQyxhQUFhekksQ0FBS3lJLENBQUFBLENBQUFBLENBQVcsQ0FBQyxDQUFFLENBQUEsSUFBQSxHQUFRLEVBQUUsRUFFOUMsQ0FDRixDQUVNLElBQ0EsbUJBQUEsQ0FBc0IsUUFDdEIsWUFBZSxDQUFBLFlBQUEsQ0FDZixZQUFjLGVBQ2QsQ0FBQSxlQUFBLENBQWtCLENBQUMsR0FBSyxDQUFBLEdBQUEsQ0FBSyxHQUFHLENBQ2hDLENBQUEsY0FBQSxDQUFpQixRQUNqQix1QkFBMEIsQ0FBQSxNQUFBLENBQzFCLHNCQUF3QixPQU05QixTQUFTLGVBQWVwSSxDQUFLLENBQUEsQ0FFM0IsSUFBTXFJLENBQVMsQ0FBQSxHQUNYQyxDQUFXLENBQUEsQ0FBQSxDQUNmLEtBQU9BLENBQVd0SSxDQUFBQSxDQUFBQSxDQUFJLFFBQVEsQ0FDNUIsR0FBSSxhQUFhLElBQUtBLENBQUFBLENBQUFBLENBQUksT0FBT3NJLENBQVEsQ0FBQyxFQUFHLENBRTNDLElBQUEsSUFESUMsRUFBZ0JELENBQ2IsQ0FBQSxXQUFBLENBQVksSUFBS3RJLENBQUFBLENBQUFBLENBQUksTUFBT3NJLENBQUFBLENBQUFBLENBQVcsQ0FBQyxDQUFDLENBQUEsRUFDOUNBLElBRUZELENBQU8sQ0FBQSxJQUFBLENBQUtySSxFQUFJLE1BQU91SSxDQUFBQSxDQUFBQSxDQUFlRCxFQUFXQyxDQUFnQixDQUFBLENBQUMsQ0FBQyxFQUNyRSxDQUFBLEtBQUEsR0FBVyxnQkFBZ0IsT0FBUXZJLENBQUFBLENBQUFBLENBQUksT0FBT3NJLENBQVEsQ0FBQyxJQUFNLENBQUksQ0FBQSxDQUFBLENBQy9ELElBQU1FLENBQVl4SSxDQUFBQSxDQUFBQSxDQUFJLE9BQU9zSSxDQUFRLENBQUEsQ0FDckMsSUFBSUMsQ0FBZ0JELENBQUFBLENBQUFBLENBRXBCLElBREFBLENBQ09BLEVBQUFBLENBQUFBLENBQUFBLENBQVd0SSxFQUFJLE1BQVVBLEVBQUFBLENBQUFBLENBQUksT0FBT3NJLENBQVEsQ0FBQSxHQUFNRSxHQUNuRHhJLENBQUksQ0FBQSxNQUFBLENBQU9zSSxDQUFRLENBQUEsR0FBTSxJQUMzQkEsRUFBQUEsQ0FBQUEsRUFBQUEsQ0FFRkEsSUFFRkQsQ0FBTyxDQUFBLElBQUEsQ0FBS3JJLEVBQUksTUFBT3VJLENBQUFBLENBQUFBLENBQWVELEVBQVdDLENBQWdCLENBQUEsQ0FBQyxDQUFDLEVBQ3JFLENBQUEsS0FBTyxDQUNMLElBQU1FLENBQUFBLENBQVN6SSxFQUFJLE1BQU9zSSxDQUFBQSxDQUFRLEVBQ2xDRCxDQUFPLENBQUEsSUFBQSxDQUFLSSxDQUFNLEVBQ3BCLENBQ0FILElBQ0YsQ0FDQSxPQUFPRCxDQUNULENBUUEsU0FBUyw0QkFBNEJLLENBQU9DLENBQUFBLENBQUFBLENBQU1DLEVBQVcsQ0FDM0QsT0FBTyxhQUFhLElBQUtGLENBQUFBLENBQUFBLENBQU0sT0FBTyxDQUFDLENBQUMsR0FDdENBLENBQVUsR0FBQSxNQUFBLEVBQ1ZBLElBQVUsT0FDVkEsRUFBQUEsQ0FBQUEsR0FBVSxRQUNWQSxDQUFVRSxHQUFBQSxDQUFBQSxFQUNWRCxJQUFTLEdBQ2IsQ0FRQSxTQUFTLHdCQUF5QmhKLENBQUFBLENBQUFBLENBQUswSSxFQUFRTyxDQUFXLENBQUEsQ0FDeEQsR0FBSVAsQ0FBTyxDQUFBLENBQUMsSUFBTSxHQUFLLENBQUEsQ0FDckJBLEVBQU8sS0FBTSxFQUFBLENBQ2IsSUFBSVEsQ0FBZSxDQUFBLENBQUEsQ0FDZkMsRUFBb0Isb0JBQXVCRixDQUFBQSxDQUFBQSxDQUFZLGNBQ3ZERCxDQUFPLENBQUEsSUFBQSxDQUNYLEtBQU9OLENBQU8sQ0FBQSxNQUFBLENBQVMsR0FBRyxDQUN4QixJQUFNSyxFQUFRTCxDQUFPLENBQUEsQ0FBQyxFQUV0QixHQUFJSyxDQUFBQSxHQUFVLEtBRVosR0FEQUcsQ0FBQUEsRUFBQUEsQ0FDSUEsQ0FBaUIsR0FBQSxDQUFBLENBQUcsQ0FDbEJGLENBQUFBLEdBQVMsT0FDWEcsQ0FBb0JBLENBQUFBLENBQUFBLENBQW9CLFFBRTFDVCxDQUFPLENBQUEsS0FBQSxHQUNQUyxDQUFxQixFQUFBLEtBQUEsQ0FDckIsR0FBSSxDQUNGLElBQU1DLEVBQW9CLFNBQVVwSixDQUFBQSxDQUFBQSxDQUFLLFVBQVcsQ0FDbEQsT0FBTyxTQUFTbUosQ0FBaUIsQ0FBQSxFQUNuQyxDQUNBLENBQUEsVUFBVyxDQUFFLE9BQU8sQ0FBQSxDQUFLLENBQUMsQ0FDMUIsQ0FBQSxPQUFBQyxFQUFrQixNQUFTRCxDQUFBQSxDQUFBQSxDQUNwQkMsQ0FDVCxDQUFTbEksTUFBQUEsQ0FBQUEsQ0FBRyxDQUNWLE9BQWtCLGlCQUFBLENBQUEsV0FBQSxHQUFjLElBQU0sQ0FBQSxtQkFBQSxDQUFxQixDQUFFLEtBQU9BLENBQUFBLENBQUFBLENBQUcsTUFBUWlJLENBQUFBLENBQWtCLENBQUMsQ0FBQSxDQUMzRixJQUNULENBQ0YsQ0FBQSxDQUFBLEtBQ1NKLElBQVUsR0FDbkJHLEVBQUFBLENBQUFBLEVBQUFBLENBRUUsNEJBQTRCSCxDQUFPQyxDQUFBQSxDQUFBQSxDQUFNQyxDQUFTLENBQ3BERSxDQUFBQSxDQUFBQSxFQUFxQixLQUFPRixDQUFZLENBQUEsR0FBQSxDQUFNRixFQUFRLE9BQVVFLENBQUFBLENBQUFBLENBQVksSUFBTUYsQ0FBUSxDQUFBLGNBQUEsQ0FBaUJBLEVBQVEsSUFFbkhJLENBQUFBLENBQUFBLENBQW9CQSxFQUFvQkosQ0FFMUNDLENBQUFBLENBQUFBLENBQU9OLEVBQU8sS0FBTSxHQUN0QixDQUNGLENBQ0YsQ0FPQSxTQUFTLFlBQWFBLENBQUFBLENBQUFBLENBQVFySCxFQUFPLENBQ25DLElBQUlxRCxFQUFTLEVBQ2IsQ0FBQSxLQUFPZ0UsRUFBTyxNQUFTLENBQUEsQ0FBQSxFQUFLLENBQUNySCxDQUFBQSxDQUFNLElBQUtxSCxDQUFBQSxDQUFBQSxDQUFPLENBQUMsQ0FBQyxDQUFBLEVBQy9DaEUsR0FBVWdFLENBQU8sQ0FBQSxLQUFBLEdBRW5CLE9BQU9oRSxDQUNULENBTUEsU0FBUyxrQkFBQSxDQUFtQmdFLEVBQVEsQ0FDbEMsSUFBSWhFLEVBQ0osT0FBSWdFLENBQUFBLENBQU8sT0FBUyxDQUFLLEVBQUEsdUJBQUEsQ0FBd0IsS0FBS0EsQ0FBTyxDQUFBLENBQUMsQ0FBQyxDQUM3REEsRUFBQUEsQ0FBQUEsQ0FBTyxPQUNQaEUsQ0FBQUEsQ0FBQUEsQ0FBUyxhQUFhZ0UsQ0FBUSxDQUFBLHFCQUFxQixFQUFFLElBQUssRUFBQSxDQUMxREEsRUFBTyxLQUFNLEVBQUEsRUFFYmhFLEVBQVMsWUFBYWdFLENBQUFBLENBQUFBLENBQVEsbUJBQW1CLENBRTVDaEUsQ0FBQUEsQ0FDVCxDQUVBLElBQU0sY0FBQSxDQUFpQiwwQkFRdkIsU0FBUyxvQkFBQSxDQUFxQjFFLEVBQUtxSixDQUFpQkMsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUV6RCxJQUFNQyxDQUFBQSxDQUFlLEVBQ2ZiLENBQUFBLENBQUFBLENBQVMsZUFBZVcsQ0FBZSxDQUFBLENBQzdDLEVBQUcsQ0FDRCxZQUFBLENBQWFYLEVBQVEsY0FBYyxDQUFBLENBQ25DLElBQU1jLENBQWdCZCxDQUFBQSxDQUFBQSxDQUFPLE9BQ3ZCOUYsQ0FBVSxDQUFBLFlBQUEsQ0FBYThGLEVBQVEsU0FBUyxDQUFBLENBQzlDLEdBQUk5RixDQUFZLEdBQUEsRUFBQSxDQUNkLEdBQUlBLENBQVksR0FBQSxPQUFBLENBQVMsQ0FFdkIsSUFBTTZHLENBQUFBLENBQVEsQ0FBRSxPQUFTLENBQUEsT0FBUSxFQUNqQyxZQUFhZixDQUFBQSxDQUFBQSxDQUFRLGNBQWMsQ0FBQSxDQUNuQ2UsQ0FBTSxDQUFBLFlBQUEsQ0FBZSxjQUFjLFlBQWFmLENBQUFBLENBQUFBLENBQVEsU0FBUyxDQUFDLENBQUEsQ0FDbEUsYUFBYUEsQ0FBUSxDQUFBLGNBQWMsRUFDbkMsSUFBSWdCLENBQUFBLENBQWMseUJBQXlCMUosQ0FBSzBJLENBQUFBLENBQUFBLENBQVEsT0FBTyxDQUMzRGdCLENBQUFBLENBQUFBLEdBQ0ZELEVBQU0sV0FBY0MsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FFdEJILEVBQWEsSUFBS0UsQ0FBQUEsQ0FBSyxFQUN6QixDQUFPLEtBQUEsQ0FFTCxJQUFNRSxDQUFjLENBQUEsQ0FBRSxRQUFBL0csQ0FBUSxDQUFBLENBQzlCLElBQUk4RyxDQUFjLENBQUEsd0JBQUEsQ0FBeUIxSixFQUFLMEksQ0FBUSxDQUFBLE9BQU8sRUFJL0QsSUFISWdCLENBQUFBLEdBQ0ZDLEVBQVksV0FBY0QsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FFckJoQixDQUFPLENBQUEsTUFBQSxDQUFTLENBQUtBLEVBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUFNLEdBQUEsR0FBQSxFQUFLLENBQzdDLFlBQWFBLENBQUFBLENBQUFBLENBQVEsY0FBYyxDQUNuQyxDQUFBLElBQU1LLEVBQVFMLENBQU8sQ0FBQSxLQUFBLEdBQ3JCLEdBQUlLLENBQUFBLEdBQVUsVUFDWlksQ0FBWSxDQUFBLE9BQUEsQ0FBVSxXQUNiWixDQUFVLEdBQUEsTUFBQSxDQUNuQlksRUFBWSxJQUFPLENBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxHQUNWWixJQUFVLFNBQ25CWSxDQUFBQSxDQUFBQSxDQUFZLFFBQVUsQ0FDYlosQ0FBQUEsQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsR0FBVSxTQUFXTCxDQUFPLENBQUEsQ0FBQyxJQUFNLEdBQzVDQSxDQUFBQSxDQUFBQSxDQUFPLE9BQ1BpQixDQUFBQSxDQUFBQSxDQUFZLE1BQVEsYUFBYyxDQUFBLFlBQUEsQ0FBYWpCLEVBQVEsbUJBQW1CLENBQUMsQ0FDbEVLLENBQUFBLEtBQUFBLEdBQUFBLENBQUFBLEdBQVUsTUFBVUwsRUFBQUEsQ0FBQUEsQ0FBTyxDQUFDLENBQU0sR0FBQSxHQUFBLENBQUssQ0FFaEQsR0FEQUEsQ0FBQUEsQ0FBTyxPQUNILENBQUEsdUJBQUEsQ0FBd0IsS0FBS0EsQ0FBTyxDQUFBLENBQUMsQ0FBQyxDQUN4QyxDQUFBLElBQUlrQixFQUFXLGtCQUFtQmxCLENBQUFBLENBQU0sT0FDbkMsQ0FDTCxJQUFJa0IsRUFBVyxZQUFhbEIsQ0FBQUEsQ0FBQUEsQ0FBUSxtQkFBbUIsQ0FDdkQsQ0FBQSxHQUFJa0IsSUFBYSxTQUFhQSxFQUFBQSxDQUFBQSxHQUFhLFFBQVVBLENBQWEsR0FBQSxNQUFBLEVBQVVBLElBQWEsVUFBWSxDQUFBLENBQ25HbEIsRUFBTyxLQUFNLEVBQUEsQ0FDYixJQUFNdkgsQ0FBVyxDQUFBLGtCQUFBLENBQW1CdUgsQ0FBTSxDQUV0Q3ZILENBQUFBLENBQUFBLENBQVMsT0FBUyxDQUNwQnlJLEdBQUFBLENBQUFBLEVBQVksSUFBTXpJLENBRXRCLEVBQUEsQ0FDRixDQUNBd0ksQ0FBWSxDQUFBLElBQUEsQ0FBT0MsRUFDckIsQ0FBV2IsS0FBQUEsQ0FBQUEsR0FBVSxVQUFZTCxDQUFPLENBQUEsQ0FBQyxJQUFNLEdBQzdDQSxFQUFBQSxDQUFBQSxDQUFPLE9BQ1BpQixDQUFBQSxDQUFBQSxDQUFZLE9BQVMsa0JBQW1CakIsQ0FBQUEsQ0FBTSxHQUNyQ0ssQ0FBVSxHQUFBLFVBQUEsRUFBY0wsRUFBTyxDQUFDLENBQUEsR0FBTSxLQUMvQ0EsQ0FBTyxDQUFBLEtBQUEsR0FDUGlCLENBQVksQ0FBQSxRQUFBLENBQVcsY0FBYyxZQUFhakIsQ0FBQUEsQ0FBQUEsQ0FBUSxtQkFBbUIsQ0FBQyxDQUFBLEVBQ3JFSyxJQUFVLE9BQVdMLEVBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUFNLEdBQUEsR0FBQSxFQUM1Q0EsQ0FBTyxDQUFBLEtBQUEsRUFDUGlCLENBQUFBLENBQUFBLENBQVksTUFBUSxZQUFhakIsQ0FBQUEsQ0FBQUEsQ0FBUSxtQkFBbUIsQ0FDbkRLLEVBQUFBLENBQUFBLEdBQVUsUUFBVUwsQ0FBTyxDQUFBLENBQUMsSUFBTSxHQUMzQ0EsRUFBQUEsQ0FBQUEsQ0FBTyxPQUNQaUIsQ0FBQUEsQ0FBQUEsQ0FBWVosQ0FBSyxDQUFJLENBQUEsa0JBQUEsQ0FBbUJMLENBQU0sQ0FDckNLLEVBQUFBLENBQUFBLEdBQVUsYUFBZUwsQ0FBTyxDQUFBLENBQUMsSUFBTSxHQUNoREEsRUFBQUEsQ0FBQUEsQ0FBTyxPQUNQaUIsQ0FBQUEsQ0FBQUEsQ0FBWVosQ0FBSyxDQUFJLENBQUEsWUFBQSxDQUFhTCxFQUFRLG1CQUFtQixDQUFBLEVBRTdELGtCQUFrQjFJLENBQUssQ0FBQSxtQkFBQSxDQUFxQixDQUFFLEtBQU8wSSxDQUFBQSxDQUFBQSxDQUFPLE9BQVEsQ0FBQyxFQUV6RSxDQUNBYSxDQUFhLENBQUEsSUFBQSxDQUFLSSxDQUFXLEVBQy9CLENBRUVqQixFQUFPLE1BQVdjLEdBQUFBLENBQUFBLEVBQ3BCLGtCQUFrQnhKLENBQUssQ0FBQSxtQkFBQSxDQUFxQixDQUFFLEtBQU8wSSxDQUFBQSxDQUFBQSxDQUFPLE9BQVEsQ0FBQyxFQUV2RSxZQUFhQSxDQUFBQSxDQUFBQSxDQUFRLGNBQWMsRUFDckMsQ0FBQSxNQUFTQSxFQUFPLENBQUMsQ0FBQSxHQUFNLEtBQU9BLENBQU8sQ0FBQSxLQUFBLElBQ3JDLE9BQUlZLENBQUFBLEdBQ0ZBLEVBQU1ELENBQWUsQ0FBQSxDQUFJRSxHQUVwQkEsQ0FDVCxDQU1BLFNBQVMsZUFBZ0J2SixDQUFBQSxDQUFBQSxDQUFLLENBQzVCLElBQU1xSixDQUFBQSxDQUFrQixrQkFBa0JySixDQUFLLENBQUEsWUFBWSxDQUN2RHVKLENBQUFBLENBQUFBLENBQWUsRUFBQyxDQUNwQixHQUFJRixDQUFpQixDQUFBLENBQ25CLElBQU1DLENBQVEsQ0FBQSxJQUFBLENBQUssT0FBTyxpQkFDMUJDLENBQUFBLENBQUFBLENBQWdCRCxHQUFTQSxDQUFNRCxDQUFBQSxDQUFlLEdBQU0sb0JBQXFCckosQ0FBQUEsQ0FBQUEsQ0FBS3FKLEVBQWlCQyxDQUFLLEVBQ3RHLENBRUEsT0FBSUMsQ0FBQUEsQ0FBYSxPQUFTLENBQ2pCQSxDQUFBQSxDQUFBQSxDQUNFLFFBQVF2SixDQUFLLENBQUEsTUFBTSxFQUNyQixDQUFDLENBQUUsUUFBUyxRQUFTLENBQUMsRUFDcEIsT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBSyw0Q0FBNEMsQ0FDM0QsQ0FBQSxDQUFDLENBQUUsT0FBUyxDQUFBLE9BQVEsQ0FBQyxDQUNuQixDQUFBLE9BQUEsQ0FBUUEsRUFBSyxjQUFjLENBQUEsQ0FDN0IsQ0FBQyxDQUFFLE9BQUEsQ0FBUyxRQUFTLENBQUMsQ0FBQSxDQUV0QixDQUFDLENBQUUsT0FBQSxDQUFTLE9BQVEsQ0FBQyxDQUVoQyxDQUtBLFNBQVMsYUFBQSxDQUFjQSxFQUFLLENBQzFCLGVBQUEsQ0FBZ0JBLENBQUcsQ0FBRSxDQUFBLFNBQUEsQ0FBWSxHQUNuQyxDQU9BLFNBQVMsZUFBZUEsQ0FBSzZKLENBQUFBLENBQUFBLENBQVNDLEVBQU0sQ0FDMUMsSUFBTUMsRUFBVyxlQUFnQi9KLENBQUFBLENBQUcsRUFDcEMrSixDQUFTLENBQUEsT0FBQSxDQUFVLFdBQVksQ0FBQSxVQUFBLENBQVcsVUFBVyxDQUMvQyxZQUFBLENBQWEvSixDQUFHLENBQUsrSixFQUFBQSxDQUFBQSxDQUFTLFNBQWMsR0FBQSxDQUFBLENBQUEsR0FDekMsZ0JBQWlCRCxDQUFBQSxDQUFBQSxDQUFNOUosRUFBSyxTQUFVLENBQUEsaUJBQUEsQ0FBbUIsQ0FDNUQsV0FBYThKLENBQUFBLENBQUFBLENBQ2IsT0FBUTlKLENBQ1YsQ0FBQyxDQUFDLENBQ0E2SixFQUFBQSxDQUFBQSxDQUFRN0osQ0FBRyxDQUViLENBQUEsY0FBQSxDQUFlQSxFQUFLNkosQ0FBU0MsQ0FBQUEsQ0FBSSxHQUVyQyxDQUFHQSxDQUFBQSxDQUFBQSxDQUFLLFlBQVksRUFDdEIsQ0FNQSxTQUFTLFdBQVk5SixDQUFBQSxDQUFBQSxDQUFLLENBQ3hCLE9BQU8sUUFBQSxDQUFTLFdBQWFBLENBQUksQ0FBQSxRQUFBLEVBQy9CLGdCQUFnQkEsQ0FBSyxDQUFBLE1BQU0sR0FDM0IsZUFBZ0JBLENBQUFBLENBQUFBLENBQUssTUFBTSxDQUFFLENBQUEsT0FBQSxDQUFRLEdBQUcsQ0FBTSxHQUFBLENBQ2xELENBS0EsU0FBUyxhQUFjQSxDQUFBQSxDQUFBQSxDQUFLLENBQzFCLE9BQU8sT0FBQSxDQUFRQSxFQUFLLElBQUssQ0FBQSxNQUFBLENBQU8sZUFBZSxDQUNqRCxDQU9BLFNBQVMsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBSytKLEVBQVVSLENBQWMsQ0FBQSxDQUNqRCxHQUFLdkosQ0FBZSxZQUFBLGlCQUFBLEVBQXFCLFlBQVlBLENBQUcsQ0FBQSxHQUFNQSxFQUFJLE1BQVcsR0FBQSxFQUFBLEVBQU1BLEVBQUksTUFBVyxHQUFBLE9BQUEsQ0FBQSxFQUFjQSxFQUFJLE9BQVksR0FBQSxNQUFBLEVBQVUsT0FBTyxlQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxRQUFRLENBQUMsQ0FBQSxDQUFFLGFBQWtCLEdBQUEsUUFBQSxDQUFXLENBQzVNK0osQ0FBUyxDQUFBLE9BQUEsQ0FBVSxHQUNuQixJQUFJN0osQ0FBQUEsQ0FBTWlELENBQ1YsQ0FBQSxHQUFJbkQsQ0FBSSxDQUFBLE9BQUEsR0FBWSxJQUNsQkUsQ0FBTyxDQUFBLEtBQUEsQ0FDUGlELEVBQU8sZUFBZ0JuRCxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FDN0IsQ0FBQSxLQUFBLENBQ0wsSUFBTWdLLENBQWUsQ0FBQSxlQUFBLENBQWdCaEssRUFBSyxRQUFRLENBQUEsQ0FDbERFLEVBQU84SixDQUFlQSxDQUFBQSxDQUFBQSxDQUFhLGFBQWdCLENBQUEsS0FBQSxDQUduRDdHLEVBQU8sZUFBZ0JuRCxDQUFBQSxDQUFBQSxDQUFLLFFBQVEsRUFDdEMsQ0FDQXVKLEVBQWEsT0FBUSxDQUFBLFNBQVNJLEVBQWEsQ0FDekMsZ0JBQUEsQ0FBaUIzSixFQUFLLFNBQVM0RCxDQUFBQSxDQUFNTixFQUFLLENBQ3hDLElBQU10RCxFQUFNLFNBQVU0RCxDQUFBQSxDQUFJLEVBQzFCLEdBQUksYUFBQSxDQUFjNUQsQ0FBRyxDQUFHLENBQUEsQ0FDdEIsZUFBZUEsQ0FBRyxDQUFBLENBQ2xCLE1BQ0YsQ0FDQSxnQkFBQSxDQUFpQkUsRUFBTWlELENBQU1uRCxDQUFBQSxDQUFBQSxDQUFLc0QsQ0FBRyxFQUN2QyxDQUFBLENBQUd5RyxFQUFVSixDQUFhLENBQUEsQ0FBQSxDQUFJLEVBQ2hDLENBQUMsRUFDSCxDQUNGLENBT0EsU0FBUyxhQUFhckcsQ0FBS00sQ0FBQUEsQ0FBQUEsQ0FBTSxDQUMvQixJQUFNNUQsQ0FBQUEsQ0FBTSxVQUFVNEQsQ0FBSSxDQUFBLENBQzFCLE9BQUs1RCxDQUdELENBQUEsQ0FBQSxFQUFBLENBQUFzRCxFQUFJLElBQVMsR0FBQSxRQUFBLEVBQVlBLEVBQUksSUFBUyxHQUFBLE9BQUEsSUFDcEN0RCxFQUFJLE9BQVksR0FBQSxNQUFBLEVBR2hCLFFBQVFBLENBQUssQ0FBQSw4QkFBOEIsQ0FBSyxFQUFBLE9BQUEsQ0FBUUEsQ0FBSyxDQUFBLE1BQU0sSUFBTSxJQUd6RUEsRUFBQUEsQ0FBQUEsWUFBZSxtQkFBcUJBLENBQUksQ0FBQSxJQUFBLEdBQ3pDQSxFQUFJLFlBQWEsQ0FBQSxNQUFNLElBQU0sR0FBT0EsRUFBQUEsQ0FBQUEsQ0FBSSxhQUFhLE1BQU0sQ0FBQSxDQUFFLFFBQVEsR0FBRyxDQUFBLEdBQU0sS0FWMUUsQ0FlWCxDQUFBLENBT0EsU0FBUyw0QkFBNkJBLENBQUFBLENBQUFBLENBQUtzRCxFQUFLLENBQzlDLE9BQU8sZ0JBQWdCdEQsQ0FBRyxDQUFBLENBQUUsU0FBV0EsQ0FBZSxZQUFBLGlCQUFBLEVBQXFCc0QsRUFBSSxJQUFTLEdBQUEsT0FBQSxHQUVyRkEsRUFBSSxPQUFXQSxFQUFBQSxDQUFBQSxDQUFJLFFBQ3hCLENBUUEsU0FBUyxpQkFBaUJxRyxDQUFhM0osQ0FBQUEsQ0FBQUEsQ0FBS3NELENBQUssQ0FBQSxDQUMvQyxJQUFNb0csQ0FBQUEsQ0FBY0MsRUFBWSxXQUNoQyxDQUFBLEdBQUlELEVBQ0YsR0FBSSxDQUNGLE9BQU9BLENBQVksQ0FBQSxJQUFBLENBQUsxSixFQUFLc0QsQ0FBRyxDQUFBLEdBQU0sRUFDeEMsQ0FBU3BDLE1BQUFBLENBQUFBLENBQUcsQ0FDVixJQUFNK0ksQ0FBQUEsQ0FBU1AsRUFBWSxNQUMzQixDQUFBLE9BQUEsaUJBQUEsQ0FBa0IsYUFBYyxDQUFBLElBQUEsQ0FBTSx5QkFBMEIsQ0FBRSxLQUFBLENBQU94SSxFQUFHLE1BQUErSSxDQUFBQSxDQUFPLENBQUMsQ0FDN0UsQ0FBQSxDQUFBLENBQ1QsQ0FFRixPQUFPLENBQUEsQ0FDVCxDQVNBLFNBQVMsZ0JBQUEsQ0FBaUJqSyxFQUFLNkosQ0FBU0UsQ0FBQUEsQ0FBQUEsQ0FBVUosRUFBYU8sQ0FBZ0IsQ0FBQSxDQUM3RSxJQUFNQyxDQUFBQSxDQUFjLGVBQWdCbkssQ0FBQUEsQ0FBRyxFQUVuQ29LLENBQ0FULENBQUFBLENBQUFBLENBQVksS0FDZFMsQ0FBaUIsQ0FBQSxtQkFBQSxDQUFvQnBLLEVBQUsySixDQUFZLENBQUEsSUFBSSxFQUUxRFMsQ0FBaUIsQ0FBQSxDQUFDcEssQ0FBRyxDQUduQjJKLENBQUFBLENBQUFBLENBQVksU0FDZFMsQ0FBZSxDQUFBLE9BQUEsQ0FBUSxTQUFTQyxDQUFlLENBQUEsQ0FDN0MsSUFBTUMsQ0FBb0IsQ0FBQSxlQUFBLENBQWdCRCxDQUFhLENBRXZEQyxDQUFBQSxDQUFBQSxDQUFrQixVQUFZRCxDQUFjLENBQUEsTUFDOUMsQ0FBQyxDQUVILENBQUEsT0FBQSxDQUFRRCxFQUFnQixTQUFTQyxDQUFBQSxDQUFlLENBRTlDLElBQU1FLENBQUFBLENBQWdCLFNBQVNqSCxDQUFLLENBQUEsQ0FDbEMsR0FBSSxDQUFDLFlBQUEsQ0FBYXRELENBQUcsQ0FBRyxDQUFBLENBQ3RCcUssRUFBYyxtQkFBb0JWLENBQUFBLENBQUFBLENBQVksUUFBU1ksQ0FBYSxDQUFBLENBQ3BFLE1BQ0YsQ0FPQSxHQU5JLDZCQUE2QnZLLENBQUtzRCxDQUFBQSxDQUFHLEtBR3JDNEcsQ0FBa0IsRUFBQSxZQUFBLENBQWE1RyxFQUFLdEQsQ0FBRyxDQUFBLEdBQ3pDc0QsRUFBSSxjQUFlLEVBQUEsQ0FFakIsaUJBQWlCcUcsQ0FBYTNKLENBQUFBLENBQUFBLENBQUtzRCxDQUFHLENBQ3hDLENBQUEsQ0FBQSxPQUVGLElBQU1rSCxDQUFZLENBQUEsZUFBQSxDQUFnQmxILENBQUcsQ0FLckMsQ0FBQSxHQUpBa0gsRUFBVSxXQUFjYixDQUFBQSxDQUFBQSxDQUNwQmEsRUFBVSxVQUFjLEVBQUEsSUFBQSxHQUMxQkEsRUFBVSxVQUFhLENBQUEsSUFFckJBLENBQVUsQ0FBQSxVQUFBLENBQVcsT0FBUXhLLENBQUFBLENBQUcsQ0FBSSxDQUFBLENBQUEsQ0FBRyxDQUt6QyxHQUpBd0ssQ0FBQUEsQ0FBVSxXQUFXLElBQUt4SyxDQUFBQSxDQUFHLEVBQ3pCMkosQ0FBWSxDQUFBLE9BQUEsRUFDZHJHLEVBQUksZUFBZ0IsRUFBQSxDQUVsQnFHLEVBQVksTUFBVXJHLEVBQUFBLENBQUFBLENBQUksUUFDeEIsQ0FBQyxPQUFBLENBQVEsVUFBVUEsQ0FBSSxDQUFBLE1BQU0sRUFBR3FHLENBQVksQ0FBQSxNQUFNLEVBQ3BELE9BR0osR0FBSUEsRUFBWSxJQUFNLENBQUEsQ0FDcEIsR0FBSVEsQ0FBWSxDQUFBLGFBQUEsQ0FDZCxPQUVBQSxDQUFZLENBQUEsYUFBQSxDQUFnQixHQUVoQyxDQUNBLEdBQUlSLEVBQVksT0FBUyxDQUFBLENBQ3ZCLElBQU1XLENBQW9CLENBQUEsZUFBQSxDQUFnQkQsQ0FBYSxDQUFBLENBRWpEM0csQ0FBUTJHLENBQUFBLENBQUFBLENBQWMsTUFDNUIsR0FBSUMsQ0FBQUEsQ0FBa0IsWUFBYzVHLENBQ2xDLENBQUEsT0FFRjRHLEVBQWtCLFNBQVk1RyxDQUFBQSxFQUNoQyxDQUlBLEdBSEl5RyxDQUFBQSxDQUFZLFNBQ2QsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBWSxPQUFPLENBRTlCQSxDQUFBQSxDQUFBQSxDQUFZLFNBQ2QsT0FHRVIsQ0FBQUEsQ0FBWSxTQUFXLENBQ3BCUSxDQUFBQSxDQUFBQSxDQUFZLFdBQ2YsWUFBYW5LLENBQUFBLENBQUFBLENBQUssY0FBYyxDQUNoQzZKLENBQUFBLENBQUFBLENBQVE3SixFQUFLc0QsQ0FBRyxDQUFBLENBQ2hCNkcsRUFBWSxRQUFXLENBQUEsU0FBQSxHQUFZLFVBQVcsQ0FBQSxVQUFXLENBQ3ZEQSxDQUFZLENBQUEsUUFBQSxDQUFXLEtBQ3pCLENBQUdSLENBQUFBLENBQUFBLENBQVksUUFBUSxDQUFBLENBQUEsQ0FFaEJBLENBQVksQ0FBQSxLQUFBLENBQVEsRUFDN0JRLENBQVksQ0FBQSxPQUFBLENBQVUsV0FBWSxDQUFBLFVBQUEsQ0FBVyxVQUFXLENBQ3RELFlBQUEsQ0FBYW5LLEVBQUssY0FBYyxDQUFBLENBQ2hDNkosRUFBUTdKLENBQUtzRCxDQUFBQSxDQUFHLEVBQ2xCLENBQUdxRyxDQUFBQSxDQUFBQSxDQUFZLEtBQUssQ0FFcEIsRUFBQSxZQUFBLENBQWEzSixFQUFLLGNBQWMsQ0FBQSxDQUNoQzZKLEVBQVE3SixDQUFLc0QsQ0FBQUEsQ0FBRyxHQUVwQixDQUNGLENBQUEsQ0FDSXlHLEVBQVMsYUFBaUIsRUFBQSxJQUFBLEdBQzVCQSxFQUFTLGFBQWdCLENBQUEsSUFFM0JBLENBQVMsQ0FBQSxhQUFBLENBQWMsS0FBSyxDQUMxQixPQUFBLENBQVNKLEVBQVksT0FDckIsQ0FBQSxRQUFBLENBQVVZLEVBQ1YsRUFBSUYsQ0FBQUEsQ0FDTixDQUFDLENBQ0RBLENBQUFBLENBQUFBLENBQWMsaUJBQWlCVixDQUFZLENBQUEsT0FBQSxDQUFTWSxDQUFhLEVBQ25FLENBQUMsRUFDSCxDQUVBLElBQUksa0JBQW9CLENBQ3BCLENBQUEsQ0FBQSxhQUFBLENBQWdCLEtBQ3BCLFNBQVMsaUJBQUEsRUFBb0IsQ0FDdEIsYUFDSCxHQUFBLGFBQUEsQ0FBZ0IsVUFBVyxDQUN6QixpQkFBQSxDQUFvQixHQUN0QixDQUNBLENBQUEsTUFBQSxDQUFPLGlCQUFpQixRQUFVLENBQUEsYUFBYSxFQUMvQyxXQUFZLENBQUEsVUFBVyxDQUNqQixpQkFDRixHQUFBLGlCQUFBLENBQW9CLEdBQ3BCLE9BQVEsQ0FBQSxXQUFBLEdBQWMsZ0JBQWlCLENBQUEsd0RBQXdELEVBQUcsU0FBU3ZLLENBQUFBLENBQUssQ0FDOUcsV0FBQSxDQUFZQSxDQUFHLEVBQ2pCLENBQUMsQ0FFTCxFQUFBLENBQUEsQ0FBRyxHQUFHLENBRVYsRUFBQSxDQUtBLFNBQVMsV0FBWUEsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNwQixDQUFDLFlBQUEsQ0FBYUEsRUFBSyxrQkFBa0IsQ0FBQSxFQUFLLG1CQUFtQkEsQ0FBRyxDQUFBLEdBQ2xFQSxFQUFJLFlBQWEsQ0FBQSxrQkFBQSxDQUFvQixNQUFNLENBQzFCLENBQUEsZUFBQSxDQUFnQkEsQ0FBRyxDQUN2QixDQUFBLFFBQUEsQ0FDWCxhQUFhQSxDQUFLLENBQUEsVUFBVSxFQUc1QkEsQ0FBSSxDQUFBLGdCQUFBLENBQWlCLHdCQUF5QixVQUFXLENBQUUsYUFBYUEsQ0FBSyxDQUFBLFVBQVUsRUFBRSxDQUFHLENBQUEsQ0FBRSxLQUFNLENBQUssQ0FBQSxDQUFDLENBR2hILEVBQUEsQ0FVQSxTQUFTLGVBQUEsQ0FBZ0JBLEVBQUs2SixDQUFTRSxDQUFBQSxDQUFBQSxDQUFVdEcsRUFBTyxDQUN0RCxJQUFNZ0gsRUFBTyxVQUFXLENBQ2pCVixFQUFTLE1BQ1pBLEdBQUFBLENBQUFBLENBQVMsT0FBUyxDQUNsQkYsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBUTdKLENBQUcsQ0FFZixFQUFBLENBQUEsQ0FDSXlELEVBQVEsQ0FDVixDQUFBLFNBQUEsR0FBWSxVQUFXZ0gsQ0FBQUEsQ0FBQUEsQ0FBTWhILENBQUssQ0FFbENnSCxDQUFBQSxDQUFBQSxHQUVKLENBUUEsU0FBUyxhQUFhekssQ0FBSytKLENBQUFBLENBQUFBLENBQVVSLEVBQWMsQ0FDakQsSUFBSW1CLEVBQWlCLENBQ3JCLENBQUEsQ0FBQSxPQUFBLE9BQUEsQ0FBUSxNQUFPLFNBQVN4SyxDQUFBQSxDQUFNLENBQzVCLEdBQUksWUFBQSxDQUFhRixDQUFLLENBQUEsS0FBQSxDQUFRRSxDQUFJLENBQUEsQ0FBRyxDQUNuQyxJQUFNaUQsQ0FBQUEsQ0FBTyxrQkFBa0JuRCxDQUFLLENBQUEsS0FBQSxDQUFRRSxDQUFJLENBQ2hEd0ssQ0FBQUEsQ0FBQUEsQ0FBaUIsR0FDakJYLENBQVMsQ0FBQSxJQUFBLENBQU81RyxFQUNoQjRHLENBQVMsQ0FBQSxJQUFBLENBQU83SixFQUNoQnFKLENBQWEsQ0FBQSxPQUFBLENBQVEsU0FBU0ksQ0FBYSxDQUFBLENBQ3pDLGtCQUFrQjNKLENBQUsySixDQUFBQSxDQUFBQSxDQUFhSSxFQUFVLFNBQVNuRyxDQUFBQSxDQUFNTixFQUFLLENBQ2hFLElBQU10RCxFQUFNLFNBQVU0RCxDQUFBQSxDQUFJLEVBQzFCLEdBQUksT0FBQSxDQUFRNUQsRUFBSyxJQUFLLENBQUEsTUFBQSxDQUFPLGVBQWUsQ0FBRyxDQUFBLENBQzdDLGVBQWVBLENBQUcsQ0FBQSxDQUNsQixNQUNGLENBQ0EsZ0JBQUEsQ0FBaUJFLEVBQU1pRCxDQUFNbkQsQ0FBQUEsQ0FBQUEsQ0FBS3NELENBQUcsRUFDdkMsQ0FBQyxFQUNILENBQUMsRUFDSCxDQUNGLENBQUMsQ0FBQSxDQUNNb0gsQ0FDVCxDQWNBLFNBQVMsa0JBQWtCMUssQ0FBSzJKLENBQUFBLENBQUFBLENBQWFJLEVBQVVGLENBQVMsQ0FBQSxDQUM5RCxHQUFJRixDQUFZLENBQUEsT0FBQSxHQUFZLFdBQzFCLGlCQUFrQixFQUFBLENBQ2xCLGlCQUFpQjNKLENBQUs2SixDQUFBQSxDQUFBQSxDQUFTRSxFQUFVSixDQUFXLENBQUEsQ0FDcEQsWUFBWSxTQUFVM0osQ0FBQUEsQ0FBRyxDQUFDLENBQ2pCMkosQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsQ0FBWSxVQUFZLFdBQWEsQ0FBQSxDQUM5QyxJQUFNZ0IsQ0FBa0IsQ0FBQSxFQUNwQmhCLENBQUFBLENBQUFBLENBQVksSUFDZGdCLEdBQUFBLENBQUFBLENBQWdCLEtBQU8sZ0JBQWlCM0ssQ0FBQUEsQ0FBQUEsQ0FBSzJKLEVBQVksSUFBSSxDQUFBLENBQUEsQ0FFM0RBLEVBQVksU0FDZGdCLEdBQUFBLENBQUFBLENBQWdCLFVBQVksVUFBV2hCLENBQUFBLENBQUFBLENBQVksU0FBUyxDQUU3QyxDQUFBLENBQUEsSUFBSSxxQkFBcUIsU0FBU2lCLENBQUFBLENBQVMsQ0FDMUQsSUFBU3RJLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSXNJLENBQUFBLENBQUFBLENBQVEsT0FBUXRJLENBRWxDLEVBQUEsQ0FBQSxHQURjc0ksRUFBUXRJLENBQUMsQ0FBQSxDQUNiLGVBQWdCLENBQ3hCLFlBQUEsQ0FBYXRDLEVBQUssV0FBVyxDQUFBLENBQzdCLEtBQ0YsQ0FFSixDQUFBLENBQUcySyxDQUFlLENBQ1QsQ0FBQSxPQUFBLENBQVEsVUFBVTNLLENBQUcsQ0FBQyxDQUMvQixDQUFBLGdCQUFBLENBQWlCLFNBQVVBLENBQUFBLENBQUcsRUFBRzZKLENBQVNFLENBQUFBLENBQUFBLENBQVVKLENBQVcsRUFDakUsQ0FBQSxLQUFXQSxFQUFZLE9BQVksR0FBQSxNQUFBLENBQzVCLGlCQUFpQkEsQ0FBYTNKLENBQUFBLENBQUFBLENBQUssVUFBVSxNQUFRLENBQUEsQ0FBRSxJQUFBQSxDQUFJLENBQUMsQ0FBQyxDQUNoRSxFQUFBLGVBQUEsQ0FBZ0IsVUFBVUEsQ0FBRyxDQUFBLENBQUc2SixFQUFTRSxDQUFVSixDQUFBQSxDQUFBQSxDQUFZLEtBQUssQ0FFN0RBLENBQUFBLENBQUFBLENBQVksYUFBZSxDQUNwQ0ksRUFBQUEsQ0FBQUEsQ0FBUyxRQUFVLENBQ25CLENBQUEsQ0FBQSxjQUFBLENBQWUsVUFBVS9KLENBQUcsQ0FBQSxDQUFHNkosRUFBU0YsQ0FBVyxDQUFBLEVBRW5ELGlCQUFpQjNKLENBQUs2SixDQUFBQSxDQUFBQSxDQUFTRSxDQUFVSixDQUFBQSxDQUFXLEVBRXhELENBTUEsU0FBUyxpQkFBa0IvRixDQUFBQSxDQUFBQSxDQUFNLENBQy9CLElBQU01RCxDQUFBQSxDQUFNLFVBQVU0RCxDQUFJLENBQUEsQ0FDMUIsR0FBSSxDQUFDNUQsQ0FBQUEsQ0FDSCxPQUFPLENBRVQsQ0FBQSxDQUFBLElBQU02SyxFQUFhN0ssQ0FBSSxDQUFBLFVBQUEsQ0FDdkIsUUFBU21ILENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUkwRCxDQUFXLENBQUEsTUFBQSxDQUFRMUQsSUFBSyxDQUMxQyxJQUFNM0MsRUFBV3FHLENBQVcxRCxDQUFBQSxDQUFDLEVBQUUsSUFDL0IsQ0FBQSxHQUFJLFdBQVczQyxDQUFVLENBQUEsUUFBUSxHQUFLLFVBQVdBLENBQUFBLENBQUFBLENBQVUsYUFBYSxDQUN0RSxFQUFBLFVBQUEsQ0FBV0EsRUFBVSxRQUFRLENBQUEsRUFBSyxXQUFXQSxDQUFVLENBQUEsYUFBYSxFQUNwRSxPQUFPLENBQUEsQ0FFWCxDQUNBLE9BQU8sQ0FBQSxDQUNULENBTUEsSUFBTSxXQUFBLENBQWMsSUFBSSxjQUFlLEVBQUEsQ0FDcEMsaUJBQWlCLHdKQUN5RCxDQUFBLENBRTdFLFNBQVMsZUFBZ0J4RSxDQUFBQSxDQUFBQSxDQUFLOEssRUFBVSxDQUNsQyxpQkFBQSxDQUFrQjlLLENBQUcsQ0FDdkI4SyxFQUFBQSxDQUFBQSxDQUFTLEtBQUssU0FBVTlLLENBQUFBLENBQUcsQ0FBQyxDQUU5QixDQUFBLElBQU0rSyxFQUFPLFdBQVksQ0FBQSxRQUFBLENBQVMvSyxDQUFHLENBQ2pDNEQsQ0FBQUEsQ0FBQUEsQ0FBTyxLQUNYLEtBQU9BLENBQUFBLENBQU9tSCxFQUFLLFdBQVksRUFBQSxFQUFHRCxFQUFTLElBQUssQ0FBQSxTQUFBLENBQVVsSCxDQUFJLENBQUMsRUFDakUsQ0FFQSxTQUFTLHdCQUF5QjVELENBQUFBLENBQUFBLENBQUssQ0FFckMsSUFBTThLLENBQUFBLENBQVcsRUFDakIsQ0FBQSxHQUFJOUssYUFBZSxnQkFDakIsQ0FBQSxJQUFBLElBQVc2RCxLQUFTN0QsQ0FBSSxDQUFBLFVBQUEsQ0FDdEIsZ0JBQWdCNkQsQ0FBT2lILENBQUFBLENBQVEsT0FHakMsZUFBZ0I5SyxDQUFBQSxDQUFBQSxDQUFLOEssQ0FBUSxDQUUvQixDQUFBLE9BQU9BLENBQ1QsQ0FNQSxTQUFTLHNCQUFzQjlLLENBQUssQ0FBQSxDQUNsQyxHQUFJQSxDQUFJLENBQUEsZ0JBQUEsQ0FBa0IsQ0FDeEIsSUFBTWdMLENBQUFBLENBQWtCLG1FQUVsQkMsQ0FBcUIsQ0FBQSxHQUMzQixJQUFXL0osSUFBQUEsQ0FBQUEsSUFBSyxXQUFZLENBQzFCLElBQU1pRSxDQUFZLENBQUEsVUFBQSxDQUFXakUsQ0FBQyxDQUFBLENBQzlCLEdBQUlpRSxDQUFVLENBQUEsWUFBQSxDQUFjLENBQzFCLElBQUkrRixDQUFBQSxDQUFZL0YsRUFBVSxZQUFhLEVBQUEsQ0FDbkMrRixHQUNGRCxDQUFtQixDQUFBLElBQUEsQ0FBS0MsQ0FBUyxFQUVyQyxDQUNGLENBS0EsT0FIZ0JsTCxDQUFBQSxDQUFJLGlCQUFpQixhQUFnQmdMLENBQUFBLENBQUFBLENBQWtCLG9GQUNQQyxDQUFtQixDQUFBLElBQUEsR0FBTyxHQUFJRSxDQUFBQSxDQUFBQSxFQUFLLEtBQU9BLENBQUMsQ0FBQSxDQUFFLEtBQUssRUFBRSxDQUFDLENBR3ZILENBQ0UsS0FBQSxPQUFPLEVBRVgsQ0FPQSxTQUFTLHlCQUEwQjdILENBQUFBLENBQUFBLENBQUssQ0FDdEMsSUFBTXRELENBQUFBLENBQXlELE9BQVEsQ0FBQSxTQUFBLENBQVVzRCxDQUFJLENBQUEsTUFBTSxFQUFHLDhCQUE4QixDQUFBLENBQ3RIb0QsRUFBZSxrQkFBbUJwRCxDQUFBQSxDQUFHLEVBQ3ZDb0QsQ0FDRkEsR0FBQUEsQ0FBQUEsQ0FBYSxrQkFBb0IxRyxDQUVyQyxFQUFBLENBS0EsU0FBUywyQkFBNEJzRCxDQUFBQSxDQUFBQSxDQUFLLENBQ3hDLElBQU1vRCxDQUFBQSxDQUFlLG1CQUFtQnBELENBQUcsQ0FBQSxDQUN2Q29ELElBQ0ZBLENBQWEsQ0FBQSxpQkFBQSxDQUFvQixNQUVyQyxDQU1BLFNBQVMsbUJBQW1CcEQsQ0FBSyxDQUFBLENBQy9CLElBQU10RCxDQUFNLENBQUEsT0FBQSxDQUFRLFVBQVVzRCxDQUFJLENBQUEsTUFBTSxFQUFHLDhCQUE4QixDQUFBLENBQ3pFLEdBQUksQ0FBQ3RELENBQUFBLENBQ0gsT0FFRixJQUFNb0wsQ0FBQUEsQ0FBTyxjQUFjLEdBQU0sQ0FBQSxlQUFBLENBQWdCcEwsRUFBSyxNQUFNLENBQUEsQ0FBR0EsRUFBSSxXQUFZLEVBQUMsR0FBSyxPQUFRQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FDeEcsQ0FBQSxHQUFLb0wsRUFHTCxPQUFPLGVBQUEsQ0FBZ0JBLENBQUksQ0FDN0IsQ0FLQSxTQUFTLGtCQUFtQnBMLENBQUFBLENBQUFBLENBQUssQ0FJL0JBLENBQUksQ0FBQSxnQkFBQSxDQUFpQixRQUFTLHlCQUF5QixDQUFBLENBQ3ZEQSxFQUFJLGdCQUFpQixDQUFBLFNBQUEsQ0FBVyx5QkFBeUIsQ0FDekRBLENBQUFBLENBQUFBLENBQUksaUJBQWlCLFVBQVksQ0FBQSwyQkFBMkIsRUFDOUQsQ0FPQSxTQUFTLG9CQUFvQkEsQ0FBS3VJLENBQUFBLENBQUFBLENBQVc4QyxFQUFNLENBQ2pELElBQU10QixDQUFXLENBQUEsZUFBQSxDQUFnQi9KLENBQUcsQ0FBQSxDQUMvQixNQUFNLE9BQVErSixDQUFBQSxDQUFBQSxDQUFTLFVBQVUsQ0FDcENBLEdBQUFBLENBQUFBLENBQVMsV0FBYSxFQUFDLENBQUEsQ0FFekIsSUFBSS9ILENBRUVzSixDQUFBQSxDQUFBQSxDQUFXLFNBQVNwSyxDQUFHLENBQUEsQ0FDM0IsVUFBVWxCLENBQUssQ0FBQSxVQUFXLENBQ3BCLGFBQWNBLENBQUFBLENBQUcsSUFHaEJnQyxDQUNIQSxHQUFBQSxDQUFBQSxDQUFPLElBQUksUUFBUyxDQUFBLE9BQUEsQ0FBU3FKLENBQUksQ0FFbkNySixDQUFBQSxDQUFBQSxDQUFBQSxDQUFLLEtBQUtoQyxDQUFLa0IsQ0FBQUEsQ0FBQyxHQUNsQixDQUFDLEVBQ0gsRUFDQWxCLENBQUksQ0FBQSxnQkFBQSxDQUFpQnVJLEVBQVcrQyxDQUFRLENBQUEsQ0FDeEN2QixFQUFTLFVBQVcsQ0FBQSxJQUFBLENBQUssQ0FBRSxLQUFBLENBQU94QixDQUFXLENBQUEsUUFBQSxDQUFBK0MsQ0FBUyxDQUFDLEVBQ3pELENBS0EsU0FBUyxtQkFBQSxDQUFvQnRMLEVBQUssQ0FFaEMsZ0JBQUEsQ0FBaUJBLENBQUcsQ0FFcEIsQ0FBQSxJQUFBLElBQVNzQyxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUl0QyxFQUFJLFVBQVcsQ0FBQSxNQUFBLENBQVFzQyxJQUFLLENBQzlDLElBQU0vQixFQUFPUCxDQUFJLENBQUEsVUFBQSxDQUFXc0MsQ0FBQyxDQUFFLENBQUEsSUFBQSxDQUN6Qm9CLEVBQVExRCxDQUFJLENBQUEsVUFBQSxDQUFXc0MsQ0FBQyxDQUFFLENBQUEsS0FBQSxDQUNoQyxHQUFJLFVBQVcvQixDQUFBQSxDQUFBQSxDQUFNLE9BQU8sQ0FBSyxFQUFBLFVBQUEsQ0FBV0EsRUFBTSxZQUFZLENBQUEsQ0FBRyxDQUMvRCxJQUFNZ0wsQ0FBQUEsQ0FBa0JoTCxDQUFLLENBQUEsT0FBQSxDQUFRLEtBQUssQ0FBQSxDQUFJLEVBQ3hDaUwsQ0FBV2pMLENBQUFBLENBQUFBLENBQUssTUFBTWdMLENBQWlCQSxDQUFBQSxDQUFBQSxDQUFrQixDQUFDLENBQ2hFLENBQUEsR0FBSUMsSUFBYSxHQUFPQSxFQUFBQSxDQUFBQSxHQUFhLElBQUssQ0FDeEMsSUFBSWpELEVBQVloSSxDQUFLLENBQUEsS0FBQSxDQUFNZ0wsRUFBa0IsQ0FBQyxDQUFBLENBRTFDLFdBQVdoRCxDQUFXLENBQUEsR0FBRyxFQUMzQkEsQ0FBWSxDQUFBLE1BQUEsQ0FBU0EsRUFDWixVQUFXQSxDQUFBQSxDQUFBQSxDQUFXLEdBQUcsQ0FDbENBLENBQUFBLENBQUFBLENBQVksUUFBVUEsQ0FBVSxDQUFBLEtBQUEsQ0FBTSxDQUFDLENBQzlCLENBQUEsVUFBQSxDQUFXQSxFQUFXLE9BQU8sQ0FBQSxHQUN0Q0EsRUFBWSxPQUFVQSxDQUFBQSxDQUFBQSxDQUFVLE1BQU0sQ0FBQyxDQUFBLENBQUEsQ0FHekMsb0JBQW9CdkksQ0FBS3VJLENBQUFBLENBQUFBLENBQVc3RSxDQUFLLEVBQzNDLENBQ0YsQ0FDRixDQUNGLENBS0EsU0FBUyxRQUFTMUQsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNyQixHQUFJLE9BQUEsQ0FBUUEsRUFBSyxJQUFLLENBQUEsTUFBQSxDQUFPLGVBQWUsQ0FBRyxDQUFBLENBQzdDLGVBQWVBLENBQUcsQ0FBQSxDQUNsQixNQUNGLENBQ0EsSUFBTStKLEVBQVcsZUFBZ0IvSixDQUFBQSxDQUFHLEVBQ3BDLEdBQUkrSixDQUFBQSxDQUFTLFdBQWEsYUFBYy9KLENBQUFBLENBQUcsRUFBRyxDQUU1QyxVQUFBLENBQVdBLENBQUcsQ0FFZCtKLENBQUFBLENBQUFBLENBQVMsU0FBVyxhQUFjL0osQ0FBQUEsQ0FBRyxDQUVyQyxDQUFBLFlBQUEsQ0FBYUEsQ0FBSyxDQUFBLHdCQUF3QixFQUd0Q0EsQ0FBSSxDQUFBLEtBQUEsR0FFTitKLEVBQVMsU0FBWS9KLENBQUFBLENBQUFBLENBQUksT0FHM0IsSUFBTXVKLENBQUFBLENBQWUsZ0JBQWdCdkosQ0FBRyxDQUFBLENBQ1YsYUFBYUEsQ0FBSytKLENBQUFBLENBQUFBLENBQVVSLENBQVksQ0FHaEUsR0FBQSx3QkFBQSxDQUF5QnZKLEVBQUssVUFBVSxDQUFBLEdBQU0sT0FDaEQsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBSytKLEVBQVVSLENBQVksQ0FBQSxDQUMvQixhQUFhdkosQ0FBSyxDQUFBLFlBQVksR0FDdkN1SixDQUFhLENBQUEsT0FBQSxDQUFRLFNBQVNJLENBQWEsQ0FBQSxDQUV6QyxrQkFBa0IzSixDQUFLMkosQ0FBQUEsQ0FBQUEsQ0FBYUksRUFBVSxVQUFXLEVBQ3hELEVBQ0gsQ0FBQyxDQU1EL0osQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFZLEdBQUEsTUFBQSxFQUFXLGdCQUFnQkEsQ0FBSyxDQUFBLE1BQU0sSUFBTSxRQUFZLEVBQUEsWUFBQSxDQUFhQSxFQUFLLE1BQU0sQ0FBQSxHQUNsRyxtQkFBbUJBLENBQUcsQ0FBQSxDQUd4QixhQUFhQSxDQUFLLENBQUEsdUJBQXVCLEVBQzNDLENBQ0YsQ0FTQSxTQUFTLFdBQVlBLENBQUFBLENBQUFBLENBQUssQ0FFeEIsR0FEQUEsQ0FBQUEsQ0FBTSxjQUFjQSxDQUFHLENBQUEsQ0FDbkIsUUFBUUEsQ0FBSyxDQUFBLElBQUEsQ0FBSyxPQUFPLGVBQWUsQ0FBQSxDQUFHLENBQzdDLGNBQWVBLENBQUFBLENBQUcsRUFDbEIsTUFDRixDQUNBLFNBQVNBLENBQUcsQ0FBQSxDQUNaLFFBQVEscUJBQXNCQSxDQUFBQSxDQUFHLENBQUcsQ0FBQSxTQUFTNkQsQ0FBTyxDQUFBLENBQUUsU0FBU0EsQ0FBSyxFQUFFLENBQUMsQ0FDdkUsQ0FBQSxPQUFBLENBQVEseUJBQXlCN0QsQ0FBRyxDQUFBLENBQUcsbUJBQW1CLEVBQzVELENBVUEsU0FBUyxjQUFlSyxDQUFBQSxDQUFBQSxDQUFLLENBQzNCLE9BQU9BLENBQUFBLENBQUksUUFBUSxvQkFBc0IsQ0FBQSxPQUFPLEVBQUUsV0FBWSxFQUNoRSxDQU9BLFNBQVMsU0FBQSxDQUFVa0ksRUFBV0MsQ0FBUSxDQUFBLENBQ3BDLElBQUlsRixDQUNKLENBQUEsT0FBSSxPQUFPLFdBQWUsRUFBQSxPQUFPLE9BQU8sV0FBZ0IsRUFBQSxVQUFBLENBR3REQSxFQUFNLElBQUksV0FBQSxDQUFZaUYsRUFBVyxDQUFFLE9BQUEsQ0FBUyxHQUFNLFVBQVksQ0FBQSxDQUFBLENBQUEsQ0FBTSxTQUFVLENBQU0sQ0FBQSxDQUFBLE1BQUEsQ0FBQUMsQ0FBTyxDQUFDLENBQUEsRUFFNUZsRixFQUFNLFdBQVksRUFBQSxDQUFFLFlBQVksYUFBYSxDQUFBLENBQzdDQSxFQUFJLGVBQWdCaUYsQ0FBQUEsQ0FBQUEsQ0FBVyxHQUFNLENBQU1DLENBQUFBLENBQUFBLENBQU0sR0FFNUNsRixDQUNULENBT0EsU0FBUyxpQkFBa0J0RCxDQUFBQSxDQUFBQSxDQUFLdUksRUFBV0MsQ0FBUSxDQUFBLENBQ2pELGFBQWF4SSxDQUFLdUksQ0FBQUEsQ0FBQUEsQ0FBVyxhQUFhLENBQUUsS0FBQSxDQUFPQSxDQUFVLENBQUdDLENBQUFBLENBQU0sQ0FBQyxFQUN6RSxDQU1BLFNBQVMscUJBQXNCRCxDQUFBQSxDQUFBQSxDQUFXLENBQ3hDLE9BQU9BLENBQUFBLEdBQWMsdUJBQ3ZCLENBV0EsU0FBUyxjQUFBLENBQWV2SSxFQUFLeUwsQ0FBTSxDQUFBLENBQ2pDLFFBQVEsYUFBY3pMLENBQUFBLENBQUcsRUFBRyxTQUFTbUYsQ0FBQUEsQ0FBVyxDQUM5QyxHQUFJLENBQ0ZzRyxFQUFLdEcsQ0FBUyxFQUNoQixPQUFTakUsQ0FBRyxDQUFBLENBQ1YsU0FBU0EsQ0FBQyxFQUNaLENBQ0YsQ0FBQyxFQUNILENBRUEsU0FBUyxRQUFBLENBQVN3SyxFQUFLLENBQ2pCLE9BQUEsQ0FBUSxNQUNWLE9BQVEsQ0FBQSxLQUFBLENBQU1BLENBQUcsQ0FDUixDQUFBLE9BQUEsQ0FBUSxLQUNqQixPQUFRLENBQUEsR0FBQSxDQUFJLFVBQVdBLENBQUcsRUFFOUIsQ0FZQSxTQUFTLFlBQUEsQ0FBYTFMLENBQUt1SSxDQUFBQSxDQUFBQSxDQUFXQyxDQUFRLENBQUEsQ0FDNUN4SSxFQUFNLGFBQWNBLENBQUFBLENBQUcsRUFDbkJ3SSxDQUFVLEVBQUEsSUFBQSxHQUNaQSxFQUFTLEVBQUMsQ0FBQSxDQUVaQSxFQUFPLEdBQU14SSxDQUFBQSxDQUFBQSxDQUNiLElBQU11RCxDQUFRLENBQUEsU0FBQSxDQUFVZ0YsRUFBV0MsQ0FBTSxDQUFBLENBQ3JDLEtBQUssTUFBVSxFQUFBLENBQUMsc0JBQXNCRCxDQUFTLENBQUEsRUFDakQsS0FBSyxNQUFPdkksQ0FBQUEsQ0FBQUEsQ0FBS3VJLEVBQVdDLENBQU0sQ0FBQSxDQUVoQ0EsRUFBTyxLQUNULEdBQUEsUUFBQSxDQUFTQSxFQUFPLEtBQUssQ0FBQSxDQUNyQixhQUFheEksQ0FBSyxDQUFBLFlBQUEsQ0FBYyxDQUFFLFNBQVd3SSxDQUFBQSxDQUFPLENBQUMsQ0FFdkQsQ0FBQSxDQUFBLElBQUltRCxDQUFjM0wsQ0FBQUEsQ0FBQUEsQ0FBSSxhQUFjdUQsQ0FBQUEsQ0FBSyxFQUNuQ3FJLENBQVksQ0FBQSxjQUFBLENBQWVyRCxDQUFTLENBQzFDLENBQUEsR0FBSW9ELEdBQWVDLENBQWNyRCxHQUFBQSxDQUFBQSxDQUFXLENBQzFDLElBQU1zRCxDQUFBQSxDQUFlLFVBQVVELENBQVdySSxDQUFBQSxDQUFBQSxDQUFNLE1BQU0sQ0FDdERvSSxDQUFBQSxDQUFBQSxDQUFjQSxHQUFlM0wsQ0FBSSxDQUFBLGFBQUEsQ0FBYzZMLENBQVksRUFDN0QsQ0FDQSxzQkFBZSxTQUFVN0wsQ0FBQUEsQ0FBRyxFQUFHLFNBQVNtRixDQUFBQSxDQUFXLENBQ2pEd0csQ0FBY0EsQ0FBQUEsQ0FBQUEsRUFBZ0J4RyxFQUFVLE9BQVFvRCxDQUFBQSxDQUFBQSxDQUFXaEYsQ0FBSyxDQUFNLEdBQUEsQ0FBQSxDQUFBLEVBQVMsQ0FBQ0EsQ0FBTSxDQUFBLGlCQUN4RixDQUFDLENBQ01vSSxDQUFBQSxDQUNULENBS0EsSUFBSSxxQkFBd0IsQ0FBQSxRQUFBLENBQVMsU0FBVyxRQUFTLENBQUEsTUFBQSxDQUt6RCxTQUFTLGlCQUFvQixFQUFBLENBRTNCLE9BRG1CLFdBQVksRUFBQSxDQUFFLGNBQWMsd0NBQXdDLENBQUEsRUFDbEUsYUFBYyxDQUFBLElBQ3JDLENBTUEsU0FBUyxrQkFBQSxDQUFtQnZJLEVBQUswSSxDQUFTLENBQUEsQ0FDeEMsR0FBSSxDQUFDLHFCQUFBLEdBQ0gsT0FJRixJQUFNQyxFQUFZLHdCQUF5QkQsQ0FBQUEsQ0FBTyxFQUM1Q0UsQ0FBUSxDQUFBLFdBQUEsR0FBYyxLQUN0QkMsQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFPLE9BRXRCLENBQUEsR0FBSSxLQUFLLE1BQU8sQ0FBQSxnQkFBQSxFQUFvQixFQUFHLENBRXJDLFlBQUEsQ0FBYSxVQUFXLENBQUEsb0JBQW9CLENBQzVDLENBQUEsTUFDRixDQUVBN0ksQ0FBTSxDQUFBLGFBQUEsQ0FBY0EsQ0FBRyxDQUV2QixDQUFBLElBQU04SSxFQUFlLFNBQVUsQ0FBQSxZQUFBLENBQWEsUUFBUSxvQkFBb0IsQ0FBQyxHQUFLLEVBQUMsQ0FDL0UsUUFBUzVKLENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUk0SixDQUFhLENBQUEsTUFBQSxDQUFRNUosSUFDdkMsR0FBSTRKLENBQUFBLENBQWE1SixDQUFDLENBQUUsQ0FBQSxHQUFBLEdBQVFjLEVBQUssQ0FDL0I4SSxDQUFBQSxDQUFhLE9BQU81SixDQUFHLENBQUEsQ0FBQyxFQUN4QixLQUNGLENBSUYsSUFBTTZKLENBQWlCLENBQUEsQ0FBRSxJQUFBL0ksQ0FBSyxDQUFBLE9BQUEsQ0FBUzJJLEVBQVcsS0FBQUMsQ0FBQUEsQ0FBQUEsQ0FBTyxNQUFBQyxDQUFBQSxDQUFPLENBS2hFLENBQUEsSUFIQSxhQUFhLFdBQVksRUFBQSxDQUFFLEtBQU0seUJBQTJCLENBQUEsQ0FBRSxLQUFNRSxDQUFnQixDQUFBLEtBQUEsQ0FBT0QsQ0FBYSxDQUFDLENBQUEsQ0FFekdBLEVBQWEsSUFBS0MsQ0FBQUEsQ0FBYyxFQUN6QkQsQ0FBYSxDQUFBLE1BQUEsQ0FBUyxLQUFLLE1BQU8sQ0FBQSxnQkFBQSxFQUN2Q0EsRUFBYSxLQUFNLEVBQUEsQ0FJckIsS0FBT0EsQ0FBYSxDQUFBLE1BQUEsQ0FBUyxHQUMzQixHQUFJLENBQ0YsYUFBYSxPQUFRLENBQUEsb0JBQUEsQ0FBc0IsS0FBSyxTQUFVQSxDQUFBQSxDQUFZLENBQUMsQ0FDdkUsQ0FBQSxLQUNGLE9BQVNoTCxDQUFHLENBQUEsQ0FDVixrQkFBa0IsV0FBWSxFQUFBLENBQUUsSUFBTSxDQUFBLHdCQUFBLENBQTBCLENBQUUsS0FBQSxDQUFPQSxFQUFHLEtBQU9nTCxDQUFBQSxDQUFhLENBQUMsQ0FDakdBLENBQUFBLENBQUFBLENBQWEsUUFDZixDQUVKLENBY0EsU0FBUyxnQkFBQSxDQUFpQjlJLEVBQUssQ0FDN0IsR0FBSSxDQUFDLHFCQUFzQixFQUFBLENBQ3pCLE9BQU8sSUFHVEEsQ0FBQUEsQ0FBQUEsQ0FBTSxjQUFjQSxDQUFHLENBQUEsQ0FFdkIsSUFBTThJLENBQWUsQ0FBQSxTQUFBLENBQVUsYUFBYSxPQUFRLENBQUEsb0JBQW9CLENBQUMsQ0FBSyxFQUFBLEdBQzlFLElBQVM1SixJQUFBQSxDQUFBQSxDQUFJLEVBQUdBLENBQUk0SixDQUFBQSxDQUFBQSxDQUFhLE9BQVE1SixDQUN2QyxFQUFBLENBQUEsR0FBSTRKLEVBQWE1SixDQUFDLENBQUEsQ0FBRSxNQUFRYyxDQUMxQixDQUFBLE9BQU84SSxFQUFhNUosQ0FBQyxDQUFBLENBR3pCLE9BQU8sSUFDVCxDQU1BLFNBQVMsd0JBQXlCdEMsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNyQyxJQUFNb00sQ0FBQUEsQ0FBWSxLQUFLLE1BQU8sQ0FBQSxZQUFBLENBQ3hCQyxFQUE4QnJNLENBQUksQ0FBQSxTQUFBLENBQVUsRUFBSSxDQUN0RCxDQUFBLE9BQUEsT0FBQSxDQUFRLFFBQVFxTSxDQUFPLENBQUEsR0FBQSxDQUFNRCxDQUFTLENBQUcsQ0FBQSxTQUFTdkksRUFBTyxDQUN2RCxzQkFBQSxDQUF1QkEsRUFBT3VJLENBQVMsRUFDekMsQ0FBQyxDQUVELENBQUEsT0FBQSxDQUFRLFFBQVFDLENBQU8sQ0FBQSx5QkFBeUIsRUFBRyxTQUFTeEksQ0FBQUEsQ0FBTyxDQUNqRUEsQ0FBTSxDQUFBLGVBQUEsQ0FBZ0IsVUFBVSxFQUNsQyxDQUFDLENBQUEsQ0FDTXdJLEVBQU0sU0FDZixDQUVBLFNBQVMsd0JBQTJCLEVBQUEsQ0FDbEMsSUFBTXJNLENBQU0sQ0FBQSxpQkFBQSxHQUNObUQsQ0FBTyxDQUFBLHFCQUFBLEVBQXlCLFNBQVMsUUFBVyxDQUFBLFFBQUEsQ0FBUyxPQU8vRG1KLENBQ0osQ0FBQSxHQUFJLENBQ0ZBLENBQXNCLENBQUEsV0FBQSxHQUFjLGFBQWMsQ0FBQSxvREFBb0QsRUFDeEcsQ0FBWSxLQUFBLENBRVZBLEVBQXNCLFdBQVksRUFBQSxDQUFFLGNBQWMsZ0RBQWdELEVBQ3BHLENBQ0tBLENBQ0gsR0FBQSxZQUFBLENBQWEsYUFBYyxDQUFBLElBQUEsQ0FBTSx5QkFBMEIsQ0FBRSxJQUFBLENBQUFuSixFQUFNLFVBQVluRCxDQUFBQSxDQUFJLENBQUMsQ0FBQSxDQUNwRixrQkFBbUJtRCxDQUFBQSxDQUFBQSxDQUFNbkQsQ0FBRyxDQUcxQixDQUFBLENBQUEsSUFBQSxDQUFLLE9BQU8sY0FBZ0IsRUFBQSxPQUFBLENBQVEsYUFBYSxDQUFFLElBQUEsQ0FBTSxFQUFLLENBQUcsQ0FBQSxXQUFBLEdBQWMsS0FBTyxDQUFBLE1BQUEsQ0FBTyxTQUFTLElBQUksRUFDaEgsQ0FLQSxTQUFTLGtCQUFBLENBQW1CbUQsRUFBTSxDQUU1QixJQUFBLENBQUssT0FBTyxtQkFDZEEsR0FBQUEsQ0FBQUEsQ0FBT0EsRUFBSyxPQUFRLENBQUEsaUNBQUEsQ0FBbUMsRUFBRSxDQUNyRCxDQUFBLENBQUEsUUFBQSxDQUFTQSxFQUFNLEdBQUcsQ0FBQSxFQUFLLFNBQVNBLENBQU0sQ0FBQSxHQUFHLEtBQzNDQSxDQUFPQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FBRyxDQUFBLENBQUEsQ0FBRSxDQUd2QixDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUssTUFBTyxDQUFBLGNBQUEsRUFDZCxRQUFRLFNBQVUsQ0FBQSxDQUFFLEtBQU0sQ0FBSyxDQUFBLENBQUEsQ0FBRyxHQUFJQSxDQUFJLENBQUEsQ0FFNUMsc0JBQXdCQSxFQUMxQixDQUtBLFNBQVMsbUJBQW9CQSxDQUFBQSxDQUFBQSxDQUFNLENBQzdCLElBQUssQ0FBQSxNQUFBLENBQU8sZ0JBQWdCLE9BQVEsQ0FBQSxZQUFBLENBQWEsQ0FBRSxJQUFNLENBQUEsQ0FBQSxDQUFLLEVBQUcsRUFBSUEsQ0FBQUEsQ0FBSSxFQUM3RSxxQkFBd0JBLENBQUFBLEVBQzFCLENBS0EsU0FBUyxpQkFBQSxDQUFrQm9KLEVBQU8sQ0FDaEMsT0FBQSxDQUFRQSxFQUFPLFNBQVN0RSxDQUFBQSxDQUFNLENBQzVCQSxDQUFLLENBQUEsSUFBQSxDQUFLLE1BQVMsRUFDckIsQ0FBQyxFQUNILENBS0EsU0FBUyxzQkFBc0I5RSxDQUFNLENBQUEsQ0FDbkMsSUFBTXFKLENBQVUsQ0FBQSxJQUFJLGVBQ2RDLENBQVUsQ0FBQSxDQUFFLEtBQUF0SixDQUFNLENBQUEsR0FBQSxDQUFLcUosQ0FBUSxDQUNyQyxDQUFBLFlBQUEsQ0FBYSxhQUFjLENBQUEsSUFBQSxDQUFNLHdCQUF5QkMsQ0FBTyxDQUFBLENBQ2pFRCxFQUFRLElBQUssQ0FBQSxLQUFBLENBQU9ySixFQUFNLENBQUksQ0FBQSxDQUFBLENBQzlCcUosRUFBUSxnQkFBaUIsQ0FBQSxZQUFBLENBQWMsTUFBTSxDQUM3Q0EsQ0FBQUEsQ0FBQUEsQ0FBUSxpQkFBaUIsNEJBQThCLENBQUEsTUFBTSxFQUM3REEsQ0FBUSxDQUFBLGdCQUFBLENBQWlCLGlCQUFrQixXQUFZLEVBQUEsQ0FBRSxTQUFTLElBQUksQ0FBQSxDQUN0RUEsQ0FBUSxDQUFBLE1BQUEsQ0FBUyxVQUFXLENBQzFCLEdBQUksSUFBSyxDQUFBLE1BQUEsRUFBVSxLQUFPLElBQUssQ0FBQSxNQUFBLENBQVMsSUFBSyxDQUMzQyxZQUFBLENBQWEsYUFBYyxDQUFBLElBQUEsQ0FBTSw0QkFBNkJDLENBQU8sQ0FBQSxDQUNyRSxJQUFNbEwsQ0FBVyxDQUFBLFlBQUEsQ0FBYSxLQUFLLFFBQVEsQ0FBQSxDQUVyQzhGLEVBQVU5RixDQUFTLENBQUEsYUFBQSxDQUFjLHdDQUF3QyxDQUFLQSxFQUFBQSxDQUFBQSxDQUM5RW1MLEVBQWlCLGlCQUFrQixFQUFBLENBQ25DcEgsRUFBYSxjQUFlb0gsQ0FBQUEsQ0FBYyxFQUNoRCxXQUFZbkwsQ0FBQUEsQ0FBQUEsQ0FBUyxLQUFLLENBRTFCLENBQUEsYUFBQSxDQUFjbUwsRUFBZ0JyRixDQUFTL0IsQ0FBQUEsQ0FBVSxFQUNqRCxpQkFBa0JBLENBQUFBLENBQUFBLENBQVcsS0FBSyxDQUFBLENBQ2xDLHFCQUF3Qm5DLENBQUFBLENBQUFBLENBQ3hCLGFBQWEsV0FBWSxFQUFBLENBQUUsS0FBTSxxQkFBdUIsQ0FBQSxDQUFFLEtBQUFBLENBQU0sQ0FBQSxTQUFBLENBQVcsR0FBTSxjQUFnQixDQUFBLElBQUEsQ0FBSyxRQUFTLENBQUMsRUFDbEgsTUFDRSxpQkFBa0IsQ0FBQSxXQUFBLEdBQWMsSUFBTSxDQUFBLGdDQUFBLENBQWtDc0osQ0FBTyxFQUVuRixDQUFBLENBQ0FELEVBQVEsSUFBSyxHQUNmLENBS0EsU0FBUyxjQUFBLENBQWVySixFQUFNLENBQzVCLHdCQUFBLEdBQ0FBLENBQU9BLENBQUFBLENBQUFBLEVBQVEsU0FBUyxRQUFXLENBQUEsUUFBQSxDQUFTLE9BQzVDLElBQU13SixDQUFBQSxDQUFTLGlCQUFpQnhKLENBQUksQ0FBQSxDQUNwQyxHQUFJd0osQ0FBQUEsQ0FBUSxDQUNWLElBQU1wTCxFQUFXLFlBQWFvTCxDQUFBQSxDQUFBQSxDQUFPLE9BQU8sQ0FDdENELENBQUFBLENBQUFBLENBQWlCLG1CQUNqQnBILENBQUFBLENBQUFBLENBQWEsZUFBZW9ILENBQWMsQ0FBQSxDQUNoRCxZQUFZbkwsQ0FBUyxDQUFBLEtBQUssRUFDMUIsYUFBY21MLENBQUFBLENBQUFBLENBQWdCbkwsRUFBVStELENBQVUsQ0FBQSxDQUNsRCxrQkFBa0JBLENBQVcsQ0FBQSxLQUFLLEVBQ2xDLFNBQVUsRUFBQSxDQUFFLFdBQVcsVUFBVyxDQUNoQyxPQUFPLFFBQVMsQ0FBQSxDQUFBLENBQUdxSCxFQUFPLE1BQU0sRUFDbEMsRUFBRyxDQUFDLENBQUEsQ0FDSixzQkFBd0J4SixDQUN4QixDQUFBLFlBQUEsQ0FBYSxhQUFjLENBQUEsSUFBQSxDQUFNLHNCQUF1QixDQUFFLElBQUEsQ0FBQUEsRUFBTSxJQUFNd0osQ0FBQUEsQ0FBTyxDQUFDLEVBQ2hGLENBQUEsS0FDTSxLQUFLLE1BQU8sQ0FBQSxvQkFBQSxDQUdkLE9BQU8sUUFBUyxDQUFBLE1BQUEsQ0FBTyxFQUFJLENBRTNCLENBQUEscUJBQUEsQ0FBc0J4SixDQUFJLEVBR2hDLENBTUEsU0FBUywwQkFBMkJuRCxDQUFBQSxDQUFBQSxDQUFLLENBQ3ZDLElBQUk0TSxDQUFBQSxDQUFxQyxxQkFBcUI1TSxDQUFLLENBQUEsY0FBYyxFQUNqRixPQUFJNE0sQ0FBQUEsRUFBYyxPQUNoQkEsQ0FBYSxDQUFBLENBQUM1TSxDQUFHLENBRW5CLENBQUEsQ0FBQSxPQUFBLENBQVE0TSxFQUFZLFNBQVNDLENBQUFBLENBQUksQ0FDL0IsSUFBTW5HLENBQUFBLENBQWUsZ0JBQWdCbUcsQ0FBRSxDQUFBLENBQ3ZDbkcsQ0FBYSxDQUFBLFlBQUEsQ0FBQSxDQUFnQkEsQ0FBYSxDQUFBLFlBQUEsRUFBZ0IsR0FBSyxDQUMvRG1HLENBQUFBLENBQUFBLENBQUcsVUFBVSxHQUFJLENBQUEsSUFBQSxDQUFLQSxFQUFHLFNBQVcsQ0FBQSxJQUFBLENBQUssT0FBTyxZQUFZLEVBQzlELENBQUMsQ0FDTUQsQ0FBQUEsQ0FDVCxDQU1BLFNBQVMsZUFBQSxDQUFnQjVNLEVBQUssQ0FDNUIsSUFBSThNLEVBQXVDLG9CQUFxQjlNLENBQUFBLENBQUFBLENBQUssaUJBQWlCLENBQ3RGLENBQUEsT0FBSThNLEdBQWdCLElBQ2xCQSxHQUFBQSxDQUFBQSxDQUFlLEVBRWpCLENBQUEsQ0FBQSxPQUFBLENBQVFBLEVBQWMsU0FBU0MsQ0FBQUEsQ0FBaUIsQ0FDOUMsSUFBTXJHLENBQUFBLENBQWUsZ0JBQWdCcUcsQ0FBZSxDQUFBLENBQ3BEckcsRUFBYSxZQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBYSxZQUFnQixFQUFBLENBQUEsRUFBSyxDQUMvRHFHLENBQUFBLENBQUFBLENBQWdCLGFBQWEsVUFBWSxDQUFBLEVBQUUsRUFDM0NBLENBQWdCLENBQUEsWUFBQSxDQUFhLHdCQUF5QixFQUFFLEVBQzFELENBQUMsQ0FDTUQsQ0FBQUEsQ0FDVCxDQU1BLFNBQVMsdUJBQUEsQ0FBd0JGLEVBQVlJLENBQVUsQ0FBQSxDQUNyRCxRQUFRSixDQUFZLENBQUEsU0FBU0MsRUFBSSxDQUMvQixJQUFNbkcsRUFBZSxlQUFnQm1HLENBQUFBLENBQUUsRUFDdkNuRyxDQUFhLENBQUEsWUFBQSxDQUFBLENBQWdCQSxFQUFhLFlBQWdCLEVBQUEsQ0FBQSxFQUFLLEVBQzNEQSxDQUFhLENBQUEsWUFBQSxHQUFpQixHQUNoQ21HLENBQUcsQ0FBQSxTQUFBLENBQVUsT0FBTyxJQUFLQSxDQUFBQSxDQUFBQSxDQUFHLFVBQVcsSUFBSyxDQUFBLE1BQUEsQ0FBTyxZQUFZLEVBRW5FLENBQUMsQ0FBQSxDQUNELFFBQVFHLENBQVUsQ0FBQSxTQUFTRCxFQUFpQixDQUMxQyxJQUFNckcsRUFBZSxlQUFnQnFHLENBQUFBLENBQWUsRUFDcERyRyxDQUFhLENBQUEsWUFBQSxDQUFBLENBQWdCQSxFQUFhLFlBQWdCLEVBQUEsQ0FBQSxFQUFLLEVBQzNEQSxDQUFhLENBQUEsWUFBQSxHQUFpQixJQUNoQ3FHLENBQWdCLENBQUEsZUFBQSxDQUFnQixVQUFVLENBQzFDQSxDQUFBQSxDQUFBQSxDQUFnQixnQkFBZ0IsdUJBQXVCLENBQUEsRUFFM0QsQ0FBQyxFQUNILENBV0EsU0FBUyxZQUFhRSxDQUFBQSxDQUFBQSxDQUFXak4sRUFBSyxDQUNwQyxJQUFBLElBQVNzQyxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUkySyxFQUFVLE1BQVEzSyxDQUFBQSxDQUFBQSxFQUFBQSxDQUVwQyxHQURhMkssQ0FBVTNLLENBQUFBLENBQUMsRUFDZixVQUFXdEMsQ0FBQUEsQ0FBRyxFQUNyQixPQUFPLENBQUEsQ0FBQSxDQUdYLE9BQU8sQ0FDVCxDQUFBLENBTUEsU0FBUyxhQUFjNEcsQ0FBQUEsQ0FBQUEsQ0FBUyxDQUU5QixJQUFNNUcsQ0FBQUEsQ0FBdUM0RyxFQUs3QyxPQUpJNUcsQ0FBQUEsQ0FBSSxPQUFTLEVBQU1BLEVBQUFBLENBQUFBLENBQUksTUFBUSxJQUFRQSxFQUFBQSxDQUFBQSxDQUFJLFVBQVksT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBSyxvQkFBb0IsQ0FJeEZBLEVBQUFBLENBQUFBLENBQUksT0FBUyxRQUFZQSxFQUFBQSxDQUFBQSxDQUFJLE9BQVMsUUFBWUEsRUFBQUEsQ0FBQUEsQ0FBSSxVQUFZLE9BQVdBLEVBQUFBLENBQUFBLENBQUksVUFBWSxPQUFXQSxFQUFBQSxDQUFBQSxDQUFJLFVBQVksTUFDbkgsQ0FBQSxDQUFBLENBQUEsQ0FFTEEsRUFBSSxJQUFTLEdBQUEsVUFBQSxFQUFjQSxDQUFJLENBQUEsSUFBQSxHQUFTLE9BQ25DQSxDQUFBQSxDQUFBQSxDQUFJLFFBRU4sQ0FDVCxDQUFBLENBS0EsU0FBUyxrQkFBbUJPLENBQUFBLENBQUFBLENBQU1tRCxFQUFPd0osQ0FBVSxDQUFBLENBQzdDM00sR0FBUSxJQUFRbUQsRUFBQUEsQ0FBQUEsRUFBUyxPQUN2QixLQUFNLENBQUEsT0FBQSxDQUFRQSxDQUFLLENBQ3JCQSxDQUFBQSxDQUFBQSxDQUFNLFFBQVEsU0FBU3lKLENBQUFBLENBQUcsQ0FBRUQsQ0FBUyxDQUFBLE1BQUEsQ0FBTzNNLEVBQU00TSxDQUFDLEVBQUUsQ0FBQyxDQUV0REQsQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFPM00sQ0FBTW1ELENBQUFBLENBQUssR0FHakMsQ0FLQSxTQUFTLHdCQUF3Qm5ELENBQU1tRCxDQUFBQSxDQUFBQSxDQUFPd0osRUFBVSxDQUN0RCxHQUFJM00sR0FBUSxJQUFRbUQsRUFBQUEsQ0FBQUEsRUFBUyxJQUFNLENBQUEsQ0FDakMsSUFBSTBKLENBQUFBLENBQVNGLEVBQVMsTUFBTzNNLENBQUFBLENBQUksRUFDN0IsS0FBTSxDQUFBLE9BQUEsQ0FBUW1ELENBQUssQ0FDckIwSixDQUFBQSxDQUFBQSxDQUFTQSxFQUFPLE1BQU9ELENBQUFBLENBQUFBLEVBQUt6SixFQUFNLE9BQVF5SixDQUFBQSxDQUFDLEVBQUksQ0FBQyxDQUFBLENBRWhEQyxFQUFTQSxDQUFPLENBQUEsTUFBQSxDQUFPRCxHQUFLQSxDQUFNekosR0FBQUEsQ0FBSyxFQUV6Q3dKLENBQVMsQ0FBQSxNQUFBLENBQU8zTSxDQUFJLENBQ3BCLENBQUEsT0FBQSxDQUFRNk0sRUFBUUQsQ0FBS0QsRUFBQUEsQ0FBQUEsQ0FBUyxPQUFPM00sQ0FBTTRNLENBQUFBLENBQUMsQ0FBQyxFQUMvQyxDQUNGLENBU0EsU0FBUyxpQkFBQSxDQUFrQkYsRUFBV0MsQ0FBVUcsQ0FBQUEsQ0FBQUEsQ0FBUXJOLENBQUtzTixDQUFBQSxDQUFBQSxDQUFVLENBQ3JFLEdBQUksRUFBQXROLENBQU8sRUFBQSxJQUFBLEVBQVEsYUFBYWlOLENBQVdqTixDQUFBQSxDQUFHLEdBSzlDLENBRkVpTixHQUFBQSxDQUFBQSxDQUFVLEtBQUtqTixDQUFHLENBQUEsQ0FFaEIsY0FBY0EsQ0FBRyxDQUFBLENBQUcsQ0FDdEIsSUFBTU8sQ0FBQUEsQ0FBTyxnQkFBZ0JQLENBQUssQ0FBQSxNQUFNLEVBRXBDMEQsQ0FBUTFELENBQUFBLENBQUFBLENBQUksTUFDWkEsQ0FBZSxZQUFBLGlCQUFBLEVBQXFCQSxFQUFJLFFBQzFDMEQsR0FBQUEsQ0FBQUEsQ0FBUSxRQUFRMUQsQ0FBSSxDQUFBLGdCQUFBLENBQWlCLGdCQUFnQixDQUFDLENBQUEsQ0FBRSxJQUFJLFNBQVNrQixDQUFBQSxDQUFHLENBQUUsT0FBdUNBLENBQUFBLENBQUksS0FBTSxDQUFDLENBQUEsQ0FBQSxDQUcxSGxCLGFBQWUsZ0JBQW9CQSxFQUFBQSxDQUFBQSxDQUFJLFFBQ3pDMEQsQ0FBUSxDQUFBLE9BQUEsQ0FBUTFELEVBQUksS0FBSyxDQUFBLENBQUEsQ0FFM0IsbUJBQW1CTyxDQUFNbUQsQ0FBQUEsQ0FBQUEsQ0FBT3dKLENBQVEsQ0FDcENJLENBQUFBLENBQUFBLEVBQ0YsZ0JBQWdCdE4sQ0FBS3FOLENBQUFBLENBQU0sRUFFL0IsQ0FDSXJOLENBQUFBLFlBQWUsa0JBQ2pCLE9BQVFBLENBQUFBLENBQUFBLENBQUksU0FBVSxTQUFTdU4sQ0FBQUEsQ0FBTyxDQUNoQ04sQ0FBVSxDQUFBLE9BQUEsQ0FBUU0sQ0FBSyxDQUFLLEVBQUEsQ0FBQSxDQUk5Qix3QkFBd0JBLENBQU0sQ0FBQSxJQUFBLENBQU1BLEVBQU0sS0FBT0wsQ0FBQUEsQ0FBUSxFQUV6REQsQ0FBVSxDQUFBLElBQUEsQ0FBS00sQ0FBSyxDQUVsQkQsQ0FBQUEsQ0FBQUEsRUFDRixnQkFBZ0JDLENBQU9GLENBQUFBLENBQU0sRUFFakMsQ0FBQyxDQUNELENBQUEsSUFBSSxTQUFTck4sQ0FBRyxDQUFBLENBQUUsUUFBUSxTQUFTMEQsQ0FBQUEsQ0FBT25ELEVBQU0sQ0FDMUNtRCxDQUFBQSxZQUFpQixNQUFRQSxDQUFNLENBQUEsSUFBQSxHQUFTLElBRzVDLGtCQUFtQm5ELENBQUFBLENBQUFBLENBQU1tRCxFQUFPd0osQ0FBUSxFQUMxQyxDQUFDLENBRUwsRUFBQSxDQUFBLENBT0EsU0FBUyxlQUFnQmxOLENBQUFBLENBQUFBLENBQUtxTixFQUFRLENBQ3BDLElBQU16RyxFQUF5RDVHLENBQzNENEcsQ0FBQUEsQ0FBQUEsQ0FBUSxlQUNWLFlBQWFBLENBQUFBLENBQUFBLENBQVMsMEJBQTBCLENBQzNDQSxDQUFBQSxDQUFBQSxDQUFRLGVBQ1h5RyxHQUFBQSxDQUFBQSxDQUFPLEtBQUssQ0FBRSxHQUFBLENBQUt6RyxFQUFTLE9BQVNBLENBQUFBLENBQUFBLENBQVEsaUJBQW1CLENBQUEsUUFBQSxDQUFVQSxDQUFRLENBQUEsUUFBUyxDQUFDLENBQzVGLENBQUEsWUFBQSxDQUFhQSxFQUFTLHdCQUEwQixDQUFBLENBQUUsUUFBU0EsQ0FBUSxDQUFBLGlCQUFBLENBQW1CLFNBQVVBLENBQVEsQ0FBQSxRQUFTLENBQUMsQ0FHeEgsQ0FBQSxFQUFBLENBUUEsU0FBUyxnQkFBaUI0RyxDQUFBQSxDQUFBQSxDQUFVQyxFQUFPLENBQ3pDLElBQUEsSUFBVzFLLEtBQU8wSyxDQUFNLENBQUEsSUFBQSxHQUN0QkQsQ0FBUyxDQUFBLE1BQUEsQ0FBT3pLLENBQUcsQ0FFckIsQ0FBQSxPQUFBMEssRUFBTSxPQUFRLENBQUEsU0FBUy9KLEVBQU9YLENBQUssQ0FBQSxDQUNqQ3lLLEVBQVMsTUFBT3pLLENBQUFBLENBQUFBLENBQUtXLENBQUssRUFDNUIsQ0FBQyxFQUNNOEosQ0FDVCxDQU9BLFNBQVMsY0FBQSxDQUFleE4sQ0FBS0UsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUVqQyxJQUFNK00sQ0FBQUEsQ0FBWSxFQUNaQyxDQUFBQSxDQUFBQSxDQUFXLElBQUksUUFDZlEsQ0FBQUEsQ0FBQUEsQ0FBbUIsSUFBSSxRQUV2QkwsQ0FBQUEsQ0FBQUEsQ0FBUyxFQUNUM0csQ0FBQUEsQ0FBQUEsQ0FBZSxnQkFBZ0IxRyxDQUFHLENBQUEsQ0FDcEMwRyxFQUFhLGlCQUFxQixFQUFBLENBQUMsYUFBYUEsQ0FBYSxDQUFBLGlCQUFpQixJQUNoRkEsQ0FBYSxDQUFBLGlCQUFBLENBQW9CLE1BS25DLElBQUk0RyxDQUFBQSxDQUFZdE4sYUFBZSxlQUFtQkEsRUFBQUEsQ0FBQUEsQ0FBSSxhQUFlLENBQVMsQ0FBQSxFQUFBLGlCQUFBLENBQWtCQSxFQUFLLGFBQWEsQ0FBQSxHQUFNLE9BY3hILEdBYkkwRyxDQUFBQSxDQUFhLG9CQUNmNEcsQ0FBV0EsQ0FBQUEsQ0FBQUEsRUFBWTVHLEVBQWEsaUJBQWtCLENBQUEsY0FBQSxHQUFtQixJQUl2RXhHLENBQVMsR0FBQSxLQUFBLEVBQ1gsa0JBQWtCK00sQ0FBV1MsQ0FBQUEsQ0FBQUEsQ0FBa0JMLEVBQVEsT0FBUXJOLENBQUFBLENBQUFBLENBQUssTUFBTSxDQUFHc04sQ0FBQUEsQ0FBUSxFQUl2RixpQkFBa0JMLENBQUFBLENBQUFBLENBQVdDLEVBQVVHLENBQVFyTixDQUFBQSxDQUFBQSxDQUFLc04sQ0FBUSxDQUd4RDVHLENBQUFBLENBQUFBLENBQWEsbUJBQXFCMUcsQ0FBSSxDQUFBLE9BQUEsR0FBWSxVQUNyREEsQ0FBSSxDQUFBLE9BQUEsR0FBWSxTQUFXLGVBQWdCQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FBTSxHQUFBLFFBQUEsQ0FBVyxDQUN0RSxJQUFNMk4sQ0FBQUEsQ0FBU2pILEVBQWEsaUJBQXNFMUcsRUFBQUEsQ0FBQUEsQ0FDNUZPLEVBQU8sZUFBZ0JvTixDQUFBQSxDQUFBQSxDQUFRLE1BQU0sQ0FDM0MsQ0FBQSxrQkFBQSxDQUFtQnBOLENBQU1vTixDQUFBQSxDQUFBQSxDQUFPLEtBQU9ELENBQUFBLENBQWdCLEVBQ3pELENBR0EsSUFBTUUsRUFBVyxvQkFBcUI1TixDQUFBQSxDQUFBQSxDQUFLLFlBQVksQ0FDdkQsQ0FBQSxPQUFBLE9BQUEsQ0FBUTROLEVBQVUsU0FBU2hLLENBQUFBLENBQU0sQ0FDL0IsaUJBQWtCcUosQ0FBQUEsQ0FBQUEsQ0FBV0MsRUFBVUcsQ0FBUSxDQUFBLFNBQUEsQ0FBVXpKLENBQUksQ0FBRzBKLENBQUFBLENBQVEsRUFFbkUsT0FBUTFKLENBQUFBLENBQUFBLENBQU0sTUFBTSxDQUN2QixFQUFBLE9BQUEsQ0FBUSxhQUFhQSxDQUFJLENBQUEsQ0FBRSxpQkFBaUIsY0FBYyxDQUFBLENBQUcsU0FBU2lLLENBQVksQ0FBQSxDQUNoRixrQkFBa0JaLENBQVdDLENBQUFBLENBQUFBLENBQVVHLEVBQVFRLENBQVlQLENBQUFBLENBQVEsRUFDckUsQ0FBQyxFQUVMLENBQUMsQ0FBQSxDQUdELGdCQUFpQkosQ0FBQUEsQ0FBQUEsQ0FBVVEsQ0FBZ0IsQ0FFcEMsQ0FBQSxDQUFFLE9BQUFMLENBQVEsQ0FBQSxRQUFBLENBQUFILEVBQVUsTUFBUSxDQUFBLGFBQUEsQ0FBY0EsQ0FBUSxDQUFFLENBQzdELENBUUEsU0FBUyxXQUFBLENBQVlZLEVBQVd2TixDQUFNd04sQ0FBQUEsQ0FBQUEsQ0FBVyxDQUMzQ0QsQ0FBYyxHQUFBLEVBQUEsR0FDaEJBLEdBQWEsR0FFWCxDQUFBLENBQUEsTUFBQSxDQUFPQyxDQUFTLENBQU0sR0FBQSxpQkFBQSxHQUN4QkEsRUFBWSxJQUFLLENBQUEsU0FBQSxDQUFVQSxDQUFTLENBRXRDLENBQUEsQ0FBQSxJQUFNNUMsRUFBSSxrQkFBbUI0QyxDQUFBQSxDQUFTLEVBQ3RDLE9BQUFELENBQUFBLEVBQWEsbUJBQW1Cdk4sQ0FBSSxDQUFBLENBQUksSUFBTTRLLENBQ3ZDMkMsQ0FBQUEsQ0FDVCxDQU1BLFNBQVMsU0FBVVYsQ0FBQUEsQ0FBQUEsQ0FBUSxDQUN6QkEsQ0FBUyxDQUFBLGtCQUFBLENBQW1CQSxDQUFNLENBQ2xDLENBQUEsSUFBSVUsRUFBWSxFQUNoQixDQUFBLE9BQUFWLEVBQU8sT0FBUSxDQUFBLFNBQVMxSixFQUFPWCxDQUFLLENBQUEsQ0FDbEMrSyxFQUFZLFdBQVlBLENBQUFBLENBQUFBLENBQVcvSyxFQUFLVyxDQUFLLEVBQy9DLENBQUMsQ0FDTW9LLENBQUFBLENBQ1QsQ0FZQSxTQUFTLFVBQUEsQ0FBVzlOLEVBQUtpRixDQUFRK0ksQ0FBQUEsQ0FBQUEsQ0FBUSxDQUV2QyxJQUFNQyxDQUFBQSxDQUFVLENBQ2QsWUFBYyxDQUFBLE1BQUEsQ0FDZCxhQUFjLGVBQWdCak8sQ0FBQUEsQ0FBQUEsQ0FBSyxJQUFJLENBQ3ZDLENBQUEsaUJBQUEsQ0FBbUIsZ0JBQWdCQSxDQUFLLENBQUEsTUFBTSxFQUM5QyxXQUFhLENBQUEsaUJBQUEsQ0FBa0JpRixFQUFRLElBQUksQ0FBQSxDQUMzQyxpQkFBa0IsV0FBWSxFQUFBLENBQUUsU0FBUyxJQUMzQyxDQUFBLENBQ0EsMkJBQW9CakYsQ0FBSyxDQUFBLFlBQUEsQ0FBYyxHQUFPaU8sQ0FBTyxDQUFBLENBQ2pERCxJQUFXLEtBQ2JDLENBQUFBLEdBQUFBLENBQUFBLENBQVEsV0FBVyxDQUFJRCxDQUFBQSxDQUFBQSxDQUFBQSxDQUVyQixnQkFBZ0JoTyxDQUFHLENBQUEsQ0FBRSxVQUN2QmlPLENBQVEsQ0FBQSxZQUFZLEVBQUksTUFFbkJBLENBQUFBLENBQUFBLENBQ1QsQ0FVQSxTQUFTLFlBQUEsQ0FBYUMsRUFBYWxPLENBQUssQ0FBQSxDQUN0QyxJQUFNbU8sQ0FBYyxDQUFBLHdCQUFBLENBQXlCbk8sRUFBSyxXQUFXLENBQUEsQ0FDN0QsR0FBSW1PLENBQWEsQ0FBQSxDQUNmLEdBQUlBLENBQUFBLEdBQWdCLE1BQ2xCLENBQUEsT0FBTyxJQUFJLFFBQ04sQ0FBQSxHQUFJQSxJQUFnQixHQUN6QixDQUFBLE9BQU9ELEVBQ0YsR0FBSUMsQ0FBQUEsQ0FBWSxRQUFRLE1BQU0sQ0FBQSxHQUFNLEVBQ3pDLE9BQVFBLE9BQUFBLENBQUFBLENBQUFBLENBQVksT0FBTyxDQUFDLENBQUEsQ0FBRSxNQUFNLEdBQUcsQ0FBQSxDQUFHLFNBQVM1TixDQUFNLENBQUEsQ0FDdkRBLEVBQU9BLENBQUssQ0FBQSxJQUFBLEdBQ1oyTixDQUFZLENBQUEsTUFBQSxDQUFPM04sQ0FBSSxFQUN6QixDQUFDLEVBQ00yTixDQUNGLENBQUEsQ0FDTCxJQUFNRSxDQUFZLENBQUEsSUFBSSxTQUN0QixPQUFRRCxPQUFBQSxDQUFBQSxDQUFBQSxDQUFZLE1BQU0sR0FBRyxDQUFBLENBQUcsU0FBUzVOLENBQUFBLENBQU0sQ0FDN0NBLENBQUFBLENBQU9BLEVBQUssSUFBSyxFQUFBLENBQ2IyTixFQUFZLEdBQUkzTixDQUFBQSxDQUFJLEdBQ3RCMk4sQ0FBWSxDQUFBLE1BQUEsQ0FBTzNOLENBQUksQ0FBRSxDQUFBLE9BQUEsQ0FBUSxTQUFTbUQsQ0FBTyxDQUFBLENBQUUwSyxFQUFVLE1BQU83TixDQUFBQSxDQUFBQSxDQUFNbUQsQ0FBSyxFQUFFLENBQUMsRUFFdEYsQ0FBQyxDQUFBLENBQ00wSyxDQUNULENBQ0YsQ0FBQSxZQUNTRixDQUVYLENBTUEsU0FBUyxZQUFhbE8sQ0FBQUEsQ0FBQUEsQ0FBSyxDQUN6QixPQUFPLENBQUMsQ0FBQyxlQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxNQUFNLENBQUssRUFBQSxlQUFBLENBQWdCQSxFQUFLLE1BQU0sQ0FBQSxDQUFFLE9BQVEsQ0FBQSxHQUFHLENBQUssRUFBQSxDQUN4RixDQU9BLFNBQVMsb0JBQUEsQ0FBcUJBLEVBQUtxTyxDQUFrQixDQUFBLENBQ25ELElBQU1DLENBQVdELENBQUFBLENBQUFBLEVBQW9CLHlCQUF5QnJPLENBQUssQ0FBQSxTQUFTLEVBRXRFc0gsQ0FBVyxDQUFBLENBQ2YsVUFBVyxlQUFnQnRILENBQUFBLENBQUcsRUFBRSxPQUFVLENBQUEsV0FBQSxDQUFjLEtBQUssTUFBTyxDQUFBLGdCQUFBLENBQ3BFLFVBQVcsSUFBSyxDQUFBLE1BQUEsQ0FBTyxpQkFDdkIsV0FBYSxDQUFBLElBQUEsQ0FBSyxPQUFPLGtCQUMzQixDQUFBLENBSUEsR0FISSxJQUFLLENBQUEsTUFBQSxDQUFPLHVCQUF5QixlQUFnQkEsQ0FBQUEsQ0FBRyxFQUFFLE9BQVcsRUFBQSxDQUFDLGFBQWFBLENBQUcsQ0FBQSxHQUN4RnNILEVBQVMsSUFBTyxDQUFBLEtBQUEsQ0FBQSxDQUVkZ0gsRUFBVSxDQUNaLElBQU1DLEVBQVEsaUJBQWtCRCxDQUFBQSxDQUFRLEVBQ3hDLEdBQUlDLENBQUFBLENBQU0sT0FBUyxDQUNqQixDQUFBLElBQUEsSUFBU2pNLEVBQUksQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSWlNLEVBQU0sTUFBUWpNLENBQUFBLENBQUFBLEVBQUFBLENBQUssQ0FDckMsSUFBTW9CLENBQUFBLENBQVE2SyxFQUFNak0sQ0FBQyxDQUFBLENBQ3JCLEdBQUlvQixDQUFNLENBQUEsT0FBQSxDQUFRLE9BQU8sQ0FBTSxHQUFBLENBQUEsQ0FDN0I0RCxFQUFTLFNBQVksQ0FBQSxhQUFBLENBQWM1RCxFQUFNLE1BQU8sQ0FBQSxDQUFDLENBQUMsQ0FDekNBLENBQUFBLEtBQUFBLEdBQUFBLENBQUFBLENBQU0sUUFBUSxTQUFTLENBQUEsR0FBTSxFQUN0QzRELENBQVMsQ0FBQSxXQUFBLENBQWMsYUFBYzVELENBQUFBLENBQUFBLENBQU0sTUFBTyxDQUFBLENBQUMsQ0FBQyxDQUMzQ0EsQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsQ0FBTSxRQUFRLGFBQWEsQ0FBQSxHQUFNLEVBQzFDNEQsQ0FBUyxDQUFBLFVBQUEsQ0FBYTVELEVBQU0sTUFBTyxDQUFBLEVBQUUsSUFBTSxNQUNsQ0EsQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsQ0FBTSxRQUFRLGNBQWMsQ0FBQSxHQUFNLEVBQzNDNEQsQ0FBUyxDQUFBLFdBQUEsQ0FBYzVELEVBQU0sTUFBTyxDQUFBLEVBQUUsSUFBTSxNQUNuQ0EsQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsQ0FBTSxRQUFRLFNBQVMsQ0FBQSxHQUFNLEVBQUcsQ0FFekMsSUFBSThLLEVBRGU5SyxDQUFNLENBQUEsTUFBQSxDQUFPLENBQUMsQ0FDTixDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQ3BDLENBQUEsSUFBTStLLEVBQVlELENBQVUsQ0FBQSxHQUFBLEVBQzVCLENBQUEsSUFBSUUsQ0FBY0YsQ0FBQUEsQ0FBQUEsQ0FBVSxPQUFTLENBQUlBLENBQUFBLENBQUFBLENBQVUsS0FBSyxHQUFHLENBQUEsQ0FBSSxLQUUvRGxILENBQVMsQ0FBQSxNQUFBLENBQVNtSCxFQUNsQm5ILENBQVMsQ0FBQSxZQUFBLENBQWVvSCxFQUMxQixDQUFXaEwsS0FBQUEsR0FBQUEsQ0FBQUEsQ0FBTSxRQUFRLE9BQU8sQ0FBQSxHQUFNLEVBQUcsQ0FFdkMsSUFBSThLLEVBRGE5SyxDQUFNLENBQUEsTUFBQSxDQUFPLENBQUMsQ0FDTixDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQ2xDLENBQUEsSUFBTWlMLEVBQVVILENBQVUsQ0FBQSxHQUFBLEdBQzFCLElBQUlFLENBQUFBLENBQWNGLEVBQVUsTUFBUyxDQUFBLENBQUEsQ0FBSUEsRUFBVSxJQUFLLENBQUEsR0FBRyxFQUFJLElBQy9EbEgsQ0FBQUEsQ0FBQUEsQ0FBUyxJQUFPcUgsQ0FBQUEsQ0FBQUEsQ0FDaEJySCxDQUFTLENBQUEsVUFBQSxDQUFhb0gsRUFDeEIsQ0FBV2hMLEtBQUFBLEdBQUFBLENBQUFBLENBQU0sUUFBUSxlQUFlLENBQUEsR0FBTSxFQUFHLENBQy9DLElBQU1rTCxFQUFpQmxMLENBQU0sQ0FBQSxNQUFBLENBQU8sRUFBc0IsQ0FDMUQ0RCxDQUFBQSxDQUFBQSxDQUFTLFlBQWNzSCxDQUFrQixFQUFBLE9BQzNDLE1BQVd0TSxDQUFLLEVBQUEsQ0FBQSxDQUNkZ0YsRUFBUyxTQUFZNUQsQ0FBQUEsQ0FBQUEsQ0FFckIsU0FBUywrQkFBa0NBLENBQUFBLENBQUssRUFFcEQsQ0FFSixDQUNBLE9BQU80RCxDQUNULENBTUEsU0FBUyxZQUFhdEgsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUN6QixPQUFPLHdCQUFBLENBQXlCQSxFQUFLLGFBQWEsQ0FBQSxHQUFNLHVCQUN2RCxPQUFRQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FBSyxFQUFBLGVBQUEsQ0FBZ0JBLEVBQUssU0FBUyxDQUFBLEdBQU0scUJBQy9ELENBUUEsU0FBUyxvQkFBb0JtSSxDQUFLbkksQ0FBQUEsQ0FBQUEsQ0FBSzZPLEVBQW9CLENBQ3pELElBQUlDLEVBQW9CLElBTXhCLENBQUEsT0FMQSxlQUFlOU8sQ0FBSyxDQUFBLFNBQVNtRixFQUFXLENBQ2xDMkosQ0FBQUEsRUFBcUIsT0FDdkJBLENBQW9CM0osQ0FBQUEsQ0FBQUEsQ0FBVSxpQkFBaUJnRCxDQUFLMEcsQ0FBQUEsQ0FBQUEsQ0FBb0I3TyxDQUFHLENBRS9FLEVBQUEsQ0FBQyxFQUNHOE8sQ0FHRSxHQUFBLFlBQUEsQ0FBYTlPLENBQUcsQ0FHWCxDQUFBLGdCQUFBLENBQWlCLElBQUksUUFBWSxDQUFBLGtCQUFBLENBQW1CNk8sQ0FBa0IsQ0FBQyxDQUFBLENBRXZFLFVBQVVBLENBQWtCLENBQUEsQ0FHekMsQ0FPQSxTQUFTLGNBQWU1SixDQUFBQSxDQUFBQSxDQUFRLENBQzlCLE9BQU8sQ0FBRSxNQUFPLEVBQUMsQ0FBRyxLQUFNLENBQUNBLENBQU0sQ0FBRSxDQUNyQyxDQU1BLFNBQVMsaUJBQWtCb0MsQ0FBQUEsQ0FBQUEsQ0FBU0MsRUFBVSxDQUM1QyxJQUFNeUgsRUFBUTFILENBQVEsQ0FBQSxDQUFDLEVBQ2pCMkIsQ0FBTzNCLENBQUFBLENBQUFBLENBQVFBLEVBQVEsTUFBUyxDQUFBLENBQUMsRUFDdkMsR0FBSUMsQ0FBQUEsQ0FBUyxPQUFRLENBQ25CLElBQUlyQyxFQUFTLElBQ1RxQyxDQUFBQSxDQUFBQSxDQUFTLGVBQ1hyQyxDQUFTLENBQUEsU0FBQSxDQUFVLGlCQUFpQjhKLENBQU96SCxDQUFBQSxDQUFBQSxDQUFTLFlBQVksQ0FBQyxDQUFBLENBQUEsQ0FFL0RBLENBQVMsQ0FBQSxNQUFBLEdBQVcsS0FBVXlILEdBQUFBLENBQUFBLEVBQVM5SixLQUN6Q0EsQ0FBU0EsQ0FBQUEsQ0FBQUEsRUFBVThKLEVBQ25COUosQ0FBTyxDQUFBLFNBQUEsQ0FBWSxHQUVqQnFDLENBQVMsQ0FBQSxNQUFBLEdBQVcsV0FBYTBCLENBQVEvRCxFQUFBQSxDQUFBQSxDQUFBQSxHQUMzQ0EsRUFBU0EsQ0FBVStELEVBQUFBLENBQUFBLENBQ25CL0QsRUFBTyxTQUFZQSxDQUFBQSxDQUFBQSxDQUFPLGNBRTlCLENBQ0EsR0FBSXFDLEVBQVMsSUFBTSxDQUFBLENBQ2pCLElBQUlyQyxDQUFTLENBQUEsSUFBQSxDQUNiLEdBQUlxQyxDQUFTLENBQUEsVUFBQSxDQUFZLENBQ3ZCLElBQUkxQyxDQUFBQSxDQUFZMEMsRUFBUyxVQUNyQkEsQ0FBQUEsQ0FBQUEsQ0FBUyxhQUFlLFFBQzFCMUMsR0FBQUEsQ0FBQUEsQ0FBWSxRQUVkSyxDQUFTLENBQUEsU0FBQSxDQUFVLGlCQUFpQjhKLENBQU9uSyxDQUFBQSxDQUFTLENBQUMsRUFDdkQsQ0FDSTBDLENBQUFBLENBQVMsT0FBUyxLQUFVeUgsR0FBQUEsQ0FBQUEsRUFBUzlKLEtBQ3ZDQSxDQUFTQSxDQUFBQSxDQUFBQSxFQUFVOEosRUFFbkI5SixDQUFPLENBQUEsY0FBQSxDQUFlLENBQUUsS0FBTyxDQUFBLE9BQUEsQ0FBUyxTQUFVLElBQUssQ0FBQSxNQUFBLENBQU8sY0FBZSxDQUFDLENBQUEsQ0FBQSxDQUU1RXFDLEVBQVMsSUFBUyxHQUFBLFFBQUEsR0FBYTBCLEdBQVEvRCxDQUN6Q0EsQ0FBQUEsR0FBQUEsQ0FBQUEsQ0FBU0EsR0FBVStELENBRW5CL0QsQ0FBQUEsQ0FBQUEsQ0FBTyxlQUFlLENBQUUsS0FBQSxDQUFPLE1BQU8sUUFBVSxDQUFBLElBQUEsQ0FBSyxPQUFPLGNBQWUsQ0FBQyxHQUVoRixDQUNGLENBU0EsU0FBUyxtQkFBb0JqRixDQUFBQSxDQUFBQSxDQUFLMEIsRUFBTXNOLENBQWU1QixDQUFBQSxDQUFBQSxDQUFRLENBSTdELEdBSElBLENBQUFBLEVBQVUsT0FDWkEsQ0FBUyxDQUFBLElBRVBwTixDQUFPLEVBQUEsSUFBQSxDQUNULE9BQU9vTixDQUVULENBQUEsSUFBTXRNLEVBQWlCLGlCQUFrQmQsQ0FBQUEsQ0FBQUEsQ0FBSzBCLENBQUksQ0FDbEQsQ0FBQSxHQUFJWixFQUFnQixDQUNsQixJQUFJVCxFQUFNUyxDQUFlLENBQUEsSUFBQSxHQUNyQm1PLENBQWdCRCxDQUFBQSxDQUFBQSxDQUNwQixHQUFJM08sQ0FBUSxHQUFBLE9BQUEsQ0FDVixPQUFPLElBRUxBLENBQUFBLENBQUFBLENBQUksUUFBUSxhQUFhLENBQUEsR0FBTSxHQUNqQ0EsQ0FBTUEsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPLEVBQUUsQ0FBQSxDQUNuQjRPLEVBQWdCLENBQ1A1TyxDQUFBQSxFQUFBQSxDQUFBQSxDQUFJLFFBQVEsS0FBSyxDQUFBLEdBQU0sQ0FDaENBLEdBQUFBLENBQUFBLENBQU1BLENBQUksQ0FBQSxNQUFBLENBQU8sQ0FBQyxDQUNsQjRPLENBQUFBLENBQUFBLENBQWdCLElBRWQ1TyxDQUFJLENBQUEsT0FBQSxDQUFRLEdBQUcsQ0FBTSxHQUFBLENBQUEsR0FDdkJBLEVBQU0sR0FBTUEsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUVwQixJQUFJNk8sQ0FBQUEsQ0FDQUQsRUFDRkMsQ0FBYSxDQUFBLFNBQUEsQ0FBVWxQLEVBQUssVUFBVyxDQUFFLE9BQU8sUUFBUyxDQUFBLFVBQUEsQ0FBYUssRUFBTSxHQUFHLENBQUEsRUFBSSxDQUFHLENBQUEsRUFBRSxDQUV4RjZPLENBQUFBLENBQUFBLENBQWEsVUFBVTdPLENBQUcsQ0FBQSxDQUU1QixRQUFXMEMsQ0FBT21NLElBQUFBLENBQUFBLENBQ1pBLEVBQVcsY0FBZW5NLENBQUFBLENBQUcsR0FDM0JxSyxDQUFPckssQ0FBQUEsQ0FBRyxDQUFLLEVBQUEsSUFBQSxHQUNqQnFLLENBQU9ySyxDQUFBQSxDQUFHLEVBQUltTSxDQUFXbk0sQ0FBQUEsQ0FBRyxHQUlwQyxDQUNBLE9BQU8sb0JBQW9CLFNBQVUsQ0FBQSxTQUFBLENBQVUvQyxDQUFHLENBQUMsQ0FBQSxDQUFHMEIsRUFBTXNOLENBQWU1QixDQUFBQSxDQUFNLENBQ25GLENBUUEsU0FBUyxVQUFVcE4sQ0FBS21QLENBQUFBLENBQUFBLENBQVFDLEVBQVksQ0FDMUMsT0FBSSxLQUFLLE1BQU8sQ0FBQSxTQUFBLENBQ1BELEdBRVAsRUFBQSxpQkFBQSxDQUFrQm5QLEVBQUssMEJBQTBCLENBQUEsQ0FDMUNvUCxFQUVYLENBT0EsU0FBUyxvQkFBb0JwUCxDQUFLcVAsQ0FBQUEsQ0FBQUEsQ0FBZ0IsQ0FDaEQsT0FBTyxtQkFBQSxDQUFvQnJQLEVBQUssU0FBVyxDQUFBLENBQUEsQ0FBQSxDQUFNcVAsQ0FBYyxDQUNqRSxDQU9BLFNBQVMsb0JBQW9CclAsQ0FBS3FQLENBQUFBLENBQUFBLENBQWdCLENBQ2hELE9BQU8sbUJBQUEsQ0FBb0JyUCxFQUFLLFNBQVcsQ0FBQSxDQUFBLENBQUEsQ0FBT3FQLENBQWMsQ0FDbEUsQ0FNQSxTQUFTLGlCQUFrQnJQLENBQUFBLENBQUFBLENBQUssQ0FDOUIsT0FBTyxZQUFBLENBQWEsb0JBQW9CQSxDQUFHLENBQUEsQ0FBRyxvQkFBb0JBLENBQUcsQ0FBQyxDQUN4RSxDQU9BLFNBQVMscUJBQXFCbUksQ0FBS0MsQ0FBQUEsQ0FBQUEsQ0FBUWtILEVBQWEsQ0FDdEQsR0FBSUEsSUFBZ0IsSUFDbEIsQ0FBQSxHQUFJLENBQ0ZuSCxDQUFJLENBQUEsZ0JBQUEsQ0FBaUJDLEVBQVFrSCxDQUFXLEVBQzFDLE1BQVksQ0FFVm5ILENBQUFBLENBQUksaUJBQWlCQyxDQUFRLENBQUEsa0JBQUEsQ0FBbUJrSCxDQUFXLENBQUMsQ0FBQSxDQUM1RG5ILEVBQUksZ0JBQWlCQyxDQUFBQSxDQUFBQSxDQUFTLG1CQUFvQixNQUFNLEVBQzFELENBRUosQ0FNQSxTQUFTLG9CQUFvQkQsQ0FBSyxDQUFBLENBRWhDLEdBQUlBLENBQUksQ0FBQSxXQUFBLEVBQWUsT0FBUSxHQUFTLENBQUEsR0FBQSxDQUN0QyxHQUFJLENBQ0YsSUFBTS9FLEVBQU0sSUFBSSxHQUFBLENBQUkrRSxFQUFJLFdBQVcsQ0FBQSxDQUNuQyxPQUFPL0UsQ0FBSSxDQUFBLFFBQUEsQ0FBV0EsRUFBSSxNQUM1QixDQUFBLEtBQVksQ0FDVixpQkFBa0IsQ0FBQSxXQUFBLEdBQWMsSUFBTSxDQUFBLHFCQUFBLENBQXVCLENBQUUsR0FBSytFLENBQUFBLENBQUFBLENBQUksV0FBWSxDQUFDLEVBQ3ZGLENBRUosQ0FPQSxTQUFTLFNBQUEsQ0FBVUEsRUFBS29ILENBQVEsQ0FBQSxDQUM5QixPQUFPQSxDQUFPLENBQUEsSUFBQSxDQUFLcEgsRUFBSSxxQkFBc0IsRUFBQyxDQUNoRCxDQVlBLFNBQVMsV0FBV2pJLENBQU1pRCxDQUFBQSxDQUFBQSxDQUFNZ0IsRUFBUyxDQUV2QyxPQURBakUsRUFBOEJBLENBQUssQ0FBQSxXQUFBLEdBQy9CaUUsQ0FDRUEsQ0FBQUEsQ0FBQUEsWUFBbUIsU0FBVyxPQUFPQSxDQUFBQSxFQUFZLFNBQzVDLGdCQUFpQmpFLENBQUFBLENBQUFBLENBQU1pRCxFQUFNLElBQU0sQ0FBQSxJQUFBLENBQU0sQ0FDOUMsY0FBZ0IsQ0FBQSxhQUFBLENBQWNnQixDQUFPLENBQ3JDLENBQUEsYUFBQSxDQUFlLEVBQ2pCLENBQUMsQ0FBQSxDQUVNLGdCQUFpQmpFLENBQUFBLENBQUFBLENBQU1pRCxDQUFNLENBQUEsYUFBQSxDQUFjZ0IsRUFBUSxNQUFNLENBQUEsQ0FBR0EsRUFBUSxLQUN6RSxDQUFBLENBQ0UsUUFBU0EsQ0FBUSxDQUFBLE9BQUEsQ0FDakIsUUFBU0EsQ0FBUSxDQUFBLE9BQUEsQ0FDakIsT0FBUUEsQ0FBUSxDQUFBLE1BQUEsQ0FDaEIsZUFBZ0IsYUFBY0EsQ0FBQUEsQ0FBQUEsQ0FBUSxNQUFNLENBQzVDLENBQUEsWUFBQSxDQUFjQSxFQUFRLElBQ3RCLENBQUEsTUFBQSxDQUFRQSxFQUFRLE1BQ2hCLENBQUEsYUFBQSxDQUFlLEVBQ2pCLENBQUMsQ0FBQSxDQUdFLGlCQUFpQmpFLENBQU1pRCxDQUFBQSxDQUFBQSxDQUFNLEtBQU0sSUFBTSxDQUFBLENBQzlDLGNBQWUsQ0FDakIsQ0FBQSxDQUFDLENBRUwsQ0FNQSxTQUFTLGdCQUFnQm5ELENBQUssQ0FBQSxDQUM1QixJQUFNb0MsQ0FBQUEsQ0FBTSxFQUFDLENBQ2IsS0FBT3BDLENBQ0xvQyxFQUFBQSxDQUFBQSxDQUFJLEtBQUtwQyxDQUFHLENBQUEsQ0FDWkEsRUFBTUEsQ0FBSSxDQUFBLGFBQUEsQ0FFWixPQUFPb0MsQ0FDVCxDQVFBLFNBQVMsVUFBV3BDLENBQUFBLENBQUFBLENBQUttRCxFQUFNcU0sQ0FBZSxDQUFBLENBQzVDLElBQUlDLENBQ0FyTSxDQUFBQSxDQUFBQSxDQVdKLE9BVkksT0FBTyxHQUFBLEVBQVEsWUFDakJBLENBQU0sQ0FBQSxJQUFJLElBQUlELENBQU0sQ0FBQSxRQUFBLENBQVMsU0FBUyxJQUFJLENBQUEsQ0FFMUNzTSxFQURlLFFBQVMsQ0FBQSxRQUFBLENBQVMsU0FDWHJNLENBQUksQ0FBQSxNQUFBLEdBRzFCQSxFQUFNRCxDQUNOc00sQ0FBQUEsQ0FBQUEsQ0FBVyxXQUFXdE0sQ0FBTSxDQUFBLFFBQUEsQ0FBUyxTQUFTLE1BQU0sQ0FBQSxDQUFBLENBR2xELEtBQUssTUFBTyxDQUFBLGdCQUFBLEVBQ1YsQ0FBQ3NNLENBQ0ksQ0FBQSxDQUFBLENBQUEsQ0FHSixhQUFhelAsQ0FBSyxDQUFBLGtCQUFBLENBQW9CLGFBQWEsQ0FBRSxHQUFBLENBQUFvRCxFQUFLLFFBQUFxTSxDQUFBQSxDQUFTLEVBQUdELENBQWEsQ0FBQyxDQUM3RixDQU1BLFNBQVMsbUJBQW1CRSxDQUFLLENBQUEsQ0FDL0IsR0FBSUEsQ0FBZSxZQUFBLFFBQUEsQ0FBVSxPQUFPQSxDQUNwQyxDQUFBLElBQU14QyxFQUFXLElBQUksUUFBQSxDQUNyQixRQUFXbkssQ0FBTzJNLElBQUFBLENBQUFBLENBQ1pBLEVBQUksY0FBZTNNLENBQUFBLENBQUcsSUFDcEIsT0FBTzJNLENBQUFBLENBQUkzTSxDQUFHLENBQUUsQ0FBQSxPQUFBLEVBQVksVUFDOUIyTSxDQUFBQSxDQUFBQSxDQUFJM00sQ0FBRyxDQUFBLENBQUUsUUFBUSxTQUFTb0ssQ0FBQUEsQ0FBRyxDQUFFRCxDQUFTLENBQUEsTUFBQSxDQUFPbkssRUFBS29LLENBQUMsRUFBRSxDQUFDLENBQy9DLENBQUEsT0FBT3VDLEVBQUkzTSxDQUFHLENBQUEsRUFBTSxVQUFZLEVBQUUyTSxDQUFBQSxDQUFJM00sQ0FBRyxDQUFhLFdBQUEsSUFBQSxDQUFBLENBQy9EbUssRUFBUyxNQUFPbkssQ0FBQUEsQ0FBQUEsQ0FBSyxLQUFLLFNBQVUyTSxDQUFBQSxDQUFBQSxDQUFJM00sQ0FBRyxDQUFDLENBQUMsRUFFN0NtSyxDQUFTLENBQUEsTUFBQSxDQUFPbkssRUFBSzJNLENBQUkzTSxDQUFBQSxDQUFHLENBQUMsQ0FJbkMsQ0FBQSxDQUFBLE9BQU9tSyxDQUNULENBUUEsU0FBUyxtQkFBbUJBLENBQVUzTSxDQUFBQSxDQUFBQSxDQUFNb1AsQ0FBTyxDQUFBLENBRWpELE9BQU8sSUFBSSxNQUFNQSxDQUFPLENBQUEsQ0FDdEIsSUFBSyxTQUFTMUssQ0FBQUEsQ0FBUWxDLEVBQUssQ0FDekIsT0FBSSxPQUFPQSxDQUFRLEVBQUEsUUFBQSxDQUFpQmtDLEVBQU9sQyxDQUFHLENBQUEsQ0FDMUNBLElBQVEsUUFBaUJrQyxDQUFBQSxDQUFBQSxDQUFPLE9BQ2hDbEMsQ0FBUSxHQUFBLE1BQUEsQ0FDSCxTQUFTVyxDQUFPLENBQUEsQ0FDckJ1QixFQUFPLElBQUt2QixDQUFBQSxDQUFLLEVBQ2pCd0osQ0FBUyxDQUFBLE1BQUEsQ0FBTzNNLEVBQU1tRCxDQUFLLEVBQzdCLEVBRUUsT0FBT3VCLENBQUFBLENBQU9sQyxDQUFHLENBQU0sRUFBQSxVQUFBLENBQ2xCLFVBQVcsQ0FDaEJrQyxDQUFBQSxDQUFPbEMsQ0FBRyxDQUFFLENBQUEsS0FBQSxDQUFNa0MsQ0FBUSxDQUFBLFNBQVMsQ0FDbkNpSSxDQUFBQSxDQUFBQSxDQUFTLE9BQU8zTSxDQUFJLENBQUEsQ0FDcEIwRSxFQUFPLE9BQVEsQ0FBQSxTQUFTa0ksRUFBRyxDQUFFRCxDQUFBQSxDQUFTLE9BQU8zTSxDQUFNNE0sQ0FBQUEsQ0FBQyxFQUFFLENBQUMsRUFDekQsRUFHRWxJLENBQU9sQyxDQUFBQSxDQUFHLEdBQUtrQyxDQUFPbEMsQ0FBQUEsQ0FBRyxFQUFFLE1BQVcsR0FBQSxDQUFBLENBQ2pDa0MsRUFBT2xDLENBQUcsQ0FBQSxDQUFFLENBQUMsQ0FFYmtDLENBQUFBLENBQUFBLENBQU9sQyxDQUFHLENBRXJCLENBQUEsQ0FDQSxJQUFLLFNBQVNrQyxDQUFBQSxDQUFRMkssRUFBT2xNLENBQU8sQ0FBQSxDQUNsQyxPQUFBdUIsQ0FBTzJLLENBQUFBLENBQUssRUFBSWxNLENBQ2hCd0osQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFPM00sQ0FBSSxDQUFBLENBQ3BCMEUsRUFBTyxPQUFRLENBQUEsU0FBU2tJLEVBQUcsQ0FBRUQsQ0FBQUEsQ0FBUyxPQUFPM00sQ0FBTTRNLENBQUFBLENBQUMsRUFBRSxDQUFDLENBQUEsQ0FDaEQsRUFDVCxDQUNGLENBQUMsQ0FDSCxDQU1BLFNBQVMsY0FBY0QsQ0FBVSxDQUFBLENBQy9CLE9BQU8sSUFBSSxLQUFBLENBQU1BLEVBQVUsQ0FDekIsR0FBQSxDQUFLLFNBQVNqSSxDQUFRMUUsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUMxQixHQUFJLE9BQU9BLEdBQVMsUUFFbEIsQ0FBQSxPQUFPLFFBQVEsR0FBSTBFLENBQUFBLENBQUFBLENBQVExRSxDQUFJLENBRWpDLENBQUEsR0FBSUEsSUFBUyxRQUVYLENBQUEsT0FBTyxJQUFNLE1BQUEsQ0FBTyxXQUFZMk0sQ0FBQUEsQ0FBUSxFQUUxQyxHQUFJM00sQ0FBQUEsSUFBUTBFLEVBRVYsT0FBSSxPQUFPQSxFQUFPMUUsQ0FBSSxDQUFBLEVBQU0sV0FDbkIsVUFBVyxDQUNoQixPQUFPMk0sQ0FBUzNNLENBQUFBLENBQUksRUFBRSxLQUFNMk0sQ0FBQUEsQ0FBQUEsQ0FBVSxTQUFTLENBQ2pELENBQUEsQ0FFT2pJLEVBQU8xRSxDQUFJLENBQUEsQ0FHdEIsSUFBTW9QLENBQVF6QyxDQUFBQSxDQUFBQSxDQUFTLE9BQU8zTSxDQUFJLENBQUEsQ0FFbEMsR0FBSW9QLENBQU0sQ0FBQSxNQUFBLEdBQVcsRUFFZCxPQUFJQSxDQUFBQSxDQUFNLFNBQVcsQ0FDbkJBLENBQUFBLENBQUFBLENBQU0sQ0FBQyxDQUVQLENBQUEsa0JBQUEsQ0FBbUIxSyxFQUFRMUUsQ0FBTW9QLENBQUFBLENBQUssQ0FFakQsQ0FBQSxDQUNBLEdBQUssQ0FBQSxTQUFTMUssRUFBUTFFLENBQU1tRCxDQUFBQSxDQUFBQSxDQUFPLENBQ2pDLE9BQUksT0FBT25ELEdBQVMsUUFDWCxDQUFBLENBQUEsQ0FBQSxFQUVUMEUsRUFBTyxNQUFPMUUsQ0FBQUEsQ0FBSSxFQUNkLE9BQU9tRCxDQUFBQSxDQUFNLFNBQVksVUFDM0JBLENBQUFBLENBQUFBLENBQU0sUUFBUSxTQUFTeUosQ0FBQUEsQ0FBRyxDQUFFbEksQ0FBTyxDQUFBLE1BQUEsQ0FBTzFFLEVBQU00TSxDQUFDLEVBQUUsQ0FBQyxDQUMzQyxDQUFBLE9BQU96SixHQUFVLFFBQVksRUFBQSxFQUFFQSxhQUFpQixJQUN6RHVCLENBQUFBLENBQUFBLENBQUFBLENBQU8sT0FBTzFFLENBQU0sQ0FBQSxJQUFBLENBQUssVUFBVW1ELENBQUssQ0FBQyxFQUV6Q3VCLENBQU8sQ0FBQSxNQUFBLENBQU8xRSxDQUFNbUQsQ0FBQUEsQ0FBSyxDQUVwQixDQUFBLENBQUEsQ0FBQSxDQUNULEVBQ0EsY0FBZ0IsQ0FBQSxTQUFTdUIsRUFBUTFFLENBQU0sQ0FBQSxDQUNyQyxPQUFJLE9BQU9BLENBQUFBLEVBQVMsVUFDbEIwRSxDQUFPLENBQUEsTUFBQSxDQUFPMUUsQ0FBSSxDQUViLENBQUEsQ0FBQSxDQUNULEVBRUEsT0FBUyxDQUFBLFNBQVMwRSxFQUFRLENBQ3hCLE9BQU8sUUFBUSxPQUFRLENBQUEsTUFBQSxDQUFPLFlBQVlBLENBQU0sQ0FBQyxDQUNuRCxDQUNBLENBQUEsd0JBQUEsQ0FBMEIsU0FBU0EsQ0FBUTRLLENBQUFBLENBQUFBLENBQU0sQ0FDL0MsT0FBTyxPQUFBLENBQVEseUJBQXlCLE1BQU8sQ0FBQSxXQUFBLENBQVk1SyxDQUFNLENBQUc0SyxDQUFBQSxDQUFJLENBQzFFLENBQ0YsQ0FBQyxDQUNILENBV0EsU0FBUyxpQkFBaUIzUCxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTW5ELEVBQUt1RCxDQUFPdU0sQ0FBQUEsQ0FBQUEsQ0FBS0MsRUFBVyxDQUNoRSxJQUFJQyxFQUFVLElBQ1ZDLENBQUFBLENBQUFBLENBQVMsS0FFYixHQURBSCxDQUFBQSxDQUFNQSxHQUFvQixFQUFDLENBQ3ZCQSxFQUFJLGFBQWlCLEVBQUEsT0FBTyxRQUFZLEdBQzFDLENBQUEsSUFBSUksRUFBVSxJQUFJLE9BQUEsQ0FBUSxTQUFTQyxDQUFVQyxDQUFBQSxDQUFBQSxDQUFTLENBQ3BESixDQUFVRyxDQUFBQSxDQUFBQSxDQUNWRixFQUFTRyxFQUNYLENBQUMsRUFFQ3BRLENBQU8sRUFBQSxJQUFBLEdBQ1RBLEVBQU0sV0FBWSxFQUFBLENBQUUsTUFFdEIsSUFBTXFRLENBQUFBLENBQWtCUCxDQUFJLENBQUEsT0FBQSxFQUFXLGtCQUNqQ1EsQ0FBQUEsQ0FBQUEsQ0FBU1IsRUFBSSxNQUFVLEVBQUEsSUFBQSxDQUU3QixHQUFJLENBQUMsWUFBQSxDQUFhOVAsQ0FBRyxDQUVuQixDQUFBLE9BQUEsU0FBQSxDQUFVZ1EsQ0FBTyxDQUNWRSxDQUFBQSxDQUFBQSxDQUVULElBQU1qTCxDQUFTNkssQ0FBQUEsQ0FBQUEsQ0FBSSxnQkFBa0IsU0FBVSxDQUFBLFNBQUEsQ0FBVTlQLENBQUcsQ0FBQyxDQUFBLENBQzdELEdBQUlpRixDQUFVLEVBQUEsSUFBQSxFQUFRQSxHQUFVLFNBQzlCLENBQUEsT0FBQSxpQkFBQSxDQUFrQmpGLEVBQUssa0JBQW9CLENBQUEsQ0FBRSxPQUFRLGlCQUFrQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxXQUFXLENBQUUsQ0FBQyxFQUMxRixTQUFVaVEsQ0FBQUEsQ0FBTSxFQUNUQyxDQUdULENBQUEsSUFBSUssRUFBVSxlQUFnQnZRLENBQUFBLENBQUcsQ0FDM0J3USxDQUFBQSxDQUFBQSxDQUFZRCxDQUFRLENBQUEsaUJBQUEsQ0FFMUIsR0FBSUMsQ0FBVyxDQUFBLENBQ2IsSUFBTUMsQ0FBYSxDQUFBLGVBQUEsQ0FBZ0JELEVBQVcsWUFBWSxDQUFBLENBQ3REQyxHQUFjLElBQ2hCdE4sR0FBQUEsQ0FBQUEsQ0FBT3NOLEdBR1QsSUFBTUMsQ0FBQUEsQ0FBYSxnQkFBZ0JGLENBQVcsQ0FBQSxZQUFZLEVBQ3RERSxDQUFjLEVBQUEsSUFBQSxFQUVaQSxFQUFXLFdBQVksRUFBQSxHQUFNLFdBQy9CeFEsQ0FBOEJ3USxDQUFBQSxDQUFBQSxFQUdwQyxDQUVBLElBQU1DLENBQUFBLENBQWtCLHlCQUF5QjNRLENBQUssQ0FBQSxZQUFZLEVBRWxFLEdBQUkrUCxDQUFBQSxHQUFjLFFBS1osWUFBYS9QLENBQUFBLENBQUFBLENBQUssZUFEQyxDQUFFLE1BQUEsQ0FBQWlGLEVBQVEsR0FBQWpGLENBQUFBLENBQUFBLENBQUssSUFBQW1ELENBQUFBLENBQUFBLENBQU0sSUFBQWpELENBQUFBLENBQUFBLENBQU0sZ0JBQWlCcUQsQ0FBTyxDQUFBLEdBQUEsQ0FBQXVNLEVBQUssWUFIMUQsQ0FBQSxTQUFTYyxFQUFrQixDQUM5QyxPQUFPLGlCQUFpQjFRLENBQU1pRCxDQUFBQSxDQUFBQSxDQUFNbkQsRUFBS3VELENBQU91TSxDQUFBQSxDQUFBQSxDQUFLLENBQUMsQ0FBQ2MsQ0FBZ0IsQ0FDekUsQ0FDNkYsQ0FBQSxRQUFBLENBQVVELENBQWdCLENBQ25FLENBQUEsR0FBTSxHQUN4RCxPQUFVWCxTQUFBQSxDQUFBQSxDQUFPLEVBQ1ZFLENBSVgsQ0FBQSxJQUFJVyxFQUFVN1EsQ0FDVjhRLENBQUFBLENBQUFBLENBQWUseUJBQXlCOVEsQ0FBSyxDQUFBLFNBQVMsRUFDdEQrUSxDQUFnQixDQUFBLElBQUEsQ0FDaEJDLEVBQVksQ0FDaEIsQ0FBQSxDQUFBLEdBQUlGLEVBQWMsQ0FDaEIsSUFBTUcsRUFBY0gsQ0FBYSxDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQ3BDM1AsQ0FBQUEsQ0FBQUEsQ0FBVzhQLEVBQVksQ0FBQyxDQUFBLENBQUUsTUFTaEMsQ0FBQSxHQVJJOVAsSUFBYSxNQUNmMFAsQ0FBQUEsQ0FBQUEsQ0FBVSxnQkFBZ0I3USxDQUFLLENBQUEsU0FBUyxFQUV4QzZRLENBQVUsQ0FBQSxTQUFBLENBQVUsaUJBQWlCN1EsQ0FBS21CLENBQUFBLENBQVEsQ0FBQyxDQUdyRDJQLENBQUFBLENBQUFBLENBQUFBLENBQWdCRyxFQUFZLENBQUMsQ0FBQSxFQUFLLFFBQVEsSUFBSyxFQUFBLENBQy9DVixFQUFVLGVBQWdCTSxDQUFBQSxDQUFPLEVBQzdCQyxDQUFpQixHQUFBLE1BQUEsRUFBVVAsRUFBUSxHQUFPQSxFQUFBQSxDQUFBQSxDQUFRLFlBQWMsQ0FDbEUsQ0FBQSxDQUFBLE9BQUEsU0FBQSxDQUFVUCxDQUFPLENBQ1ZFLENBQUFBLENBQUFBLENBQ0YsR0FBSVksQ0FBQUEsR0FBaUIsT0FBUyxDQUFBLENBQ25DLEdBQUlQLENBQVEsQ0FBQSxHQUFBLENBQ1YsaUJBQVVQLENBQU8sQ0FBQSxDQUNWRSxFQUVQYyxDQUFZLENBQUEsQ0FBQSxFQUVoQixNQUFXRixDQUFpQixHQUFBLFNBQUEsQ0FDMUIsYUFBYUQsQ0FBUyxDQUFBLFlBQVksRUFDekJDLENBQWEsQ0FBQSxPQUFBLENBQVEsT0FBTyxDQUFNLEdBQUEsQ0FBQSxHQUUzQ0MsR0FEc0JELENBQWEsQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUNiLENBQUEsQ0FBQyxHQUFLLE1BQVEsRUFBQSxJQUFBLElBRWpELENBRUEsR0FBSVAsRUFBUSxHQUNWLENBQUEsR0FBSUEsRUFBUSxTQUNWLENBQUEsWUFBQSxDQUFhTSxFQUFTLFlBQVksQ0FBQSxDQUFBLEtBQzdCLENBQ0wsR0FBSUUsQ0FBQUEsRUFBaUIsSUFBTSxDQUFBLENBQ3pCLEdBQUl4TixDQUFBQSxDQUFPLENBQ1QsSUFBTWlILENBQUFBLENBQVksZ0JBQWdCakgsQ0FBSyxDQUFBLENBQ25DaUgsR0FBYUEsQ0FBVSxDQUFBLFdBQUEsRUFBZUEsRUFBVSxXQUFZLENBQUEsS0FBQSxHQUM5RHVHLEVBQWdCdkcsQ0FBVSxDQUFBLFdBQUEsQ0FBWSxPQUUxQyxDQUNJdUcsQ0FBQUEsRUFBaUIsT0FDbkJBLENBQWdCLENBQUEsTUFBQSxFQUVwQixDQUNBLE9BQUlSLENBQUFBLENBQVEsZ0JBQWtCLElBQzVCQSxHQUFBQSxDQUFBQSxDQUFRLGVBQWlCLEVBQUMsQ0FBQSxDQUV4QlEsSUFBa0IsT0FBV1IsRUFBQUEsQ0FBQUEsQ0FBUSxlQUFlLE1BQVcsR0FBQSxDQUFBLENBQ2pFQSxFQUFRLGNBQWUsQ0FBQSxJQUFBLENBQUssVUFBVyxDQUNyQyxnQkFBQSxDQUFpQnJRLEVBQU1pRCxDQUFNbkQsQ0FBQUEsQ0FBQUEsQ0FBS3VELENBQU91TSxDQUFBQSxDQUFHLEVBQzlDLENBQUMsRUFDUWlCLENBQWtCLEdBQUEsS0FBQSxDQUMzQlIsRUFBUSxjQUFlLENBQUEsSUFBQSxDQUFLLFVBQVcsQ0FDckMsZ0JBQUEsQ0FBaUJyUSxFQUFNaUQsQ0FBTW5ELENBQUFBLENBQUFBLENBQUt1RCxFQUFPdU0sQ0FBRyxFQUM5QyxDQUFDLENBQ1FpQixDQUFBQSxDQUFBQSxHQUFrQixTQUMzQlIsQ0FBUSxDQUFBLGNBQUEsQ0FBaUIsRUFDekJBLENBQUFBLENBQUFBLENBQVEsZUFBZSxJQUFLLENBQUEsVUFBVyxDQUNyQyxnQkFBaUJyUSxDQUFBQSxDQUFBQSxDQUFNaUQsRUFBTW5ELENBQUt1RCxDQUFBQSxDQUFBQSxDQUFPdU0sQ0FBRyxFQUM5QyxDQUFDLEdBRUgsU0FBVUUsQ0FBQUEsQ0FBTyxFQUNWRSxDQUNULENBR0YsSUFBTS9ILENBQU0sQ0FBQSxJQUFJLGNBQ2hCb0ksQ0FBQUEsQ0FBQUEsQ0FBUSxHQUFNcEksQ0FBQUEsQ0FBQUEsQ0FDZG9JLEVBQVEsU0FBWVMsQ0FBQUEsQ0FBQUEsQ0FDcEIsSUFBTUUsQ0FBaUIsQ0FBQSxVQUFXLENBQ2hDWCxDQUFRLENBQUEsR0FBQSxDQUFNLEtBQ2RBLENBQVEsQ0FBQSxTQUFBLENBQVksR0FDaEJBLENBQVEsQ0FBQSxjQUFBLEVBQWtCLE1BQzlCQSxDQUFRLENBQUEsY0FBQSxDQUFlLE9BQVMsQ0FDUkEsRUFBQUEsQ0FBQUEsQ0FBUSxlQUFlLEtBQU0sRUFBQSxHQUd2RCxDQUNNWSxDQUFBQSxDQUFBQSxDQUFpQix5QkFBeUJuUixDQUFLLENBQUEsV0FBVyxFQUNoRSxHQUFJbVIsQ0FBQUEsQ0FBZ0IsQ0FDbEIsSUFBSUMsQ0FBQUEsQ0FBaUIsT0FBT0QsQ0FBYyxDQUFBLENBRTFDLEdBQUlDLENBQW1CLEdBQUEsSUFBQSxFQUN2QixDQUFDLFlBQWFwUixDQUFBQSxDQUFBQSxDQUFLLGFBQWUsQ0FBQSxDQUFFLE1BQVFvUixDQUFBQSxDQUFBQSxDQUFnQixPQUFBbk0sQ0FBTyxDQUFDLEVBQ2xFLE9BQVUrSyxTQUFBQSxDQUFBQSxDQUFPLEVBQ2pCa0IsQ0FBZSxFQUFBLENBQ1JoQixDQUVYLENBRUEsR0FBSVMsR0FBbUIsQ0FBQ1osQ0FBQUEsRUFDbEIsQ0FBQyxPQUFRWSxDQUFBQSxDQUFlLEVBQzFCLE9BQVVYLFNBQUFBLENBQUFBLENBQU8sRUFDakJrQixDQUFlLEVBQUEsQ0FDUmhCLEVBSVgsSUFBSWpDLENBQUFBLENBQVUsV0FBV2pPLENBQUtpRixDQUFBQSxDQUFBQSxDQUFRbU0sQ0FBYyxDQUVoRGxSLENBQUFBLENBQUFBLEdBQVMsT0FBUyxDQUFDLFlBQUEsQ0FBYUYsQ0FBRyxDQUNyQ2lPLEdBQUFBLENBQUFBLENBQVEsY0FBYyxDQUFJLENBQUEsbUNBQUEsQ0FBQSxDQUd4QjZCLEVBQUksT0FDTjdCLEdBQUFBLENBQUFBLENBQVUsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBUzZCLENBQUksQ0FBQSxPQUFPLEdBRTdDLElBQU01TCxDQUFBQSxDQUFVLGVBQWVsRSxDQUFLRSxDQUFBQSxDQUFJLEVBQ3BDbU4sQ0FBU25KLENBQUFBLENBQUFBLENBQVEsT0FDZm1OLENBQWNuTixDQUFBQSxDQUFBQSxDQUFRLFNBQ3hCNEwsQ0FBSSxDQUFBLE1BQUEsRUFDTixpQkFBaUJ1QixDQUFhLENBQUEsa0JBQUEsQ0FBbUJ2QixFQUFJLE1BQU0sQ0FBQyxFQUU5RCxJQUFNVCxDQUFBQSxDQUFpQixtQkFBbUIsaUJBQWtCclAsQ0FBQUEsQ0FBRyxDQUFDLENBQzFEc1IsQ0FBQUEsQ0FBQUEsQ0FBYyxpQkFBaUJELENBQWFoQyxDQUFBQSxDQUFjLEVBQzVEa0MsQ0FBbUIsQ0FBQSxZQUFBLENBQWFELEVBQWF0UixDQUFHLENBQUEsQ0FFaEQsS0FBSyxNQUFPLENBQUEsbUJBQUEsRUFBdUJFLElBQVMsS0FDOUNxUixFQUFBQSxDQUFBQSxDQUFpQixHQUFJLENBQUEsdUJBQUEsQ0FBeUIsZUFBZ0J0TSxDQUFBQSxDQUFBQSxDQUFRLElBQUksQ0FBSyxFQUFBLE1BQU0sR0FJbkY5QixDQUFRLEVBQUEsSUFBQSxFQUFRQSxJQUFTLEVBQzNCQSxJQUFBQSxDQUFBQSxDQUFPLGFBQWMsQ0FBQSxRQUFBLENBQVMsTUFTaEMsSUFBTXFPLENBQUFBLENBQW9CLG9CQUFvQnhSLENBQUssQ0FBQSxZQUFZLEVBRXpEeVIsQ0FBZSxDQUFBLGVBQUEsQ0FBZ0J6UixDQUFHLENBQUUsQ0FBQSxPQUFBLENBRXRDMFIsRUFBZSxJQUFLLENBQUEsTUFBQSxDQUFPLHdCQUF3QixPQUFReFIsQ0FBQUEsQ0FBSSxHQUFLLENBR2xFc1AsQ0FBQUEsQ0FBQUEsQ0FBZ0IsQ0FDcEIsT0FBU2lDLENBQUFBLENBQUFBLENBQ1QsYUFBQUMsQ0FDQSxDQUFBLFFBQUEsQ0FBVUgsRUFDVixVQUFZLENBQUEsYUFBQSxDQUFjQSxDQUFnQixDQUMxQyxDQUFBLGtCQUFBLENBQW9CRCxFQUNwQixvQkFBc0IsQ0FBQSxhQUFBLENBQWNBLENBQVcsQ0FDL0MsQ0FBQSxPQUFBLENBQUFyRCxFQUNBLE1BQUFoSixDQUFBQSxDQUFBQSxDQUNBLEtBQUEvRSxDQUNBLENBQUEsTUFBQSxDQUFBbU4sRUFDQSxlQUFpQnlDLENBQUFBLENBQUFBLENBQUksYUFBZTBCLENBQWtCLENBQUEsV0FBQSxFQUFlLEtBQUssTUFBTyxDQUFBLGVBQUEsQ0FDakYsUUFBUzFCLENBQUksQ0FBQSxPQUFBLEVBQVcwQixFQUFrQixPQUFXLEVBQUEsSUFBQSxDQUFLLE9BQU8sT0FDakUsQ0FBQSxJQUFBLENBQUFyTyxFQUNBLGVBQWlCSSxDQUFBQSxDQUNuQixFQUVBLEdBQUksQ0FBQyxhQUFhdkQsQ0FBSyxDQUFBLG9CQUFBLENBQXNCd1AsQ0FBYSxDQUN4RCxDQUFBLE9BQUEsU0FBQSxDQUFVUSxDQUFPLENBQ2pCa0IsQ0FBQUEsQ0FBQUEsR0FDT2hCLENBV1QsQ0FBQSxHQVBBL00sQ0FBT3FNLENBQUFBLENBQUFBLENBQWMsSUFDckJ0UCxDQUFBQSxDQUFBQSxDQUFPc1AsRUFBYyxJQUNyQnZCLENBQUFBLENBQUFBLENBQVV1QixFQUFjLE9BQ3hCK0IsQ0FBQUEsQ0FBQUEsQ0FBbUIsbUJBQW1CL0IsQ0FBYyxDQUFBLFVBQVUsRUFDOURuQyxDQUFTbUMsQ0FBQUEsQ0FBQUEsQ0FBYyxPQUN2QmtDLENBQWVsQyxDQUFBQSxDQUFBQSxDQUFjLGFBRXpCbkMsQ0FBVUEsRUFBQUEsQ0FBQUEsQ0FBTyxPQUFTLENBQzVCLENBQUEsT0FBQSxZQUFBLENBQWFyTixFQUFLLHdCQUEwQndQLENBQUFBLENBQWEsRUFDekQsU0FBVVEsQ0FBQUEsQ0FBTyxFQUNqQmtCLENBQWUsRUFBQSxDQUNSaEIsRUFHVCxJQUFNeUIsQ0FBQUEsQ0FBWXhPLEVBQUssS0FBTSxDQUFBLEdBQUcsRUFDMUJ5TyxDQUFlRCxDQUFBQSxDQUFBQSxDQUFVLENBQUMsQ0FDMUJFLENBQUFBLENBQUFBLENBQVNGLEVBQVUsQ0FBQyxDQUFBLENBRXRCRyxDQUFZM08sQ0FBQUEsQ0FBQUEsQ0FpQmhCLEdBaEJJdU8sQ0FBQUEsR0FDRkksRUFBWUYsQ0FDTSxDQUFBLENBQUNMLEVBQWlCLElBQUssRUFBQSxDQUFFLE1BQU8sQ0FBQSxJQUFBLEdBRTVDTyxFQUFVLE9BQVEsQ0FBQSxHQUFHLEVBQUksQ0FDM0JBLENBQUFBLENBQUFBLEVBQWEsSUFFYkEsQ0FBYSxFQUFBLEdBQUEsQ0FFZkEsR0FBYSxTQUFVUCxDQUFBQSxDQUFnQixFQUNuQ00sQ0FDRkMsR0FBQUEsQ0FBQUEsRUFBYSxJQUFNRCxDQUtyQixDQUFBLENBQUEsQ0FBQSxDQUFBLENBQUMsV0FBVzdSLENBQUs4UixDQUFBQSxDQUFBQSxDQUFXdEMsQ0FBYSxDQUMzQyxDQUFBLE9BQUEsaUJBQUEsQ0FBa0J4UCxFQUFLLGtCQUFvQndQLENBQUFBLENBQWEsRUFDeEQsU0FBVVMsQ0FBQUEsQ0FBTSxFQUNUQyxDQVNULENBQUEsR0FOQS9ILEVBQUksSUFBS2pJLENBQUFBLENBQUFBLENBQUssV0FBWSxFQUFBLENBQUc0UixDQUFXLENBQUEsQ0FBQSxDQUFJLEVBQzVDM0osQ0FBSSxDQUFBLGdCQUFBLENBQWlCLFdBQVcsQ0FDaENBLENBQUFBLENBQUFBLENBQUksZ0JBQWtCcUgsQ0FBYyxDQUFBLGVBQUEsQ0FDcENySCxFQUFJLE9BQVVxSCxDQUFBQSxDQUFBQSxDQUFjLFFBR3hCLENBQUFnQyxDQUFBQSxDQUFrQixXQUdwQixJQUFXcEosSUFBQUEsQ0FBQUEsSUFBVTZGLEVBQ25CLEdBQUlBLENBQUFBLENBQVEsZUFBZTdGLENBQU0sQ0FBQSxDQUFHLENBQ2xDLElBQU1rSCxDQUFBQSxDQUFjckIsRUFBUTdGLENBQU0sQ0FBQSxDQUNsQyxxQkFBcUJELENBQUtDLENBQUFBLENBQUFBLENBQVFrSCxDQUFXLEVBQy9DLENBQUEsQ0FLSixJQUFNeUMsQ0FBZSxDQUFBLENBQ25CLElBQUE1SixDQUNBLENBQUEsTUFBQSxDQUFBbEQsRUFDQSxhQUFBdUssQ0FBQUEsQ0FBQUEsQ0FDQSxJQUFBTSxDQUNBLENBQUEsT0FBQSxDQUFTMkIsRUFDVCxNQUFBbkIsQ0FBQUEsQ0FBQUEsQ0FDQSxTQUFVLENBQ1IsV0FBQSxDQUFhbk4sRUFDYixnQkFBa0IyTyxDQUFBQSxDQUFBQSxDQUNsQixhQUFjLElBQ2QsQ0FBQSxNQUFBLENBQUFELENBQ0YsQ0FDRixDQUFBLENBdURBLEdBckRBMUosQ0FBSSxDQUFBLE1BQUEsQ0FBUyxVQUFXLENBQ3RCLEdBQUksQ0FDRixJQUFNNkosQ0FBQUEsQ0FBWSxnQkFBZ0JoUyxDQUFHLENBQUEsQ0FVckMsR0FUQStSLENBQWEsQ0FBQSxRQUFBLENBQVMsYUFBZSxtQkFBb0I1SixDQUFBQSxDQUFHLEVBQzVEa0ksQ0FBZ0JyUSxDQUFBQSxDQUFBQSxDQUFLK1IsQ0FBWSxDQUM3QkEsQ0FBQUEsQ0FBQUEsQ0FBYSxpQkFBbUIsQ0FDbEMsQ0FBQSxFQUFBLHVCQUFBLENBQXdCbkYsRUFBWXFGLENBQVcsQ0FBQSxDQUVqRCxZQUFhalMsQ0FBQUEsQ0FBQUEsQ0FBSyxtQkFBcUIrUixDQUFBQSxDQUFZLEVBQ25ELFlBQWEvUixDQUFBQSxDQUFBQSxDQUFLLG1CQUFvQitSLENBQVksQ0FBQSxDQUc5QyxDQUFDLFlBQWEvUixDQUFBQSxDQUFHLEVBQUcsQ0FDdEIsSUFBSWtTLEVBQXNCLElBQzFCLENBQUEsS0FBT0YsRUFBVSxNQUFTLENBQUEsQ0FBQSxFQUFLRSxHQUF1QixJQUFNLEVBQUEsQ0FDMUQsSUFBTUMsQ0FBdUJILENBQUFBLENBQUFBLENBQVUsT0FDbkMsQ0FBQSxZQUFBLENBQWFHLENBQW9CLENBQ25DRCxHQUFBQSxDQUFBQSxDQUFzQkMsR0FFMUIsQ0FDSUQsQ0FBQUEsR0FDRixhQUFhQSxDQUFxQixDQUFBLG1CQUFBLENBQXFCSCxDQUFZLENBQ25FLENBQUEsWUFBQSxDQUFhRyxFQUFxQixrQkFBb0JILENBQUFBLENBQVksR0FFdEUsQ0FDQSxTQUFBLENBQVUvQixDQUFPLENBQUEsQ0FDakJrQixDQUFlLEdBQ2pCLE9BQVNoUSxDQUFHLENBQUEsQ0FDVix3QkFBa0JsQixDQUFLLENBQUEsa0JBQUEsQ0FBb0IsYUFBYSxDQUFFLEtBQUEsQ0FBT2tCLENBQUUsQ0FBRzZRLENBQUFBLENBQVksQ0FBQyxDQUM3RTdRLENBQUFBLENBQ1IsQ0FDRixDQUNBaUgsQ0FBQUEsQ0FBQUEsQ0FBSSxRQUFVLFVBQVcsQ0FDdkIsd0JBQXdCeUUsQ0FBWXFGLENBQUFBLENBQVcsRUFDL0MsaUJBQWtCalMsQ0FBQUEsQ0FBQUEsQ0FBSyxvQkFBcUIrUixDQUFZLENBQUEsQ0FDeEQsa0JBQWtCL1IsQ0FBSyxDQUFBLGdCQUFBLENBQWtCK1IsQ0FBWSxDQUNyRCxDQUFBLFNBQUEsQ0FBVTlCLENBQU0sQ0FDaEJpQixDQUFBQSxDQUFBQSxHQUNGLENBQ0EvSSxDQUFBQSxDQUFBQSxDQUFJLFFBQVUsVUFBVyxDQUN2Qix1QkFBd0J5RSxDQUFBQSxDQUFBQSxDQUFZcUYsQ0FBVyxDQUFBLENBQy9DLGtCQUFrQmpTLENBQUssQ0FBQSxtQkFBQSxDQUFxQitSLENBQVksQ0FDeEQsQ0FBQSxpQkFBQSxDQUFrQi9SLEVBQUssZ0JBQWtCK1IsQ0FBQUEsQ0FBWSxFQUNyRCxTQUFVOUIsQ0FBQUEsQ0FBTSxFQUNoQmlCLENBQWUsR0FDakIsRUFDQS9JLENBQUksQ0FBQSxTQUFBLENBQVksVUFBVyxDQUN6Qix1QkFBQSxDQUF3QnlFLEVBQVlxRixDQUFXLENBQUEsQ0FDL0Msa0JBQWtCalMsQ0FBSyxDQUFBLG1CQUFBLENBQXFCK1IsQ0FBWSxDQUN4RCxDQUFBLGlCQUFBLENBQWtCL1IsRUFBSyxjQUFnQitSLENBQUFBLENBQVksRUFDbkQsU0FBVTlCLENBQUFBLENBQU0sRUFDaEJpQixDQUFlLEdBQ2pCLEVBQ0ksQ0FBQyxZQUFBLENBQWFsUixFQUFLLG9CQUFzQitSLENBQUFBLENBQVksRUFDdkQsT0FBVS9CLFNBQUFBLENBQUFBLENBQU8sRUFDakJrQixDQUFlLEVBQUEsQ0FDUmhCLEVBRVQsSUFBSXRELENBQUFBLENBQWEsMkJBQTJCNU0sQ0FBRyxDQUFBLENBQzNDaVMsRUFBYyxlQUFnQmpTLENBQUFBLENBQUcsRUFFckMsT0FBUSxDQUFBLENBQUMsWUFBYSxTQUFXLENBQUEsVUFBQSxDQUFZLE9BQU8sQ0FBRyxDQUFBLFNBQVN1SSxFQUFXLENBQ3pFLE9BQUEsQ0FBUSxDQUFDSixDQUFLQSxDQUFBQSxDQUFBQSxDQUFJLE1BQU0sQ0FBRyxDQUFBLFNBQVNsRCxFQUFRLENBQzFDQSxDQUFBQSxDQUFPLGlCQUFpQnNELENBQVcsQ0FBQSxTQUFTaEYsRUFBTyxDQUNqRCxZQUFBLENBQWF2RCxFQUFLLFdBQWN1SSxDQUFBQSxDQUFBQSxDQUFXLENBQ3pDLGdCQUFrQmhGLENBQUFBLENBQUFBLENBQU0sZ0JBQ3hCLENBQUEsTUFBQSxDQUFRQSxDQUFNLENBQUEsTUFBQSxDQUNkLE1BQU9BLENBQU0sQ0FBQSxLQUNmLENBQUMsRUFDSCxDQUFDLEVBQ0gsQ0FBQyxFQUNILENBQUMsQ0FDRCxDQUFBLFlBQUEsQ0FBYXZELEVBQUssaUJBQW1CK1IsQ0FBQUEsQ0FBWSxFQUNqRCxJQUFNSyxFQUFBQSxDQUFTVixFQUFlLElBQU8sQ0FBQSxtQkFBQSxDQUFvQnZKLEVBQUtuSSxDQUFLdVIsQ0FBQUEsQ0FBZ0IsRUFDbkYsT0FBQXBKLENBQUFBLENBQUksS0FBS2lLLEVBQU0sQ0FBQSxDQUNSbEMsQ0FDVCxDQWFBLFNBQVMsd0JBQXdCbFEsQ0FBSytSLENBQUFBLENBQUFBLENBQWMsQ0FDbEQsSUFBTTVKLENBQUFBLENBQU00SixFQUFhLEdBS3JCTSxDQUFBQSxDQUFBQSxDQUFrQixLQUNsQkMsQ0FBa0IsQ0FBQSxJQUFBLENBYXRCLEdBWkksU0FBQSxDQUFVbkssQ0FBSyxDQUFBLFdBQVcsR0FDNUJrSyxDQUFrQmxLLENBQUFBLENBQUFBLENBQUksa0JBQWtCLFNBQVMsQ0FBQSxDQUNqRG1LLEVBQWtCLE1BQ1QsRUFBQSxTQUFBLENBQVVuSyxFQUFLLGVBQWUsQ0FBQSxFQUN2Q2tLLEVBQWtCbEssQ0FBSSxDQUFBLGlCQUFBLENBQWtCLGFBQWEsQ0FDckRtSyxDQUFBQSxDQUFBQSxDQUFrQixRQUNULFNBQVVuSyxDQUFBQSxDQUFBQSxDQUFLLGtCQUFrQixDQUMxQ2tLLEdBQUFBLENBQUFBLENBQWtCbEssRUFBSSxpQkFBa0IsQ0FBQSxnQkFBZ0IsRUFDeERtSyxDQUFrQixDQUFBLFNBQUEsQ0FBQSxDQUloQkQsRUFDRixPQUFJQSxDQUFBQSxHQUFvQixRQUNmLEVBQUMsQ0FFRCxDQUNMLElBQU1DLENBQUFBLENBQUFBLENBQ04sS0FBTUQsQ0FDUixDQUFBLENBT0osSUFBTUUsQ0FBY1IsQ0FBQUEsQ0FBQUEsQ0FBYSxRQUFTLENBQUEsZ0JBQUEsQ0FDcENTLENBQWVULENBQUFBLENBQUFBLENBQWEsU0FBUyxZQUVyQ1UsQ0FBQUEsQ0FBQUEsQ0FBVSx5QkFBeUJ6UyxDQUFLLENBQUEsYUFBYSxFQUNyRDBTLENBQWEsQ0FBQSx3QkFBQSxDQUF5QjFTLEVBQUssZ0JBQWdCLENBQUEsQ0FDM0QyUyxFQUFtQixlQUFnQjNTLENBQUFBLENBQUcsRUFBRSxPQUUxQzRTLENBQUFBLENBQUFBLENBQVcsS0FDWHpQLENBQU8sQ0FBQSxJQUFBLENBYVgsT0FYSXNQLENBQ0ZHLEVBQUFBLENBQUFBLENBQVcsT0FDWHpQLENBQU9zUCxDQUFBQSxDQUFBQSxFQUNFQyxHQUNURSxDQUFXLENBQUEsU0FBQSxDQUNYelAsRUFBT3VQLENBQ0VDLEVBQUFBLENBQUFBLEdBQ1RDLEVBQVcsTUFDWHpQLENBQUFBLENBQUFBLENBQU9xUCxHQUFnQkQsQ0FHckJwUCxDQUFBQSxDQUFBQSxDQUFBQSxDQUVFQSxJQUFTLE9BQ0osQ0FBQSxJQUlMQSxDQUFTLEdBQUEsTUFBQSxHQUNYQSxFQUFPcVAsQ0FBZ0JELEVBQUFBLENBQUFBLENBQUFBLENBSXJCUixFQUFhLFFBQVMsQ0FBQSxNQUFBLEVBQVU1TyxFQUFLLE9BQVEsQ0FBQSxHQUFHLElBQU0sQ0FDeERBLENBQUFBLEdBQUFBLENBQUFBLENBQU9BLEVBQU8sR0FBTTRPLENBQUFBLENBQUFBLENBQWEsU0FBUyxNQUdyQyxDQUFBLENBQUEsQ0FDTCxLQUFNYSxDQUNOLENBQUEsSUFBQSxDQUFBelAsQ0FDRixDQUVPLENBQUEsQ0FBQSxFQUVYLENBT0EsU0FBUyxZQUFZMFAsQ0FBd0JDLENBQUFBLENBQUFBLENBQVEsQ0FDbkQsSUFBSUMsQ0FBQUEsQ0FBUyxJQUFJLE1BQU9GLENBQUFBLENBQUFBLENBQXVCLElBQUksQ0FDbkQsQ0FBQSxPQUFPRSxFQUFPLElBQUtELENBQUFBLENBQUFBLENBQU8sU0FBUyxFQUFFLENBQUMsQ0FDeEMsQ0FNQSxTQUFTLHVCQUF3QjNLLENBQUFBLENBQUFBLENBQUssQ0FDcEMsSUFBQSxJQUFTN0YsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJLEtBQUssTUFBTyxDQUFBLGdCQUFBLENBQWlCLE9BQVFBLENBQUssRUFBQSxDQUFBLENBRTVELElBQUkwUSxDQUEwQixDQUFBLElBQUEsQ0FBSyxPQUFPLGdCQUFpQjFRLENBQUFBLENBQUMsRUFDNUQsR0FBSSxXQUFBLENBQVkwUSxFQUF5QjdLLENBQUksQ0FBQSxNQUFNLEVBQ2pELE9BQU82SyxDQUVYLENBRUEsT0FBTyxDQUNMLEtBQU0sQ0FDUixDQUFBLENBQ0YsQ0FLQSxTQUFTLFdBQUEsQ0FBWWhILEVBQU8sQ0FDMUIsR0FBSUEsRUFBTyxDQUNULElBQU1pSCxFQUFXLElBQUssQ0FBQSxPQUFPLEVBQ3pCQSxDQUNGQSxDQUFBQSxDQUFBQSxDQUFTLFNBQVlqSCxDQUFBQSxDQUFBQSxDQUVyQixNQUFPLENBQUEsUUFBQSxDQUFTLE1BQVFBLEVBRTVCLENBQ0YsQ0FNQSxTQUFTLGtCQUFBLENBQW1CaE0sRUFBSytSLENBQWMsQ0FBQSxDQUM3QyxJQUFNNUosQ0FBTTRKLENBQUFBLENBQUFBLENBQWEsSUFDckI5TSxDQUFTOE0sQ0FBQUEsQ0FBQUEsQ0FBYSxPQUNwQmpDLENBQU1pQyxDQUFBQSxDQUFBQSxDQUFhLElBQ25CbUIsQ0FBcUJuQixDQUFBQSxDQUFBQSxDQUFhLE9BRXhDLEdBQUksQ0FBQyxhQUFhL1IsQ0FBSyxDQUFBLG1CQUFBLENBQXFCK1IsQ0FBWSxDQUFHLENBQUEsT0FNM0QsR0FKSSxTQUFVNUosQ0FBQUEsQ0FBQUEsQ0FBSyxjQUFjLENBQy9CLEVBQUEsbUJBQUEsQ0FBb0JBLEVBQUssWUFBY25JLENBQUFBLENBQUcsRUFHeEMsU0FBVW1JLENBQUFBLENBQUFBLENBQUssZUFBZSxDQUFHLENBQUEsQ0FDbkMsd0JBQXlCLEVBQUEsQ0FDekIsSUFBSWdMLENBQUFBLENBQWVoTCxFQUFJLGlCQUFrQixDQUFBLGFBQWEsRUFFdEQsSUFBSWlMLENBQUFBLENBQ0FELEVBQWEsT0FBUSxDQUFBLEdBQUcsSUFBTSxDQUNoQ0MsR0FBQUEsQ0FBQUEsQ0FBbUIsVUFBVUQsQ0FBWSxDQUFBLENBRXpDQSxFQUFlQyxDQUFpQixDQUFBLElBQUEsQ0FDaEMsT0FBT0EsQ0FBaUIsQ0FBQSxJQUFBLENBQUEsQ0FFMUIsV0FBVyxLQUFPRCxDQUFBQSxDQUFBQSxDQUFjQyxDQUFnQixDQUFFLENBQUEsSUFBQSxDQUFLLFVBQVcsQ0FDaEUsa0JBQUEsQ0FBbUJELENBQVksRUFDakMsQ0FBQyxFQUNELE1BQ0YsQ0FFQSxJQUFNRSxDQUFnQixDQUFBLFNBQUEsQ0FBVWxMLEVBQUssY0FBYyxDQUFBLEVBQUtBLEVBQUksaUJBQWtCLENBQUEsWUFBWSxJQUFNLE1BRWhHLENBQUEsR0FBSSxVQUFVQSxDQUFLLENBQUEsZUFBZSxFQUFHLENBQ25DNEosQ0FBQUEsQ0FBYSxlQUFpQixDQUM5QixDQUFBLENBQUEsUUFBQSxDQUFTLEtBQU81SixDQUFJLENBQUEsaUJBQUEsQ0FBa0IsYUFBYSxDQUNuRGtMLENBQUFBLENBQUFBLEVBQWlCLFNBQVMsTUFBTyxFQUFBLENBQ2pDLE1BQ0YsQ0FFQSxHQUFJQSxFQUFlLENBQ2pCdEIsQ0FBQUEsQ0FBYSxlQUFpQixDQUM5QixDQUFBLENBQUEsUUFBQSxDQUFTLFFBQ1QsQ0FBQSxNQUNGLENBRUksU0FBVTVKLENBQUFBLENBQUFBLENBQUssZUFBZSxDQUM1QkEsR0FBQUEsQ0FBQUEsQ0FBSSxrQkFBa0IsYUFBYSxDQUFBLEdBQU0sT0FDM0M0SixDQUFhLENBQUEsTUFBQSxDQUFTL1IsRUFFdEIrUixDQUFhLENBQUEsTUFBQSxDQUFTLFNBQVUsQ0FBQSxnQkFBQSxDQUFpQi9SLENBQUttSSxDQUFBQSxDQUFBQSxDQUFJLGtCQUFrQixhQUFhLENBQUMsQ0FBQyxDQUkvRixDQUFBLENBQUEsSUFBTW1MLEVBQWdCLHVCQUF3QnRULENBQUFBLENBQUFBLENBQUsrUixDQUFZLENBRXpEd0IsQ0FBQUEsQ0FBQUEsQ0FBbUIsd0JBQXdCcEwsQ0FBRyxDQUFBLENBQzlDcUwsRUFBYUQsQ0FBaUIsQ0FBQSxJQUFBLENBQ2hDRSxFQUFVLENBQUMsQ0FBQ0YsRUFBaUIsS0FDN0JHLENBQUFBLENBQUFBLENBQWMsS0FBSyxNQUFPLENBQUEsV0FBQSxFQUFlSCxFQUFpQixXQUMxREksQ0FBQUEsQ0FBQUEsQ0FBaUJKLEVBQWlCLE1BQ2xDQSxDQUFBQSxDQUFBQSxDQUFpQixTQUNuQnhCLENBQWEsQ0FBQSxNQUFBLENBQVMsVUFBVSxnQkFBaUIvUixDQUFBQSxDQUFBQSxDQUFLdVQsRUFBaUIsTUFBTSxDQUFDLEdBRWhGLElBQUlLLENBQUFBLENBQWU5RCxDQUFJLENBQUEsWUFBQSxDQUNuQjhELENBQWdCLEVBQUEsSUFBQSxFQUFRTCxFQUFpQixZQUMzQ0ssR0FBQUEsQ0FBQUEsQ0FBZUwsRUFBaUIsWUFJOUIsQ0FBQSxDQUFBLFNBQUEsQ0FBVXBMLEVBQUssZUFBZSxDQUFBLEdBQzVCQSxFQUFJLGlCQUFrQixDQUFBLGFBQWEsSUFBTSxNQUMzQzRKLENBQUFBLENBQUFBLENBQWEsT0FBUy9SLENBRXRCK1IsQ0FBQUEsQ0FBQUEsQ0FBYSxPQUFTLFNBQVUsQ0FBQSxnQkFBQSxDQUFpQi9SLEVBQUttSSxDQUFJLENBQUEsaUJBQUEsQ0FBa0IsYUFBYSxDQUFDLENBQUMsR0FHM0YsU0FBVUEsQ0FBQUEsQ0FBQUEsQ0FBSyxhQUFhLENBQzlCeUwsR0FBQUEsQ0FBQUEsQ0FBZXpMLEVBQUksaUJBQWtCLENBQUEsV0FBVyxHQUdsRCxJQUFJMEwsQ0FBQUEsQ0FBaUIxTCxFQUFJLFFBRXJCMUMsQ0FBQUEsQ0FBQUEsQ0FBb0IsYUFBYSxDQUNuQyxVQUFBLENBQUErTixDQUNBLENBQUEsY0FBQSxDQUFBSyxDQUNBLENBQUEsT0FBQSxDQUFBSixFQUNBLFdBQUFDLENBQUFBLENBQUFBLENBQ0EsZUFBQUMsQ0FDRixDQUFBLENBQUc1QixDQUFZLENBRWYsQ0FBQSxHQUFJLEVBQUF3QixDQUFpQixDQUFBLEtBQUEsRUFBUyxDQUFDLFlBQWF0TyxDQUFBQSxDQUFBQSxDQUFRc08sRUFBaUIsS0FBTzlOLENBQUFBLENBQWlCLElBRXhGLFlBQWFSLENBQUFBLENBQUFBLENBQVEsa0JBQW1CUSxDQUFpQixDQUFBLENBWTlELElBVkFSLENBQVNRLENBQUFBLENBQUFBLENBQWtCLE9BQzNCb08sQ0FBaUJwTyxDQUFBQSxDQUFBQSxDQUFrQixlQUNuQ2dPLENBQVVoTyxDQUFBQSxDQUFBQSxDQUFrQixRQUM1QmlPLENBQWNqTyxDQUFBQSxDQUFBQSxDQUFrQixZQUNoQ2tPLENBQWlCbE8sQ0FBQUEsQ0FBQUEsQ0FBa0IsZUFFbkNzTSxDQUFhLENBQUEsTUFBQSxDQUFTOU0sRUFDdEI4TSxDQUFhLENBQUEsTUFBQSxDQUFTMEIsRUFDdEIxQixDQUFhLENBQUEsVUFBQSxDQUFhLENBQUMwQixDQUV2QmhPLENBQUFBLENBQUFBLENBQWtCLFdBQVksQ0FDNUIwQyxDQUFBQSxDQUFJLFNBQVcsR0FDakIsRUFBQSxhQUFBLENBQWNuSSxDQUFHLENBR25CLENBQUEsY0FBQSxDQUFlQSxFQUFLLFNBQVNtRixDQUFBQSxDQUFXLENBQ3RDME8sQ0FBaUIxTyxDQUFBQSxDQUFBQSxDQUFVLGtCQUFrQjBPLENBQWdCMUwsQ0FBQUEsQ0FBQUEsQ0FBS25JLENBQUcsRUFDdkUsQ0FBQyxFQUdHc1QsQ0FBYyxDQUFBLElBQUEsRUFDaEIsMEJBR0UsQ0FBQSxTQUFBLENBQVVuTCxFQUFLLGFBQWEsQ0FBQSxHQUM5QnlMLEVBQWV6TCxDQUFJLENBQUEsaUJBQUEsQ0FBa0IsV0FBVyxDQUVsRCxDQUFBLENBQUEsSUFBSWIsRUFBVyxvQkFBcUJ0SCxDQUFBQSxDQUFBQSxDQUFLNFQsQ0FBWSxDQUVoRHRNLENBQUFBLENBQUFBLENBQVMsY0FBZSxDQUFBLGFBQWEsQ0FDeENBLEdBQUFBLENBQUFBLENBQVMsWUFBY29NLENBR3pCek8sQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBTyxVQUFVLEdBQUksQ0FBQSxJQUFBLENBQUssT0FBTyxhQUFhLENBQUEsQ0FHOUMsSUFBSTZPLENBQWdCLENBQUEsSUFBQSxDQUNoQkMsRUFBZSxJQUVmYixDQUFBQSxDQUFBQSxHQUNGUyxFQUFpQlQsQ0FHZixDQUFBLENBQUEsU0FBQSxDQUFVL0ssRUFBSyxlQUFlLENBQUEsR0FDaEN3TCxFQUFpQnhMLENBQUksQ0FBQSxpQkFBQSxDQUFrQixhQUFhLENBR3RELENBQUEsQ0FBQSxJQUFNNkwsRUFBWSx3QkFBeUJoVSxDQUFBQSxDQUFBQSxDQUFLLGVBQWUsQ0FDekRzUSxDQUFBQSxDQUFBQSxDQUFTLHlCQUF5QnRRLENBQUssQ0FBQSxXQUFXLEVBRXBEaVUsQ0FBUyxDQUFBLFVBQVcsQ0FDdEIsR0FBSSxDQUVFWCxFQUFjLElBQ2hCLEdBQUEsWUFBQSxDQUFhLFdBQVksRUFBQSxDQUFFLElBQU0sQ0FBQSwwQkFBQSxDQUE0QixhQUFhLENBQUUsT0FBQSxDQUFTQSxDQUFjLENBQUd2QixDQUFBQSxDQUFZLENBQUMsQ0FDL0d1QixDQUFBQSxDQUFBQSxDQUFjLE9BQVMsTUFDekIsRUFBQSxrQkFBQSxDQUFtQkEsRUFBYyxJQUFJLENBQUEsQ0FDckMsYUFBYSxXQUFZLEVBQUEsQ0FBRSxLQUFNLHdCQUEwQixDQUFBLENBQUUsS0FBTUEsQ0FBYyxDQUFBLElBQUssQ0FBQyxDQUV2RixHQUFBLG1CQUFBLENBQW9CQSxFQUFjLElBQUksQ0FBQSxDQUN0QyxhQUFhLFdBQVksRUFBQSxDQUFFLEtBQU0sd0JBQTBCLENBQUEsQ0FBRSxLQUFNQSxDQUFjLENBQUEsSUFBSyxDQUFDLENBSTNGLENBQUEsQ0FBQSxDQUFBLElBQUEsQ0FBS3JPLEVBQVE0TyxDQUFnQnZNLENBQUFBLENBQUFBLENBQVUsQ0FDckMsTUFBQSxDQUFRcU0sQ0FBa0JyRCxFQUFBQSxDQUFBQSxDQUMxQixVQUFBMEQsQ0FDQSxDQUFBLFNBQUEsQ0FBV2pDLEVBQ1gsTUFBUUEsQ0FBQUEsQ0FBQUEsQ0FBYSxTQUFTLE1BQzlCLENBQUEsY0FBQSxDQUFnQi9SLEVBQ2hCLGlCQUFtQixDQUFBLFVBQVcsQ0FDNUIsR0FBSSxTQUFBLENBQVVtSSxFQUFLLHlCQUF5QixDQUFBLENBQUcsQ0FDN0MsSUFBSStMLENBQUFBLENBQVdsVSxFQUNWLFlBQWFBLENBQUFBLENBQUcsSUFDbkJrVSxDQUFXLENBQUEsV0FBQSxHQUFjLElBRTNCLENBQUEsQ0FBQSxtQkFBQSxDQUFvQi9MLEVBQUssdUJBQXlCK0wsQ0FBQUEsQ0FBUSxFQUM1RCxDQUNGLENBQUEsQ0FDQSxvQkFBcUIsVUFBVyxDQUM5QixHQUFJLFNBQVUvTCxDQUFBQSxDQUFBQSxDQUFLLDJCQUEyQixDQUFHLENBQUEsQ0FDL0MsSUFBSStMLENBQVdsVSxDQUFBQSxDQUFBQSxDQUNWLGFBQWFBLENBQUcsQ0FBQSxHQUNuQmtVLEVBQVcsV0FBWSxFQUFBLENBQUUsTUFFM0IsbUJBQW9CL0wsQ0FBQUEsQ0FBQUEsQ0FBSywwQkFBMkIrTCxDQUFRLEVBQzlELENBQ0EsU0FBVUosQ0FBQUEsQ0FBYSxFQUN6QixDQUNGLENBQUMsRUFDSCxDQUFTNVMsTUFBQUEsQ0FBQUEsQ0FBRyxDQUNWLE1BQWtCbEIsaUJBQUFBLENBQUFBLENBQUFBLENBQUssaUJBQWtCK1IsQ0FBWSxDQUFBLENBQ3JELFVBQVVnQyxDQUFZLENBQUEsQ0FDaEI3UyxDQUNSLENBQ0YsQ0FBQSxDQUVJaVQsRUFBbUIsSUFBSyxDQUFBLE1BQUEsQ0FBTyxzQkFLbkMsR0FKSTdNLENBQUFBLENBQVMsZUFBZSxZQUFZLENBQUEsR0FDdEM2TSxFQUFtQjdNLENBQVMsQ0FBQSxVQUFBLENBQUEsQ0FHMUI2TSxDQUNJLEVBQUEsWUFBQSxDQUFhblUsQ0FBSyxDQUFBLHVCQUFBLENBQXlCK1IsQ0FBWSxDQUN2RCxFQUFBLE9BQU8sUUFBWSxHQUVuQixFQUFBLFFBQUEsQ0FBUyxvQkFBcUIsQ0FDcEMsSUFBTXFDLEVBQWdCLElBQUksT0FBQSxDQUFRLFNBQVNqRSxDQUFVQyxDQUFBQSxDQUFBQSxDQUFTLENBQzVEMEQsQ0FBZ0IzRCxDQUFBQSxDQUFBQSxDQUNoQjRELEVBQWUzRCxFQUNqQixDQUFDLEVBRUtpRSxDQUFjSixDQUFBQSxDQUFBQSxDQUNwQkEsRUFBUyxVQUFXLENBRWxCLFNBQVMsbUJBQW9CLENBQUEsVUFBVyxDQUN0QyxPQUFBSSxDQUFBQSxHQUNPRCxDQUNULENBQUMsRUFDSCxFQUNGLENBRUk5TSxFQUFTLFNBQVksQ0FBQSxDQUFBLENBQ3ZCLFdBQVksQ0FBQSxVQUFBLENBQVcyTSxDQUFRM00sQ0FBQUEsQ0FBQUEsQ0FBUyxTQUFTLENBQUEsQ0FFakQyTSxJQUVKLENBQ0lSLEdBQ0YsaUJBQWtCelQsQ0FBQUEsQ0FBQUEsQ0FBSyxxQkFBc0IsWUFBYSxDQUFBLENBQUUsTUFBTyw2QkFBZ0NtSSxDQUFBQSxDQUFBQSxDQUFJLE9BQVMsUUFBVzRKLENBQUFBLENBQUFBLENBQWEsU0FBUyxXQUFZLENBQUEsQ0FBR0EsQ0FBWSxDQUFDLEVBQUEsQ0FFakwsQ0FPQSxJQUFNLFVBQUEsQ0FBYSxFQU1uQixDQUFBLFNBQVMsZUFBZ0IsQ0FDdkIsT0FBTyxDQUNMLElBQU0sQ0FBQSxTQUFTdUMsRUFBSyxDQUFFLE9BQU8sSUFBSyxDQUNsQyxDQUFBLFlBQUEsQ0FBYyxVQUFXLENBQUUsT0FBTyxJQUFLLENBQ3ZDLENBQUEsT0FBQSxDQUFTLFNBQVMvVCxDQUFBQSxDQUFNK0MsQ0FBSyxDQUFBLENBQUUsT0FBTyxDQUFLLENBQUEsQ0FBQSxDQUMzQyxrQkFBbUIsU0FBU2lSLENBQUFBLENBQU1wTSxFQUFLbkksQ0FBSyxDQUFBLENBQUUsT0FBT3VVLENBQUssQ0FBQSxDQUMxRCxhQUFjLFNBQVN2UCxDQUFBQSxDQUFXLENBQUUsT0FBTyxDQUFBLENBQU0sRUFDakQsVUFBWSxDQUFBLFNBQVNBLEVBQVdDLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsRUFBWSxDQUFFLE9BQU8sRUFBTSxDQUM3RSxDQUFBLGdCQUFBLENBQWtCLFNBQVM2QyxDQUFLcU0sQ0FBQUEsQ0FBQUEsQ0FBWXhVLEVBQUssQ0FBRSxPQUFPLElBQUssQ0FDakUsQ0FDRixDQVVBLFNBQVMsZUFBQSxDQUFnQk8sRUFBTTRFLENBQVcsQ0FBQSxDQUNwQ0EsRUFBVSxJQUNaQSxFQUFBQSxDQUFBQSxDQUFVLEtBQUssV0FBVyxDQUFBLENBRTVCLFdBQVc1RSxDQUFJLENBQUEsQ0FBSSxhQUFhLGFBQWMsRUFBQSxDQUFHNEUsQ0FBUyxFQUM1RCxDQVNBLFNBQVMsZUFBZ0I1RSxDQUFBQSxDQUFBQSxDQUFNLENBQzdCLE9BQU8sVUFBQSxDQUFXQSxDQUFJLEVBQ3hCLENBVUEsU0FBUyxhQUFjUCxDQUFBQSxDQUFBQSxDQUFLeVUsRUFBb0JDLENBQW9CLENBQUEsQ0FJbEUsR0FISUQsQ0FBc0IsRUFBQSxJQUFBLEdBQ3hCQSxFQUFxQixFQUFDLENBQUEsQ0FFcEJ6VSxHQUFPLElBQ1QsQ0FBQSxPQUFPeVUsRUFFTEMsQ0FBc0IsRUFBQSxJQUFBLEdBQ3hCQSxFQUFxQixFQUFDLENBQUEsQ0FFeEIsSUFBTUMsQ0FBdUIsQ0FBQSxpQkFBQSxDQUFrQjNVLENBQUssQ0FBQSxRQUFRLENBQzVELENBQUEsT0FBSTJVLEdBQ0YsT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBcUIsTUFBTSxHQUFHLENBQUEsQ0FBRyxTQUFTQyxDQUFlLENBQUEsQ0FFL0QsR0FEQUEsQ0FBZ0JBLENBQUFBLENBQUFBLENBQWMsUUFBUSxJQUFNLENBQUEsRUFBRSxFQUMxQ0EsQ0FBYyxDQUFBLEtBQUEsQ0FBTSxFQUFHLENBQUMsQ0FBQSxFQUFLLFVBQVcsQ0FDMUNGLENBQUFBLENBQW1CLEtBQUtFLENBQWMsQ0FBQSxLQUFBLENBQU0sQ0FBQyxDQUFDLENBQUEsQ0FDOUMsTUFDRixDQUNBLEdBQUlGLEVBQW1CLE9BQVFFLENBQUFBLENBQWEsRUFBSSxDQUFHLENBQUEsQ0FDakQsSUFBTXpQLENBQVksQ0FBQSxVQUFBLENBQVd5UCxDQUFhLENBQ3RDelAsQ0FBQUEsQ0FBQUEsRUFBYXNQLENBQW1CLENBQUEsT0FBQSxDQUFRdFAsQ0FBUyxDQUFBLENBQUksR0FDdkRzUCxDQUFtQixDQUFBLElBQUEsQ0FBS3RQLENBQVMsRUFFckMsQ0FDRixDQUFDLENBRUksQ0FBQSxhQUFBLENBQWMsVUFBVSxTQUFVbkYsQ0FBQUEsQ0FBRyxDQUFDLENBQUd5VSxDQUFBQSxDQUFBQSxDQUFvQkMsQ0FBa0IsQ0FDeEYsQ0FLQSxJQUFJLE9BQVUsQ0FBQSxDQUFBLENBQUEsQ0FDZCxhQUFjLENBQUEsZ0JBQUEsQ0FBaUIsbUJBQW9CLFVBQVcsQ0FDNUQsUUFBVSxDQUNaLEVBQUEsQ0FBQyxFQVNELFNBQVMsS0FBQSxDQUFNRyxFQUFJLENBR2IsT0FBQSxFQUFXLGFBQWMsQ0FBQSxVQUFBLEdBQWUsV0FDMUNBLENBQUcsRUFBQSxDQUVILGFBQWMsQ0FBQSxnQkFBQSxDQUFpQixrQkFBb0JBLENBQUFBLENBQUUsRUFFekQsQ0FFQSxTQUFTLHFCQUF3QixFQUFBLENBQy9CLEdBQUksSUFBSyxDQUFBLE1BQUEsQ0FBTyx5QkFBMkIsQ0FBTyxDQUFBLENBQUEsQ0FDaEQsSUFBTUMsQ0FBaUIsQ0FBQSxJQUFBLENBQUssT0FBTyxnQkFBbUIsQ0FBQSxDQUFBLFFBQUEsRUFBVyxLQUFLLE1BQU8sQ0FBQSxnQkFBZ0IsSUFBTSxFQUNuRyxDQUFBLFdBQUEsR0FBYyxJQUFLLENBQUEsa0JBQUEsQ0FBbUIsWUFDcEMsUUFBV0EsQ0FBQUEsQ0FBQUEsQ0FBaUIsV0FDekIsSUFBSyxDQUFBLE1BQUEsQ0FBTyxlQUFpQixvQkFDN0IsQ0FBQSxJQUFBLENBQUssT0FBTyxZQUFlLENBQUEsSUFBQSxDQUFPLEtBQUssTUFBTyxDQUFBLGNBQUEsQ0FBaUIseURBQy9ELElBQUssQ0FBQSxNQUFBLENBQU8sYUFBZSxHQUFNLENBQUEsSUFBQSxDQUFLLE9BQU8sY0FBaUIsQ0FBQSwrREFDMUQsRUFDWCxDQUNGLENBRUEsU0FBUyxhQUFnQixFQUFBLENBRXZCLElBQU1sTyxDQUFVLENBQUEsV0FBQSxHQUFjLGFBQWMsQ0FBQSwwQkFBMEIsRUFDdEUsT0FBSUEsQ0FBQUEsQ0FDSyxVQUFVQSxDQUFRLENBQUEsT0FBTyxFQUV6QixJQUVYLENBRUEsU0FBUyxlQUFrQixFQUFBLENBQ3pCLElBQU1tTyxDQUFhLENBQUEsYUFBQSxHQUNmQSxDQUNGLEdBQUEsSUFBQSxDQUFLLE9BQVMsWUFBYSxDQUFBLElBQUEsQ0FBSyxPQUFRQSxDQUFVLENBQUEsRUFFdEQsQ0FHQSxPQUFNLEtBQUEsQ0FBQSxVQUFXLENBQ2YsZUFBZ0IsRUFBQSxDQUNoQix1QkFDQSxDQUFBLElBQUlDLENBQU8sQ0FBQSxXQUFBLEVBQWMsQ0FBQSxJQUFBLENBQ3pCLFlBQVlBLENBQUksQ0FBQSxDQUNoQixJQUFNQyxDQUFlLENBQUEsV0FBQSxHQUFjLGdCQUNqQyxDQUFBLHNEQUNGLEVBQ0FELENBQUssQ0FBQSxnQkFBQSxDQUFpQixhQUFjLFNBQVMxUixDQUFBQSxDQUFLLENBQ2hELElBQU0yQixDQUFBQSxDQUFTM0IsRUFBSSxNQUNib0QsQ0FBQUEsQ0FBQUEsQ0FBZSxnQkFBZ0J6QixDQUFNLENBQUEsQ0FDdkN5QixHQUFnQkEsQ0FBYSxDQUFBLEdBQUEsRUFDL0JBLEVBQWEsR0FBSSxDQUFBLEtBQUEsR0FFckIsQ0FBQyxDQUFBLENBRUQsSUFBTXdPLENBQW1CLENBQUEsTUFBQSxDQUFPLFdBQWEsTUFBTyxDQUFBLFVBQUEsQ0FBVyxLQUFLLE1BQU0sQ0FBQSxDQUFJLEtBRTlFLE1BQU8sQ0FBQSxVQUFBLENBQWEsU0FBUzNSLENBQUFBLENBQU8sQ0FDOUJBLENBQUFBLENBQU0sT0FBU0EsQ0FBTSxDQUFBLEtBQUEsQ0FBTSxNQUM3QixjQUFlLEVBQUEsQ0FDZixRQUFRMFIsQ0FBYyxDQUFBLFNBQVNqVixFQUFLLENBQ2xDLFlBQUEsQ0FBYUEsRUFBSyxlQUFpQixDQUFBLENBQ2pDLFNBQVUsV0FBWSxFQUFBLENBQ3RCLFlBQ0YsQ0FBQyxFQUNILENBQUMsQ0FFR2tWLEVBQUFBLENBQUFBLEVBQ0ZBLEVBQWlCM1IsQ0FBSyxFQUc1QixFQUNBLFNBQVUsRUFBQSxDQUFFLFdBQVcsVUFBVyxDQUNoQyxhQUFheVIsQ0FBTSxDQUFBLFdBQUEsQ0FBYSxFQUFFLENBQUEsQ0FDbENBLEVBQU8sS0FDVCxDQUFBLENBQUcsQ0FBQyxFQUNOLENBQUMsQ0FFTSxDQUFBLElBQ1QsQ0FBRyxFQUFBLENBZ0xJRyxFQUFRcFYsRUNoaUtmLENBQUEsU0FBU3FWLEdBQVVDLENBQWVqUyxDQUFBQSxDQUFBQSxDQUFhLENBQzdDLEdBQUlpUyxDQUFBQSxHQUFhLFNBQ2YsT0FBTyxDQUFBLENBQUEsQ0FFVCxJQUFNQyxDQUFpQkQsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFNLEdBQUcsQ0FBQSxDQUNuQ0UsRUFBVW5TLENBQUksQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUM3QixDQUFBLElBQUEsSUFBU2QsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJaVQsRUFBUSxNQUFRalQsQ0FBQUEsQ0FBQUEsRUFBQUEsQ0FBSyxDQUN2QyxJQUFNa1QsQ0FBQUEsQ0FBb0JGLEVBQWUsS0FBTSxFQUFBLENBQ3pDRyxFQUFjRixDQUFRalQsQ0FBQUEsQ0FBQyxFQUM3QixHQUFJa1QsQ0FBQUEsR0FBc0JDLEdBQWVELENBQXNCLEdBQUEsR0FBQSxDQUM3RCxPQUFPLENBRVQsQ0FBQSxDQUFBLEdBQ0VGLEVBQWUsTUFBVyxHQUFBLENBQUEsRUFDekJBLEVBQWUsTUFBVyxHQUFBLENBQUEsRUFBS0EsRUFBZSxDQUFDLENBQUEsR0FBTSxHQUV0RCxPQUFPLENBQUEsQ0FFWCxDQUNBLE9BQU8sQ0FBQSxDQUNULENBRUEsU0FBU0ksRUFBQUEsQ0FBWXZTLEVBQWMsQ0FDakMsSUFBTXdTLEVBQWVSLENBQUssQ0FBQSxPQUFBLENBQVEsYUFBYSxDQUMvQyxDQUFBLElBQUEsSUFBUzdTLEVBQUksQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSXFULEVBQWEsTUFBUXJULENBQUFBLENBQUFBLEVBQUFBLENBQUssQ0FDNUMsSUFBTXRDLENBQUFBLENBQU0yVixFQUFhclQsQ0FBQyxDQUFBLENBQ3RCOFMsR0FBVXBWLENBQUksQ0FBQSxZQUFBLENBQWEsV0FBVyxDQUFHbUQsQ0FBQUEsQ0FBSSxDQUMvQ2dTLEVBQUFBLENBQUFBLENBQUssT0FBUW5WLENBQUFBLENBQUFBLENBQUssWUFBYSxJQUFJLEVBRXZDLENBQ0YsQ0FFQW1WLENBQUFBLENBQUssZ0JBQWdCLFdBQWEsQ0FBQSxDQUVoQyxRQUFTLFNBQVU1VSxDQUFBQSxDQUFNK0MsRUFBSyxDQUM1QixHQUFJLEVBQUVBLENBQWUsWUFBQSxXQUFBLENBQUEsQ0FDbkIsT0FBTyxDQUVULENBQUEsQ0FBQSxHQUFJL0MsSUFBUyxtQkFBcUIsQ0FBQSxDQUNoQyxJQUFNcVYsQ0FBU3RTLENBQUFBLENBQUFBLENBQUksT0FBTyxhQUd4QnNTLENBQUFBLENBQUFBLEVBQ0FBLEVBQU8sSUFBUyxHQUFBLEtBQUEsRUFDaEJ0UyxFQUFJLE1BQVUsRUFBQSxJQUFBLEVBQ2RBLEVBQUksTUFBa0IsWUFBQSxPQUFBLEVBQ3RCQSxFQUFJLE1BQU8sQ0FBQSxZQUFBLENBQWEsV0FBVyxDQUFNLEdBQUEsUUFBQSxFQUV6Q29TLEVBQVlFLENBQUFBLENBQUFBLENBQU8sSUFBSSxFQUUzQixDQUNGLENBQ0YsQ0FBQyxFQ3BERCxTQUFTQyxFQUFBQSxDQUFleFYsRUFBYSxDQUNqQyxPQUFPQSxFQUFJLE9BQVEsQ0FBQSxvQkFBQSxDQUFzQixPQUFPLENBQUUsQ0FBQSxXQUFBLEVBQ3RELENBRUEsSUFBTXlWLEdBQWdCLENBQUMsd0JBQUEsQ0FBMEIsd0JBQXlCLGlCQUFtQixDQUFBLGdCQUFBLENBQWtCLG9CQUFxQixrQkFBb0IsQ0FBQSxvQkFBQSxDQUFzQixzQkFBdUIsb0JBQW9CLENBQUEsQ0FFek4sU0FBU0MsRUFBVXhOLENBQUFBLENBQUFBLENBQW1CQyxFQUFhLENBQy9DLElBQUlsRixFQUNKLE9BQUksTUFBQSxDQUFPLGFBQWUsT0FBTyxNQUFBLENBQU8sYUFBZ0IsVUFFcERBLENBQUFBLENBQUFBLENBQU0sSUFBSSxXQUFBLENBQVlpRixDQUFXLENBQUEsQ0FBRSxRQUFTLENBQU8sQ0FBQSxDQUFBLFVBQUEsQ0FBWSxHQUFNLFFBQVUsQ0FBQSxDQUFBLENBQUEsQ0FBTSxPQUFBQyxDQUFPLENBQUMsR0FFN0ZsRixDQUFNLENBQUEsUUFBQSxDQUFTLFlBQVksYUFBYSxDQUFBLENBQ3hDQSxFQUFJLGVBQWdCaUYsQ0FBQUEsQ0FBQUEsQ0FBVyxHQUFNLENBQU1DLENBQUFBLENBQUFBLENBQU0sR0FFOUNsRixDQUNYLENBRUEsU0FBUzBTLENBQWdCL1EsQ0FBQUEsQ0FBQUEsQ0FBcUIxRSxFQUFjZ0QsQ0FBb0IwUyxDQUFBQSxDQUFBQSxDQUE2QixDQUN0R0gsRUFBYyxDQUFBLFFBQUEsQ0FBU3ZWLENBQUksQ0FHMUIwRSxFQUFBQSxDQUFBQSxFQUFVQSxFQUFPLFFBQ2pCLEVBQUEsS0FBQSxDQUFNLEtBQUtBLENBQU8sQ0FBQSxRQUFRLEVBQUUsT0FBUy9ELENBQUFBLENBQUFBLEVBQU0sQ0FFdkMsSUFBTXFILENBQUFBLENBRFFzTixHQUFldFYsQ0FBSSxDQUFBLENBQ1QsUUFBUSxPQUFTLENBQUEsU0FBUyxFQUNsRCxHQUFJLENBQUMwVixFQUFVLEdBQUkvVSxDQUFBQSxDQUFnQixFQUFHLENBQ2xDLEdBQUdBLEVBQUUsWUFBYXFILENBQUFBLENBQVMsRUFBRyxDQUMxQixJQUFNMk4sRUFBV0gsRUFBVXhOLENBQUFBLENBQUFBLENBQVUsUUFBUSxTQUFXLENBQUEsT0FBTyxFQUFHaEYsQ0FBTSxDQUFBLE1BQU0sRUFDOUUyUyxDQUFTLENBQUEsTUFBQSxDQUFPLEtBQU8sa0JBQ3ZCaFYsQ0FBQUEsQ0FBQUEsQ0FBRSxjQUFjZ1YsQ0FBUSxDQUFBLENBQ3hCRCxFQUFVLEdBQUkvVSxDQUFBQSxDQUFnQixFQUNsQyxDQUNJQSxDQUFBQSxDQUFFLFFBQ0Y4VSxFQUFBQSxDQUFBQSxDQUFnQjlVLENBQWtCWCxDQUFBQSxDQUFBQSxDQUFNZ0QsRUFBTzBTLENBQVMsRUFFaEUsQ0FDSixDQUFDLEVBRVQsQ0FHQWQsQ0FBSyxDQUFBLGVBQUEsQ0FBZ0IsbUJBQW9CLENBQ3JDLE9BQUEsQ0FBUyxDQUFDNVUsQ0FBTStDLENBQUFBLENBQUFBLEdBQTZCLENBSXpDLEdBSEksRUFBRUEsYUFBZSxXQUdsQkEsQ0FBQUEsRUFBQUEsQ0FBQUEsQ0FBSSxPQUFPLElBQVMsR0FBQSxrQkFBQSxDQUNuQixPQUFPLENBRVgsQ0FBQSxDQUFBLElBQU0yUyxFQUFZLElBQUksR0FBQSxDQUNoQmhSLEVBQVMzQixDQUFJLENBQUEsTUFBQSxFQUF5QkEsRUFBSSxNQUFPLENBQUEsTUFBQSxDQUN2RCxPQUFBMFMsQ0FBZ0IvUSxDQUFBQSxDQUFBQSxDQUFRMUUsRUFBTStDLENBQUsyUyxDQUFBQSxDQUFTLEVBQ3JDLENBQ1gsQ0FBQSxDQUFBLENBQ0EsSUFBTSxDQUFBLFNBQVUzQixDQUFnQixDQUFBLEdBRWhDLGlCQUFtQixDQUFBLFNBQ2ZDLEVBQ0FwTSxDQUNBbkksQ0FBQUEsQ0FBQUEsQ0FDTSxDQUNOLE9BQU91VSxDQUNYLEVBQ0EsWUFBYyxDQUFBLFNBQVV2UCxFQUFtQyxDQUN2RCxPQUFPLEVBQ1gsQ0FDQSxDQUFBLFVBQUEsQ0FBWSxTQUNSQSxDQUNBQyxDQUFBQSxDQUFBQSxDQUNBMUQsRUFDQStELENBQ2dCLENBQUEsQ0FDaEIsT0FBTyxDQUNYLENBQUEsQ0FBQSxDQUNBLGlCQUFrQixTQUNkNkMsQ0FBQUEsQ0FDQXFNLEVBQ0F4VSxDQUNGLENBQUEsR0FFRixZQUFjLENBQUEsVUFBNkIsQ0FDdkMsT0FBTyxJQUNYLENBQ0osQ0FBQyxDQUFBLENDcEZEbVYsRUFBSyxlQUFnQixDQUFBLE9BQUEsQ0FBUyxDQUU1QixPQUFBLENBQVMsU0FBVTVVLENBQUFBLENBQU0rQyxFQUFLLENBQ3hCLE9BQUEsQ0FBUSxNQUNWLE9BQVEsQ0FBQSxLQUFBLENBQU0vQyxFQUFNK0MsQ0FBRyxDQUFBLENBQ2QsU0FDVCxPQUFRLENBQUEsR0FBQSxDQUFJLFNBQVUvQyxDQUFNK0MsQ0FBQUEsQ0FBRyxFQUluQyxDQUNGLENBQUMsRUNaRCxJQUFNc1MsQ0FBQUEsQ0FBY1QsRUFBSyxNQUdyQmIsQ0FBQUEsQ0FBQUEsQ0FFRTZCLEdBQWEsWUFHbkIsQ0FBQSxTQUFTQyxFQUFXL1YsQ0FBYXlELENBQUFBLENBQUFBLENBQWdCLENBQy9DLE9BQU96RCxDQUFBQSxDQUFJLFVBQVUsQ0FBR3lELENBQUFBLENBQUFBLENBQU8sTUFBTSxDQUFNQSxHQUFBQSxDQUM3QyxDQU9BLFNBQVN1UyxFQUFBQSxDQUFrQnJXLEVBQWNzVyxDQUF3QixDQUFBLENBQy9ELEdBQUksQ0FBQ3RXLENBQUFBLEVBQU8sQ0FBQ3NXLENBQWdCLENBQUEsT0FBTyxLQUVwQyxJQUFNQyxDQUFBQSxDQUFXRCxFQUFlLFFBQVMsRUFBQSxDQVNuQ0UsRUFBb0IsQ0FDeEJELENBQUFBLENBRUFBLEVBQVMsTUFBTyxDQUFBLENBQUEsQ0FBRyxDQUFDLENBQUksQ0FBQSxHQUFBLENBQ3hCQSxFQUFTLE1BQU8sQ0FBQSxDQUFBLENBQUcsQ0FBQyxDQUFJLENBQUEsR0FBQSxDQUV4QkEsRUFBUyxNQUFPLENBQUEsQ0FBQSxDQUFHLENBQUMsQ0FBSSxDQUFBLEdBQUEsQ0FDeEJBLEVBQVMsTUFBTyxDQUFBLENBQUEsQ0FBRyxDQUFDLENBQUksQ0FBQSxHQUFBLENBQ3hCQSxFQUFTLE1BQU8sQ0FBQSxDQUFBLENBQUcsQ0FBQyxDQUFJLENBQUEsSUFBQSxDQUN4QkEsRUFBUyxNQUFPLENBQUEsQ0FBQSxDQUFHLENBQUMsQ0FBQSxDQUFJLElBRXhCLENBQUEsR0FBQSxDQUNBLElBQ0EsS0FDQSxDQUFBLEtBQ0YsR0FDSUgsQ0FBV0csQ0FBQUEsQ0FBQUEsQ0FBVSxHQUFHLENBQUtILEVBQUFBLENBQUFBLENBQVdHLEVBQVUsR0FBRyxDQUFBLEdBQ3ZEQyxFQUFrQixJQUFLLENBQUEsT0FBTyxFQUdoQyxJQUFTbFUsSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJa1UsQ0FBQUEsQ0FBQUEsQ0FBa0IsT0FBUWxVLENBQUssRUFBQSxDQUFBLENBQ2pELElBQU1aLENBQU95VSxDQUFBQSxFQUFBQSxDQUFhSyxFQUFrQmxVLENBQUMsQ0FBQSxDQUN2Q21VLEVBQVluQyxDQUFJLENBQUEsd0JBQUEsQ0FBeUJ0VSxFQUFLMEIsQ0FBSSxDQUFBLENBQ3hELEdBQUkrVSxDQUNGLENBQUEsT0FBSUEsSUFBYyxNQUNUbkMsQ0FBQUEsQ0FBQUEsQ0FBSSxnQkFBZ0J0VSxDQUFLMEIsQ0FBQUEsQ0FBSSxDQUU3QjRTLENBQUFBLENBQUFBLENBQUksZ0JBQWlCdFUsQ0FBQUEsQ0FBQUEsQ0FBS3lXLENBQVMsQ0FHaEQsQ0FFQSxPQUFPLElBQ1QsQ0FHQSxTQUFTQyxDQUFnQnBULENBQUFBLENBQUFBLENBQWtCLENBQ3JDQSxDQUFJLENBQUEsTUFBQSxDQUFPLFFBQ1RzUyxDQUFPLENBQUEseUJBQUEsR0FDVHRTLEVBQUksTUFBTyxDQUFBLE9BQUEsQ0FBVSxJQUVkc1MsQ0FBTyxDQUFBLHVCQUFBLEdBQ2hCdFMsRUFBSSxNQUFPLENBQUEsT0FBQSxDQUFVLElBRXpCLENBRUE2UixDQUFBQSxDQUFLLGdCQUFnQixrQkFBb0IsQ0FBQSxDQUV2QyxLQUFPd0IsQ0FBVyxFQUFBLENBQ2hCckMsRUFBTXFDLENBRUZmLENBQUFBLENBQUFBLENBQU8sNEJBQThCLEtBQ3ZDQSxDQUFBQSxHQUFBQSxDQUFBQSxDQUFPLDBCQUE0QixDQUVqQ0EsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBTywwQkFBNEIsS0FDckNBLENBQUFBLEdBQUFBLENBQUFBLENBQU8sdUJBQTBCLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FFL0JBLENBQU8sQ0FBQSw2QkFBQSxHQUFrQyxTQUMzQ0EsQ0FBTyxDQUFBLDZCQUFBLENBQWdDLElBRXJDQSxDQUFPLENBQUEsbUNBQUEsR0FBd0MsU0FDakRBLENBQU8sQ0FBQSxtQ0FBQSxDQUFzQyxJQUVqRCxDQUdBLENBQUEsT0FBQSxDQUFTLENBQUNyVixDQUFNK0MsQ0FBQUEsQ0FBQUEsR0FBUSxDQUN0QixHQUFJLEVBQUVBLGFBQWUsV0FDbkIsQ0FBQSxDQUFBLE9BQU8sR0FFVCxHQUNFL0MsQ0FBQUEsR0FBUyxtQkFDVCtDLENBQUksQ0FBQSxNQUFBLENBQU8sS0FDWEEsQ0FBSSxDQUFBLE1BQUEsQ0FBTyxJQUFJLE1BQVcsR0FBQSxHQUFBLENBQzFCLENBQ0EsR0FBSUEsQ0FBQUEsQ0FBSSxPQUFPLE1BQ1RzUyxHQUFBQSxDQUFBQSxDQUFPLCtCQU1UQSxDQUFPLENBQUEsbUNBQUEsRUFDUHRTLEVBQUksTUFBTyxDQUFBLEdBQUEsQ0FBSSx1QkFBd0IsQ0FBQSxLQUFBLENBQU0sZUFBZSxDQUU1RCxDQUFBLENBQUEsT0FBQUEsRUFBSSxNQUFPLENBQUEsVUFBQSxDQUFhLEdBQ3hCb1QsQ0FBZ0JwVCxDQUFBQSxDQUFHLEVBQ1osQ0FHWCxDQUFBLENBQUEsR0FBSSxDQUFDQSxDQUFJLENBQUEsTUFBQSxDQUFPLGNBQ2QsT0FBTyxDQUFBLENBQUEsQ0FFVCxJQUFNMkIsQ0FBU29SLENBQUFBLEVBQUFBLENBQ2IvUyxFQUFJLE1BQU8sQ0FBQSxhQUFBLENBQWMsSUFDekJBLENBQUksQ0FBQSxNQUFBLENBQU8sSUFBSSxNQUNqQixDQUFBLENBQ0EsT0FBSTJCLENBQ0Z5UixHQUFBQSxDQUFBQSxDQUFnQnBULENBQUcsQ0FDbkJBLENBQUFBLENBQUFBLENBQUksT0FBTyxVQUFhLENBQUEsQ0FBQSxDQUFBLENBQ3hCQSxFQUFJLE1BQU8sQ0FBQSxNQUFBLENBQVMyQixHQUVmLENBQ1QsQ0FBQSxDQUNGLENBQ0YsQ0FBQyxDQ3JJRGtRLENBQUFBLENBQUFBLENBQUssZ0JBQWdCLGdCQUFrQixDQUFBLENBRXJDLFFBQVMsQ0FBQzVVLENBQUFBLENBQU0rQyxJQUFRLENBQ3RCLEdBQUksRUFBRUEsQ0FBZSxZQUFBLFdBQUEsQ0FBQSxDQUNuQixPQUFPLENBRVQsQ0FBQSxDQUFBLEdBQUkvQyxJQUFTLG1CQUFxQixDQUFBLENBQ2hDLEdBQUksQ0FBQytDLENBQUFBLENBQUksUUFBVSxDQUFDQSxDQUFBQSxDQUFJLE9BQU8sR0FDN0IsQ0FBQSxPQUVGLElBQU13UCxDQUFTeFAsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPLEdBQUksQ0FBQSxNQUFBLENBQzFCd1AsR0FBVSxHQUNacUMsRUFBQUEsQ0FBQUEsQ0FBSyxRQUFRLDZCQUE2QixDQUFBLENBQUUsUUFBU3ZPLENBQVksRUFBQSxDQUMvRHVPLEVBQUssT0FBUXZPLENBQUFBLENBQUFBLENBQVMscUJBQXVCLENBQUEsQ0FBRSxNQUFBa00sQ0FBQUEsQ0FBTyxDQUFDLEVBQ3pELENBQUMsRUFFTCxDQUNGLENBQ0YsQ0FBQyxDQ2pCRCxDQUFBLElBQUk4RCxFQUFjLEVBRWxCekIsQ0FBQUEsQ0FBQUEsQ0FBSyxnQkFBZ0IsWUFBYyxDQUFBLENBQy9CLEtBQU0sVUFBWSxDQUVkLElBQUkwQixDQUFVLENBQUEsQ0FBQSxDQUFBLENBQ2QsUUFBV2pRLENBQVcsSUFBQSxLQUFBLENBQU0sS0FBS3VPLENBQUssQ0FBQSxPQUFBLENBQVEsVUFBVSxDQUFDLENBQUEsQ0FFckQsR0FEY3ZPLENBQVEsQ0FBQSxZQUFBLENBQWEsUUFBUSxDQUNqQyxFQUFBLEtBQUEsQ0FBTSxHQUFHLENBQUUsQ0FBQSxRQUFBLENBQVMsWUFBWSxDQUFHLENBQUEsQ0FDekNpUSxFQUFVLENBQ1YsQ0FBQSxDQUFBLEtBQ0osQ0FHSixHQUFHLENBQUNBLENBQUFBLENBQ0EsT0FHSixPQUFRLENBQUEsR0FBQSxDQUFJLG1DQUFtQyxDQUUvQyxDQUFBLElBQU1DLEVBQWMsSUFBSSxXQUFBLENBQVksaUJBQWlCLENBRXJEQSxDQUFBQSxDQUFBQSxDQUFZLFVBQVksU0FBU3ZULENBQUFBLENBQU8sQ0FDcEMsSUFBTXdULENBQUFBLENBQVV4VCxFQUFNLElBRW5CcVQsQ0FBQUEsQ0FBQUEsR0FBZ0IsS0FDZkEsQ0FBY0csQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FFZkgsSUFBZ0JHLENBQ2ZILEdBQUFBLENBQUFBLENBQWNHLEVBQ2RDLEVBQU8sRUFBQSxFQUVmLEVBRUFGLENBQVksQ0FBQSxPQUFBLENBQVUsU0FBUzdULENBQU8sQ0FBQSxDQUNsQyxRQUFRLEtBQU0sQ0FBQSxvQkFBQSxDQUFzQkEsQ0FBSyxFQUM3QyxFQUVKLEVBRUEsT0FBUyxDQUFBLFNBQVUxQyxFQUFNK0MsQ0FBSyxDQUFBLEVBR2xDLENBQUMsQ0FBQSxDQUVELFNBQVMwVCxFQUFTLEVBQUEsQ0FDZCxPQUFPLFFBQVMsQ0FBQSxNQUFBLEdBQ3BCLENDaERBLElBQU1DLEdBQWUsaUNBRXJCOUIsQ0FBQUEsQ0FBQUEsQ0FBSyxnQkFBZ0IsT0FBUyxDQUFBLENBRTFCLFFBQVMsU0FBVTVVLENBQUFBLENBQU0rQyxFQUFLLENBQ3hCL0MsQ0FBQUEsR0FBUyw2QkFBK0IrQyxDQUFJLENBQUEsTUFBQSxFQUMzQzRULEVBQXdCNVQsQ0FBSSxDQUFBLE1BQXFCLEVBRXhELENBQ0osQ0FBQyxFQUVNLFNBQVM0VCxDQUFBQSxDQUF3QnRRLEVBQXNCLENBQzNELElBQU1pRSxFQUFhLEtBQU0sQ0FBQSxJQUFBLENBQUtqRSxFQUFRLFVBQVUsQ0FBQSxDQUMvQyxJQUFTakMsSUFBQUEsQ0FBQUEsSUFBYWtHLENBQVksQ0FBQSxDQUMvQixJQUFNc00sQ0FBVXhTLENBQUFBLENBQUFBLENBQVUsTUFBTSxLQUFNc1MsQ0FBQUEsRUFBYSxHQUFLLEVBQUMsQ0FDeEQsUUFBUzVWLENBQVM4VixJQUFBQSxDQUFBQSxDQUFTLENBQ3ZCLElBQU14UixDQUFBQSxDQUFLdEUsRUFBTSxPQUFRLENBQUEsSUFBQSxDQUFNLEVBQUUsQ0FBRSxDQUFBLE9BQUEsQ0FBUSxTQUFVLEVBQUUsQ0FBQSxDQUFFLFFBQVEsR0FBSyxDQUFBLEVBQUUsRUFDbEUrVixDQUFNLENBQUEsUUFBQSxDQUFTLGVBQWV6UixDQUFFLENBQUEsQ0FDbkN5UixHQUFPQSxDQUFJLENBQUEsT0FBQSxHQUFZLFdBQ3RCLE9BQVEsQ0FBQSxLQUFBLENBQU0scUNBQXNDelIsQ0FBRSxDQUFBLENBQ3REeVIsRUFBSSxNQUFPLEVBQUEsRUFFbkIsQ0FDSixDQUNKLENDdkJBLElBQUk5QyxFQUFZLElBQ1pySCxDQUFBQSxDQUFBQSxDQUFZLElBQUksR0FFcEJrSSxDQUFBQSxDQUFBQSxDQUFLLGdCQUFnQixLQUFPLENBQUEsQ0FDeEIsS0FBTSxTQUFVd0IsQ0FBQUEsQ0FBUSxDQUNwQnJDLENBQU1xQyxDQUFBQSxFQUNWLEVBRUEsT0FBUyxDQUFBLFNBQVVwVyxFQUFNK0MsQ0FBSyxDQUFBLENBQzFCLElBQU0yQixDQUFTM0IsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUNuQixHQUFLMkIsQ0FBQUEsWUFBa0IsY0FJcEIxRSxDQUFTLEdBQUEsMkJBQUEsRUFDUjJXLEVBQXdCalMsQ0FBTSxDQUFBLENBRy9CMUUsSUFBUyx3QkFBMEIsQ0FBQSxDQUFBLENBQ2xDLElBQU11SyxDQUFXLENBQUEsUUFBQSxDQUFTLGlCQUFpQixlQUFlLENBQUEsQ0FDMUQsUUFBU2xFLENBQVcsSUFBQSxLQUFBLENBQU0sSUFBS2tFLENBQUFBLENBQVEsQ0FBRyxDQUFBLENBQ3RDLElBQU0xSCxDQUFNd0QsQ0FBQUEsQ0FBQUEsQ0FBUSxhQUFhLGFBQWEsQ0FBQSxDQUMzQ3hELEdBQU8sQ0FBQzZKLENBQUFBLENBQVUsSUFBSTdKLENBQUcsQ0FBQSxHQUN4QmlVLEdBQW1CelEsQ0FBU3hELENBQUFBLENBQUcsRUFDL0I2SixDQUFVLENBQUEsR0FBQSxDQUFJN0osQ0FBRyxDQUV6QixFQUFBLENBQ0osQ0FDSixDQUNKLENBQUMsRUFFRCxTQUFTaVUsRUFBQUEsQ0FBbUJELEVBQWNoVSxDQUFhLENBQUEsQ0FDbkQsR0FBRyxDQUFDQSxDQUFBQSxDQUNBLE9BRUosT0FBUSxDQUFBLElBQUEsQ0FBSyw0QkFBNkJBLENBQUcsQ0FBQSxDQUM3QyxJQUFNMFQsQ0FBYyxDQUFBLElBQUksWUFBWTFULENBQUcsQ0FBQSxDQUV2QzBULEVBQVksZ0JBQWlCLENBQUEsT0FBQSxDQUFTLFNBQVN2VCxDQUFPLENBQUEsQ0FDbEQ0UixFQUFLLE9BQVFpQyxDQUFBQSxDQUFBQSxDQUFLLGdCQUFpQixDQUFDLEtBQUEsQ0FBTzdULENBQUssQ0FBQyxFQUNyRCxDQUFDLENBRUR1VCxDQUFBQSxDQUFBQSxDQUFZLE9BQVMsU0FBU3ZULENBQUFBLENBQU8sQ0FDakM0UixDQUFLLENBQUEsT0FBQSxDQUFRaUMsRUFBSyxjQUFnQixDQUFBLENBQUMsTUFBTzdULENBQUssQ0FBQyxFQUNwRCxDQUVBdVQsQ0FBQUEsQ0FBQUEsQ0FBWSxRQUFVLFNBQVN2VCxDQUFBQSxDQUFPLENBQ2xDNFIsQ0FBSyxDQUFBLE9BQUEsQ0FBUWlDLEVBQUssZUFBaUIsQ0FBQSxDQUFDLE1BQU83VCxDQUFLLENBQUMsRUFDN0N1VCxDQUFZLENBQUEsVUFBQSxFQUFjLFdBQVksQ0FBQSxNQUFBLEVBQ3RDM0IsQ0FBSyxDQUFBLE9BQUEsQ0FBUWlDLEVBQUssZUFBaUIsQ0FBQSxDQUFDLE1BQU83VCxDQUFLLENBQUMsRUFFekQsQ0FFQXVULENBQUFBLENBQUFBLENBQVksVUFBWSxTQUFTdlQsQ0FBQUEsQ0FBTyxDQUNwQzRSLENBQUssQ0FBQSxPQUFBLENBQVFpQyxFQUFLLHVCQUF5QixDQUFBLENBQUMsTUFBTzdULENBQUssQ0FBQyxFQUN6RCxJQUFNNUIsQ0FBQUEsQ0FBVzRCLEVBQU0sSUFDakJoQyxDQUFBQSxDQUFBQSxDQUFXK1MsRUFBSSxZQUFhM1MsQ0FBQUEsQ0FBUSxFQUNwQzJWLENBQVcsQ0FBQSxLQUFBLENBQU0sS0FBSy9WLENBQVMsQ0FBQSxRQUFRLEVBQzdDLElBQVNzQyxJQUFBQSxDQUFBQSxJQUFTeVQsRUFDZGhELENBQUksQ0FBQSxPQUFBLENBQVFBLEVBQUksaUJBQWtCelEsQ0FBQUEsQ0FBQUEsQ0FBTyxhQUFhLENBQUEsRUFBSyxNQUFRQSxDQUFBQSxDQUFBQSxDQUFPLENBQUMsS0FBTyxDQUFBLEVBQUUsQ0FBQyxDQUFBLENBRWxGQSxFQUFNLE9BQVksR0FBQSxRQUFBLEVBQVlBLEVBQU0sRUFBRyxDQUFBLFVBQUEsQ0FBVyxRQUFRLENBQ3pELEVBQUEsUUFBQSxDQUFTLEtBQUssV0FBWUEsQ0FBQUEsQ0FBSyxFQUd2Q3NSLENBQUssQ0FBQSxPQUFBLENBQVFpQyxFQUFLLHNCQUF3QixDQUFBLENBQUMsTUFBTzdULENBQUssQ0FBQyxFQUM1RCxFQUNKLENDNURBLFNBQVNnVSxFQUFTbFUsQ0FBQUEsQ0FBQUEsQ0FBb0QsQ0FDcEUsSUFBSW1VLENBQUFBLENBQVUsT0FBTyxRQUFTLENBQUEsSUFBQSxDQUM5QixZQUFZLElBQU0sQ0FDWixPQUFPLFFBQVMsQ0FBQSxJQUFBLEdBQVNBLENBQzNCblUsR0FBQUEsQ0FBQUEsQ0FBU21VLENBQVMsQ0FBQSxNQUFBLENBQU8sU0FBUyxJQUFJLENBQUEsQ0FDdENBLEVBQVUsTUFBTyxDQUFBLFFBQUEsQ0FBUyxNQUU5QixDQUFHLENBQUEsR0FBRyxFQUNSLENBRUFELEVBQUFBLENBQVMsQ0FBQ0UsQ0FBR0MsQ0FBQUEsQ0FBQUEsR0FBVyxDQUN0QkMsRUFBWUQsQ0FBQUEsQ0FBTSxFQUNwQixDQUFDLENBQUEsQ0FFRCxTQUFTQyxFQUFZRCxDQUFBQSxDQUFBQSxDQUFnQixDQUNuQyxJQUFJdFUsQ0FBQUEsQ0FBTSxJQUFJLEdBQUlzVSxDQUFBQSxDQUFNLEVBRXhCLFFBQVMsQ0FBQSxnQkFBQSxDQUFpQixjQUFjLENBQUUsQ0FBQSxPQUFBLENBQVEsU0FBVTlRLENBQVMsQ0FBQSxDQUNuRSxJQUFNMEIsQ0FBVzFCLENBQUFBLENBQUFBLENBQVEsYUFBYSxZQUFZLENBQUEsQ0FDbEQsR0FBSSxDQUFDMEIsQ0FDSCxDQUFBLE9BR0YsR0FEY0EsQ0FBUyxDQUFBLEtBQUEsQ0FBTSxJQUFJLENBQ3ZCLENBQUEsSUFBQSxDQUFNNkMsR0FBTUEsQ0FBTSxHQUFBLEtBQUssRUFDL0JnSyxDQUFLLENBQUEsSUFBQSxDQUFLdk8sRUFBUyxLQUFPLENBQUEsQ0FDeEIsVUFBVyxXQUNYLENBQUEsU0FBQSxDQUFXLEVBQ1gsV0FBYSxDQUFBLENBQ2YsQ0FBQyxDQUVELENBQUEsS0FBQSxJQUFBLEdBQVMsQ0FBQzdELENBQUtxSyxDQUFBQSxDQUFNLElBQUtoSyxDQUFJLENBQUEsWUFBQSxDQUFjLENBQzFDLElBQUltRixDQUFBQSxDQUFZLE1BQVF4RixDQUN4QixDQUFBLEdBQUl1RixFQUFTLFFBQVNDLENBQUFBLENBQVMsRUFBRyxDQUNoQyxPQUFBLENBQVEsSUFBSSxZQUFjQSxDQUFBQSxDQUFTLENBQ25DNE0sQ0FBQUEsQ0FBQUEsQ0FBSyxPQUFRdk8sQ0FBQUEsQ0FBQUEsQ0FBUzJCLEVBQVcsSUFBSSxDQUFBLENBQ3JDLEtBQ0YsQ0FDRixDQUVKLENBQUMsQ0FFRCxDQUFBLFFBQUEsQ0FBUyxpQkFBaUIsZUFBZSxDQUFBLENBQUUsUUFBU2hHLENBQU8sRUFBQSxDQUN6RCxJQUFJcVYsQ0FBVyxDQUFBLENBQUEsQ0FBQSxDQUNmLFFBQVNyWCxDQUFRZ0MsSUFBQUEsQ0FBQUEsQ0FBRyxtQkFDbEIsQ0FBQSxHQUFJaEMsRUFBSyxVQUFXLENBQUEsc0JBQXNCLEVBQUcsQ0FDM0MsSUFBSWMsRUFBUWQsQ0FBSyxDQUFBLE9BQUEsQ0FBUSx1QkFBd0IsRUFBRSxDQUFBLENBRW5ELEdBRFk2QyxDQUFJLENBQUEsWUFBQSxDQUFhLElBQUkvQixDQUFLLENBQUEsQ0FDM0IsQ0FDVDhULENBQUssQ0FBQSxJQUFBLENBQUs1UyxDQUFJQSxDQUFBQSxDQUFBQSxDQUFHLFlBQWFoQyxDQUFBQSxDQUFJLEdBQUssRUFBSSxDQUFBLENBQ3pDLFVBQVcsV0FDWCxDQUFBLFNBQUEsQ0FBVyxFQUNYLFdBQWEsQ0FBQSxDQUNmLENBQUMsQ0FDRHFYLENBQUFBLENBQUFBLENBQVcsR0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLEVBQVUsQ0FDYixJQUFJQyxFQUFhdFYsQ0FBRyxDQUFBLFlBQUEsQ0FBYSxxQkFBcUIsQ0FDbERzVixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHt0YXNrczogW119KTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts index 16cfe795..83c66e2e 100644 --- a/framework/assets/js/htmxextensions/sse.ts +++ b/framework/assets/js/htmxextensions/sse.ts @@ -39,8 +39,11 @@ function connectEventSource(ele: Element, url: string) { console.info('Connecting to EventSource', url) const eventSource = new EventSource(url); + eventSource.addEventListener("close", function(event) { + htmx.trigger(ele, "htmx:sseClose", {event: event}); + }) + eventSource.onopen = function(event) { - console.log('EventSource open:', event); htmx.trigger(ele, "htmx:sseOpen", {event: event}); } @@ -52,7 +55,6 @@ function connectEventSource(ele: Element, url: string) { } eventSource.onmessage = function(event) { - console.log('EventSource message:', event.data); htmx.trigger(ele, "htmx:sseBeforeMessage", {event: event}); const response = event.data const fragment = api.makeFragment(response) as DocumentFragment; From 33b4b3299e17095f0c42cefdf6b19ffaeb40c845 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 10:48:41 -0500 Subject: [PATCH 003/145] fixes with managing the sse connections --- examples/chat/chat/broadcast.go | 12 +++-- examples/chat/main.go | 11 ++++ examples/chat/ws/handler.go | 95 +++++++++++++++++++++------------ examples/chat/ws/manager.go | 58 +++++++++++--------- 4 files changed, 110 insertions(+), 66 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 014f68ae..6d68fdf8 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -25,7 +25,7 @@ func NewManager(locator *service.Locator) *Manager { } func (m *Manager) StartListener() { - c := make(chan ws.SocketEvent) + c := make(chan ws.SocketEvent, 1) m.socketManager.Listen(c) for { @@ -33,11 +33,13 @@ func (m *Manager) StartListener() { case event := <-c: switch event.Type { case ws.ConnectedEvent: - m.OnConnected(event) + go m.OnConnected(event) case ws.DisconnectedEvent: - m.OnDisconnected(event) + go m.OnDisconnected(event) case ws.MessageEvent: - m.onMessage(event) + go m.onMessage(event) + default: + fmt.Printf("Unknown event type: %s\n", event.Type) } } } @@ -80,7 +82,7 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { }, ) - go m.backFill(e.Id, e.RoomId) + m.backFill(e.Id, e.RoomId) } func (m *Manager) OnDisconnected(e ws.SocketEvent) { diff --git a/examples/chat/main.go b/examples/chat/main.go index 4cdff390..f8cf9359 100644 --- a/examples/chat/main.go +++ b/examples/chat/main.go @@ -5,10 +5,13 @@ import ( "chat/chat" "chat/internal/db" "chat/ws" + "fmt" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "io/fs" "net/http" + "runtime" + "time" ) func main() { @@ -22,6 +25,14 @@ func main() { chatManager := chat.NewManager(locator) go chatManager.StartListener() + go func() { + for { + count := runtime.NumGoroutine() + fmt.Printf("goroutines: %d\n", count) + time.Sleep(10 * time.Second) + } + }() + h.Start(h.AppOpts{ ServiceLocator: locator, LiveReload: true, diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 0e9af55d..3caca7d8 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -7,6 +7,7 @@ import ( "github.com/maddalax/htmgo/framework/service" "log/slog" "net/http" + "sync" "time" ) @@ -21,55 +22,79 @@ func Handle() http.HandlerFunc { cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) locator := cc.ServiceLocator() manager := service.Get[SocketManager](locator) - // Flush the headers immediately - flusher, ok := w.(http.Flusher) sessionCookie, _ := r.Cookie("session_id") + sessionId := "" - if sessionCookie == nil { - manager.writeCloseRaw(w, flusher, "no session") - return + if sessionCookie != nil { + sessionId = sessionCookie.Value } - sessionId := sessionCookie.Value + ctx := r.Context() + done := make(chan CloseEvent, 1) + writer := make(WriterChan, 1) - roomId := chi.URLParam(r, "id") + wg := sync.WaitGroup{} + wg.Add(1) - if roomId == "" { - slog.Error("invalid room", slog.String("room_id", roomId)) - manager.writeCloseRaw(w, flusher, "invalid room") - return - } - - done := make(chan CloseEvent, 50) - flush := make(chan bool, 50) + /* + * This goroutine is responsible for writing messages to the client + */ + go func() { + defer wg.Done() + defer manager.Disconnect(sessionId) - manager.Add(roomId, sessionId, w, done, flush) + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() - defer func() { - manager.Disconnect(sessionId) + for { + select { + case <-ctx.Done(): + return + case reason := <-done: + fmt.Printf("closing connection: %s\n", reason.Reason) + return + case <-ticker.C: + manager.Ping(sessionId) + case message := <-writer: + _, err := fmt.Fprintf(w, message) + if err != nil { + done <- CloseEvent{ + Code: -1, + Reason: err.Error(), + } + } else { + flusher, ok := w.(http.Flusher) + if ok { + flusher.Flush() + } + } + } + } }() - if !ok { - http.Error(w, "Streaming unsupported", http.StatusInternalServerError) - return - } + /** + * This goroutine is responsible for adding the client to the room + */ + wg.Add(1) + go func() { + defer wg.Done() + if sessionId == "" { + manager.writeCloseRaw(writer, "no session") + return + } - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() + roomId := chi.URLParam(r, "id") - for { - select { - case <-ticker.C: - manager.Ping(sessionId) - case <-flush: - if flusher != nil { - flusher.Flush() - } - case <-done: // Client closed the connection - fmt.Println("Client disconnected") + if roomId == "" { + slog.Error("invalid room", slog.String("room_id", roomId)) + manager.writeCloseRaw(writer, "invalid room") return } - } + + manager.Add(roomId, sessionId, writer, done) + }() + + wg.Wait() } } diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 3c18cd11..d6555423 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -3,10 +3,12 @@ package ws import ( "fmt" "github.com/puzpuzpuz/xsync/v3" - "net/http" + "time" ) type EventType string +type WriterChan chan string +type DoneChan chan CloseEvent const ( ConnectedEvent EventType = "connected" @@ -28,10 +30,9 @@ type CloseEvent struct { type SocketConnection struct { Id string - Writer http.ResponseWriter RoomId string - Done chan CloseEvent - Flush chan bool + Done DoneChan + Writer WriterChan } type SocketManager struct { @@ -62,13 +63,29 @@ func (manager *SocketManager) Listen(listener chan SocketEvent) { if manager.listeners == nil { manager.listeners = make([]chan SocketEvent, 0) } - manager.listeners = append(manager.listeners, listener) + if listener != nil { + manager.listeners = append(manager.listeners, listener) + } } func (manager *SocketManager) dispatch(event SocketEvent) { + fmt.Printf("dispatching event: %s\n", event.Type) + done := make(chan struct{}, 1) + go func() { + for { + select { + case <-done: + fmt.Printf("dispatched event: %s\n", event.Type) + return + case <-time.After(5 * time.Second): + fmt.Printf("havent dispatched event after 5s, chan blocked: %s\n", event.Type) + } + } + }() for _, listener := range manager.listeners { listener <- event } + done <- struct{}{} } func (manager *SocketManager) OnMessage(id string, message map[string]any) { @@ -84,7 +101,7 @@ func (manager *SocketManager) OnMessage(id string, message map[string]any) { }) } -func (manager *SocketManager) Add(roomId string, id string, writer http.ResponseWriter, done chan CloseEvent, flush chan bool) { +func (manager *SocketManager) Add(roomId string, id string, writer chan string, done chan CloseEvent) { manager.idToRoom.Store(id, roomId) sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { @@ -96,7 +113,6 @@ func (manager *SocketManager) Add(roomId string, id string, writer http.Response Writer: writer, RoomId: roomId, Done: done, - Flush: flush, }) s, ok := sockets.Load(id) @@ -110,6 +126,8 @@ func (manager *SocketManager) Add(roomId string, id string, writer http.Response RoomId: s.RoomId, Payload: map[string]any{}, }) + + fmt.Printf("User %s connected to %s\n", id, roomId) } func (manager *SocketManager) OnClose(id string) { @@ -141,7 +159,7 @@ func (manager *SocketManager) CloseWithMessage(id string, message string) { func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { - go manager.OnClose(id) + manager.OnClose(id) conn.Done <- CloseEvent{ Code: -1, Reason: "", @@ -169,35 +187,23 @@ func (manager *SocketManager) Ping(id string) { } } -func (manager *SocketManager) writeCloseRaw(writer http.ResponseWriter, flusher http.Flusher, message string) { - err := manager.writeTextRaw(writer, "close", message) - if err == nil { - flusher.Flush() - } +func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { + manager.writeTextRaw(writer, "close", message) } -func (manager *SocketManager) writeTextRaw(writer http.ResponseWriter, event string, message string) error { - if writer == nil { - return nil - } - var err error +func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, message string) { if event != "" { - _, err = fmt.Fprintf(writer, "event: %s\ndata: %s\n\n", event, message) + writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) } else { - _, err = fmt.Fprintf(writer, "data: %s\n\n", message) + writer <- fmt.Sprintf("data: %s\n\n", message) } - return err } func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { if socket.Writer == nil { return } - err := manager.writeTextRaw(socket.Writer, event, message) - if err != nil && event != "close" { - manager.CloseWithMessage(socket.Id, "failed to write message") - } - socket.Flush <- true + manager.writeTextRaw(socket.Writer, event, message) } func (manager *SocketManager) BroadcastText(roomId string, message string, predicate func(conn SocketConnection) bool) { From d739ef3758948a66f35505f84196602b2170d8d4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 11:06:00 -0500 Subject: [PATCH 004/145] fix issues with error handling --- examples/chat/pages/chat.$id.go | 2 +- examples/chat/ws/handler.go | 11 ++++------- examples/chat/ws/manager.go | 16 +++++----------- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 2f9938a4..497b52eb 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -26,7 +26,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { js.ConsoleLog("Connected to chat room"), ), - h.HxOnSseClose( + h.HxOnSseError( js.EvalJs(fmt.Sprintf(` const reason = e.detail.event.data if(['invalid room', 'no session', 'invalid user'].includes(reason)) { diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index 3caca7d8..e6a7060d 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -31,7 +31,7 @@ func Handle() http.HandlerFunc { } ctx := r.Context() - done := make(chan CloseEvent, 1) + done := make(chan bool, 1) writer := make(WriterChan, 1) wg := sync.WaitGroup{} @@ -51,18 +51,15 @@ func Handle() http.HandlerFunc { select { case <-ctx.Done(): return - case reason := <-done: - fmt.Printf("closing connection: %s\n", reason.Reason) + case <-done: + fmt.Printf("closing connection: \n") return case <-ticker.C: manager.Ping(sessionId) case message := <-writer: _, err := fmt.Fprintf(w, message) if err != nil { - done <- CloseEvent{ - Code: -1, - Reason: err.Error(), - } + done <- true } else { flusher, ok := w.(http.Flusher) if ok { diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index d6555423..f4dbb9bc 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -8,7 +8,7 @@ import ( type EventType string type WriterChan chan string -type DoneChan chan CloseEvent +type DoneChan chan bool const ( ConnectedEvent EventType = "connected" @@ -101,7 +101,7 @@ func (manager *SocketManager) OnMessage(id string, message map[string]any) { }) } -func (manager *SocketManager) Add(roomId string, id string, writer chan string, done chan CloseEvent) { +func (manager *SocketManager) Add(roomId string, id string, writer WriterChan, done DoneChan) { manager.idToRoom.Store(id, roomId) sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { @@ -148,11 +148,8 @@ func (manager *SocketManager) CloseWithMessage(id string, message string) { conn := manager.Get(id) if conn != nil { defer manager.OnClose(id) - manager.writeText(*conn, "close", message) - conn.Done <- CloseEvent{ - Code: -1, - Reason: message, - } + manager.writeText(*conn, "error", message) + conn.Done <- true } } @@ -160,10 +157,7 @@ func (manager *SocketManager) Disconnect(id string) { conn := manager.Get(id) if conn != nil { manager.OnClose(id) - conn.Done <- CloseEvent{ - Code: -1, - Reason: "", - } + conn.Done <- true } } From 6ea3f77b62c1dcd9dcea59b0f6d07154e397e1f1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 12:10:04 -0500 Subject: [PATCH 005/145] fix issues with channel buffer size --- examples/chat/chat/broadcast.go | 6 ++--- examples/chat/internal/routine/goroutine.go | 25 +++++++++++++++++++++ examples/chat/ws/handler.go | 19 ++++++++++++++-- examples/chat/ws/manager.go | 13 ++++++----- 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 examples/chat/internal/routine/goroutine.go diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 6d68fdf8..4c76de40 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -33,11 +33,11 @@ func (m *Manager) StartListener() { case event := <-c: switch event.Type { case ws.ConnectedEvent: - go m.OnConnected(event) + m.OnConnected(event) case ws.DisconnectedEvent: - go m.OnDisconnected(event) + m.OnDisconnected(event) case ws.MessageEvent: - go m.onMessage(event) + m.onMessage(event) default: fmt.Printf("Unknown event type: %s\n", event.Type) } diff --git a/examples/chat/internal/routine/goroutine.go b/examples/chat/internal/routine/goroutine.go new file mode 100644 index 00000000..144f68a6 --- /dev/null +++ b/examples/chat/internal/routine/goroutine.go @@ -0,0 +1,25 @@ +package routine + +import ( + "fmt" + "time" +) + +func DebugLongRunning(name string, f func()) { + now := time.Now() + done := make(chan struct{}, 1) + go func() { + ticker := time.NewTicker(time.Second * 5) + for { + select { + case <-done: + return + case <-ticker.C: + elapsed := time.Since(now).Milliseconds() + fmt.Printf("function %s has not finished after %dms\n", name, elapsed) + } + } + }() + f() + done <- struct{}{} +} diff --git a/examples/chat/ws/handler.go b/examples/chat/ws/handler.go index e6a7060d..04a2a8df 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/ws/handler.go @@ -31,8 +31,13 @@ func Handle() http.HandlerFunc { } ctx := r.Context() - done := make(chan bool, 1) - writer := make(WriterChan, 1) + + /* + Large buffer in case the client disconnects while we are writing + we don't want to block the writer + */ + done := make(chan bool, 1000) + writer := make(WriterChan, 1000) wg := sync.WaitGroup{} wg.Add(1) @@ -44,6 +49,16 @@ func Handle() http.HandlerFunc { defer wg.Done() defer manager.Disconnect(sessionId) + defer func() { + fmt.Printf("empting channels\n") + for len(writer) > 0 { + <-writer + } + for len(done) > 0 { + <-done + } + }() + ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index f4dbb9bc..4d653f17 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -1,6 +1,7 @@ package ws import ( + "chat/internal/routine" "fmt" "github.com/puzpuzpuz/xsync/v3" "time" @@ -186,11 +187,13 @@ func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { } func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, message string) { - if event != "" { - writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) - } else { - writer <- fmt.Sprintf("data: %s\n\n", message) - } + routine.DebugLongRunning("writeTextRaw", func() { + if event != "" { + writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) + } else { + writer <- fmt.Sprintf("data: %s\n\n", message) + } + }) } func (manager *SocketManager) writeText(socket SocketConnection, event string, message string) { From deb87dceed46ae5bc0797c2f9149f046a388ed80 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 2 Oct 2024 12:56:11 -0500 Subject: [PATCH 006/145] test --- examples/chat/ws/manager.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index 4d653f17..afb3a113 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -188,10 +188,19 @@ func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, message string) { routine.DebugLongRunning("writeTextRaw", func() { + timeout := 3 * time.Second + data := "" if event != "" { - writer <- fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) + data = fmt.Sprintf("event: %s\ndata: %s\n\n", event, message) } else { - writer <- fmt.Sprintf("data: %s\n\n", message) + data = fmt.Sprintf("data: %s\n\n", message) + } + fmt.Printf("writing to channel:\n") + select { + case writer <- data: + fmt.Println("Sent to the channel") + case <-time.After(timeout): + fmt.Printf("could not send %s to channel after %s\n", data, timeout) } }) } From aa6d311fa8ee68f5bd19a8701f11c9ea88aebf23 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 11:38:40 -0500 Subject: [PATCH 007/145] sidebar fixes --- examples/chat/chat/broadcast.go | 43 +++++++++++++---------- examples/chat/chat/component.go | 16 ++++----- examples/chat/pages/chat.$id.go | 3 +- examples/chat/ws/manager.go | 2 -- framework/assets/dist/htmgo.js | 4 +-- framework/assets/js/htmxextensions/sse.ts | 3 +- 6 files changed, 37 insertions(+), 34 deletions(-) diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 4c76de40..64ae0825 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -45,6 +45,27 @@ func (m *Manager) StartListener() { } } +func (m *Manager) dispatchConnectedUsers(roomId string, predicate func(conn ws.SocketConnection) bool) { + + connectedUsers := make([]db.User, 0) + + // backfill all existing clients to the connected client + m.socketManager.ForEachSocket(roomId, func(conn ws.SocketConnection) { + if !predicate(conn) { + return + } + user, err := m.queries.GetUserBySessionId(context.Background(), conn.Id) + if err != nil { + return + } + connectedUsers = append(connectedUsers, user) + }) + + m.socketManager.ForEachSocket(roomId, func(conn ws.SocketConnection) { + m.socketManager.SendText(conn.Id, h.Render(ConnectedUsers(connectedUsers, conn.Id))) + }) +} + func (m *Manager) OnConnected(e ws.SocketEvent) { room, _ := m.service.GetRoom(e.RoomId) @@ -62,26 +83,10 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { fmt.Printf("User %s connected to %s\n", user.Name, e.RoomId) - // backfill all existing clients to the connected client - m.socketManager.ForEachSocket(e.RoomId, func(conn ws.SocketConnection) { - user, err := m.queries.GetUserBySessionId(context.Background(), conn.Id) - if err != nil { - return - } - isMe := conn.Id == e.Id - fmt.Printf("Sending connected user %s to %s\n", user.Name, e.Id) - m.socketManager.SendText(e.Id, h.Render(ConnectedUsers(user.Name, isMe))) + m.dispatchConnectedUsers(e.RoomId, func(conn ws.SocketConnection) bool { + return true }) - // send the connected user to all existing clients - m.socketManager.BroadcastText( - e.RoomId, - h.Render(ConnectedUsers(user.Name, false)), - func(conn ws.SocketConnection) bool { - return conn.Id != e.Id - }, - ) - m.backFill(e.Id, e.RoomId) } @@ -95,7 +100,7 @@ func (m *Manager) OnDisconnected(e ws.SocketEvent) { return } fmt.Printf("User %s disconnected from %s\n", user.Name, room.ID) - m.socketManager.BroadcastText(room.ID, h.Render(ConnectedUser(user.Name, true, false)), func(conn ws.SocketConnection) bool { + m.dispatchConnectedUsers(e.RoomId, func(conn ws.SocketConnection) bool { return conn.Id != e.Id }) } diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index bf7c18d6..f81adbf8 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -1,6 +1,7 @@ package chat import ( + "chat/internal/db" "fmt" "github.com/maddalax/htmgo/framework/h" "strings" @@ -27,22 +28,19 @@ func MessageRow(message *Message) *h.Element { ) } -func ConnectedUsers(username string, isMe bool) *h.Element { +func ConnectedUsers(users []db.User, myId string) *h.Element { return h.Ul( - h.Attribute("hx-swap", "none"), - h.Attribute("hx-swap-oob", "beforeend"), + h.Attribute("hx-swap-oob", "outerHTML"), h.Id("connected-users"), h.Class("flex flex-col"), - // This would be populated dynamically with connected users - ConnectedUser(username, false, isMe), + h.List(users, func(user db.User, index int) *h.Element { + return connectedUser(user.Name, user.SessionID == myId) + }), ) } -func ConnectedUser(username string, remove bool, isMe bool) *h.Element { +func connectedUser(username string, isMe bool) *h.Element { id := fmt.Sprintf("connected-user-%s", strings.ReplaceAll(username, "#", "-")) - if remove { - return h.Div(h.Id(id), h.Attribute("hx-swap-oob", "delete")) - } return h.Li( h.Id(id), h.ClassX("truncate text-slate-700", h.ClassMap{ diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 497b52eb..7463c7b7 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -2,6 +2,7 @@ package pages import ( "chat/chat" + "chat/internal/db" "chat/partials" "fmt" "github.com/go-chi/chi/v5" @@ -111,7 +112,7 @@ func UserSidebar() *h.Element { h.Class("pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex flex-col justify-between gap-3 rounded-l-lg"), h.Div( h.H3F("Connected Users", h.Class("text-lg font-bold")), - chat.ConnectedUsers("", false), + chat.ConnectedUsers(make([]db.User, 0), ""), ), h.A( h.Class("cursor-pointer"), diff --git a/examples/chat/ws/manager.go b/examples/chat/ws/manager.go index afb3a113..10f842fd 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/ws/manager.go @@ -195,10 +195,8 @@ func (manager *SocketManager) writeTextRaw(writer WriterChan, event string, mess } else { data = fmt.Sprintf("data: %s\n\n", message) } - fmt.Printf("writing to channel:\n") select { case writer <- data: - fmt.Println("Sent to the channel") case <-time.After(timeout): fmt.Printf("could not send %s to channel after %s\n", data, timeout) } diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index f28c22f4..f40bb7b7 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},P=getClosestAttributeValue(n,"hx-prompt");if(P){var I=prompt(P);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,N=v.formData;o.values&&overrideFormData(N,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(N,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,F=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:F,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,F=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(F&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(M,V),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(M,V),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var M=addRequestIndicatorClasses(n),V=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=F?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,k,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{k=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var B=null,K=new Set;h.defineExtension("sse",{init:function(e){B=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){h.trigger(e,"htmx:sseBeforeMessage",{event:r});let o=r.data,i=B.makeFragment(o),s=Array.from(i.children);for(let l of s)B.oobSwap(B.getAttributeValue(l,"hx-swap-oob")||"true",l,{tasks:[]}),l.tagName==="SCRIPT"&&l.id.startsWith("__eval")&&document.body.appendChild(l);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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VixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHt0YXNrczogW119KTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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QUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts index 83c66e2e..b4b7a19e 100644 --- a/framework/assets/js/htmxextensions/sse.ts +++ b/framework/assets/js/htmxextensions/sse.ts @@ -55,12 +55,13 @@ function connectEventSource(ele: Element, url: string) { } eventSource.onmessage = function(event) { + const settleInfo = api.makeSettleInfo(ele); htmx.trigger(ele, "htmx:sseBeforeMessage", {event: event}); const response = event.data const fragment = api.makeFragment(response) as DocumentFragment; const children = Array.from(fragment.children); for (let child of children) { - api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, {tasks: []}); + api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, settleInfo); // support htmgo eval__ scripts if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { document.body.appendChild(child); From a06f5fea120decb15d4f505753ddd352acd4ac2d Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 12:04:49 -0500 Subject: [PATCH 008/145] css fixes --- examples/chat/pages/chat.$id.go | 41 +++++++++++++++++++++++---------- examples/chat/pages/root.go | 4 ++++ 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 7463c7b7..1b71761d 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -35,27 +35,29 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { } else if(e.detail.event.code === 1011) { window.location.reload() } else if (e.detail.event.code === 1008 || e.detail.event.code === 1006) { - window.location.href = '/?roomId=%s'; + window.location.href = '/?roomId=%s'; } else { console.error('Connection closed:', e.detail.event) } `, roomId, roomId)), ), - h.Class("flex flex-row min-h-screen bg-neutral-100"), + // Adjusted flex properties for responsive layout + h.Class("flex flex-row h-screen bg-neutral-100"), + + // Collapse Button for mobile + CollapseButton(), // Sidebar for connected users UserSidebar(), h.Div( - h.Class("flex flex-col flex-grow bg-white rounded p-4"), + // Adjusted to fill height and width + h.Class("flex flex-col h-full w-full bg-white p-4 overflow-hidden"), // Room name at the top, fixed CachedRoomHeader(ctx), - // Padding to push chat content below the fixed room name - h.Div(h.Class("pt-[50px]")), - h.HxAfterSseMessage( js.EvalJsOnSibling("#messages", `element.scrollTop = element.scrollHeight;`), @@ -64,14 +66,12 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { // Chat Messages h.Div( h.Id("messages"), - h.Class("flex flex-col gap-4 overflow-auto grow w-full mb-4 max-w-[calc(100%-215px)]"), + // Adjusted flex properties and removed max-width + h.Class("flex flex-col gap-4 mb-4 overflow-auto flex-grow w-full pt-[50px]"), ), // Chat Input at the bottom - h.Div( - h.Class("mt-auto"), - Form(), - ), + Form(), ), ), ), @@ -109,7 +109,7 @@ func roomNameHeader(ctx *h.RequestContext) *h.Element { func UserSidebar() *h.Element { return h.Div( - h.Class("pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex flex-col justify-between gap-3 rounded-l-lg"), + h.Class("sidebar h-full pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex-col justify-between gap-3 rounded-l-lg hidden md:flex"), h.Div( h.H3F("Connected Users", h.Class("text-lg font-bold")), chat.ConnectedUsers(make([]db.User, 0), ""), @@ -122,6 +122,23 @@ func UserSidebar() *h.Element { ) } +func CollapseButton() *h.Element { + return h.Div( + h.Class("fixed top-0 left-4 md:hidden z-50"), // Always visible on mobile + h.Button( + h.Class("p-2 text-2xl bg-neutral-700 text-white rounded-md"), // Styling the button + h.OnClick( + js.EvalJs(` + const sidebar = document.querySelector('.sidebar'); + sidebar.classList.toggle('hidden'); + sidebar.classList.toggle('flex'); + `), + ), + h.UnsafeRaw("☰"), // The icon for collapsing the sidebar + ), + ) +} + func MessageInput() *h.Element { return h.Input("text", h.Id("message-input"), diff --git a/examples/chat/pages/root.go b/examples/chat/pages/root.go index 806a8820..c566cf2a 100644 --- a/examples/chat/pages/root.go +++ b/examples/chat/pages/root.go @@ -8,6 +8,10 @@ func RootPage(children ...h.Ren) h.Ren { extensions := h.BaseExtensions() return h.Html( h.HxExtension(extensions), + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Meta("title", "htmgo chat example"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), h.Head( h.Link("/public/main.css", "stylesheet"), h.Script("/public/htmgo.js"), From 496981efd0869353e54c073764149df044ab4424 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 15:35:19 -0500 Subject: [PATCH 009/145] fix tests --- framework/h/command_test.go | 9 ++++++--- framework/h/lifecycle.go | 7 +------ framework/h/render_test.go | 2 +- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/framework/h/command_test.go b/framework/h/command_test.go index 37433815..0da8afb2 100644 --- a/framework/h/command_test.go +++ b/framework/h/command_test.go @@ -32,17 +32,20 @@ func renderJs(t *testing.T, command Command) string { value := parsed.FirstChild.FirstChild.NextSibling.LastChild.Attr[0].Val isComplex := strings.HasPrefix(value, "__eval_") if !isComplex { - return value + value = strings.ReplaceAll(value, "var e=event;", "") + return strings.ReplaceAll(value, "var self=this;", "") } else { - id := strings.TrimSuffix(value, "(this);") + id := strings.TrimSuffix(value, "(this, event);") script := findScriptById(parsed, id) assert.NotNil(t, script) funcCall := script.LastChild.Data funcCall = strings.ReplaceAll(funcCall, "\n", "") funcCall = strings.ReplaceAll(funcCall, "\t", "") - start := fmt.Sprintf("function %s(self) {", id) + start := fmt.Sprintf("function %s(self, event) {", id) funcCall = strings.TrimPrefix(funcCall, start) funcCall = strings.TrimSuffix(funcCall, "}") + funcCall = strings.ReplaceAll(funcCall, "let e = event;", "") + funcCall = strings.ReplaceAll(funcCall, "var self=this;", "") return funcCall } } diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index 295b50d9..1dd199aa 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -307,12 +307,7 @@ func SetValue(value string) SimpleJsCommand { func SubmitFormOnEnter() ComplexJsCommand { // language=JavaScript return EvalJs(` - if (event.code === 'Enter') { - console.log('submitting form'); - setTimeout(() => { - self.form.dispatchEvent(new Event('submit', { cancelable: true })); - }, 250) - } + if (event.code === 'Enter') { self.form.dispatchEvent(new Event('submit', { cancelable: true })); } `) } diff --git a/framework/h/render_test.go b/framework/h/render_test.go index 10a6662f..b38a8df3 100644 --- a/framework/h/render_test.go +++ b/framework/h/render_test.go @@ -46,7 +46,7 @@ func TestRender(t *testing.T) { assert.Equal(t, expected, - result) + strings.ReplaceAll(result, "var self=this;var e=event;", "")) } func TestRenderAttributes_1(t *testing.T) { From e6af7a73d548110545a41abd8ae7a358a272409d Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 3 Oct 2024 15:41:09 -0500 Subject: [PATCH 010/145] fix test --- framework/h/render_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/framework/h/render_test.go b/framework/h/render_test.go index b38a8df3..dbbd1e1c 100644 --- a/framework/h/render_test.go +++ b/framework/h/render_test.go @@ -25,7 +25,6 @@ func TestRender(t *testing.T) { Attribute("data-attr-2", "value"), Attributes(&AttributeMap{ "data-attr-3": "value", - "data-attr-4": "value", }), HxBeforeRequest( SetText("before request"), @@ -41,7 +40,7 @@ func TestRender(t *testing.T) { div.attributes.Set("data-attr-1", "value") - expected := `
hello, world
hello, child
` + expected := `
hello, world
hello, child
` result := Render(div) assert.Equal(t, From 9258f3ed06e25f1770b9c2e5ed914bc5aa847307 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 10:33:04 -0500 Subject: [PATCH 011/145] fixes --- cli/htmgo/internal/dirutil/dir.go | 2 +- cli/htmgo/tasks/astgen/entry.go | 2 +- cli/htmgo/tasks/astgen/map.go | 4 ++-- framework/internal/datastructure/map.go | 4 ++-- htmgo-site/internal/datastructures/map.go | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cli/htmgo/internal/dirutil/dir.go b/cli/htmgo/internal/dirutil/dir.go index 6817ac9b..27152775 100644 --- a/cli/htmgo/internal/dirutil/dir.go +++ b/cli/htmgo/internal/dirutil/dir.go @@ -71,7 +71,7 @@ func MoveFile(src, dst string) error { if err != nil { return fmt.Errorf("failed to copy file: %v", err) } - // Disconnect the source file. + // Remove the source file. err = os.Remove(src) if err != nil { return fmt.Errorf("failed to remove source file: %v", err) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index 7b4d13b1..e11ef0b2 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -53,7 +53,7 @@ func sliceCommonPrefix(dir1, dir2 string) string { slicedDir1 := strings.TrimPrefix(dir1, commonPrefix) slicedDir2 := strings.TrimPrefix(dir2, commonPrefix) - // Disconnect leading slashes + // Remove leading slashes slicedDir1 = strings.TrimPrefix(slicedDir1, string(filepath.Separator)) slicedDir2 = strings.TrimPrefix(slicedDir2, string(filepath.Separator)) diff --git a/cli/htmgo/tasks/astgen/map.go b/cli/htmgo/tasks/astgen/map.go index 73eb3e41..201ccead 100644 --- a/cli/htmgo/tasks/astgen/map.go +++ b/cli/htmgo/tasks/astgen/map.go @@ -68,10 +68,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Disconnect the key from the map + // Remove the key from the map delete(om.values, key) - // Disconnect the key from the keys slice + // Remove the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) diff --git a/framework/internal/datastructure/map.go b/framework/internal/datastructure/map.go index 434c5611..e4741d21 100644 --- a/framework/internal/datastructure/map.go +++ b/framework/internal/datastructure/map.go @@ -70,10 +70,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Disconnect the key from the map + // Remove the key from the map delete(om.values, key) - // Disconnect the key from the keys slice + // Remove the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) diff --git a/htmgo-site/internal/datastructures/map.go b/htmgo-site/internal/datastructures/map.go index 0e016c3e..533ca4f7 100644 --- a/htmgo-site/internal/datastructures/map.go +++ b/htmgo-site/internal/datastructures/map.go @@ -64,10 +64,10 @@ func (om *OrderedMap[K, V]) Values() []V { // Delete removes a key-value pair from the OrderedMap. func (om *OrderedMap[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { - // Disconnect the key from the map + // Remove the key from the map delete(om.values, key) - // Disconnect the key from the keys slice + // Remove the key from the keys slice for i, k := range om.keys { if k == key { om.keys = append(om.keys[:i], om.keys[i+1:]...) From 2b24b8adff3ed96d1712c968023b32c554e1db09 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 4 Oct 2024 15:33:55 +0000 Subject: [PATCH 012/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 3 +-- examples/chat/go.sum | 8 ++------ examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 20 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 15fbf0d5..5841d060 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -3,10 +3,9 @@ module chat go 1.23.0 require ( - github.com/coder/websocket v1.8.12 github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241002032603-8b816e956692 + github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c29b6fa6..4e2768de 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -1,15 +1,11 @@ -github.com/coder/websocket v1.8.12 h1:5bUXkEPPIbewrnkU8LTCLVaxi4N4J8ahufH2vlo4NAo= -github.com/coder/websocket v1.8.12/go.mod h1:LNVeNrXQZfe5qhS9ALED3uA+l5pPqvwXg3CKoDBB2gs= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701 h1:0Zk282axc1kPiuspLNzK5BJV7cQ5h2kPZHe54dznhYY= -github.com/maddalax/htmgo/framework v0.0.0-20241001184532-9a5b92987701/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= -github.com/maddalax/htmgo/framework v0.0.0-20241002032603-8b816e956692 h1:NtLJ7GcD9hWvPYmombxC1SzVNgvnhLXWhZEQJZOstik= -github.com/maddalax/htmgo/framework v0.0.0-20241002032603-8b816e956692/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index c3614336..63564233 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 + github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 889771d3..d5097b8c 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 h1:G1ZKaigLbmtKWy67XMhulKm4qXnAjRdrFiymCM+zX+U= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 9815b523..e8f59ecc 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 +require github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index cce2d159..a91005ef 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 h1:G1ZKaigLbmtKWy67XMhulKm4qXnAjRdrFiymCM+zX+U= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index bf7a7f4c..0a46375b 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 + github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 9ed95838..db405f7e 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 h1:G1ZKaigLbmtKWy67XMhulKm4qXnAjRdrFiymCM+zX+U= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 5fce2816..01ca2af1 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 +require github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index cce2d159..a91005ef 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58 h1:G1ZKaigLbmtKWy67XMhulKm4qXnAjRdrFiymCM+zX+U= -github.com/maddalax/htmgo/framework v0.0.0-20240930180419-e33ab7366d58/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= +github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From f65c5b303e7303681770595af16fc12a6187491b Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 10:38:15 -0500 Subject: [PATCH 013/145] add chat example --- examples/chat/Dockerfile | 2 +- htmgo-site/assets/public/chat-example.jpg | Bin 0 -> 87348 bytes htmgo-site/pages/examples.go | 10 ++++++++-- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 htmgo-site/assets/public/chat-example.jpg diff --git a/examples/chat/Dockerfile b/examples/chat/Dockerfile index 5f9bc422..eae23dda 100644 --- a/examples/chat/Dockerfile +++ b/examples/chat/Dockerfile @@ -14,7 +14,7 @@ RUN go mod download COPY . . # Build the Go binary for Linux -RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@8b816e956692683337d9fff6416ccc31f5047b59 build +RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@latest build RUN CGO_ENABLED=1 GOOS=linux go build -tags prod -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . diff --git a/htmgo-site/assets/public/chat-example.jpg b/htmgo-site/assets/public/chat-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb57c98fbb14d8bf4713fe5bef87556667923e2d GIT binary patch literal 87348 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 literal 0 HcmV?d00001 diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go index 7a8d6c25..3db313a9 100644 --- a/htmgo-site/pages/examples.go +++ b/htmgo-site/pages/examples.go @@ -14,6 +14,12 @@ type Example struct { } var examples = []Example{ + { + Title: "Chat App Example", + Github: "https://github.com/maddalax/htmgo/tree/master/examples/chat", + Demo: "https://chat-example.htmgo.dev", + Image: "public/chat-example.jpg", + }, { Title: "Todo List MVC", Github: "https://github.com/maddalax/htmgo/tree/master/examples/todo-list", @@ -67,10 +73,10 @@ func ExamplesPage(ctx *h.RequestContext) *h.Page { func ExampleCards() *h.Element { return h.Div( - h.Class("prose-h2:my-1 prose-img:my-1 flex flex-col md:flex-row gap-6 md:gap-2 text-center pb-8"), // Left-aligns and allows multiple cards in a row + h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 md:grid-cols-3 gap-6 text-center pb-8"), // Using grid for 3-column layout h.List(examples, func(example Example, index int) *h.Element { return h.Div( - h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 w-full md:w-1/2 bg-neutral-100"), // Reduces padding + h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), // Removed specific width, handled by grid h.Div( h.Class("flex flex-col gap-1 mt-4"), h.H2( From 7503e1b2c146585950a2972b22b81a93561fcc55 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 11:12:38 -0500 Subject: [PATCH 014/145] add docs for SSE --- examples/chat/pages/chat.$id.go | 9 +-- .../6_pushing_data/1_server_sent_events.md | 65 +++++++++++++++++++ htmgo-site/pages/examples.go | 11 ++-- 3 files changed, 72 insertions(+), 13 deletions(-) create mode 100644 htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 1b71761d..adabbb72 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -16,10 +16,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { return h.NewPage( RootPage( h.Div( - h.JoinExtensions( - h.TriggerChildren(), - h.HxExtension("ws"), - ), + h.TriggerChildren(), h.Attribute("sse-connect", fmt.Sprintf("/ws/chat/%s", roomId)), @@ -143,10 +140,6 @@ func MessageInput() *h.Element { return h.Input("text", h.Id("message-input"), h.Required(), - h.Class("p-4 rounded-md border border-slate-200 w-full focus:outline-none focus:ring focus:ring-slate-200"), - h.Name("message"), - h.MaxLength(1000), - h.Placeholder("Type a message..."), h.HxAfterSseMessage( js.SetValue(""), ), diff --git a/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md b/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md new file mode 100644 index 00000000..2e64f895 --- /dev/null +++ b/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md @@ -0,0 +1,65 @@ +**Server Sent Events (SSE)** + +htmgo supports server-sent events (SSE) out of the box. +This allows you to push data from the server to the client in real-time. + +Example of this can be found in the [chat-app](https://github.com/maddalax/htmgo/tree/master/examples/chat) example. +Demo: https://chat-example.htmgo.dev + +## How it works ## +1. The client sends a request to the server to establish a connection. +2. The server holds the connection open and sends data (in our case, most likely elements) to the client whenever there is new data to send. +3. The htmgo SSE extension uses https://htmx.org/attributes/hx-swap-oob/ to swap out the elements that the server sends. + + +**Note**: SSE is **unidirectional** (the server can only send data to the client). +For the client to send data to the server, normal xhr behavior should be used (form submission, triggers, etc). + +## Usage +1. Add the SSE connection attribute and the path to the handler that will handle the connection. + +```go +h.Attribute("sse-connect", fmt.Sprintf("/chat/%s", roomId)) +``` + +The following **Event Handlers** can be used to react to SSE connections. +```go +h.HxOnSseOpen +h.HxBeforeSseMessage +h.HxAfterSseMessage +h.HxOnSseError +h.HxOnSseClose +h.HxOnSseConnecting +``` + +**Example:** Adding an event listener handle SSE errors. + +```go +h.HxOnSseError( + js.EvalJs(fmt.Sprintf(` + const reason = e.detail.event.data + if(['invalid room', 'no session', 'invalid user'].includes(reason)) { + window.location.href = '/?roomId=%s'; + } else if(e.detail.event.code === 1011) { + window.location.reload() + } else if (e.detail.event.code === 1008 || e.detail.event.code === 1006) { + window.location.href = '/?roomId=%s'; + } else { + console.error('Connection closed:', e.detail.event) + } + `, roomId, roomId)), +), +``` + +**Example:** Clearing the input field after sending a message. +```go +func MessageInput() *h.Element { + return h.Input("text", + h.Id("message-input"), + h.Required(), + h.HxAfterSseMessage( + js.SetValue(""), + ), + ) +} +``` diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go index 3db313a9..73aaf2b7 100644 --- a/htmgo-site/pages/examples.go +++ b/htmgo-site/pages/examples.go @@ -15,10 +15,11 @@ type Example struct { var examples = []Example{ { - Title: "Chat App Example", - Github: "https://github.com/maddalax/htmgo/tree/master/examples/chat", - Demo: "https://chat-example.htmgo.dev", - Image: "public/chat-example.jpg", + Title: "Chat App Example", + Github: "https://github.com/maddalax/htmgo/tree/master/examples/chat", + Description: "A simple chat application built with htmgo using SSE for real-time updates", + Demo: "https://chat-example.htmgo.dev", + Image: "public/chat-example.jpg", }, { Title: "Todo List MVC", @@ -73,7 +74,7 @@ func ExamplesPage(ctx *h.RequestContext) *h.Page { func ExampleCards() *h.Element { return h.Div( - h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 md:grid-cols-3 gap-6 text-center pb-8"), // Using grid for 3-column layout + h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 md:grid-cols-2 gap-6 text-center pb-8"), // Using grid for 3-column layout h.List(examples, func(example Example, index int) *h.Element { return h.Div( h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), // Removed specific width, handled by grid From 1e51b6b8e85f02c8173ec0030b146edc8f2f8110 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 11:15:57 -0500 Subject: [PATCH 015/145] some cleanup --- examples/chat/chat/broadcast.go | 32 ++++++------- examples/chat/main.go | 8 ++-- examples/chat/pages/chat.$id.go | 3 +- examples/chat/partials/chat.go | 4 +- examples/chat/{ws => sse}/handler.go | 2 +- examples/chat/{ws => sse}/manager.go | 2 +- framework/assets/dist/htmgo.js | 2 +- .../assets/js/htmxextensions/livereload.ts | 3 +- framework/assets/js/util/ws.ts | 46 ------------------- 9 files changed, 27 insertions(+), 75 deletions(-) rename examples/chat/{ws => sse}/handler.go (99%) rename examples/chat/{ws => sse}/manager.go (99%) delete mode 100644 framework/assets/js/util/ws.ts diff --git a/examples/chat/chat/broadcast.go b/examples/chat/chat/broadcast.go index 64ae0825..394c1cd6 100644 --- a/examples/chat/chat/broadcast.go +++ b/examples/chat/chat/broadcast.go @@ -2,7 +2,7 @@ package chat import ( "chat/internal/db" - "chat/ws" + "chat/sse" "context" "fmt" "github.com/maddalax/htmgo/framework/h" @@ -11,32 +11,32 @@ import ( ) type Manager struct { - socketManager *ws.SocketManager + socketManager *sse.SocketManager queries *db.Queries service *Service } func NewManager(locator *service.Locator) *Manager { return &Manager{ - socketManager: service.Get[ws.SocketManager](locator), + socketManager: service.Get[sse.SocketManager](locator), queries: service.Get[db.Queries](locator), service: NewService(locator), } } func (m *Manager) StartListener() { - c := make(chan ws.SocketEvent, 1) + c := make(chan sse.SocketEvent, 1) m.socketManager.Listen(c) for { select { case event := <-c: switch event.Type { - case ws.ConnectedEvent: + case sse.ConnectedEvent: m.OnConnected(event) - case ws.DisconnectedEvent: + case sse.DisconnectedEvent: m.OnDisconnected(event) - case ws.MessageEvent: + case sse.MessageEvent: m.onMessage(event) default: fmt.Printf("Unknown event type: %s\n", event.Type) @@ -45,12 +45,12 @@ func (m *Manager) StartListener() { } } -func (m *Manager) dispatchConnectedUsers(roomId string, predicate func(conn ws.SocketConnection) bool) { +func (m *Manager) dispatchConnectedUsers(roomId string, predicate func(conn sse.SocketConnection) bool) { connectedUsers := make([]db.User, 0) // backfill all existing clients to the connected client - m.socketManager.ForEachSocket(roomId, func(conn ws.SocketConnection) { + m.socketManager.ForEachSocket(roomId, func(conn sse.SocketConnection) { if !predicate(conn) { return } @@ -61,12 +61,12 @@ func (m *Manager) dispatchConnectedUsers(roomId string, predicate func(conn ws.S connectedUsers = append(connectedUsers, user) }) - m.socketManager.ForEachSocket(roomId, func(conn ws.SocketConnection) { + m.socketManager.ForEachSocket(roomId, func(conn sse.SocketConnection) { m.socketManager.SendText(conn.Id, h.Render(ConnectedUsers(connectedUsers, conn.Id))) }) } -func (m *Manager) OnConnected(e ws.SocketEvent) { +func (m *Manager) OnConnected(e sse.SocketEvent) { room, _ := m.service.GetRoom(e.RoomId) if room == nil { @@ -83,14 +83,14 @@ func (m *Manager) OnConnected(e ws.SocketEvent) { fmt.Printf("User %s connected to %s\n", user.Name, e.RoomId) - m.dispatchConnectedUsers(e.RoomId, func(conn ws.SocketConnection) bool { + m.dispatchConnectedUsers(e.RoomId, func(conn sse.SocketConnection) bool { return true }) m.backFill(e.Id, e.RoomId) } -func (m *Manager) OnDisconnected(e ws.SocketEvent) { +func (m *Manager) OnDisconnected(e sse.SocketEvent) { user, err := m.queries.GetUserBySessionId(context.Background(), e.Id) if err != nil { return @@ -100,7 +100,7 @@ func (m *Manager) OnDisconnected(e ws.SocketEvent) { return } fmt.Printf("User %s disconnected from %s\n", user.Name, room.ID) - m.dispatchConnectedUsers(e.RoomId, func(conn ws.SocketConnection) bool { + m.dispatchConnectedUsers(e.RoomId, func(conn sse.SocketConnection) bool { return conn.Id != e.Id }) } @@ -123,7 +123,7 @@ func (m *Manager) backFill(socketId string, roomId string) { } } -func (m *Manager) onMessage(e ws.SocketEvent) { +func (m *Manager) onMessage(e sse.SocketEvent) { message := e.Payload["message"].(string) if message == "" { @@ -147,7 +147,7 @@ func (m *Manager) onMessage(e ws.SocketEvent) { m.socketManager.BroadcastText( e.RoomId, h.Render(MessageRow(saved)), - func(conn ws.SocketConnection) bool { + func(conn sse.SocketConnection) bool { return true }, ) diff --git a/examples/chat/main.go b/examples/chat/main.go index f8cf9359..e5d92cbd 100644 --- a/examples/chat/main.go +++ b/examples/chat/main.go @@ -4,7 +4,7 @@ import ( "chat/__htmgo" "chat/chat" "chat/internal/db" - "chat/ws" + "chat/sse" "fmt" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" @@ -18,8 +18,8 @@ func main() { locator := service.NewLocator() service.Set[db.Queries](locator, service.Singleton, db.Provide) - service.Set[ws.SocketManager](locator, service.Singleton, func() *ws.SocketManager { - return ws.NewSocketManager() + service.Set[sse.SocketManager](locator, service.Singleton, func() *sse.SocketManager { + return sse.NewSocketManager() }) chatManager := chat.NewManager(locator) @@ -46,7 +46,7 @@ func main() { http.FileServerFS(sub) app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) - app.Router.Handle("/ws/chat/{id}", ws.Handle()) + app.Router.Handle("/sse/chat/{id}", sse.Handle()) __htmgo.Register(app.Router) }, diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index adabbb72..d6f28d2c 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -18,7 +18,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.Div( h.TriggerChildren(), - h.Attribute("sse-connect", fmt.Sprintf("/ws/chat/%s", roomId)), + h.Attribute("sse-connect", fmt.Sprintf("/sse/chat/%s", roomId)), h.HxOnSseOpen( js.ConsoleLog("Connected to chat room"), @@ -152,7 +152,6 @@ func Form() *h.Element { h.Form( h.NoSwap(), h.PostPartial(partials.SendMessage), - h.Attribute("ws-send", ""), h.Class("flex flex-grow"), MessageInput(), ), diff --git a/examples/chat/partials/chat.go b/examples/chat/partials/chat.go index 59b41cc3..27d43eaf 100644 --- a/examples/chat/partials/chat.go +++ b/examples/chat/partials/chat.go @@ -2,14 +2,14 @@ package partials import ( "chat/components" - "chat/ws" + "chat/sse" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" ) func SendMessage(ctx *h.RequestContext) *h.Partial { locator := ctx.ServiceLocator() - socketManager := service.Get[ws.SocketManager](locator) + socketManager := service.Get[sse.SocketManager](locator) sessionCookie, err := ctx.Request.Cookie("session_id") diff --git a/examples/chat/ws/handler.go b/examples/chat/sse/handler.go similarity index 99% rename from examples/chat/ws/handler.go rename to examples/chat/sse/handler.go index 04a2a8df..b4f8000a 100644 --- a/examples/chat/ws/handler.go +++ b/examples/chat/sse/handler.go @@ -1,4 +1,4 @@ -package ws +package sse import ( "fmt" diff --git a/examples/chat/ws/manager.go b/examples/chat/sse/manager.go similarity index 99% rename from examples/chat/ws/manager.go rename to examples/chat/sse/manager.go index 10f842fd..485afb2e 100644 --- a/examples/chat/ws/manager.go +++ b/examples/chat/sse/manager.go @@ -1,4 +1,4 @@ -package ws +package sse import ( "chat/internal/routine" diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index f40bb7b7..46bca78f 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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QUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCB7Y3JlYXRlV2ViU29ja2V0Q2xpZW50fSBmcm9tIFwiLi4vdXRpbC93c1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn0iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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QUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/livereload.ts b/framework/assets/js/htmxextensions/livereload.ts index 8dbc9c6b..ebde77d7 100644 --- a/framework/assets/js/htmxextensions/livereload.ts +++ b/framework/assets/js/htmxextensions/livereload.ts @@ -1,5 +1,4 @@ import htmx from "htmx.org"; -import {createWebSocketClient} from "../util/ws"; let lastVersion = ""; @@ -48,4 +47,4 @@ htmx.defineExtension("livereload", { function reload() { window.location.reload() -} \ No newline at end of file +} diff --git a/framework/assets/js/util/ws.ts b/framework/assets/js/util/ws.ts deleted file mode 100644 index 446289fe..00000000 --- a/framework/assets/js/util/ws.ts +++ /dev/null @@ -1,46 +0,0 @@ -type WsOpts = { - url: string; - reconnectInterval?: number; - onOpen?: () => void; - onMessage: (message: string) => void; - onError?: (error: Event) => void; - onClose?: () => void; -} - -export function createWebSocketClient(opts: WsOpts) { - let socket: WebSocket | null = null; - const connect = (tries: number) => { - console.log('connecting to ws', opts.url, 'attempt', tries) - socket = new WebSocket(opts.url); - // Handle incoming messages - socket.onmessage = (event) => { - opts.onMessage(event.data) - }; - // Handle connection errors - socket.onerror = (error) => { - try { - socket?.close() - } catch(ex) { - // noop - } - socket = null - let interval = tries * (opts.reconnectInterval || 1000); - setTimeout(() => connect(tries + 1), interval); - }; - // Handle connection close and attempt reconnection - socket.onclose = () => { - socket = null; - let interval = tries * (opts.reconnectInterval || 1000); - setTimeout(() => connect(tries + 1), interval); - }; - }; - connect(1); - const sendMessage = (message: string) => { - if (socket && socket.readyState === WebSocket.OPEN) { - socket.send(message); - } else { - setTimeout(() => sendMessage(message), 100); - } - }; - return { sendMessage }; -} \ No newline at end of file From 7d9857f97e6ab59067b0627605eb945e2c835929 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 4 Oct 2024 16:16:51 +0000 Subject: [PATCH 016/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 5841d060..844c70e4 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc + github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 4e2768de..cf564ab9 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 63564233..8fa8770d 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc + github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index d5097b8c..a5131dde 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index e8f59ecc..3d127c99 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc +require github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index a91005ef..9c59ddaf 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 0a46375b..b77fb3cb 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc + github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index db405f7e..6664ec7e 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 01ca2af1..dc3771e5 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc +require github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index a91005ef..9c59ddaf 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc h1:KDM8pPvXiUhjN+rZuGsBSuOP9PXNMnZdU+y+XC9U+/M= -github.com/maddalax/htmgo/framework v0.0.0-20241004153314-caad5633d0fc/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= +github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 697b4c49244e82f1330047003149683f21b76cc4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 11:18:33 -0500 Subject: [PATCH 017/145] undo --- examples/chat/pages/chat.$id.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index d6f28d2c..3bece629 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -18,7 +18,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.Div( h.TriggerChildren(), - h.Attribute("sse-connect", fmt.Sprintf("/sse/chat/%s", roomId)), + h.Attribute("sse-connect", fmt.Sprintf("/ws/chat/%s", roomId)), h.HxOnSseOpen( js.ConsoleLog("Connected to chat room"), @@ -140,6 +140,10 @@ func MessageInput() *h.Element { return h.Input("text", h.Id("message-input"), h.Required(), + h.Class("p-4 rounded-md border border-slate-200 w-full focus:outline-none focus:ring focus:ring-slate-200"), + h.Name("message"), + h.MaxLength(1000), + h.Placeholder("Type a message..."), h.HxAfterSseMessage( js.SetValue(""), ), @@ -152,6 +156,7 @@ func Form() *h.Element { h.Form( h.NoSwap(), h.PostPartial(partials.SendMessage), + h.Attribute("ws-send", ""), h.Class("flex flex-grow"), MessageInput(), ), From 805e5729e1cedb88b6282b2d4bad3d2cef4006e2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 11:21:15 -0500 Subject: [PATCH 018/145] build fix --- framework/h/app.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/framework/h/app.go b/framework/h/app.go index 51547cf3..e8c6f5e3 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -29,6 +29,10 @@ type RequestContext struct { kv map[string]interface{} } +func (c *RequestContext) FormValue(key string) string { + return c.Request.FormValue(key) +} + func (c *RequestContext) QueryParam(key string) string { return c.Request.URL.Query().Get(key) } From d11044f6383667dedde4a024cffe4336e8d08d85 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 4 Oct 2024 16:21:55 +0000 Subject: [PATCH 019/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 844c70e4..89a5a03c 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f + github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index cf564ab9..c8c885a5 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 8fa8770d..83303805 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f + github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index a5131dde..4a60744d 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 3d127c99..0e3e6a9a 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f +require github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 9c59ddaf..501295c7 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index b77fb3cb..e73d7f42 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f + github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 6664ec7e..319b8fb8 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index dc3771e5..00c46241 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f +require github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 9c59ddaf..501295c7 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f h1:ELhRtU4+tCkdUvlBcq2zSSSQ3ZePwiiObCdArF9v7AU= -github.com/maddalax/htmgo/framework v0.0.0-20241004161557-1e51b6b8e85f/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= +github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 60651361e23b3f256bec1b275590c8cc4f268fd8 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 11:22:48 -0500 Subject: [PATCH 020/145] revert --- examples/chat/pages/chat.$id.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 3bece629..92b10664 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -18,7 +18,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { h.Div( h.TriggerChildren(), - h.Attribute("sse-connect", fmt.Sprintf("/ws/chat/%s", roomId)), + h.Attribute("sse-connect", fmt.Sprintf("/sse/chat/%s", roomId)), h.HxOnSseOpen( js.ConsoleLog("Connected to chat room"), From e019c288deb19ed7938f4f16b5b86f7ee230347a Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 4 Oct 2024 11:52:54 -0500 Subject: [PATCH 021/145] fix --- examples/chat/pages/chat.$id.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 92b10664..493a873c 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -40,7 +40,7 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { ), // Adjusted flex properties for responsive layout - h.Class("flex flex-row h-screen bg-neutral-100"), + h.Class("flex flex-row h-screen bg-neutral-100 overflow-x-hidden"), // Collapse Button for mobile CollapseButton(), From 1f0a84039630f64f09b6e1ffb957e37a19ac0af3 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 6 Oct 2024 10:18:29 -0500 Subject: [PATCH 022/145] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f8181e68..a5787708 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ > [!WARNING] -> htmgo is in alpha release. Please report any issues on GitHub. +> htmgo is in alpha release and active development. API's likely will have breaking changes. Do not use this library at this time if you are expecting a rock solid stable api that will require no migrations. Please report any issues on GitHub. ## **htmgo** From 150c87b4560b0673b212ba3d67cf5a097a06b957 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 6 Oct 2024 11:21:37 -0500 Subject: [PATCH 023/145] fix trigger children ext --- framework/assets/dist/htmgo.js | 4 +- .../js/htmxextensions/trigger-children.ts | 37 +++---------------- 2 files changed, 8 insertions(+), 33 deletions(-) diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index 46bca78f..9f1455ed 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),n.detail);l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0},init:function(e){},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){},getSelectors:function(){return null}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=T;let H=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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QUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXgsIHtIdG14U2V0dGxlSW5mbywgSHRteFN3YXBTdHlsZX0gZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwgZXZlbnQuZGV0YWlsKVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaTogYW55KTogdm9pZCB7XG4gICAgfSxcbiAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24gKFxuICAgICAgICB0ZXh0OiBzdHJpbmcsXG4gICAgICAgIHhocjogWE1MSHR0cFJlcXVlc3QsXG4gICAgICAgIGVsdDogRWxlbWVudCxcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9LFxuICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24gKHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbiAoXG4gICAgICAgIHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSxcbiAgICAgICAgdGFyZ2V0OiBOb2RlLFxuICAgICAgICBmcmFnbWVudDogTm9kZSxcbiAgICAgICAgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8sXG4gICAgKTogYm9vbGVhbiB8IE5vZGVbXSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uIChcbiAgICAgICAgeGhyOiBYTUxIdHRwUmVxdWVzdCxcbiAgICAgICAgcGFyYW1ldGVyczogRm9ybURhdGEsXG4gICAgICAgIGVsdDogTm9kZSxcbiAgICApIHtcbiAgICB9LFxuICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24gKCk6IHN0cmluZ1tdIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25DLENBQUEsTUFDckIsRUFHQSxNQUFRLENBQUEsSUFBQSxDQUVSLFNBQVUsSUFFVixDQUFBLFdBQUEsQ0FBYSxLQUViLFdBQWEsQ0FBQSxJQUFBLENBRWIsVUFBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsT0FBUSxJQVFSLENBQUEsTUFBQSxDQUFRLENBTU4sY0FBZ0IsQ0FBQSxDQUFBLENBQUEsQ0FNaEIsaUJBQWtCLEVBS2xCLENBQUEsb0JBQUEsQ0FBc0IsR0FNdEIsZ0JBQWtCLENBQUEsV0FBQSxDQU1sQixpQkFBa0IsQ0FNbEIsQ0FBQSxrQkFBQSxDQUFvQixHQU1wQixzQkFBd0IsQ0FBQSxDQUFBLENBQUEsQ0FNeEIsZUFBZ0IsZ0JBTWhCLENBQUEsWUFBQSxDQUFjLGVBTWQsVUFBWSxDQUFBLFlBQUEsQ0FNWixjQUFlLGVBTWYsQ0FBQSxhQUFBLENBQWUsZ0JBTWYsU0FBVyxDQUFBLENBQUEsQ0FBQSxDQU1YLGdCQUFpQixDQU1qQixDQUFBLENBQUEsaUJBQUEsQ0FBbUIsRUFNbkIsQ0FBQSxnQkFBQSxDQUFrQixFQU1sQixDQUFBLGtCQUFBLENBQW9CLENBQUMsT0FBUyxDQUFBLE9BQUEsQ0FBUyxRQUFTLFFBQVEsQ0FBQSxDQU14RCxnQkFBaUIsQ0FLakIsQ0FBQSxDQUFBLE9BQUEsQ0FBUyxFQU1ULGdCQUFrQixDQUFBLGFBQUEsQ0FNbEIsYUFBYyxNQUtkLENBQUEsZUFBQSxDQUFpQixrQ0FLakIsY0FBZ0IsQ0FBQSxTQUFBLENBTWhCLG1CQUFvQixDQU1wQixDQUFBLENBQUEsbUJBQUEsQ0FBcUIsR0FNckIscUJBQXVCLENBQUEsQ0FBQSxDQUFBLENBTXZCLHdCQUF5QixDQUFDLEtBQUEsQ0FBTyxRQUFRLENBTXpDLENBQUEsZ0JBQUEsQ0FBa0IsR0FNbEIsV0FBYSxDQUFBLENBQUEsQ0FBQSxDQU1iLHNCQUF1QixDQU92QixDQUFBLENBQUEsaUJBQUEsQ0FBbUIsS0FFbkIsa0JBQW9CLENBQUEsQ0FBQSxDQUFBLENBRXBCLGlCQUFrQixDQUNoQixDQUFFLEtBQU0sS0FBTyxDQUFBLElBQUEsQ0FBTSxFQUFNLENBQzNCLENBQUEsQ0FBRSxLQUFNLFFBQVUsQ0FBQSxJQUFBLENBQU0sRUFBSyxDQUM3QixDQUFBLENBQUUsS0FBTSxRQUFVLENBQUEsSUFBQSxDQUFNLEdBQU8sS0FBTyxDQUFBLENBQUEsQ0FBSyxDQUM3QyxDQU1BLENBQUEsbUJBQUEsQ0FBcUIsRUFDdkIsQ0FFQSxDQUFBLGFBQUEsQ0FBZSxLQUVmLENBQUcsQ0FBQSxJQUFBLENBQ0gsUUFBUyxPQUNYLENBQUEsQ0FFQSxLQUFLLE1BQVMsQ0FBQSxZQUFBLENBQ2QsS0FBSyxPQUFVLENBQUEsV0FBQSxDQUNmLEtBQUssRUFBSyxDQUFBLG9CQUFBLENBQ1YsS0FBSyxHQUFNLENBQUEsdUJBQUEsQ0FDWCxLQUFLLE9BQVUsQ0FBQSxZQUFBLENBQ2YsS0FBSyxJQUFPLENBQUEsVUFBQSxDQUNaLEtBQUssSUFBTyxDQUFBLElBQUEsQ0FDWixJQUFLLENBQUEsT0FBQSxDQUFVLE9BQ2YsQ0FBQSxJQUFBLENBQUssUUFBVSxPQUNmLENBQUEsSUFBQSxDQUFLLE9BQVMsYUFDZCxDQUFBLElBQUEsQ0FBSyxTQUFXLGlCQUNoQixDQUFBLElBQUEsQ0FBSyxZQUFjLHNCQUNuQixDQUFBLElBQUEsQ0FBSyxZQUFjLG9CQUNuQixDQUFBLElBQUEsQ0FBSyxVQUFZLG1CQUNqQixDQUFBLElBQUEsQ0FBSyxLQUFPLElBQ1osQ0FBQSxJQUFBLENBQUssZ0JBQWtCLGVBQ3ZCLENBQUEsSUFBQSxDQUFLLGdCQUFrQixlQUN2QixDQUFBLElBQUEsQ0FBSyxPQUFTLE1BQ2QsQ0FBQSxJQUFBLENBQUssUUFBVSxPQUNmLENBQUEsSUFBQSxDQUFLLGNBQWdCLGFBQ3JCLENBQUEsSUFBQSxDQUFLLEVBQUksWUFFVCxDQUFBLElBQU0sWUFBYyxDQUNsQixpQkFBQSxDQUNBLGFBQ0EscUJBQ0EsQ0FBQSxlQUFBLENBQ0EsYUFDQSxJQUNBLENBQUEsWUFBQSxDQUNBLGtCQUNBLHdCQUNBLENBQUEsZUFBQSxDQUNBLGtCQUNBLFVBQ0EsQ0FBQSxjQUFBLENBQ0EsZ0JBQ0Esb0JBQ0EsQ0FBQSxlQUFBLENBQ0EsVUFDQSxZQUNBLENBQUEsWUFBQSxDQUNBLGVBQ0EsT0FDQSxDQUFBLGdCQUFBLENBQ0Esa0JBQ0EsWUFDQSxDQUFBLFlBQUEsQ0FDQSxrQkFDQSxjQUNGLENBQUEsQ0FFTSxNQUFRLENBQUMsS0FBQSxDQUFPLE9BQVEsS0FBTyxDQUFBLFFBQUEsQ0FBVSxPQUFPLENBQ2hELENBQUEsYUFBQSxDQUFnQixNQUFNLEdBQUksQ0FBQSxTQUFTQyxFQUFNLENBQzdDLE9BQU8sT0FBU0EsQ0FBTyxDQUFBLGNBQUEsQ0FBaUJBLEVBQU8sR0FDakQsQ0FBQyxFQUFFLElBQUssQ0FBQSxJQUFJLENBRU4sQ0FBQSxjQUFBLENBQWlCLFlBQWEsQ0FBQSxNQUFNLEVBVzFDLFNBQVMsWUFBQSxDQUFhQyxFQUFLQyxDQUFTLENBQUEsQ0FBQSxDQUFBLENBQU8sQ0FDekMsT0FBTyxJQUFJLE9BQU8sQ0FBSUQsQ0FBQUEsRUFBQUEsQ0FBRyxnQ0FBZ0NBLENBQUcsQ0FBQSxDQUFBLENBQUEsQ0FDMURDLEVBQVMsS0FBUSxDQUFBLElBQUksQ0FDekIsQ0FZQSxTQUFTLGNBQWNDLENBQUssQ0FBQSxDQUMxQixHQUFJQSxDQUFPLEVBQUEsSUFBQSxDQUNULE9BR0YsSUFBSUMsQ0FBQUEsQ0FBVyxJQUNmLE9BQUlELENBQUFBLENBQUksTUFBTSxDQUFFLENBQUEsQ0FBQSxFQUFLLEtBQ25CQyxDQUFXLENBQUEsVUFBQSxDQUFXRCxFQUFJLEtBQU0sQ0FBQSxDQUFBLENBQUcsRUFBRSxDQUFDLENBQUEsQ0FDN0JBLEVBQUksS0FBTSxDQUFBLENBQUEsQ0FBRSxHQUFLLEdBQzFCQyxDQUFBQSxDQUFBQSxDQUFXLFdBQVdELENBQUksQ0FBQSxLQUFBLENBQU0sRUFBRyxDQUFFLENBQUEsQ0FBQyxFQUFJLEdBQ2pDQSxDQUFBQSxDQUFBQSxDQUFJLE1BQU0sQ0FBRSxDQUFBLENBQUEsRUFBSyxJQUMxQkMsQ0FBVyxDQUFBLFVBQUEsQ0FBV0QsRUFBSSxLQUFNLENBQUEsQ0FBQSxDQUFHLEVBQUUsQ0FBQyxDQUFBLENBQUksSUFBTyxFQUVqREMsQ0FBQUEsQ0FBQUEsQ0FBVyxXQUFXRCxDQUFHLENBQUEsQ0FFcEIsTUFBTUMsQ0FBUSxDQUFBLENBQUksT0FBWUEsQ0FDdkMsQ0FPQSxTQUFTLGVBQWdCTixDQUFBQSxDQUFBQSxDQUFLTyxFQUFNLENBQ2xDLE9BQU9QLGFBQWUsT0FBV0EsRUFBQUEsQ0FBQUEsQ0FBSSxZQUFhTyxDQUFBQSxDQUFJLENBQ3hELENBUUEsU0FBUyxZQUFhUCxDQUFBQSxDQUFBQSxDQUFLUSxFQUFlLENBQ3hDLE9BQU8sQ0FBQyxDQUFDUixDQUFBQSxDQUFJLGVBQWlCQSxDQUFJLENBQUEsWUFBQSxDQUFhUSxDQUFhLENBQzFEUixFQUFBQSxDQUFBQSxDQUFJLGFBQWEsT0FBVVEsQ0FBQUEsQ0FBYSxFQUM1QyxDQVFBLFNBQVMsa0JBQWtCUixDQUFLUSxDQUFBQSxDQUFBQSxDQUFlLENBQzdDLE9BQU8sZUFBQSxDQUFnQlIsRUFBS1EsQ0FBYSxDQUFBLEVBQUssZ0JBQWdCUixDQUFLLENBQUEsT0FBQSxDQUFVUSxDQUFhLENBQzVGLENBTUEsU0FBUyxTQUFVUixDQUFBQSxDQUFBQSxDQUFLLENBQ3RCLElBQU1TLENBQUFBLENBQVNULEVBQUksYUFDbkIsQ0FBQSxPQUFJLENBQUNTLENBQVVULEVBQUFBLENBQUFBLENBQUksc0JBQXNCLFVBQW1CQSxDQUFBQSxDQUFBQSxDQUFJLFdBQ3pEUyxDQUNULENBS0EsU0FBUyxXQUFjLEVBQUEsQ0FDckIsT0FBTyxRQUNULENBT0EsU0FBUyxXQUFZVCxDQUFBQSxDQUFBQSxDQUFLSSxFQUFRLENBQ2hDLE9BQU9KLEVBQUksV0FBY0EsQ0FBQUEsQ0FBQUEsQ0FBSSxZQUFZLENBQUUsUUFBQSxDQUFVSSxDQUFPLENBQUMsQ0FBQSxDQUFJLGFBQ25FLENBT0EsU0FBUyxlQUFnQkosQ0FBQUEsQ0FBQUEsQ0FBS1UsRUFBVyxDQUN2QyxLQUFPVixHQUFPLENBQUNVLENBQUFBLENBQVVWLENBQUcsQ0FDMUJBLEVBQUFBLENBQUFBLENBQU0sVUFBVUEsQ0FBRyxDQUFBLENBR3JCLE9BQU9BLENBQUFBLEVBQU8sSUFDaEIsQ0FRQSxTQUFTLG1DQUFvQ1csQ0FBQUEsQ0FBQUEsQ0FBZ0JDLEVBQVVDLENBQWUsQ0FBQSxDQUNwRixJQUFNQyxDQUFpQixDQUFBLGlCQUFBLENBQWtCRixFQUFVQyxDQUFhLENBQUEsQ0FDMURFLEVBQWEsaUJBQWtCSCxDQUFBQSxDQUFBQSxDQUFVLGVBQWUsQ0FDOUQsQ0FBQSxJQUFJSSxFQUFVLGlCQUFrQkosQ0FBQUEsQ0FBQUEsQ0FBVSxZQUFZLENBQ3RELENBQUEsR0FBSUQsSUFBbUJDLENBQVUsQ0FBQSxDQUMvQixHQUFJLElBQUssQ0FBQSxNQUFBLENBQU8sbUJBQ2QsT0FBSUksQ0FBQUEsR0FBWUEsSUFBWSxHQUFPQSxFQUFBQSxDQUFBQSxDQUFRLE1BQU0sR0FBRyxDQUFBLENBQUUsUUFBUUgsQ0FBYSxDQUFBLEVBQUssR0FDdkVDLENBRUEsQ0FBQSxJQUFBLENBR1gsR0FBSUMsQ0FBZUEsR0FBQUEsQ0FBQUEsR0FBZSxLQUFPQSxDQUFXLENBQUEsS0FBQSxDQUFNLEdBQUcsQ0FBRSxDQUFBLE9BQUEsQ0FBUUYsQ0FBYSxDQUFLLEVBQUEsQ0FBQSxDQUFBLENBQ3ZGLE9BQU8sT0FFWCxDQUNBLE9BQU9DLENBQ1QsQ0FPQSxTQUFTLHdCQUF5QmQsQ0FBQUEsQ0FBQUEsQ0FBS2EsRUFBZSxDQUNwRCxJQUFJSSxFQUFjLElBSWxCLENBQUEsR0FIQSxnQkFBZ0JqQixDQUFLLENBQUEsU0FBU2tCLEVBQUcsQ0FDL0IsT0FBTyxDQUFDLEVBQUVELENBQUFBLENBQWMsb0NBQW9DakIsQ0FBSyxDQUFBLFNBQUEsQ0FBVWtCLENBQUMsQ0FBR0wsQ0FBQUEsQ0FBYSxFQUM5RixDQUFDLENBQUEsQ0FDR0ksSUFBZ0IsT0FDbEIsQ0FBQSxPQUFPQSxDQUVYLENBT0EsU0FBUyxPQUFBLENBQVFqQixFQUFLbUIsQ0FBVSxDQUFBLENBRzlCLElBQU1DLENBQWtCcEIsQ0FBQUEsQ0FBQUEsWUFBZSxVQUFZQSxDQUFJLENBQUEsT0FBQSxFQUFXQSxFQUFJLGVBQW1CQSxFQUFBQSxDQUFBQSxDQUFJLG1CQUFxQkEsQ0FBSSxDQUFBLGtCQUFBLEVBQXNCQSxFQUFJLHFCQUF5QkEsRUFBQUEsQ0FBQUEsQ0FBSSxrQkFDN0ssT0FBTyxDQUFDLENBQUNvQixDQUFtQkEsRUFBQUEsQ0FBQUEsQ0FBZ0IsS0FBS3BCLENBQUttQixDQUFBQSxDQUFRLENBQ2hFLENBTUEsU0FBUyxZQUFZZCxDQUFLLENBQUEsQ0FFeEIsSUFBTWdCLENBRGEsQ0FBQSxnQ0FBQSxDQUNNLEtBQUtoQixDQUFHLENBQUEsQ0FDakMsT0FBSWdCLENBQ0tBLENBQUFBLENBQUFBLENBQU0sQ0FBQyxDQUFFLENBQUEsV0FBQSxHQUVULEVBRVgsQ0FNQSxTQUFTLFNBQVVDLENBQUFBLENBQUFBLENBQU0sQ0FFdkIsT0FEZSxJQUFJLFdBQ0wsQ0FBQSxlQUFBLENBQWdCQSxFQUFNLFdBQVcsQ0FDakQsQ0FNQSxTQUFTLGVBQUEsQ0FBZ0JDLEVBQVV2QixDQUFLLENBQUEsQ0FDdEMsS0FBT0EsQ0FBSSxDQUFBLFVBQUEsQ0FBVyxPQUFTLENBQzdCdUIsRUFBQUEsQ0FBQUEsQ0FBUyxPQUFPdkIsQ0FBSSxDQUFBLFVBQUEsQ0FBVyxDQUFDLENBQUMsRUFFckMsQ0FNQSxTQUFTLGVBQUEsQ0FBZ0J3QixFQUFRLENBQy9CLElBQU1DLEVBQVksV0FBWSxFQUFBLENBQUUsY0FBYyxRQUFRLENBQUEsQ0FDdEQsZUFBUUQsQ0FBTyxDQUFBLFVBQUEsQ0FBWSxTQUFTRSxDQUFBQSxDQUFNLENBQ3hDRCxDQUFBQSxDQUFVLGFBQWFDLENBQUssQ0FBQSxJQUFBLENBQU1BLEVBQUssS0FBSyxFQUM5QyxDQUFDLENBQ0RELENBQUFBLENBQUFBLENBQVUsWUFBY0QsQ0FBTyxDQUFBLFdBQUEsQ0FDL0JDLEVBQVUsS0FBUSxDQUFBLENBQUEsQ0FBQSxDQUNkLEtBQUssTUFBTyxDQUFBLGlCQUFBLEdBQ2RBLEVBQVUsS0FBUSxDQUFBLElBQUEsQ0FBSyxPQUFPLGlCQUV6QkEsQ0FBQUEsQ0FBQUEsQ0FDVCxDQU1BLFNBQVMsc0JBQUEsQ0FBdUJELEVBQVEsQ0FDdEMsT0FBT0EsRUFBTyxPQUFRLENBQUEsUUFBUSxJQUFNQSxDQUFPLENBQUEsSUFBQSxHQUFTLG1CQUFxQkEsQ0FBTyxDQUFBLElBQUEsR0FBUyxVQUFZQSxDQUFPLENBQUEsSUFBQSxHQUFTLEdBQ3ZILENBU0EsU0FBUyxtQkFBb0JELENBQUFBLENBQUFBLENBQVUsQ0FDckMsS0FBQSxDQUFNLEtBQUtBLENBQVMsQ0FBQSxnQkFBQSxDQUFpQixRQUFRLENBQUMsQ0FBQSxDQUFFLFFBQWtEQyxDQUFXLEVBQUEsQ0FDM0csR0FBSSxzQkFBdUJBLENBQUFBLENBQU0sRUFBRyxDQUNsQyxJQUFNQyxFQUFZLGVBQWdCRCxDQUFBQSxDQUFNLEVBQ2xDZixDQUFTZSxDQUFBQSxDQUFBQSxDQUFPLFdBQ3RCLEdBQUksQ0FDRmYsRUFBTyxZQUFhZ0IsQ0FBQUEsQ0FBQUEsQ0FBV0QsQ0FBTSxFQUN2QyxDQUFBLE1BQVNOLEVBQUcsQ0FDVixRQUFBLENBQVNBLENBQUMsRUFDWixDQUFBLE9BQUUsQ0FDQU0sQ0FBTyxDQUFBLE1BQUEsR0FDVCxDQUNGLENBQ0YsQ0FBQyxFQUNILENBWUEsU0FBUyxZQUFBLENBQWFHLENBQVUsQ0FBQSxDQUU5QixJQUFNQyxDQUFxQkQsQ0FBQUEsQ0FBQUEsQ0FBUyxRQUFRLGNBQWdCLENBQUEsRUFBRSxFQUN4REUsQ0FBVyxDQUFBLFdBQUEsQ0FBWUQsQ0FBa0IsQ0FFM0NMLENBQUFBLENBQUFBLENBQ0osR0FBSU0sQ0FBYSxHQUFBLE1BQUEsQ0FBUSxDQUV2Qk4sQ0FBbUQsQ0FBQSxJQUFJLGlCQUN2RCxJQUFNTyxDQUFBQSxDQUFNLFVBQVVILENBQVEsQ0FBQSxDQUM5QixnQkFBZ0JKLENBQVVPLENBQUFBLENBQUFBLENBQUksSUFBSSxDQUNsQ1AsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFRTyxDQUFJLENBQUEsTUFDdkIsU0FBV0QsQ0FBYSxHQUFBLE1BQUEsQ0FBUSxDQUU5Qk4sQ0FBbUQsQ0FBQSxJQUFJLGlCQUN2RCxJQUFNTyxDQUFBQSxDQUFNLFVBQVVGLENBQWtCLENBQUEsQ0FDeEMsZ0JBQWdCTCxDQUFVTyxDQUFBQSxDQUFBQSxDQUFJLElBQUksQ0FDbENQLENBQUFBLENBQUFBLENBQVMsTUFBUU8sQ0FBSSxDQUFBLE1BQ3ZCLE1BQU8sQ0FFTCxJQUFNQSxFQUFNLFNBQVUsQ0FBQSxnREFBQSxDQUFtREYsRUFBcUIsb0JBQW9CLENBQUEsQ0FDbEhMLEVBQW1ETyxDQUFJLENBQUEsYUFBQSxDQUFjLFVBQVUsQ0FBRSxDQUFBLE9BQUEsQ0FFakZQLEVBQVMsS0FBUU8sQ0FBQUEsQ0FBQUEsQ0FBSSxNQUdyQixJQUFJQyxDQUFBQSxDQUFlUixFQUFTLGFBQWMsQ0FBQSxPQUFPLEVBQzdDUSxDQUFnQkEsRUFBQUEsQ0FBQUEsQ0FBYSxhQUFlUixDQUM5Q1EsR0FBQUEsQ0FBQUEsQ0FBYSxRQUNiUixDQUFBQSxDQUFBQSxDQUFTLE1BQVFRLENBQWEsQ0FBQSxTQUFBLEVBRWxDLENBQ0EsT0FBSVIsQ0FBQUEsR0FDRSxJQUFLLENBQUEsTUFBQSxDQUFPLGVBQ2QsQ0FBQSxtQkFBQSxDQUFvQkEsQ0FBUSxDQUc1QkEsQ0FBQUEsQ0FBQUEsQ0FBUyxpQkFBaUIsUUFBUSxDQUFBLENBQUUsUUFBU0MsQ0FBV0EsRUFBQUEsQ0FBQUEsQ0FBTyxRQUFRLENBQUEsQ0FBQSxDQUdwRUQsQ0FDVCxDQUtBLFNBQVMsVUFBVVMsQ0FBTSxDQUFBLENBQ25CQSxHQUNGQSxDQUFLLEdBRVQsQ0FPQSxTQUFTLE1BQUEsQ0FBT0MsRUFBR2hDLENBQU0sQ0FBQSxDQUN2QixPQUFPLE1BQU8sQ0FBQSxTQUFBLENBQVUsU0FBUyxJQUFLZ0MsQ0FBQUEsQ0FBQyxJQUFNLFVBQWFoQyxDQUFBQSxDQUFBQSxDQUFPLEdBQ25FLENBTUEsU0FBUyxXQUFXZ0MsQ0FBRyxDQUFBLENBQ3JCLE9BQU8sT0FBT0EsQ0FBQUEsRUFBTSxVQUN0QixDQU1BLFNBQVMsWUFBWUEsQ0FBRyxDQUFBLENBQ3RCLE9BQU8sTUFBT0EsQ0FBQUEsQ0FBQUEsQ0FBRyxRQUFRLENBQzNCLENBZ0RBLFNBQVMsZUFBZ0JqQyxDQUFBQSxDQUFBQSxDQUFLLENBQzVCLElBQU1rQyxDQUFBQSxDQUFXLHFCQUNiQyxDQUFPbkMsQ0FBQUEsQ0FBQUEsQ0FBSWtDLENBQVEsQ0FDdkIsQ0FBQSxPQUFLQyxJQUNIQSxDQUFPbkMsQ0FBQUEsQ0FBQUEsQ0FBSWtDLENBQVEsQ0FBSSxDQUFBLElBRWxCQyxDQUNULENBUUEsU0FBUyxPQUFRQyxDQUFBQSxDQUFBQSxDQUFLLENBQ3BCLElBQU1DLENBQUFBLENBQVksRUFDbEIsQ0FBQSxHQUFJRCxFQUNGLElBQVNFLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSUYsQ0FBQUEsQ0FBQUEsQ0FBSSxNQUFRRSxDQUFBQSxDQUFBQSxFQUFBQSxDQUM5QkQsQ0FBVSxDQUFBLElBQUEsQ0FBS0QsRUFBSUUsQ0FBQyxDQUFDLEVBR3pCLE9BQU9ELENBQ1QsQ0FPQSxTQUFTLE9BQUEsQ0FBUUQsRUFBS0osQ0FBTSxDQUFBLENBQzFCLEdBQUlJLENBQ0YsQ0FBQSxJQUFBLElBQVNFLEVBQUksQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSUYsRUFBSSxNQUFRRSxDQUFBQSxDQUFBQSxFQUFBQSxDQUM5Qk4sRUFBS0ksQ0FBSUUsQ0FBQUEsQ0FBQyxDQUFDLEVBR2pCLENBTUEsU0FBUyxrQkFBbUJDLENBQUFBLENBQUFBLENBQUksQ0FDOUIsSUFBTUMsQ0FBQUEsQ0FBT0QsRUFBRyxxQkFBc0IsRUFBQSxDQUNoQ0UsRUFBVUQsQ0FBSyxDQUFBLEdBQUEsQ0FDZkUsRUFBYUYsQ0FBSyxDQUFBLE1BQUEsQ0FDeEIsT0FBT0MsQ0FBVSxDQUFBLE1BQUEsQ0FBTyxhQUFlQyxDQUFjLEVBQUEsQ0FDdkQsQ0FNQSxTQUFTLFlBQUEsQ0FBYTFDLEVBQUssQ0FFekIsSUFBTTJDLEVBQVczQyxDQUFJLENBQUEsV0FBQSxFQUFlQSxFQUFJLFdBQVksRUFBQSxDQUNwRCxPQUFJMkMsQ0FBWUEsRUFBQUEsQ0FBQUEsWUFBb0IsT0FBTyxVQUNsQyxDQUFBLFdBQUEsR0FBYyxJQUFLLENBQUEsUUFBQSxDQUFTQSxFQUFTLElBQUksQ0FBQSxDQUV6QyxhQUFjLENBQUEsSUFBQSxDQUFLLFNBQVMzQyxDQUFHLENBRTFDLENBTUEsU0FBUyxpQkFBQSxDQUFrQjRDLEVBQVMsQ0FDbEMsT0FBT0EsRUFBUSxJQUFLLEVBQUEsQ0FBRSxNQUFNLEtBQUssQ0FDbkMsQ0FXQSxTQUFTLFlBQUEsQ0FBYUMsQ0FBTUMsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUNoQyxJQUFBLElBQVdDLEtBQU9ELENBQ1pBLENBQUFBLENBQUFBLENBQUssZUFBZUMsQ0FBRyxDQUFBLEdBRXpCRixFQUFLRSxDQUFHLENBQUEsQ0FBSUQsRUFBS0MsQ0FBRyxDQUFBLENBQUEsQ0FJeEIsT0FBT0YsQ0FDVCxDQU1BLFNBQVMsU0FBVUcsQ0FBQUEsQ0FBQUEsQ0FBUyxDQUMxQixHQUFJLENBQ0YsT0FBTyxJQUFLLENBQUEsS0FBQSxDQUFNQSxDQUFPLENBQzNCLENBQUEsTUFBU0MsRUFBTyxDQUNkLE9BQUEsUUFBQSxDQUFTQSxDQUFLLENBQ1AsQ0FBQSxJQUNULENBQ0YsQ0FLQSxTQUFTLHVCQUF3QixDQUMvQixJQUFNQyxFQUFPLHVCQUNiLENBQUEsR0FBSSxDQUNGLE9BQWEsWUFBQSxDQUFBLE9BQUEsQ0FBUUEsQ0FBTUEsQ0FBQUEsQ0FBSSxDQUMvQixDQUFBLFlBQUEsQ0FBYSxXQUFXQSxDQUFJLENBQUEsQ0FDckIsRUFDVCxDQUFZLEtBQUEsQ0FDVixPQUFPLENBQ1QsQ0FBQSxDQUNGLENBTUEsU0FBUyxhQUFBLENBQWNDLEVBQU0sQ0FDM0IsR0FBSSxDQUNGLElBQU1DLENBQUFBLENBQU0sSUFBSSxHQUFJRCxDQUFBQSxDQUFJLEVBQ3hCLE9BQUlDLENBQUFBLEdBQ0ZELEVBQU9DLENBQUksQ0FBQSxRQUFBLENBQVdBLEVBQUksTUFHdEIsQ0FBQSxDQUFBLE1BQUEsQ0FBTyxLQUFLRCxDQUFJLENBQUEsR0FDcEJBLEVBQU9BLENBQUssQ0FBQSxPQUFBLENBQVEsT0FBUSxFQUFFLENBQUEsQ0FBQSxDQUV6QkEsQ0FDVCxDQUFZLEtBQUEsQ0FFVixPQUFPQSxDQUNULENBQ0YsQ0FVQSxTQUFTLFlBQWEsQ0FBQSxHQUFBLENBQUssQ0FDekIsT0FBTyxTQUFBLENBQVUsYUFBYyxDQUFBLElBQUEsQ0FBTSxVQUFXLENBQzlDLE9BQU8sS0FBSyxHQUFHLENBQ2pCLENBQUMsQ0FDSCxDQVVBLFNBQVMsWUFBYUUsQ0FBQUEsQ0FBQUEsQ0FBVSxDQUk5QixPQUhjLElBQUEsQ0FBSyxHQUFHLFdBQTZDLENBQUEsU0FBU0MsRUFBSyxDQUMvRUQsQ0FBQUEsQ0FBU0MsRUFBSSxNQUFPLENBQUEsR0FBRyxFQUN6QixDQUFDLENBRUgsQ0FPQSxTQUFTLE1BQUEsRUFBUyxDQUNoQixJQUFLLENBQUEsTUFBQSxDQUFTLFNBQVN0RCxDQUFLdUQsQ0FBQUEsQ0FBQUEsQ0FBT3BCLEVBQU0sQ0FDbkMsT0FBQSxFQUNGLFFBQVEsR0FBSW9CLENBQUFBLENBQUFBLENBQU92RCxFQUFLbUMsQ0FBSSxFQUVoQyxFQUNGLENBRUEsU0FBUyxTQUFVLENBQ2pCLElBQUEsQ0FBSyxPQUFTLEtBQ2hCLENBV0EsU0FBUyxJQUFLcUIsQ0FBQUEsQ0FBQUEsQ0FBZXJDLEVBQVUsQ0FDckMsT0FBSSxPQUFPcUMsQ0FBa0IsRUFBQSxRQUFBLENBQ3BCQSxFQUFjLGFBQWNyQyxDQUFBQSxDQUFRLEVBRXBDLElBQUssQ0FBQSxXQUFBLEdBQWVxQyxDQUFhLENBRTVDLENBV0EsU0FBUyxPQUFBLENBQVFBLEVBQWVyQyxDQUFVLENBQUEsQ0FDeEMsT0FBSSxPQUFPcUMsQ0FBQUEsRUFBa0IsU0FDcEJBLENBQWMsQ0FBQSxnQkFBQSxDQUFpQnJDLENBQVEsQ0FFdkMsQ0FBQSxPQUFBLENBQVEsV0FBWSxFQUFBLENBQUdxQyxDQUFhLENBRS9DLENBS0EsU0FBUyxTQUFBLEVBQVksQ0FDbkIsT0FBTyxNQUNULENBVUEsU0FBUyxhQUFBLENBQWN4RCxFQUFLeUQsQ0FBTyxDQUFBLENBQ2pDekQsRUFBTSxhQUFjQSxDQUFBQSxDQUFHLEVBQ25CeUQsQ0FDRixDQUFBLFNBQUEsR0FBWSxVQUFXLENBQUEsVUFBVyxDQUNoQyxhQUFjekQsQ0FBQUEsQ0FBRyxFQUNqQkEsQ0FBTSxDQUFBLEtBQ1IsRUFBR3lELENBQUssQ0FBQSxDQUVSLFVBQVV6RCxDQUFHLENBQUEsQ0FBRSxZQUFZQSxDQUFHLEVBRWxDLENBTUEsU0FBUyxTQUFBLENBQVVBLEVBQUssQ0FDdEIsT0FBT0EsYUFBZSxPQUFVQSxDQUFBQSxDQUFBQSxDQUFNLElBQ3hDLENBTUEsU0FBUyxjQUFjQSxDQUFLLENBQUEsQ0FDMUIsT0FBT0EsQ0FBZSxZQUFBLFdBQUEsQ0FBY0EsRUFBTSxJQUM1QyxDQU1BLFNBQVMsUUFBUzBELENBQUFBLENBQUFBLENBQU8sQ0FDdkIsT0FBTyxPQUFPQSxHQUFVLFFBQVdBLENBQUFBLENBQUFBLENBQVEsSUFDN0MsQ0FNQSxTQUFTLGFBQWExRCxDQUFLLENBQUEsQ0FDekIsT0FBT0EsQ0FBZSxZQUFBLE9BQUEsRUFBV0EsYUFBZSxRQUFZQSxFQUFBQSxDQUFBQSxZQUFlLGlCQUFtQkEsQ0FBTSxDQUFBLElBQ3RHLENBV0EsU0FBUyxpQkFBQSxDQUFrQkEsRUFBSzJELENBQU9GLENBQUFBLENBQUFBLENBQU8sQ0FDNUN6RCxDQUFNLENBQUEsU0FBQSxDQUFVLGNBQWNBLENBQUcsQ0FBQyxDQUM3QkEsQ0FBQUEsQ0FBQUEsR0FHRHlELENBQ0YsQ0FBQSxTQUFBLEdBQVksVUFBVyxDQUFBLFVBQVcsQ0FDaEMsaUJBQWtCekQsQ0FBQUEsQ0FBQUEsQ0FBSzJELENBQUssQ0FDNUIzRCxDQUFBQSxDQUFBQSxDQUFNLEtBQ1IsQ0FBR3lELENBQUFBLENBQUssRUFFUnpELENBQUksQ0FBQSxTQUFBLEVBQWFBLEVBQUksU0FBVSxDQUFBLEdBQUEsQ0FBSTJELENBQUssQ0FFNUMsRUFBQSxDQVdBLFNBQVMsc0JBQXVCQyxDQUFBQSxDQUFBQSxDQUFNRCxFQUFPRixDQUFPLENBQUEsQ0FDbEQsSUFBSXpELENBQU0sQ0FBQSxTQUFBLENBQVUsY0FBYzRELENBQUksQ0FBQyxFQUNsQzVELENBR0R5RCxHQUFBQSxDQUFBQSxDQUNGLFdBQVksQ0FBQSxVQUFBLENBQVcsVUFBVyxDQUNoQyxzQkFBQSxDQUF1QnpELEVBQUsyRCxDQUFLLENBQUEsQ0FDakMzRCxFQUFNLEtBQ1IsQ0FBQSxDQUFHeUQsQ0FBSyxDQUVKekQsQ0FBQUEsQ0FBQUEsQ0FBSSxZQUNOQSxDQUFJLENBQUEsU0FBQSxDQUFVLE9BQU8yRCxDQUFLLENBQUEsQ0FFdEIzRCxFQUFJLFNBQVUsQ0FBQSxNQUFBLEdBQVcsR0FDM0JBLENBQUksQ0FBQSxlQUFBLENBQWdCLE9BQU8sQ0FJbkMsQ0FBQSxFQUFBLENBVUEsU0FBUyxvQkFBcUJBLENBQUFBLENBQUFBLENBQUsyRCxFQUFPLENBQ3hDM0QsQ0FBQUEsQ0FBTSxjQUFjQSxDQUFHLENBQUEsQ0FDdkJBLEVBQUksU0FBVSxDQUFBLE1BQUEsQ0FBTzJELENBQUssRUFDNUIsQ0FVQSxTQUFTLG1CQUFvQjNELENBQUFBLENBQUFBLENBQUsyRCxFQUFPLENBQ3ZDM0QsQ0FBQUEsQ0FBTSxjQUFjQSxDQUFHLENBQUEsQ0FDdkIsUUFBUUEsQ0FBSSxDQUFBLGFBQUEsQ0FBYyxRQUFVLENBQUEsU0FBUzZELENBQU8sQ0FBQSxDQUNsRCx1QkFBdUJBLENBQU9GLENBQUFBLENBQUssRUFDckMsQ0FBQyxDQUFBLENBQ0Qsa0JBQWtCLFNBQVUzRCxDQUFBQSxDQUFHLEVBQUcyRCxDQUFLLEVBQ3pDLENBV0EsU0FBUyxPQUFBLENBQVEzRCxFQUFLbUIsQ0FBVSxDQUFBLENBRTlCLEdBREFuQixDQUFNLENBQUEsU0FBQSxDQUFVLGNBQWNBLENBQUcsQ0FBQyxFQUM5QkEsQ0FBT0EsRUFBQUEsQ0FBQUEsQ0FBSSxRQUNiLE9BQU9BLENBQUFBLENBQUksUUFBUW1CLENBQVEsQ0FBQSxDQUczQixHQUNNbkIsR0FBQUEsQ0FBQUEsRUFBTyxNQUFRLE9BQVFBLENBQUFBLENBQUFBLENBQUttQixDQUFRLENBQ3RDLENBQUEsT0FBT25CLFFBR0pBLENBQU1BLENBQUFBLENBQUFBLEVBQU8sU0FBVSxDQUFBLFNBQUEsQ0FBVUEsQ0FBRyxDQUFDLEdBQzVDLE9BQU8sSUFFWCxDQU9BLFNBQVMsVUFBQSxDQUFXSyxFQUFLeUQsQ0FBUSxDQUFBLENBQy9CLE9BQU96RCxDQUFJLENBQUEsU0FBQSxDQUFVLEVBQUd5RCxDQUFPLENBQUEsTUFBTSxJQUFNQSxDQUM3QyxDQU9BLFNBQVMsUUFBU3pELENBQUFBLENBQUFBLENBQUswRCxFQUFRLENBQzdCLE9BQU8xRCxFQUFJLFNBQVVBLENBQUFBLENBQUFBLENBQUksT0FBUzBELENBQU8sQ0FBQSxNQUFNLElBQU1BLENBQ3ZELENBTUEsU0FBUyxpQkFBa0I1QyxDQUFBQSxDQUFBQSxDQUFVLENBQ25DLElBQU02QyxDQUFBQSxDQUFrQjdDLEVBQVMsSUFBSyxFQUFBLENBQ3RDLE9BQUksVUFBVzZDLENBQUFBLENBQUFBLENBQWlCLEdBQUcsQ0FBQSxFQUFLLFFBQVNBLENBQUFBLENBQUFBLENBQWlCLElBQUksQ0FDN0RBLENBQUFBLENBQUFBLENBQWdCLFVBQVUsQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBZ0IsT0FBUyxDQUFDLENBQUEsQ0FFdkRBLENBRVgsQ0FRQSxTQUFTLG9CQUFvQmhFLENBQUttQixDQUFBQSxDQUFBQSxDQUFVZixFQUFRLENBRWxELE9BREFKLEVBQU0sYUFBY0EsQ0FBQUEsQ0FBRyxFQUNuQm1CLENBQVMsQ0FBQSxPQUFBLENBQVEsVUFBVSxDQUFNLEdBQUEsQ0FBQSxDQUM1QixDQUFDLE9BQVEsQ0FBQSxTQUFBLENBQVVuQixDQUFHLENBQUcsQ0FBQSxpQkFBQSxDQUFrQm1CLEVBQVMsTUFBTyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDN0RBLENBQVMsQ0FBQSxPQUFBLENBQVEsT0FBTyxDQUFNLEdBQUEsQ0FBQSxDQUNoQyxDQUFDLElBQUssQ0FBQSxZQUFBLENBQWFuQixDQUFHLENBQUcsQ0FBQSxpQkFBQSxDQUFrQm1CLEVBQVMsTUFBTyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDN0RBLENBQWEsR0FBQSxNQUFBLENBQ2YsQ0FBQyxTQUFVbkIsQ0FBQUEsQ0FBRyxFQUFFLGtCQUFrQixDQUFBLENBQ2hDbUIsRUFBUyxPQUFRLENBQUEsT0FBTyxJQUFNLENBQ2hDLENBQUEsQ0FBQyxpQkFBaUJuQixDQUFLLENBQUEsaUJBQUEsQ0FBa0JtQixFQUFTLE1BQU8sQ0FBQSxDQUFDLENBQUMsQ0FBRyxDQUFBLENBQUMsQ0FBQ2YsQ0FBTSxDQUFDLEVBQ3JFZSxDQUFhLEdBQUEsVUFBQSxDQUNmLENBQUMsU0FBVW5CLENBQUFBLENBQUcsRUFBRSxzQkFBc0IsQ0FBQSxDQUNwQ21CLENBQVMsQ0FBQSxPQUFBLENBQVEsV0FBVyxDQUFBLEdBQU0sRUFDcEMsQ0FBQyxrQkFBQSxDQUFtQm5CLEVBQUssaUJBQWtCbUIsQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFPLENBQUMsQ0FBQyxFQUFHLENBQUMsQ0FBQ2YsQ0FBTSxDQUFDLENBQUEsQ0FDdkVlLElBQWEsVUFDZixDQUFBLENBQUMsUUFBUSxDQUNQQSxDQUFBQSxDQUFBQSxHQUFhLFNBQ2YsQ0FBQyxNQUFNLEVBQ0xBLENBQWEsR0FBQSxNQUFBLENBQ2YsQ0FBQyxRQUFTLENBQUEsSUFBSSxFQUNaQSxDQUFhLEdBQUEsTUFBQSxDQUNmLENBQUMsV0FBWW5CLENBQUFBLENBQUFBLENBQUssQ0FBQyxDQUFDSSxDQUFNLENBQUMsQ0FDekJlLENBQUFBLENBQUFBLENBQVMsUUFBUSxTQUFTLENBQUEsR0FBTSxFQUNsQyxtQkFBb0JuQixDQUFBQSxDQUFBQSxDQUFLbUIsRUFBUyxLQUFNLENBQUEsQ0FBQyxFQUFHLENBQUksQ0FBQSxDQUFBLENBRWhELFFBQVEsWUFBYSxDQUFBLFdBQUEsQ0FBWW5CLEVBQUssQ0FBQyxDQUFDSSxDQUFNLENBQUMsQ0FBQSxDQUFFLGlCQUFpQixpQkFBa0JlLENBQUFBLENBQVEsQ0FBQyxDQUFDLENBRXpHLENBUUEsSUFBSSxnQkFBQSxDQUFtQixTQUFTOEMsQ0FBTzVDLENBQUFBLENBQUFBLENBQU9qQixFQUFRLENBQ3BELElBQU04RCxFQUFVLFlBQWEsQ0FBQSxXQUFBLENBQVlELEVBQU83RCxDQUFNLENBQUMsRUFBRSxnQkFBaUJpQixDQUFBQSxDQUFLLEVBQy9FLElBQVNpQixJQUFBQSxDQUFBQSxDQUFJLEVBQUdBLENBQUk0QixDQUFBQSxDQUFBQSxDQUFRLE1BQVE1QixDQUFBQSxDQUFBQSxFQUFBQSxDQUFLLENBQ3ZDLElBQU10QyxFQUFNa0UsQ0FBUTVCLENBQUFBLENBQUMsRUFDckIsR0FBSXRDLENBQUFBLENBQUksd0JBQXdCaUUsQ0FBSyxDQUFBLEdBQU0sS0FBSywyQkFDOUMsQ0FBQSxPQUFPakUsQ0FFWCxDQUNGLENBQUEsQ0FRSSxtQkFBcUIsU0FBU2lFLENBQUFBLENBQU81QyxFQUFPakIsQ0FBUSxDQUFBLENBQ3RELElBQU04RCxDQUFVLENBQUEsWUFBQSxDQUFhLFlBQVlELENBQU83RCxDQUFBQSxDQUFNLENBQUMsQ0FBRSxDQUFBLGdCQUFBLENBQWlCaUIsQ0FBSyxDQUMvRSxDQUFBLElBQUEsSUFBU2lCLEVBQUk0QixDQUFRLENBQUEsTUFBQSxDQUFTLEVBQUc1QixDQUFLLEVBQUEsQ0FBQSxDQUFHQSxJQUFLLENBQzVDLElBQU10QyxFQUFNa0UsQ0FBUTVCLENBQUFBLENBQUMsRUFDckIsR0FBSXRDLENBQUFBLENBQUksd0JBQXdCaUUsQ0FBSyxDQUFBLEdBQU0sS0FBSywyQkFDOUMsQ0FBQSxPQUFPakUsQ0FFWCxDQUNGLENBQUEsQ0FPQSxTQUFTLGdCQUFpQndELENBQUFBLENBQUFBLENBQWVyQyxFQUFVLENBQ2pELE9BQUksT0FBT3FDLENBQWtCLEVBQUEsUUFBQSxDQUNwQixvQkFBb0JBLENBQWVyQyxDQUFBQSxDQUFRLEVBQUUsQ0FBQyxDQUFBLENBRTlDLG9CQUFvQixXQUFZLEVBQUEsQ0FBRSxLQUFNcUMsQ0FBYSxDQUFBLENBQUUsQ0FBQyxDQUVuRSxDQVFBLFNBQVMsYUFBY0EsQ0FBQUEsQ0FBQUEsQ0FBZVcsRUFBUyxDQUM3QyxPQUFJLE9BQU9YLENBQWtCLEVBQUEsUUFBQSxDQUNwQixLQUFLLFlBQWFXLENBQUFBLENBQU8sQ0FBSyxFQUFBLFFBQUEsQ0FBVVgsQ0FBYSxDQUFBLENBRXJEQSxDQUVYLENBbUJBLFNBQVMsaUJBQWlCWSxDQUFNQyxDQUFBQSxDQUFBQSxDQUFNQyxFQUFNLENBQzFDLE9BQUksV0FBV0QsQ0FBSSxDQUFBLENBQ1YsQ0FDTCxNQUFRLENBQUEsV0FBQSxHQUFjLElBQ3RCLENBQUEsS0FBQSxDQUFPLFNBQVNELENBQUksQ0FBQSxDQUNwQixTQUFVQyxDQUNaLENBQUEsQ0FFTyxDQUNMLE1BQVEsQ0FBQSxhQUFBLENBQWNELENBQUksQ0FDMUIsQ0FBQSxLQUFBLENBQU8sU0FBU0MsQ0FBSSxDQUFBLENBQ3BCLFNBQVVDLENBQ1osQ0FFSixDQVlBLFNBQVMsb0JBQUEsQ0FBcUJGLEVBQU1DLENBQU1DLENBQUFBLENBQUFBLENBQU0sQ0FDOUMsT0FBTSxLQUFBLENBQUEsVUFBVyxDQUNmLElBQU1DLENBQVksQ0FBQSxnQkFBQSxDQUFpQkgsRUFBTUMsQ0FBTUMsQ0FBQUEsQ0FBSSxFQUNuREMsQ0FBVSxDQUFBLE1BQUEsQ0FBTyxpQkFBaUJBLENBQVUsQ0FBQSxLQUFBLENBQU9BLEVBQVUsUUFBUSxFQUN2RSxDQUFDLENBQ1MsQ0FBQSxVQUFBLENBQVdGLENBQUksQ0FDZEEsQ0FBQUEsQ0FBQUEsQ0FBT0MsQ0FDcEIsQ0FZQSxTQUFTLHdCQUF3QkYsQ0FBTUMsQ0FBQUEsQ0FBQUEsQ0FBTUMsRUFBTSxDQUNqRCxPQUFBLEtBQUEsQ0FBTSxVQUFXLENBQ2YsSUFBTUMsRUFBWSxnQkFBaUJILENBQUFBLENBQUFBLENBQU1DLEVBQU1DLENBQUksQ0FBQSxDQUNuREMsRUFBVSxNQUFPLENBQUEsbUJBQUEsQ0FBb0JBLEVBQVUsS0FBT0EsQ0FBQUEsQ0FBQUEsQ0FBVSxRQUFRLEVBQzFFLENBQUMsQ0FDTSxDQUFBLFVBQUEsQ0FBV0YsQ0FBSSxDQUFBLENBQUlBLEVBQU9DLENBQ25DLENBTUEsSUFBTSxTQUFZLENBQUEsV0FBQSxHQUFjLGFBQWMsQ0FBQSxRQUFRLEVBTXRELFNBQVMsb0JBQUEsQ0FBcUJ0RSxFQUFLd0UsQ0FBVSxDQUFBLENBQzNDLElBQU1DLENBQWEsQ0FBQSx3QkFBQSxDQUF5QnpFLEVBQUt3RSxDQUFRLENBQUEsQ0FDekQsR0FBSUMsQ0FBWSxDQUFBLENBQ2QsR0FBSUEsQ0FBZSxHQUFBLE1BQUEsQ0FDakIsT0FBTyxDQUFDLGVBQUEsQ0FBZ0J6RSxFQUFLd0UsQ0FBUSxDQUFDLEVBQ2pDLENBQ0wsSUFBTUUsRUFBUyxtQkFBb0IxRSxDQUFBQSxDQUFBQSxDQUFLeUUsQ0FBVSxDQUNsRCxDQUFBLE9BQUlDLEVBQU8sTUFBVyxHQUFBLENBQUEsRUFDcEIsU0FBUyxnQkFBbUJELENBQUFBLENBQUFBLENBQWEsUUFBVUQsQ0FBVyxDQUFBLHVCQUF1QixFQUM5RSxDQUFDLFNBQVMsR0FFVkUsQ0FFWCxDQUNGLENBQ0YsQ0FPQSxTQUFTLGdCQUFnQjFFLENBQUsyRSxDQUFBQSxDQUFBQSxDQUFXLENBQ3ZDLE9BQU8sU0FBQSxDQUFVLGdCQUFnQjNFLENBQUssQ0FBQSxTQUFTQSxFQUFLLENBQ2xELE9BQU8sa0JBQWtCLFNBQVVBLENBQUFBLENBQUcsRUFBRzJFLENBQVMsQ0FBQSxFQUFLLElBQ3pELENBQUMsQ0FBQyxDQUNKLENBTUEsU0FBUyxVQUFVM0UsQ0FBSyxDQUFBLENBQ3RCLElBQU00RSxDQUFZLENBQUEsd0JBQUEsQ0FBeUI1RSxFQUFLLFdBQVcsQ0FBQSxDQUMzRCxPQUFJNEUsQ0FBQUEsQ0FDRUEsQ0FBYyxHQUFBLE1BQUEsQ0FDVCxnQkFBZ0I1RSxDQUFLLENBQUEsV0FBVyxFQUVoQyxnQkFBaUJBLENBQUFBLENBQUFBLENBQUs0RSxDQUFTLENBRzNCLENBQUEsZUFBQSxDQUFnQjVFLENBQUcsQ0FDdkIsQ0FBQSxPQUFBLENBQ0EsYUFBYyxDQUFBLElBQUEsQ0FFZEEsQ0FHYixDQU1BLFNBQVMsc0JBQXNCTyxDQUFNLENBQUEsQ0FDbkMsSUFBTXNFLENBQXFCLENBQUEsSUFBQSxDQUFLLE9BQU8sa0JBQ3ZDLENBQUEsSUFBQSxJQUFTdkMsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJdUMsRUFBbUIsTUFBUXZDLENBQUFBLENBQUFBLEVBQUFBLENBQzdDLEdBQUkvQixDQUFTc0UsR0FBQUEsQ0FBQUEsQ0FBbUJ2QyxDQUFDLENBQy9CLENBQUEsT0FBTyxHQUdYLE9BQU8sQ0FBQSxDQUNULENBTUEsU0FBUyxlQUFBLENBQWdCd0MsRUFBU0MsQ0FBVyxDQUFBLENBQzNDLFFBQVFELENBQVEsQ0FBQSxVQUFBLENBQVksU0FBU3BELENBQU0sQ0FBQSxDQUNyQyxDQUFDcUQsQ0FBVSxDQUFBLFlBQUEsQ0FBYXJELEVBQUssSUFBSSxDQUFBLEVBQUssc0JBQXNCQSxDQUFLLENBQUEsSUFBSSxHQUN2RW9ELENBQVEsQ0FBQSxlQUFBLENBQWdCcEQsRUFBSyxJQUFJLEVBRXJDLENBQUMsQ0FDRCxDQUFBLE9BQUEsQ0FBUXFELEVBQVUsVUFBWSxDQUFBLFNBQVNyRCxFQUFNLENBQ3ZDLHFCQUFBLENBQXNCQSxFQUFLLElBQUksQ0FBQSxFQUNqQ29ELEVBQVEsWUFBYXBELENBQUFBLENBQUFBLENBQUssS0FBTUEsQ0FBSyxDQUFBLEtBQUssRUFFOUMsQ0FBQyxFQUNILENBT0EsU0FBUyxZQUFBLENBQWFzRCxDQUFXQyxDQUFBQSxDQUFBQSxDQUFRLENBQ3ZDLElBQU1DLEVBQWEsYUFBY0QsQ0FBQUEsQ0FBTSxFQUN2QyxJQUFTM0MsSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJNEMsQ0FBQUEsQ0FBQUEsQ0FBVyxPQUFRNUMsQ0FBSyxFQUFBLENBQUEsQ0FDMUMsSUFBTTZDLENBQVlELENBQUFBLENBQUFBLENBQVc1QyxDQUFDLENBQzlCLENBQUEsR0FBSSxDQUNGLEdBQUk2QyxDQUFBQSxDQUFVLGFBQWFILENBQVMsQ0FBQSxDQUNsQyxPQUFPLENBRVgsQ0FBQSxDQUFBLE1BQVM5RCxFQUFHLENBQ1YsUUFBQSxDQUFTQSxDQUFDLEVBQ1osQ0FDRixDQUNBLE9BQU84RCxDQUFBQSxHQUFjLFdBQ3ZCLENBUUEsU0FBUyxRQUFRSSxDQUFVQyxDQUFBQSxDQUFBQSxDQUFZQyxFQUFZLENBQ2pELElBQUluRSxFQUFXLEdBQU0sQ0FBQSxlQUFBLENBQWdCa0UsRUFBWSxJQUFJLENBQUEsQ0FFakRMLEVBQVksV0FDWkksQ0FBQUEsQ0FBQUEsR0FBYSxTQUVOQSxDQUFTLENBQUEsT0FBQSxDQUFRLEdBQUcsQ0FBSSxDQUFBLENBQUEsRUFDakNKLEVBQVlJLENBQVMsQ0FBQSxNQUFBLENBQU8sRUFBR0EsQ0FBUyxDQUFBLE9BQUEsQ0FBUSxHQUFHLENBQUMsQ0FBQSxDQUNwRGpFLEVBQVdpRSxDQUFTLENBQUEsTUFBQSxDQUFPQSxFQUFTLE9BQVEsQ0FBQSxHQUFHLEVBQUksQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFNLENBRXJFSixFQUFBQSxDQUFBQSxDQUFZSSxHQUdkLElBQU1HLENBQUFBLENBQVUsYUFBYyxDQUFBLGdCQUFBLENBQWlCcEUsQ0FBUSxDQUN2RCxDQUFBLE9BQUlvRSxHQUNGLE9BQ0VBLENBQUFBLENBQUFBLENBQ0EsU0FBU04sQ0FBQUEsQ0FBUSxDQUNmLElBQUkxRCxFQUNFaUUsQ0FBa0JILENBQUFBLENBQUFBLENBQVcsVUFBVSxDQUFJLENBQUEsQ0FBQSxDQUNqRDlELEVBQVcsV0FBWSxFQUFBLENBQUUsd0JBQ3pCQSxDQUFBQSxDQUFBQSxDQUFTLFlBQVlpRSxDQUFlLENBQUEsQ0FDL0IsYUFBYVIsQ0FBV0MsQ0FBQUEsQ0FBTSxJQUNqQzFELENBQVcsQ0FBQSxZQUFBLENBQWFpRSxDQUFlLENBR3pDLENBQUEsQ0FBQSxJQUFNQyxFQUFvQixDQUFFLFVBQUEsQ0FBWSxHQUFNLE1BQUFSLENBQUFBLENBQUFBLENBQVEsU0FBQTFELENBQVMsQ0FBQSxDQUMxRCxhQUFhMEQsQ0FBUSxDQUFBLG9CQUFBLENBQXNCUSxDQUFpQixDQUVqRVIsR0FBQUEsQ0FBQUEsQ0FBU1EsRUFBa0IsTUFDdkJBLENBQUFBLENBQUFBLENBQWtCLFlBQ3BCLGFBQWNULENBQUFBLENBQUFBLENBQVdDLENBQVFBLENBQUFBLENBQUFBLENBQVExRCxDQUFVK0QsQ0FBQUEsQ0FBVSxFQUUvRCxPQUFRQSxDQUFBQSxDQUFBQSxDQUFXLEtBQU0sU0FBU3RGLENBQUFBLENBQUssQ0FDckMsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBSyxvQkFBcUJ5RixDQUFpQixFQUMxRCxDQUFDLENBQ0gsRUFBQSxDQUNGLEVBQ0FKLENBQVcsQ0FBQSxVQUFBLENBQVcsWUFBWUEsQ0FBVSxDQUFBLEdBRTVDQSxFQUFXLFVBQVcsQ0FBQSxXQUFBLENBQVlBLENBQVUsQ0FDNUMsQ0FBQSxpQkFBQSxDQUFrQixhQUFjLENBQUEsSUFBQSxDQUFNLHdCQUF5QixDQUFFLE9BQUEsQ0FBU0EsQ0FBVyxDQUFDLENBQUEsQ0FBQSxDQUVqRkQsQ0FDVCxDQUtBLFNBQVMsd0JBQXdCN0QsQ0FBVSxDQUFBLENBQ3pDLFFBQVEsT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBVSxtQ0FBbUMsQ0FBQSxDQUFHLFNBQVNtRSxDQUFBQSxDQUFjLENBQ3JGLElBQU1DLENBQUFBLENBQUssa0JBQWtCRCxDQUFjLENBQUEsSUFBSSxFQUN6Q0UsQ0FBUyxDQUFBLFdBQUEsR0FBYyxjQUFlRCxDQUFBQSxDQUFFLEVBQzFDQyxDQUFVLEVBQUEsSUFBQSxFQUNaRixFQUFhLFVBQVcsQ0FBQSxZQUFBLENBQWFFLEVBQVFGLENBQVksRUFFN0QsQ0FBQyxFQUNILENBT0EsU0FBUyxnQkFBaUJHLENBQUFBLENBQUFBLENBQVl0RSxFQUFVK0QsQ0FBWSxDQUFBLENBQzFELFFBQVEvRCxDQUFTLENBQUEsZ0JBQUEsQ0FBaUIsTUFBTSxDQUFHLENBQUEsU0FBU3VFLEVBQVMsQ0FDM0QsSUFBTUgsRUFBSyxlQUFnQkcsQ0FBQUEsQ0FBQUEsQ0FBUyxJQUFJLENBQ3hDLENBQUEsR0FBSUgsR0FBTUEsQ0FBRyxDQUFBLE1BQUEsQ0FBUyxFQUFHLENBQ3ZCLElBQU1JLEVBQWVKLENBQUcsQ0FBQSxPQUFBLENBQVEsSUFBSyxLQUFLLENBQUEsQ0FDcENLLEVBQWdCRixDQUFRLENBQUEsT0FBQSxDQUFRLFFBQVEsR0FBSyxDQUFBLEtBQUssRUFDbERHLENBQVksQ0FBQSxZQUFBLENBQWFKLENBQVUsQ0FDbkNLLENBQUFBLENBQUFBLENBQVVELEdBQWFBLENBQVUsQ0FBQSxhQUFBLENBQWNELEVBQWdCLE9BQVVELENBQUFBLENBQUFBLENBQWUsSUFBSSxDQUNsRyxDQUFBLEdBQUlHLEdBQVdBLENBQVlELEdBQUFBLENBQUFBLENBQVcsQ0FDcEMsSUFBTUUsQ0FBQUEsQ0FBZ0JMLEVBQVEsU0FBVSxFQUFBLENBQ3hDLGdCQUFnQkEsQ0FBU0ksQ0FBQUEsQ0FBTyxFQUNoQ1osQ0FBVyxDQUFBLEtBQUEsQ0FBTSxJQUFLLENBQUEsVUFBVyxDQUMvQixlQUFBLENBQWdCUSxFQUFTSyxDQUFhLEVBQ3hDLENBQUMsRUFDSCxDQUNGLENBQ0YsQ0FBQyxFQUNILENBTUEsU0FBUyxnQkFBQSxDQUFpQnRDLEVBQU8sQ0FDL0IsT0FBTyxVQUFXLENBQ2hCLHNCQUFBLENBQXVCQSxFQUFPLElBQUssQ0FBQSxNQUFBLENBQU8sVUFBVSxDQUNwRCxDQUFBLFdBQUEsQ0FBWSxVQUFVQSxDQUFLLENBQUMsRUFDNUIsWUFBYSxDQUFBLFlBQUEsQ0FBYUEsQ0FBSyxDQUFDLENBQUEsQ0FDaEMsYUFBYUEsQ0FBTyxDQUFBLFdBQVcsRUFDakMsQ0FDRixDQUtBLFNBQVMsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUMzQixJQUFNdUMsQ0FBQUEsQ0FBWSxjQUNaQyxDQUFpQixDQUFBLGFBQUEsQ0FBYyxRQUFReEMsQ0FBT3VDLENBQUFBLENBQVMsRUFBSXZDLENBQVFBLENBQUFBLENBQUFBLENBQU0sY0FBY3VDLENBQVMsQ0FBQyxFQUVyR0MsQ0FBZSxFQUFBLEtBQUEsR0FFbkIsQ0FRQSxTQUFTLGtCQUFrQlIsQ0FBWVMsQ0FBQUEsQ0FBQUEsQ0FBYy9FLEVBQVUrRCxDQUFZLENBQUEsQ0FFekUsSUFEQSxnQkFBaUJPLENBQUFBLENBQUFBLENBQVl0RSxFQUFVK0QsQ0FBVSxDQUFBLENBQzFDL0QsRUFBUyxVQUFXLENBQUEsTUFBQSxDQUFTLEdBQUcsQ0FDckMsSUFBTXNDLEVBQVF0QyxDQUFTLENBQUEsVUFBQSxDQUN2QixrQkFBa0IsU0FBVXNDLENBQUFBLENBQUssRUFBRyxJQUFLLENBQUEsTUFBQSxDQUFPLFVBQVUsQ0FDMURnQyxDQUFBQSxDQUFBQSxDQUFXLFlBQWFoQyxDQUFBQSxDQUFBQSxDQUFPeUMsQ0FBWSxDQUFBLENBQ3ZDekMsRUFBTSxRQUFhLEdBQUEsSUFBQSxDQUFLLFdBQWFBLENBQU0sQ0FBQSxRQUFBLEdBQWEsS0FBSyxZQUMvRHlCLEVBQUFBLENBQUFBLENBQVcsTUFBTSxJQUFLLENBQUEsZ0JBQUEsQ0FBaUJ6QixDQUFLLENBQUMsRUFFakQsQ0FDRixDQVNBLFNBQVMsV0FBVzBDLENBQVFDLENBQUFBLENBQUFBLENBQU0sQ0FDaEMsSUFBSUMsQ0FBQUEsQ0FBTyxFQUNYLEtBQU9BLENBQUFBLENBQU9GLEVBQU8sTUFDbkJDLEVBQUFBLENBQUFBLENBQUFBLENBQVFBLEdBQVEsQ0FBS0EsRUFBQUEsQ0FBQUEsQ0FBT0QsRUFBTyxVQUFXRSxDQUFBQSxDQUFBQSxFQUFNLEVBQUksQ0FFMUQsQ0FBQSxPQUFPRCxDQUNULENBTUEsU0FBUyxjQUFjeEcsQ0FBSyxDQUFBLENBQzFCLElBQUl3RyxDQUFPLENBQUEsQ0FBQSxDQUVYLEdBQUl4RyxDQUFJLENBQUEsVUFBQSxDQUNOLFFBQVNzQyxDQUFJLENBQUEsQ0FBQSxDQUFHQSxFQUFJdEMsQ0FBSSxDQUFBLFVBQUEsQ0FBVyxPQUFRc0MsQ0FBSyxFQUFBLENBQUEsQ0FDOUMsSUFBTXFDLENBQVkzRSxDQUFBQSxDQUFBQSxDQUFJLFdBQVdzQyxDQUFDLENBQUEsQ0FDOUJxQyxFQUFVLEtBQ1o2QixHQUFBQSxDQUFBQSxDQUFPLFdBQVc3QixDQUFVLENBQUEsSUFBQSxDQUFNNkIsQ0FBSSxDQUN0Q0EsQ0FBQUEsQ0FBQUEsQ0FBTyxXQUFXN0IsQ0FBVSxDQUFBLEtBQUEsQ0FBTzZCLENBQUksQ0FFM0MsRUFBQSxDQUVGLE9BQU9BLENBQ1QsQ0FLQSxTQUFTLGdCQUFpQnhHLENBQUFBLENBQUFBLENBQUssQ0FDN0IsSUFBTTBHLENBQUFBLENBQWUsZ0JBQWdCMUcsQ0FBRyxDQUFBLENBQ3hDLEdBQUkwRyxDQUFBQSxDQUFhLFVBQVksQ0FBQSxDQUMzQixRQUFTcEUsQ0FBSSxDQUFBLENBQUEsQ0FBR0EsRUFBSW9FLENBQWEsQ0FBQSxVQUFBLENBQVcsT0FBUXBFLENBQUssRUFBQSxDQUFBLENBQ3ZELElBQU1xRSxDQUFjRCxDQUFBQSxDQUFBQSxDQUFhLFdBQVdwRSxDQUFDLENBQUEsQ0FDN0Msd0JBQXdCdEMsQ0FBSzJHLENBQUFBLENBQUFBLENBQVksTUFBT0EsQ0FBWSxDQUFBLFFBQVEsRUFDdEUsQ0FDQSxPQUFPRCxFQUFhLFdBQ3RCLENBQ0YsQ0FLQSxTQUFTLFVBQUEsQ0FBV0UsRUFBUyxDQUMzQixJQUFNRixFQUFlLGVBQWdCRSxDQUFBQSxDQUFPLEVBQ3hDRixDQUFhLENBQUEsT0FBQSxFQUNmLGFBQWFBLENBQWEsQ0FBQSxPQUFPLEVBRS9CQSxDQUFhLENBQUEsYUFBQSxFQUNmLE9BQVFBLENBQUFBLENBQUFBLENBQWEsYUFBZSxDQUFBLFNBQVNHLEVBQU0sQ0FDN0NBLENBQUFBLENBQUssSUFDUCx1QkFBd0JBLENBQUFBLENBQUFBLENBQUssR0FBSUEsQ0FBSyxDQUFBLE9BQUEsQ0FBU0EsRUFBSyxRQUFRLEVBRWhFLENBQUMsQ0FFSCxDQUFBLGdCQUFBLENBQWlCRCxDQUFPLENBQ3hCLENBQUEsT0FBQSxDQUFRLE9BQU8sSUFBS0YsQ0FBQUEsQ0FBWSxFQUFHLFNBQVMzRCxDQUFBQSxDQUFLLENBQUUsT0FBTzJELENBQUFBLENBQWEzRCxDQUFHLEVBQUUsQ0FBQyxFQUMvRSxDQUtBLFNBQVMsZUFBZTZELENBQVMsQ0FBQSxDQUMvQixhQUFhQSxDQUFTLENBQUEsMkJBQTJCLEVBQ2pELFVBQVdBLENBQUFBLENBQU8sRUFHZEEsQ0FBUSxDQUFBLFFBQUEsRUFFVixPQUFRQSxDQUFBQSxDQUFBQSxDQUFRLFFBQVUsQ0FBQSxTQUFTL0MsRUFBTyxDQUFFLGNBQUEsQ0FBZUEsQ0FBSyxFQUFFLENBQUMsRUFFdkUsQ0FPQSxTQUFTLGNBQWNvQixDQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBVStELEVBQVksQ0FDbkQsR0FBSUwsYUFBa0IsT0FBV0EsRUFBQUEsQ0FBQUEsQ0FBTyxVQUFZLE1BQ2xELENBQUEsT0FBTyxjQUFjQSxDQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FHbkQsQ0FBQSxJQUFJd0IsRUFDRUMsQ0FBc0I5QixDQUFBQSxDQUFBQSxDQUFPLGdCQVVuQyxJQVRBLGlCQUFBLENBQWtCLFVBQVVBLENBQU0sQ0FBQSxDQUFHQSxFQUFRMUQsQ0FBVStELENBQUFBLENBQVUsRUFDN0R5QixDQUF1QixFQUFBLElBQUEsQ0FDekJELEVBQVMsU0FBVTdCLENBQUFBLENBQU0sRUFBRSxVQUUzQjZCLENBQUFBLENBQUFBLENBQVNDLEVBQW9CLFdBRS9CekIsQ0FBQUEsQ0FBQUEsQ0FBVyxLQUFPQSxDQUFXLENBQUEsSUFBQSxDQUFLLE9BQU8sU0FBU3BFLENBQUFBLENBQUcsQ0FBRSxPQUFPQSxDQUFBQSxHQUFNK0QsQ0FBTyxDQUFDLENBQUEsQ0FHckU2QixHQUFVQSxDQUFXN0IsR0FBQUEsQ0FBQUEsRUFDdEI2QixhQUFrQixPQUNwQnhCLEVBQUFBLENBQUFBLENBQVcsS0FBSyxJQUFLd0IsQ0FBQUEsQ0FBTSxFQUU3QkEsQ0FBU0EsQ0FBQUEsQ0FBQUEsQ0FBTyxZQUVsQixjQUFlN0IsQ0FBQUEsQ0FBTSxFQUNqQkEsQ0FBa0IsWUFBQSxPQUFBLENBQ3BCQSxFQUFPLE1BQU8sRUFBQSxDQUVkQSxFQUFPLFVBQVcsQ0FBQSxXQUFBLENBQVlBLENBQU0sRUFFeEMsQ0FPQSxTQUFTLGNBQWVBLENBQUFBLENBQUFBLENBQVExRCxDQUFVK0QsQ0FBQUEsQ0FBQUEsQ0FBWSxDQUNwRCxPQUFPLGtCQUFrQkwsQ0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBTyxXQUFZMUQsQ0FBVStELENBQUFBLENBQVUsQ0FDMUUsQ0FPQSxTQUFTLGdCQUFnQkwsQ0FBUTFELENBQUFBLENBQUFBLENBQVUrRCxFQUFZLENBQ3JELE9BQU8sa0JBQWtCLFNBQVVMLENBQUFBLENBQU0sRUFBR0EsQ0FBUTFELENBQUFBLENBQUFBLENBQVUrRCxDQUFVLENBQzFFLENBT0EsU0FBUyxhQUFjTCxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVksQ0FBQSxDQUNuRCxPQUFPLGlCQUFrQkwsQ0FBQUEsQ0FBQUEsQ0FBUSxLQUFNMUQsQ0FBVStELENBQUFBLENBQVUsQ0FDN0QsQ0FPQSxTQUFTLGFBQWFMLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsRUFBWSxDQUNsRCxPQUFPLGtCQUFrQixTQUFVTCxDQUFBQSxDQUFNLEVBQUdBLENBQU8sQ0FBQSxXQUFBLENBQWExRCxFQUFVK0QsQ0FBVSxDQUN0RixDQUtBLFNBQVMsVUFBQSxDQUFXTCxFQUFRLENBQzFCLE9BQUEsY0FBQSxDQUFlQSxDQUFNLENBQ2QsQ0FBQSxTQUFBLENBQVVBLENBQU0sQ0FBRSxDQUFBLFdBQUEsQ0FBWUEsQ0FBTSxDQUM3QyxDQU9BLFNBQVMsYUFBY0EsQ0FBQUEsQ0FBQUEsQ0FBUTFELEVBQVUrRCxDQUFZLENBQUEsQ0FDbkQsSUFBTTBCLENBQWEvQixDQUFBQSxDQUFBQSxDQUFPLFdBRTFCLEdBREEsaUJBQUEsQ0FBa0JBLEVBQVErQixDQUFZekYsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FDdEQwQixDQUFBQSxDQUFBQSxDQUFZLENBQ2QsS0FBT0EsQ0FBQUEsQ0FBVyxhQUNoQixjQUFlQSxDQUFBQSxDQUFBQSxDQUFXLFdBQVcsQ0FBQSxDQUNyQy9CLENBQU8sQ0FBQSxXQUFBLENBQVkrQixFQUFXLFdBQVcsQ0FBQSxDQUUzQyxlQUFlQSxDQUFVLENBQUEsQ0FDekIvQixFQUFPLFdBQVkrQixDQUFBQSxDQUFVLEVBQy9CLENBQ0YsQ0FTQSxTQUFTLGFBQWNoQyxDQUFBQSxDQUFBQSxDQUFXaEYsRUFBS2lGLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsRUFBWSxDQUNuRSxPQUFRTixHQUNOLElBQUssT0FDSCxPQUNGLElBQUssWUFDSCxhQUFjQyxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVUsQ0FBQSxDQUMxQyxPQUNGLElBQUssWUFBQSxDQUNILGVBQWVMLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsQ0FBVSxDQUMzQyxDQUFBLE9BQ0YsSUFBSyxhQUNILENBQUEsZUFBQSxDQUFnQkwsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFVLEVBQzVDLE9BQ0YsSUFBSyxZQUNILGFBQWNMLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBVSxDQUFBLENBQzFDLE9BQ0YsSUFBSyxVQUFBLENBQ0gsYUFBYUwsQ0FBUTFELENBQUFBLENBQUFBLENBQVUrRCxDQUFVLENBQ3pDLENBQUEsT0FDRixJQUFLLFFBQ0gsQ0FBQSxVQUFBLENBQVdMLENBQU0sQ0FDakIsQ0FBQSxPQUNGLFFBQ0UsSUFBSUMsQ0FBQUEsQ0FBYSxjQUFjbEYsQ0FBRyxDQUFBLENBQ2xDLFFBQVNzQyxDQUFJLENBQUEsQ0FBQSxDQUFHQSxFQUFJNEMsQ0FBVyxDQUFBLE1BQUEsQ0FBUTVDLElBQUssQ0FDMUMsSUFBTTJFLEVBQU0vQixDQUFXNUMsQ0FBQUEsQ0FBQyxFQUN4QixHQUFJLENBQ0YsSUFBTTRFLENBQUFBLENBQWNELENBQUksQ0FBQSxVQUFBLENBQVdqQyxFQUFXQyxDQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FDMUUsQ0FBQSxHQUFJNEIsRUFBYSxDQUNmLEdBQUksTUFBTSxPQUFRQSxDQUFBQSxDQUFXLEVBRTNCLElBQVNDLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSUQsQ0FBQUEsQ0FBQUEsQ0FBWSxPQUFRQyxDQUFLLEVBQUEsQ0FBQSxDQUMzQyxJQUFNdEQsQ0FBUXFELENBQUFBLENBQUFBLENBQVlDLENBQUMsQ0FDdkJ0RCxDQUFBQSxDQUFBQSxDQUFNLFdBQWEsSUFBSyxDQUFBLFNBQUEsRUFBYUEsRUFBTSxRQUFhLEdBQUEsSUFBQSxDQUFLLGNBQy9EeUIsQ0FBVyxDQUFBLEtBQUEsQ0FBTSxLQUFLLGdCQUFpQnpCLENBQUFBLENBQUssQ0FBQyxFQUVqRCxDQUVGLE1BQ0YsQ0FDRixDQUFBLE1BQVMzQyxDQUFHLENBQUEsQ0FDVixRQUFTQSxDQUFBQSxDQUFDLEVBQ1osQ0FDRixDQUNJOEQsSUFBYyxXQUNoQixDQUFBLGFBQUEsQ0FBY0MsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFVLEVBRTFDLGFBQWMsQ0FBQSxJQUFBLENBQUssT0FBTyxnQkFBa0J0RixDQUFBQSxDQUFBQSxDQUFLaUYsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFVLEVBRW5GLENBQ0YsQ0FNQSxTQUFTLHNCQUF1Qi9ELENBQUFBLENBQUFBLENBQVUrRCxFQUFZLENBQ3BELElBQUk4QixFQUFVLE9BQVE3RixDQUFBQSxDQUFBQSxDQUFVLG1DQUFtQyxDQUNuRSxDQUFBLE9BQUEsT0FBQSxDQUFRNkYsRUFBUyxTQUFTL0IsQ0FBQUEsQ0FBWSxDQUNwQyxHQUFJLElBQUEsQ0FBSyxPQUFPLG1CQUF1QkEsRUFBQUEsQ0FBQUEsQ0FBVyxnQkFBa0IsSUFBTSxDQUFBLENBQ3hFLElBQU1ELENBQUFBLENBQVcsaUJBQWtCQyxDQUFBQSxDQUFBQSxDQUFZLGFBQWEsQ0FDeERELENBQUFBLENBQUFBLEVBQVksTUFDZCxPQUFRQSxDQUFBQSxDQUFBQSxDQUFVQyxFQUFZQyxDQUFVLEVBRTVDLE1BQ0VELENBQVcsQ0FBQSxlQUFBLENBQWdCLGFBQWEsQ0FDeENBLENBQUFBLENBQUFBLENBQVcsZ0JBQWdCLGtCQUFrQixFQUVqRCxDQUFDLENBQ00rQixDQUFBQSxDQUFBQSxDQUFRLE9BQVMsQ0FDMUIsQ0FVQSxTQUFTLElBQUtuQyxDQUFBQSxDQUFBQSxDQUFRb0MsRUFBU0MsQ0FBVUMsQ0FBQUEsQ0FBQUEsQ0FBYSxDQUMvQ0EsQ0FDSEEsR0FBQUEsQ0FBQUEsQ0FBYyxFQUdoQnRDLENBQUFBLENBQUFBLENBQUFBLENBQVMsY0FBY0EsQ0FBTSxDQUFBLENBRzdCLElBQU11QyxDQUFZLENBQUEsUUFBQSxDQUFTLGNBQ3ZCQyxDQUFnQixDQUFBLEdBQ3BCLEdBQUksQ0FDRkEsRUFBZ0IsQ0FDZCxHQUFBLENBQUtELEVBRUwsS0FBT0EsQ0FBQUEsQ0FBQUEsQ0FBWUEsRUFBVSxjQUFpQixDQUFBLElBQUEsQ0FFOUMsSUFBS0EsQ0FBWUEsQ0FBQUEsQ0FBQUEsQ0FBVSxhQUFlLElBQzVDLEVBQ0YsTUFBWSxFQUdaLElBQU1sQyxDQUFhLENBQUEsY0FBQSxDQUFlTCxDQUFNLENBR3hDLENBQUEsR0FBSXFDLEVBQVMsU0FBYyxHQUFBLGFBQUEsQ0FDekJyQyxFQUFPLFdBQWNvQyxDQUFBQSxDQUFBQSxDQUFBQSxLQUVoQixDQUNMLElBQUk5RixDQUFBQSxDQUFXLGFBQWE4RixDQUFPLENBQUEsQ0FLbkMsR0FIQS9CLENBQVcsQ0FBQSxLQUFBLENBQVEvRCxFQUFTLEtBR3hCZ0csQ0FBQUEsQ0FBQUEsQ0FBWSxVQUFXLENBQ3pCLElBQU1HLENBQWtCSCxDQUFBQSxDQUFBQSxDQUFZLFNBQVUsQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUN2RCxDQUFBLElBQUEsSUFBU2pGLEVBQUksQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSW9GLEVBQWdCLE1BQVFwRixDQUFBQSxDQUFBQSxFQUFBQSxDQUFLLENBQy9DLElBQU1xRixDQUFBQSxDQUFpQkQsRUFBZ0JwRixDQUFDLENBQUEsQ0FBRSxNQUFNLEdBQUssQ0FBQSxDQUFDLEVBQ2xEcUQsQ0FBS2dDLENBQUFBLENBQUFBLENBQWUsQ0FBQyxDQUFFLENBQUEsSUFBQSxHQUN2QmhDLENBQUcsQ0FBQSxPQUFBLENBQVEsR0FBRyxDQUFNLEdBQUEsQ0FBQSxHQUN0QkEsRUFBS0EsQ0FBRyxDQUFBLFNBQUEsQ0FBVSxDQUFDLENBRXJCLENBQUEsQ0FBQSxJQUFNUCxFQUFXdUMsQ0FBZSxDQUFBLENBQUMsR0FBSyxNQUNoQ3RDLENBQUFBLENBQUFBLENBQWE5RCxFQUFTLGFBQWMsQ0FBQSxHQUFBLENBQU1vRSxDQUFFLENBQzlDTixDQUFBQSxDQUFBQSxFQUNGLFFBQVFELENBQVVDLENBQUFBLENBQUFBLENBQVlDLENBQVUsRUFFNUMsQ0FDRixDQVdBLEdBVEEsc0JBQUEsQ0FBdUIvRCxFQUFVK0QsQ0FBVSxDQUFBLENBQzNDLFFBQVEsT0FBUS9ELENBQUFBLENBQUFBLENBQVUsVUFBVSxDQUErQyxDQUFBLFNBQVNxRyxFQUFVLENBQ2hHLHNCQUFBLENBQXVCQSxFQUFTLE9BQVN0QyxDQUFBQSxDQUFVLEdBRXJEc0MsQ0FBUyxDQUFBLE1BQUEsR0FFYixDQUFDLENBQUEsQ0FHR0wsRUFBWSxNQUFRLENBQUEsQ0FDdEIsSUFBTU0sQ0FBYyxDQUFBLFdBQUEsR0FBYyxzQkFBdUIsRUFBQSxDQUN6RCxRQUFRdEcsQ0FBUyxDQUFBLGdCQUFBLENBQWlCZ0csRUFBWSxNQUFNLENBQUEsQ0FBRyxTQUFTM0QsQ0FBQUEsQ0FBTSxDQUNwRWlFLENBQUFBLENBQVksWUFBWWpFLENBQUksRUFDOUIsQ0FBQyxDQUNEckMsQ0FBQUEsQ0FBQUEsQ0FBV3NHLEVBQ2IsQ0FDQSx1QkFBQSxDQUF3QnRHLENBQVEsQ0FDaEMsQ0FBQSxhQUFBLENBQWMrRixFQUFTLFNBQVdDLENBQUFBLENBQUFBLENBQVksZUFBZ0J0QyxDQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsRUFDNUYsQ0FHQSxHQUFJbUMsQ0FBYyxDQUFBLEdBQUEsRUFDaEIsQ0FBQyxZQUFhQSxDQUFBQSxDQUFBQSxDQUFjLEdBQUcsQ0FDL0IsRUFBQSxlQUFBLENBQWdCQSxFQUFjLEdBQUssQ0FBQSxJQUFJLEVBQUcsQ0FDMUMsSUFBTUssRUFBZSxRQUFTLENBQUEsY0FBQSxDQUFlLGdCQUFnQkwsQ0FBYyxDQUFBLEdBQUEsQ0FBSyxJQUFJLENBQUMsQ0FBQSxDQUMvRU0sRUFBZSxDQUFFLGFBQUEsQ0FBZVQsRUFBUyxXQUFnQixHQUFBLEtBQUEsQ0FBQSxDQUFZLENBQUNBLENBQVMsQ0FBQSxXQUFBLENBQWMsQ0FBQyxJQUFLLENBQUEsTUFBQSxDQUFPLGtCQUFtQixDQUNuSSxDQUFBLEdBQUlRLEVBQWMsQ0FFaEIsR0FBSUwsRUFBYyxLQUFTSyxFQUFBQSxDQUFBQSxDQUFhLGtCQUN0QyxHQUFJLENBRUZBLEVBQWEsaUJBQWtCTCxDQUFBQSxDQUFBQSxDQUFjLE1BQU9BLENBQWMsQ0FBQSxHQUFHLEVBQ3ZFLENBQVksS0FBQSxFQUlkSyxDQUFhLENBQUEsS0FBQSxDQUFNQyxDQUFZLEVBQ2pDLENBQ0YsQ0FFQTlDLENBQU8sQ0FBQSxTQUFBLENBQVUsT0FBTyxJQUFLLENBQUEsTUFBQSxDQUFPLGFBQWEsQ0FDakQsQ0FBQSxPQUFBLENBQVFLLENBQVcsQ0FBQSxJQUFBLENBQU0sU0FBU3RGLENBQUFBLENBQUssQ0FDakNBLENBQUksQ0FBQSxTQUFBLEVBQ05BLEVBQUksU0FBVSxDQUFBLEdBQUEsQ0FBSSxLQUFLLE1BQU8sQ0FBQSxhQUFhLEVBRTdDLFlBQWFBLENBQUFBLENBQUFBLENBQUssaUJBQWtCdUgsQ0FBWSxDQUFBLFNBQVMsRUFDM0QsQ0FBQyxDQUFBLENBQ0dBLEVBQVksaUJBQ2RBLEVBQUFBLENBQUFBLENBQVksbUJBSVRELENBQUFBLENBQUFBLENBQVMsYUFDWixXQUFZaEMsQ0FBQUEsQ0FBQUEsQ0FBVyxLQUFLLENBSTlCLENBQUEsSUFBTTBDLEVBQVcsVUFBVyxDQVcxQixHQVZBLE9BQVExQyxDQUFBQSxDQUFBQSxDQUFXLE1BQU8sU0FBUzJDLENBQUFBLENBQU0sQ0FDdkNBLENBQUssQ0FBQSxJQUFBLEdBQ1AsQ0FBQyxDQUFBLENBQ0QsT0FBUTNDLENBQUFBLENBQUFBLENBQVcsSUFBTSxDQUFBLFNBQVN0RixFQUFLLENBQ2pDQSxDQUFBQSxDQUFJLFdBQ05BLENBQUksQ0FBQSxTQUFBLENBQVUsT0FBTyxJQUFLLENBQUEsTUFBQSxDQUFPLGFBQWEsQ0FFaEQsQ0FBQSxZQUFBLENBQWFBLEVBQUssa0JBQW9CdUgsQ0FBQUEsQ0FBQUEsQ0FBWSxTQUFTLEVBQzdELENBQUMsRUFFR0EsQ0FBWSxDQUFBLE1BQUEsQ0FBUSxDQUN0QixJQUFNVyxDQUFBQSxDQUFlLFVBQVUsYUFBYyxDQUFBLEdBQUEsQ0FBTVgsRUFBWSxNQUFNLENBQUMsRUFDbEVXLENBQ0ZBLEVBQUFBLENBQUFBLENBQWEsZUFBZSxDQUFFLEtBQUEsQ0FBTyxRQUFTLFFBQVUsQ0FBQSxNQUFPLENBQUMsRUFFcEUsQ0FFQSxrQkFBa0I1QyxDQUFXLENBQUEsSUFBQSxDQUFNZ0MsQ0FBUSxDQUFBLENBQ3ZDQyxDQUFZLENBQUEsbUJBQUEsRUFDZEEsRUFBWSxtQkFBb0IsR0FFcEMsRUFFSUQsQ0FBUyxDQUFBLFdBQUEsQ0FBYyxFQUN6QixTQUFVLEVBQUEsQ0FBRSxXQUFXVSxDQUFVVixDQUFBQSxDQUFBQSxDQUFTLFdBQVcsQ0FFckRVLENBQUFBLENBQUFBLEdBRUosQ0FPQSxTQUFTLG9CQUFvQkcsQ0FBS0MsQ0FBQUEsQ0FBQUEsQ0FBUXBJLEVBQUssQ0FDN0MsSUFBTXFJLEVBQWNGLENBQUksQ0FBQSxpQkFBQSxDQUFrQkMsQ0FBTSxDQUNoRCxDQUFBLEdBQUlDLEVBQVksT0FBUSxDQUFBLEdBQUcsSUFBTSxDQUFHLENBQUEsQ0FDbEMsSUFBTUMsQ0FBVyxDQUFBLFNBQUEsQ0FBVUQsQ0FBVyxDQUN0QyxDQUFBLElBQUEsSUFBV0UsS0FBYUQsQ0FDdEIsQ0FBQSxHQUFJQSxFQUFTLGNBQWVDLENBQUFBLENBQVMsRUFBRyxDQUN0QyxJQUFJQyxFQUFTRixDQUFTQyxDQUFBQSxDQUFTLEVBQzNCLFdBQVlDLENBQUFBLENBQU0sRUFFcEJ4SSxDQUFNd0ksQ0FBQUEsQ0FBQUEsQ0FBTyxTQUFXLEtBQVlBLENBQUFBLENBQUFBLENBQUFBLENBQU8sT0FBU3hJLENBRXBEd0ksQ0FBQUEsQ0FBQUEsQ0FBUyxDQUFFLEtBQU9BLENBQUFBLENBQU8sRUFFM0IsWUFBYXhJLENBQUFBLENBQUFBLENBQUt1SSxFQUFXQyxDQUFNLEVBQ3JDLENBRUosQ0FBTyxLQUFBLENBQ0wsSUFBTUMsQ0FBYUosQ0FBQUEsQ0FBQUEsQ0FBWSxNQUFNLEdBQUcsQ0FBQSxDQUN4QyxRQUFTLENBQUksQ0FBQSxDQUFBLENBQUcsRUFBSUksQ0FBVyxDQUFBLE1BQUEsQ0FBUSxJQUNyQyxZQUFhekksQ0FBQUEsQ0FBQUEsQ0FBS3lJLENBQVcsQ0FBQSxDQUFDLENBQUUsQ0FBQSxJQUFBLEdBQVEsRUFBRSxFQUU5QyxDQUNGLEtBR00sb0JBQXNCLE9BQ3RCLENBQUEsWUFBQSxDQUFlLGFBQ2YsV0FBYyxDQUFBLGVBQUEsQ0FDZCxnQkFBa0IsQ0FBQyxHQUFBLENBQUssSUFBSyxHQUFHLENBQUEsQ0FDaEMsZUFBaUIsT0FDakIsQ0FBQSx1QkFBQSxDQUEwQixPQUMxQixxQkFBd0IsQ0FBQSxPQU05QixTQUFTLGNBQWVwSSxDQUFBQSxDQUFBQSxDQUFLLENBRTNCLElBQU1xSSxDQUFBQSxDQUFTLEVBQ1hDLENBQUFBLENBQUFBLENBQVcsRUFDZixLQUFPQSxDQUFBQSxDQUFXdEksRUFBSSxNQUFRLEVBQUEsQ0FDNUIsR0FBSSxZQUFhLENBQUEsSUFBQSxDQUFLQSxFQUFJLE1BQU9zSSxDQUFBQSxDQUFRLENBQUMsQ0FBRyxDQUFBLENBRTNDLFFBRElDLENBQWdCRCxDQUFBQSxDQUFBQSxDQUNiLFlBQVksSUFBS3RJLENBQUFBLENBQUFBLENBQUksT0FBT3NJLENBQVcsQ0FBQSxDQUFDLENBQUMsQ0FDOUNBLEVBQUFBLENBQUFBLEVBQUFBLENBRUZELEVBQU8sSUFBS3JJLENBQUFBLENBQUFBLENBQUksT0FBT3VJLENBQWVELENBQUFBLENBQUFBLENBQVdDLEVBQWdCLENBQUMsQ0FBQyxFQUNyRSxDQUFXLEtBQUEsR0FBQSxlQUFBLENBQWdCLFFBQVF2SSxDQUFJLENBQUEsTUFBQSxDQUFPc0ksQ0FBUSxDQUFDLENBQUEsR0FBTSxHQUFJLENBQy9ELElBQU1FLEVBQVl4SSxDQUFJLENBQUEsTUFBQSxDQUFPc0ksQ0FBUSxDQUNyQyxDQUFBLElBQUlDLEVBQWdCRCxDQUVwQixDQUFBLElBREFBLENBQ09BLEVBQUFBLENBQUFBLENBQUFBLENBQVd0SSxDQUFJLENBQUEsTUFBQSxFQUFVQSxFQUFJLE1BQU9zSSxDQUFBQSxDQUFRLElBQU1FLENBQ25EeEksRUFBQUEsQ0FBQUEsQ0FBSSxPQUFPc0ksQ0FBUSxDQUFBLEdBQU0sTUFDM0JBLENBRUZBLEVBQUFBLENBQUFBLENBQUFBLEVBQUFBLENBRUZELEVBQU8sSUFBS3JJLENBQUFBLENBQUFBLENBQUksT0FBT3VJLENBQWVELENBQUFBLENBQUFBLENBQVdDLEVBQWdCLENBQUMsQ0FBQyxFQUNyRSxDQUFPLEtBQUEsQ0FDTCxJQUFNRSxDQUFTekksQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPc0ksQ0FBUSxDQUFBLENBQ2xDRCxFQUFPLElBQUtJLENBQUFBLENBQU0sRUFDcEIsQ0FDQUgsQ0FBQUEsR0FDRixDQUNBLE9BQU9ELENBQ1QsQ0FRQSxTQUFTLDJCQUFBLENBQTRCSyxFQUFPQyxDQUFNQyxDQUFBQSxDQUFBQSxDQUFXLENBQzNELE9BQU8sWUFBQSxDQUFhLEtBQUtGLENBQU0sQ0FBQSxNQUFBLENBQU8sQ0FBQyxDQUFDLENBQUEsRUFDdENBLElBQVUsTUFDVkEsRUFBQUEsQ0FBQUEsR0FBVSxTQUNWQSxDQUFVLEdBQUEsTUFBQSxFQUNWQSxJQUFVRSxDQUNWRCxFQUFBQSxDQUFBQSxHQUFTLEdBQ2IsQ0FRQSxTQUFTLHlCQUF5QmhKLENBQUswSSxDQUFBQSxDQUFBQSxDQUFRTyxFQUFXLENBQ3hELEdBQUlQLEVBQU8sQ0FBQyxDQUFBLEdBQU0sSUFBSyxDQUNyQkEsQ0FBQUEsQ0FBTyxPQUNQLENBQUEsSUFBSVEsRUFBZSxDQUNmQyxDQUFBQSxDQUFBQSxDQUFvQixxQkFBdUJGLENBQVksQ0FBQSxhQUFBLENBQ3ZERCxFQUFPLElBQ1gsQ0FBQSxLQUFPTixFQUFPLE1BQVMsQ0FBQSxDQUFBLEVBQUcsQ0FDeEIsSUFBTUssQ0FBUUwsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUFDLENBRXRCLENBQUEsR0FBSUssSUFBVSxHQUVaLENBQUEsQ0FBQSxHQURBRyxJQUNJQSxDQUFpQixHQUFBLENBQUEsQ0FBRyxDQUNsQkYsQ0FBUyxHQUFBLElBQUEsR0FDWEcsRUFBb0JBLENBQW9CLENBQUEsTUFBQSxDQUFBLENBRTFDVCxFQUFPLEtBQU0sRUFBQSxDQUNiUyxHQUFxQixLQUNyQixDQUFBLEdBQUksQ0FDRixJQUFNQyxDQUFBQSxDQUFvQixVQUFVcEosQ0FBSyxDQUFBLFVBQVcsQ0FDbEQsT0FBTyxRQUFBLENBQVNtSixDQUFpQixDQUFFLEVBQ3JDLEVBQ0EsVUFBVyxDQUFFLE9BQU8sQ0FBSyxDQUFBLENBQUMsRUFDMUIsT0FBQUMsQ0FBQUEsQ0FBa0IsT0FBU0QsQ0FDcEJDLENBQUFBLENBQ1QsQ0FBU2xJLE1BQUFBLENBQUFBLENBQUcsQ0FDVixPQUFBLGlCQUFBLENBQWtCLGFBQWMsQ0FBQSxJQUFBLENBQU0sb0JBQXFCLENBQUUsS0FBQSxDQUFPQSxFQUFHLE1BQVFpSSxDQUFBQSxDQUFrQixDQUFDLENBQzNGLENBQUEsSUFDVCxDQUNGLENBQ1NKLENBQUFBLEtBQUFBLENBQUFBLEdBQVUsS0FDbkJHLENBRUUsRUFBQSxDQUFBLDJCQUFBLENBQTRCSCxFQUFPQyxDQUFNQyxDQUFBQSxDQUFTLEVBQ3BERSxDQUFxQixFQUFBLElBQUEsQ0FBT0YsRUFBWSxHQUFNRixDQUFBQSxDQUFBQSxDQUFRLFFBQVVFLENBQVksQ0FBQSxHQUFBLENBQU1GLEVBQVEsY0FBaUJBLENBQUFBLENBQUFBLENBQVEsS0FFbkhJLENBQW9CQSxDQUFBQSxDQUFBQSxDQUFvQkosRUFFMUNDLENBQU9OLENBQUFBLENBQUFBLENBQU8sUUFDaEIsQ0FDRixDQUNGLENBT0EsU0FBUyxZQUFhQSxDQUFBQSxDQUFBQSxDQUFRckgsQ0FBTyxDQUFBLENBQ25DLElBQUlxRCxDQUFTLENBQUEsRUFBQSxDQUNiLEtBQU9nRSxDQUFPLENBQUEsTUFBQSxDQUFTLEdBQUssQ0FBQ3JILENBQUFBLENBQU0sS0FBS3FILENBQU8sQ0FBQSxDQUFDLENBQUMsQ0FDL0NoRSxFQUFBQSxDQUFBQSxFQUFVZ0UsRUFBTyxLQUFNLEVBQUEsQ0FFekIsT0FBT2hFLENBQ1QsQ0FNQSxTQUFTLGtCQUFtQmdFLENBQUFBLENBQUFBLENBQVEsQ0FDbEMsSUFBSWhFLENBQUFBLENBQ0osT0FBSWdFLENBQU8sQ0FBQSxNQUFBLENBQVMsR0FBSyx1QkFBd0IsQ0FBQSxJQUFBLENBQUtBLEVBQU8sQ0FBQyxDQUFDLEdBQzdEQSxDQUFPLENBQUEsS0FBQSxHQUNQaEUsQ0FBUyxDQUFBLFlBQUEsQ0FBYWdFLEVBQVEscUJBQXFCLENBQUEsQ0FBRSxNQUNyREEsQ0FBQUEsQ0FBQUEsQ0FBTyxPQUVQaEUsRUFBQUEsQ0FBQUEsQ0FBUyxhQUFhZ0UsQ0FBUSxDQUFBLG1CQUFtQixFQUU1Q2hFLENBQ1QsQ0FFQSxJQUFNLGNBQWlCLENBQUEseUJBQUEsQ0FRdkIsU0FBUyxvQkFBcUIxRSxDQUFBQSxDQUFBQSxDQUFLcUosRUFBaUJDLENBQU8sQ0FBQSxDQUV6RCxJQUFNQyxDQUFlLENBQUEsR0FDZmIsQ0FBUyxDQUFBLGNBQUEsQ0FBZVcsQ0FBZSxDQUM3QyxDQUFBLEVBQUcsQ0FDRCxZQUFhWCxDQUFBQSxDQUFBQSxDQUFRLGNBQWMsQ0FDbkMsQ0FBQSxJQUFNYyxFQUFnQmQsQ0FBTyxDQUFBLE1BQUEsQ0FDdkI5RixFQUFVLFlBQWE4RixDQUFBQSxDQUFBQSxDQUFRLFNBQVMsQ0FDOUMsQ0FBQSxHQUFJOUYsSUFBWSxFQUNkLENBQUEsR0FBSUEsQ0FBWSxHQUFBLE9BQUEsQ0FBUyxDQUV2QixJQUFNNkcsRUFBUSxDQUFFLE9BQUEsQ0FBUyxPQUFRLENBQ2pDLENBQUEsWUFBQSxDQUFhZixFQUFRLGNBQWMsQ0FBQSxDQUNuQ2UsRUFBTSxZQUFlLENBQUEsYUFBQSxDQUFjLGFBQWFmLENBQVEsQ0FBQSxTQUFTLENBQUMsQ0FDbEUsQ0FBQSxZQUFBLENBQWFBLEVBQVEsY0FBYyxDQUFBLENBQ25DLElBQUlnQixDQUFjLENBQUEsd0JBQUEsQ0FBeUIxSixFQUFLMEksQ0FBUSxDQUFBLE9BQU8sRUFDM0RnQixDQUNGRCxHQUFBQSxDQUFBQSxDQUFNLFlBQWNDLENBRXRCSCxDQUFBQSxDQUFBQSxDQUFBQSxDQUFhLEtBQUtFLENBQUssRUFDekIsTUFBTyxDQUVMLElBQU1FLEVBQWMsQ0FBRSxPQUFBLENBQUEvRyxDQUFRLENBQzlCLENBQUEsSUFBSThHLEVBQWMsd0JBQXlCMUosQ0FBQUEsQ0FBQUEsQ0FBSzBJLEVBQVEsT0FBTyxDQUFBLENBSS9ELElBSElnQixDQUNGQyxHQUFBQSxDQUFBQSxDQUFZLFlBQWNELENBRXJCaEIsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBTyxPQUFTLENBQUtBLEVBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUFNLEdBQUEsR0FBQSxFQUFLLENBQzdDLFlBQWFBLENBQUFBLENBQUFBLENBQVEsY0FBYyxDQUNuQyxDQUFBLElBQU1LLEVBQVFMLENBQU8sQ0FBQSxLQUFBLEdBQ3JCLEdBQUlLLENBQUFBLEdBQVUsVUFDWlksQ0FBWSxDQUFBLE9BQUEsQ0FBVSxXQUNiWixDQUFVLEdBQUEsTUFBQSxDQUNuQlksRUFBWSxJQUFPLENBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxHQUNWWixJQUFVLFNBQ25CWSxDQUFBQSxDQUFBQSxDQUFZLFFBQVUsQ0FDYlosQ0FBQUEsQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsR0FBVSxTQUFXTCxDQUFPLENBQUEsQ0FBQyxDQUFNLEdBQUEsR0FBQSxDQUM1Q0EsQ0FBTyxDQUFBLEtBQUEsR0FDUGlCLENBQVksQ0FBQSxLQUFBLENBQVEsY0FBYyxZQUFhakIsQ0FBQUEsQ0FBQUEsQ0FBUSxtQkFBbUIsQ0FBQyxDQUFBLENBQUEsS0FBQSxHQUNsRUssSUFBVSxNQUFVTCxFQUFBQSxDQUFBQSxDQUFPLENBQUMsQ0FBTSxHQUFBLEdBQUEsQ0FBSyxDQUVoRCxHQURBQSxDQUFBQSxDQUFPLE9BQ0gsQ0FBQSx1QkFBQSxDQUF3QixLQUFLQSxDQUFPLENBQUEsQ0FBQyxDQUFDLENBQ3hDLENBQUEsSUFBSWtCLEVBQVcsa0JBQW1CbEIsQ0FBQUEsQ0FBTSxPQUNuQyxDQUNMLElBQUlrQixFQUFXLFlBQWFsQixDQUFBQSxDQUFBQSxDQUFRLG1CQUFtQixDQUN2RCxDQUFBLEdBQUlrQixJQUFhLFNBQWFBLEVBQUFBLENBQUFBLEdBQWEsUUFBVUEsQ0FBYSxHQUFBLE1BQUEsRUFBVUEsSUFBYSxVQUFZLENBQUEsQ0FDbkdsQixFQUFPLEtBQU0sRUFBQSxDQUNiLElBQU12SCxDQUFXLENBQUEsa0JBQUEsQ0FBbUJ1SCxDQUFNLENBRXRDdkgsQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFTLENBQ3BCeUksR0FBQUEsQ0FBQUEsRUFBWSxJQUFNekksQ0FFdEIsRUFBQSxDQUNGLENBQ0F3SSxDQUFZLENBQUEsSUFBQSxDQUFPQyxFQUNyQixDQUFXYixLQUFBQSxDQUFBQSxHQUFVLFVBQVlMLENBQU8sQ0FBQSxDQUFDLElBQU0sR0FDN0NBLEVBQUFBLENBQUFBLENBQU8sT0FDUGlCLENBQUFBLENBQUFBLENBQVksT0FBUyxrQkFBbUJqQixDQUFBQSxDQUFNLEdBQ3JDSyxDQUFVLEdBQUEsVUFBQSxFQUFjTCxFQUFPLENBQUMsQ0FBQSxHQUFNLEtBQy9DQSxDQUFPLENBQUEsS0FBQSxHQUNQaUIsQ0FBWSxDQUFBLFFBQUEsQ0FBVyxhQUFjLENBQUEsWUFBQSxDQUFhakIsQ0FBUSxDQUFBLG1CQUFtQixDQUFDLENBQ3JFSyxFQUFBQSxDQUFBQSxHQUFVLFNBQVdMLENBQU8sQ0FBQSxDQUFDLElBQU0sR0FDNUNBLEVBQUFBLENBQUFBLENBQU8sT0FDUGlCLENBQUFBLENBQUFBLENBQVksTUFBUSxZQUFhakIsQ0FBQUEsQ0FBQUEsQ0FBUSxtQkFBbUIsQ0FDbkRLLEVBQUFBLENBQUFBLEdBQVUsUUFBVUwsQ0FBTyxDQUFBLENBQUMsSUFBTSxHQUMzQ0EsRUFBQUEsQ0FBQUEsQ0FBTyxPQUNQaUIsQ0FBQUEsQ0FBQUEsQ0FBWVosQ0FBSyxDQUFJLENBQUEsa0JBQUEsQ0FBbUJMLENBQU0sQ0FDckNLLEVBQUFBLENBQUFBLEdBQVUsYUFBZUwsQ0FBTyxDQUFBLENBQUMsSUFBTSxHQUNoREEsRUFBQUEsQ0FBQUEsQ0FBTyxPQUNQaUIsQ0FBQUEsQ0FBQUEsQ0FBWVosQ0FBSyxDQUFJLENBQUEsWUFBQSxDQUFhTCxDQUFRLENBQUEsbUJBQW1CLENBRTdELEVBQUEsaUJBQUEsQ0FBa0IxSSxFQUFLLG1CQUFxQixDQUFBLENBQUUsTUFBTzBJLENBQU8sQ0FBQSxLQUFBLEVBQVEsQ0FBQyxFQUV6RSxDQUNBYSxDQUFhLENBQUEsSUFBQSxDQUFLSSxDQUFXLEVBQy9CLENBRUVqQixFQUFPLE1BQVdjLEdBQUFBLENBQUFBLEVBQ3BCLGtCQUFrQnhKLENBQUssQ0FBQSxtQkFBQSxDQUFxQixDQUFFLEtBQU8wSSxDQUFBQSxDQUFBQSxDQUFPLE9BQVEsQ0FBQyxFQUV2RSxZQUFhQSxDQUFBQSxDQUFBQSxDQUFRLGNBQWMsRUFDckMsQ0FBQSxNQUFTQSxFQUFPLENBQUMsQ0FBQSxHQUFNLEtBQU9BLENBQU8sQ0FBQSxLQUFBLElBQ3JDLE9BQUlZLENBQUFBLEdBQ0ZBLEVBQU1ELENBQWUsQ0FBQSxDQUFJRSxDQUVwQkEsQ0FBQUEsQ0FBQUEsQ0FDVCxDQU1BLFNBQVMsZ0JBQWdCdkosQ0FBSyxDQUFBLENBQzVCLElBQU1xSixDQUFrQixDQUFBLGlCQUFBLENBQWtCckosRUFBSyxZQUFZLENBQUEsQ0FDdkR1SixFQUFlLEVBQUMsQ0FDcEIsR0FBSUYsQ0FBaUIsQ0FBQSxDQUNuQixJQUFNQyxDQUFRLENBQUEsSUFBQSxDQUFLLE9BQU8saUJBQzFCQyxDQUFBQSxDQUFBQSxDQUFnQkQsR0FBU0EsQ0FBTUQsQ0FBQUEsQ0FBZSxHQUFNLG9CQUFxQnJKLENBQUFBLENBQUFBLENBQUtxSixFQUFpQkMsQ0FBSyxFQUN0RyxDQUVBLE9BQUlDLENBQUFBLENBQWEsT0FBUyxDQUNqQkEsQ0FBQUEsQ0FBQUEsQ0FDRSxRQUFRdkosQ0FBSyxDQUFBLE1BQU0sRUFDckIsQ0FBQyxDQUFFLFFBQVMsUUFBUyxDQUFDLEVBQ3BCLE9BQVFBLENBQUFBLENBQUFBLENBQUssNENBQTRDLENBQzNELENBQUEsQ0FBQyxDQUFFLE9BQVMsQ0FBQSxPQUFRLENBQUMsQ0FDbkIsQ0FBQSxPQUFBLENBQVFBLEVBQUssY0FBYyxDQUFBLENBQzdCLENBQUMsQ0FBRSxPQUFBLENBQVMsUUFBUyxDQUFDLENBQUEsQ0FFdEIsQ0FBQyxDQUFFLE9BQUEsQ0FBUyxPQUFRLENBQUMsQ0FFaEMsQ0FLQSxTQUFTLGFBQUEsQ0FBY0EsRUFBSyxDQUMxQixlQUFBLENBQWdCQSxDQUFHLENBQUUsQ0FBQSxTQUFBLENBQVksR0FDbkMsQ0FPQSxTQUFTLGVBQWVBLENBQUs2SixDQUFBQSxDQUFBQSxDQUFTQyxFQUFNLENBQzFDLElBQU1DLEVBQVcsZUFBZ0IvSixDQUFBQSxDQUFHLENBQ3BDK0osQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFVLENBQUEsU0FBQSxHQUFZLFVBQVcsQ0FBQSxVQUFXLENBQy9DLFlBQWEvSixDQUFBQSxDQUFHLEdBQUsrSixDQUFTLENBQUEsU0FBQSxHQUFjLEtBQ3pDLGdCQUFpQkQsQ0FBQUEsQ0FBQUEsQ0FBTTlKLEVBQUssU0FBVSxDQUFBLGlCQUFBLENBQW1CLENBQzVELFdBQWE4SixDQUFBQSxDQUFBQSxDQUNiLE9BQVE5SixDQUNWLENBQUMsQ0FBQyxDQUNBNkosRUFBQUEsQ0FBQUEsQ0FBUTdKLENBQUcsQ0FFYixDQUFBLGNBQUEsQ0FBZUEsRUFBSzZKLENBQVNDLENBQUFBLENBQUksR0FFckMsQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSyxZQUFZLEVBQ3RCLENBTUEsU0FBUyxXQUFZOUosQ0FBQUEsQ0FBQUEsQ0FBSyxDQUN4QixPQUFPLFFBQUEsQ0FBUyxXQUFhQSxDQUFJLENBQUEsUUFBQSxFQUMvQixnQkFBZ0JBLENBQUssQ0FBQSxNQUFNLEdBQzNCLGVBQWdCQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FBRSxDQUFBLE9BQUEsQ0FBUSxHQUFHLENBQU0sR0FBQSxDQUNsRCxDQUtBLFNBQVMsYUFBQSxDQUFjQSxFQUFLLENBQzFCLE9BQU8sUUFBUUEsQ0FBSyxDQUFBLElBQUEsQ0FBSyxPQUFPLGVBQWUsQ0FDakQsQ0FPQSxTQUFTLFlBQUEsQ0FBYUEsRUFBSytKLENBQVVSLENBQUFBLENBQUFBLENBQWMsQ0FDakQsR0FBS3ZKLENBQUFBLFlBQWUsbUJBQXFCLFdBQVlBLENBQUFBLENBQUcsSUFBTUEsQ0FBSSxDQUFBLE1BQUEsR0FBVyxJQUFNQSxDQUFJLENBQUEsTUFBQSxHQUFXLFVBQWNBLENBQUksQ0FBQSxPQUFBLEdBQVksUUFBVSxNQUFPLENBQUEsZUFBQSxDQUFnQkEsQ0FBSyxDQUFBLFFBQVEsQ0FBQyxDQUFBLENBQUUsYUFBa0IsR0FBQSxRQUFBLENBQVcsQ0FDNU0rSixDQUFTLENBQUEsT0FBQSxDQUFVLEdBQ25CLElBQUk3SixDQUFBQSxDQUFNaUQsRUFDVixHQUFJbkQsQ0FBQUEsQ0FBSSxVQUFZLEdBQ2xCRSxDQUFBQSxDQUFBQSxDQUFPLE1BQ1BpRCxDQUFPLENBQUEsZUFBQSxDQUFnQm5ELEVBQUssTUFBTSxDQUFBLENBQUEsS0FDN0IsQ0FDTCxJQUFNZ0ssQ0FBQUEsQ0FBZSxnQkFBZ0JoSyxDQUFLLENBQUEsUUFBUSxFQUNsREUsQ0FBTzhKLENBQUFBLENBQUFBLENBQWVBLEVBQWEsV0FBWSxFQUFBLENBQUksTUFHbkQ3RyxDQUFPLENBQUEsZUFBQSxDQUFnQm5ELEVBQUssUUFBUSxFQUN0QyxDQUNBdUosQ0FBYSxDQUFBLE9BQUEsQ0FBUSxTQUFTSSxDQUFhLENBQUEsQ0FDekMsaUJBQWlCM0osQ0FBSyxDQUFBLFNBQVM0RCxFQUFNTixDQUFLLENBQUEsQ0FDeEMsSUFBTXRELENBQU0sQ0FBQSxTQUFBLENBQVU0RCxDQUFJLENBQzFCLENBQUEsR0FBSSxjQUFjNUQsQ0FBRyxDQUFBLENBQUcsQ0FDdEIsY0FBZUEsQ0FBQUEsQ0FBRyxFQUNsQixNQUNGLENBQ0EsaUJBQWlCRSxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTW5ELEVBQUtzRCxDQUFHLEVBQ3ZDLEVBQUd5RyxDQUFVSixDQUFBQSxDQUFBQSxDQUFhLEVBQUksRUFDaEMsQ0FBQyxFQUNILENBQ0YsQ0FPQSxTQUFTLFlBQWFyRyxDQUFBQSxDQUFBQSxDQUFLTSxFQUFNLENBQy9CLElBQU01RCxFQUFNLFNBQVU0RCxDQUFBQSxDQUFJLEVBQzFCLE9BQUs1RCxDQUFBQSxDQUdELENBQUFzRCxFQUFBQSxDQUFBQSxDQUFBQSxDQUFJLElBQVMsR0FBQSxRQUFBLEVBQVlBLEVBQUksSUFBUyxHQUFBLE9BQUEsSUFDcEN0RCxFQUFJLE9BQVksR0FBQSxNQUFBLEVBR2hCLFFBQVFBLENBQUssQ0FBQSw4QkFBOEIsR0FBSyxPQUFRQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FBTSxHQUFBLElBQUEsRUFHekVBLGFBQWUsaUJBQXFCQSxFQUFBQSxDQUFBQSxDQUFJLE9BQ3pDQSxDQUFJLENBQUEsWUFBQSxDQUFhLE1BQU0sQ0FBTSxHQUFBLEdBQUEsRUFBT0EsRUFBSSxZQUFhLENBQUEsTUFBTSxFQUFFLE9BQVEsQ0FBQSxHQUFHLElBQU0sQ0FWMUUsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBZVgsQ0FPQSxTQUFTLDRCQUFBLENBQTZCQSxFQUFLc0QsQ0FBSyxDQUFBLENBQzlDLE9BQU8sZUFBZ0J0RCxDQUFBQSxDQUFHLEVBQUUsT0FBV0EsRUFBQUEsQ0FBQUEsWUFBZSxpQkFBcUJzRCxFQUFBQSxDQUFBQSxDQUFJLElBQVMsR0FBQSxPQUFBLEdBRXJGQSxFQUFJLE9BQVdBLEVBQUFBLENBQUFBLENBQUksUUFDeEIsQ0FRQSxTQUFTLGlCQUFpQnFHLENBQWEzSixDQUFBQSxDQUFBQSxDQUFLc0QsRUFBSyxDQUMvQyxJQUFNb0csRUFBY0MsQ0FBWSxDQUFBLFdBQUEsQ0FDaEMsR0FBSUQsQ0FDRixDQUFBLEdBQUksQ0FDRixPQUFPQSxDQUFBQSxDQUFZLEtBQUsxSixDQUFLc0QsQ0FBQUEsQ0FBRyxJQUFNLENBQ3hDLENBQUEsQ0FBQSxNQUFTcEMsRUFBRyxDQUNWLElBQU0rSSxFQUFTUCxDQUFZLENBQUEsTUFBQSxDQUMzQix5QkFBa0IsV0FBWSxFQUFBLENBQUUsS0FBTSx3QkFBMEIsQ0FBQSxDQUFFLE1BQU94SSxDQUFHLENBQUEsTUFBQSxDQUFBK0ksQ0FBTyxDQUFDLENBQUEsQ0FDN0UsQ0FDVCxDQUFBLENBRUYsT0FBTyxDQUFBLENBQ1QsQ0FTQSxTQUFTLGdCQUFBLENBQWlCakssRUFBSzZKLENBQVNFLENBQUFBLENBQUFBLENBQVVKLEVBQWFPLENBQWdCLENBQUEsQ0FDN0UsSUFBTUMsQ0FBYyxDQUFBLGVBQUEsQ0FBZ0JuSyxDQUFHLENBRW5Db0ssQ0FBQUEsQ0FBQUEsQ0FDQVQsRUFBWSxJQUNkUyxDQUFBQSxDQUFBQSxDQUFpQixvQkFBb0JwSyxDQUFLMkosQ0FBQUEsQ0FBQUEsQ0FBWSxJQUFJLENBRTFEUyxDQUFBQSxDQUFBQSxDQUFpQixDQUFDcEssQ0FBRyxDQUFBLENBR25CMkosRUFBWSxPQUNkUyxFQUFBQSxDQUFBQSxDQUFlLFFBQVEsU0FBU0MsQ0FBQUEsQ0FBZSxDQUM3QyxJQUFNQyxDQUFBQSxDQUFvQixnQkFBZ0JELENBQWEsQ0FBQSxDQUV2REMsRUFBa0IsU0FBWUQsQ0FBQUEsQ0FBQUEsQ0FBYyxNQUM5QyxDQUFDLENBQUEsQ0FFSCxRQUFRRCxDQUFnQixDQUFBLFNBQVNDLEVBQWUsQ0FFOUMsSUFBTUUsRUFBZ0IsU0FBU2pILENBQUFBLENBQUssQ0FDbEMsR0FBSSxDQUFDLGFBQWF0RCxDQUFHLENBQUEsQ0FBRyxDQUN0QnFLLENBQWMsQ0FBQSxtQkFBQSxDQUFvQlYsRUFBWSxPQUFTWSxDQUFBQSxDQUFhLEVBQ3BFLE1BQ0YsQ0FPQSxHQU5JLDRCQUE2QnZLLENBQUFBLENBQUFBLENBQUtzRCxDQUFHLENBR3JDNEcsR0FBQUEsQ0FBQUEsQ0FBQUEsRUFBa0IsYUFBYTVHLENBQUt0RCxDQUFBQSxDQUFHLElBQ3pDc0QsQ0FBSSxDQUFBLGNBQUEsR0FFRixnQkFBaUJxRyxDQUFBQSxDQUFBQSxDQUFhM0osRUFBS3NELENBQUcsQ0FBQSxDQUFBLENBQ3hDLE9BRUYsSUFBTWtILENBQUFBLENBQVksZ0JBQWdCbEgsQ0FBRyxDQUFBLENBS3JDLEdBSkFrSCxDQUFBQSxDQUFVLFdBQWNiLENBQUFBLENBQUFBLENBQ3BCYSxFQUFVLFVBQWMsRUFBQSxJQUFBLEdBQzFCQSxFQUFVLFVBQWEsQ0FBQSxJQUVyQkEsQ0FBVSxDQUFBLFVBQUEsQ0FBVyxRQUFReEssQ0FBRyxDQUFBLENBQUksRUFBRyxDQUt6QyxHQUpBd0ssRUFBVSxVQUFXLENBQUEsSUFBQSxDQUFLeEssQ0FBRyxDQUN6QjJKLENBQUFBLENBQUFBLENBQVksU0FDZHJHLENBQUksQ0FBQSxlQUFBLEdBRUZxRyxDQUFZLENBQUEsTUFBQSxFQUFVckcsRUFBSSxNQUN4QixFQUFBLENBQUMsUUFBUSxTQUFVQSxDQUFBQSxDQUFBQSxDQUFJLE1BQU0sQ0FBR3FHLENBQUFBLENBQUFBLENBQVksTUFBTSxDQUNwRCxDQUFBLE9BR0osR0FBSUEsQ0FBWSxDQUFBLElBQUEsQ0FBTSxDQUNwQixHQUFJUSxDQUFBQSxDQUFZLGNBQ2QsT0FFQUEsQ0FBQUEsQ0FBWSxjQUFnQixDQUVoQyxFQUFBLENBQ0EsR0FBSVIsQ0FBWSxDQUFBLE9BQUEsQ0FBUyxDQUN2QixJQUFNVyxDQUFBQSxDQUFvQixnQkFBZ0JELENBQWEsQ0FBQSxDQUVqRDNHLEVBQVEyRyxDQUFjLENBQUEsS0FBQSxDQUM1QixHQUFJQyxDQUFrQixDQUFBLFNBQUEsR0FBYzVHLEVBQ2xDLE9BRUY0RyxDQUFBQSxDQUFrQixVQUFZNUcsRUFDaEMsQ0FJQSxHQUhJeUcsQ0FBWSxDQUFBLE9BQUEsRUFDZCxhQUFhQSxDQUFZLENBQUEsT0FBTyxFQUU5QkEsQ0FBWSxDQUFBLFFBQUEsQ0FDZCxPQUdFUixDQUFZLENBQUEsUUFBQSxDQUFXLEVBQ3BCUSxDQUFZLENBQUEsUUFBQSxHQUNmLGFBQWFuSyxDQUFLLENBQUEsY0FBYyxFQUNoQzZKLENBQVE3SixDQUFBQSxDQUFBQSxDQUFLc0QsQ0FBRyxDQUFBLENBQ2hCNkcsQ0FBWSxDQUFBLFFBQUEsQ0FBVyxXQUFZLENBQUEsVUFBQSxDQUFXLFVBQVcsQ0FDdkRBLENBQUFBLENBQVksU0FBVyxLQUN6QixDQUFBLENBQUdSLEVBQVksUUFBUSxDQUFBLENBQUEsQ0FFaEJBLEVBQVksS0FBUSxDQUFBLENBQUEsQ0FDN0JRLEVBQVksT0FBVSxDQUFBLFNBQUEsR0FBWSxVQUFXLENBQUEsVUFBVyxDQUN0RCxZQUFhbkssQ0FBQUEsQ0FBQUEsQ0FBSyxjQUFjLENBQ2hDNkosQ0FBQUEsQ0FBQUEsQ0FBUTdKLEVBQUtzRCxDQUFHLEVBQ2xCLEVBQUdxRyxDQUFZLENBQUEsS0FBSyxHQUVwQixZQUFhM0osQ0FBQUEsQ0FBQUEsQ0FBSyxjQUFjLENBQ2hDNkosQ0FBQUEsQ0FBQUEsQ0FBUTdKLEVBQUtzRCxDQUFHLENBQUEsRUFFcEIsQ0FDRixDQUNJeUcsQ0FBQUEsQ0FBQUEsQ0FBUyxlQUFpQixJQUM1QkEsR0FBQUEsQ0FBQUEsQ0FBUyxjQUFnQixFQUFDLENBQUEsQ0FFNUJBLEVBQVMsYUFBYyxDQUFBLElBQUEsQ0FBSyxDQUMxQixPQUFTSixDQUFBQSxDQUFBQSxDQUFZLFFBQ3JCLFFBQVVZLENBQUFBLENBQUFBLENBQ1YsR0FBSUYsQ0FDTixDQUFDLEVBQ0RBLENBQWMsQ0FBQSxnQkFBQSxDQUFpQlYsRUFBWSxPQUFTWSxDQUFBQSxDQUFhLEVBQ25FLENBQUMsRUFDSCxDQUVBLElBQUksaUJBQUEsQ0FBb0IsR0FDcEIsYUFBZ0IsQ0FBQSxJQUFBLENBQ3BCLFNBQVMsaUJBQW9CLEVBQUEsQ0FDdEIsZ0JBQ0gsYUFBZ0IsQ0FBQSxVQUFXLENBQ3pCLGlCQUFvQixDQUFBLENBQUEsRUFDdEIsRUFDQSxNQUFPLENBQUEsZ0JBQUEsQ0FBaUIsU0FBVSxhQUFhLENBQUEsQ0FDL0MsV0FBWSxDQUFBLFVBQVcsQ0FDakIsaUJBQUEsR0FDRixrQkFBb0IsQ0FDcEIsQ0FBQSxDQUFBLE9BQUEsQ0FBUSxhQUFjLENBQUEsZ0JBQUEsQ0FBaUIsd0RBQXdELENBQUcsQ0FBQSxTQUFTdkssRUFBSyxDQUM5RyxXQUFBLENBQVlBLENBQUcsRUFDakIsQ0FBQyxHQUVMLENBQUcsQ0FBQSxHQUFHLEdBRVYsQ0FLQSxTQUFTLFlBQVlBLENBQUssQ0FBQSxDQUNwQixDQUFDLFlBQWFBLENBQUFBLENBQUFBLENBQUssa0JBQWtCLENBQUssRUFBQSxrQkFBQSxDQUFtQkEsQ0FBRyxDQUNsRUEsR0FBQUEsQ0FBQUEsQ0FBSSxhQUFhLGtCQUFvQixDQUFBLE1BQU0sRUFDMUIsZUFBZ0JBLENBQUFBLENBQUcsRUFDdkIsUUFDWCxDQUFBLFlBQUEsQ0FBYUEsRUFBSyxVQUFVLENBQUEsQ0FHNUJBLENBQUksQ0FBQSxnQkFBQSxDQUFpQix1QkFBeUIsQ0FBQSxVQUFXLENBQUUsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBSyxVQUFVLEVBQUUsQ0FBQSxDQUFHLENBQUUsSUFBTSxDQUFBLENBQUEsQ0FBSyxDQUFDLENBR2hILEVBQUEsQ0FVQSxTQUFTLGVBQWdCQSxDQUFBQSxDQUFBQSxDQUFLNkosRUFBU0UsQ0FBVXRHLENBQUFBLENBQUFBLENBQU8sQ0FDdEQsSUFBTWdILENBQUFBLENBQU8sVUFBVyxDQUNqQlYsQ0FBQUEsQ0FBUyxTQUNaQSxDQUFTLENBQUEsTUFBQSxDQUFTLEdBQ2xCRixDQUFRN0osQ0FBQUEsQ0FBRyxHQUVmLENBQ0l5RCxDQUFBQSxDQUFBQSxDQUFRLEVBQ1YsU0FBVSxFQUFBLENBQUUsV0FBV2dILENBQU1oSCxDQUFBQSxDQUFLLEVBRWxDZ0gsQ0FBSyxHQUVULENBUUEsU0FBUyxZQUFBLENBQWF6SyxDQUFLK0osQ0FBQUEsQ0FBQUEsQ0FBVVIsQ0FBYyxDQUFBLENBQ2pELElBQUltQixDQUFpQixDQUFBLENBQUEsQ0FBQSxDQUNyQixlQUFRLEtBQU8sQ0FBQSxTQUFTeEssRUFBTSxDQUM1QixHQUFJLGFBQWFGLENBQUssQ0FBQSxLQUFBLENBQVFFLENBQUksQ0FBRyxDQUFBLENBQ25DLElBQU1pRCxDQUFPLENBQUEsaUJBQUEsQ0FBa0JuRCxFQUFLLEtBQVFFLENBQUFBLENBQUksRUFDaER3SyxDQUFpQixDQUFBLENBQUEsQ0FBQSxDQUNqQlgsRUFBUyxJQUFPNUcsQ0FBQUEsQ0FBQUEsQ0FDaEI0RyxFQUFTLElBQU83SixDQUFBQSxDQUFBQSxDQUNoQnFKLEVBQWEsT0FBUSxDQUFBLFNBQVNJLEVBQWEsQ0FDekMsaUJBQUEsQ0FBa0IzSixFQUFLMkosQ0FBYUksQ0FBQUEsQ0FBQUEsQ0FBVSxTQUFTbkcsQ0FBTU4sQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNoRSxJQUFNdEQsQ0FBQUEsQ0FBTSxVQUFVNEQsQ0FBSSxDQUFBLENBQzFCLEdBQUksT0FBUTVELENBQUFBLENBQUFBLENBQUssS0FBSyxNQUFPLENBQUEsZUFBZSxFQUFHLENBQzdDLGNBQUEsQ0FBZUEsQ0FBRyxDQUNsQixDQUFBLE1BQ0YsQ0FDQSxnQkFBaUJFLENBQUFBLENBQUFBLENBQU1pRCxFQUFNbkQsQ0FBS3NELENBQUFBLENBQUcsRUFDdkMsQ0FBQyxFQUNILENBQUMsRUFDSCxDQUNGLENBQUMsQ0FDTW9ILENBQUFBLENBQ1QsQ0FjQSxTQUFTLGlCQUFBLENBQWtCMUssRUFBSzJKLENBQWFJLENBQUFBLENBQUFBLENBQVVGLEVBQVMsQ0FDOUQsR0FBSUYsRUFBWSxPQUFZLEdBQUEsVUFBQSxDQUMxQixtQkFDQSxDQUFBLGdCQUFBLENBQWlCM0osRUFBSzZKLENBQVNFLENBQUFBLENBQUFBLENBQVVKLENBQVcsQ0FBQSxDQUNwRCxXQUFZLENBQUEsU0FBQSxDQUFVM0osQ0FBRyxDQUFDLENBQUEsQ0FBQSxLQUFBLEdBQ2pCMkosRUFBWSxPQUFZLEdBQUEsV0FBQSxDQUFhLENBQzlDLElBQU1nQixDQUFBQSxDQUFrQixFQUNwQmhCLENBQUFBLENBQUFBLENBQVksT0FDZGdCLENBQWdCLENBQUEsSUFBQSxDQUFPLGlCQUFpQjNLLENBQUsySixDQUFBQSxDQUFBQSxDQUFZLElBQUksQ0FFM0RBLENBQUFBLENBQUFBLENBQUFBLENBQVksWUFDZGdCLENBQWdCLENBQUEsU0FBQSxDQUFZLFdBQVdoQixDQUFZLENBQUEsU0FBUyxHQUU3QyxJQUFJLG9CQUFBLENBQXFCLFNBQVNpQixDQUFTLENBQUEsQ0FDMUQsUUFBU3RJLENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUlzSSxDQUFRLENBQUEsTUFBQSxDQUFRdEksSUFFbEMsR0FEY3NJLENBQUFBLENBQVF0SSxDQUFDLENBQ2IsQ0FBQSxjQUFBLENBQWdCLENBQ3hCLFlBQWF0QyxDQUFBQSxDQUFBQSxDQUFLLFdBQVcsQ0FDN0IsQ0FBQSxLQUNGLENBRUosQ0FBRzJLLENBQUFBLENBQWUsRUFDVCxPQUFRLENBQUEsU0FBQSxDQUFVM0ssQ0FBRyxDQUFDLENBQUEsQ0FDL0IsaUJBQWlCLFNBQVVBLENBQUFBLENBQUcsRUFBRzZKLENBQVNFLENBQUFBLENBQUFBLENBQVVKLENBQVcsRUFDakUsQ0FBQSxLQUFXQSxFQUFZLE9BQVksR0FBQSxNQUFBLENBQzVCLGlCQUFpQkEsQ0FBYTNKLENBQUFBLENBQUFBLENBQUssVUFBVSxNQUFRLENBQUEsQ0FBRSxJQUFBQSxDQUFJLENBQUMsQ0FBQyxDQUNoRSxFQUFBLGVBQUEsQ0FBZ0IsVUFBVUEsQ0FBRyxDQUFBLENBQUc2SixFQUFTRSxDQUFVSixDQUFBQSxDQUFBQSxDQUFZLEtBQUssQ0FFN0RBLENBQUFBLENBQUFBLENBQVksWUFBZSxDQUFBLENBQUEsRUFDcENJLENBQVMsQ0FBQSxPQUFBLENBQVUsR0FDbkIsY0FBZSxDQUFBLFNBQUEsQ0FBVS9KLENBQUcsQ0FBRzZKLENBQUFBLENBQUFBLENBQVNGLENBQVcsQ0FFbkQsRUFBQSxnQkFBQSxDQUFpQjNKLEVBQUs2SixDQUFTRSxDQUFBQSxDQUFBQSxDQUFVSixDQUFXLEVBRXhELENBTUEsU0FBUyxpQkFBa0IvRixDQUFBQSxDQUFBQSxDQUFNLENBQy9CLElBQU01RCxDQUFBQSxDQUFNLFVBQVU0RCxDQUFJLENBQUEsQ0FDMUIsR0FBSSxDQUFDNUQsQ0FBQUEsQ0FDSCxPQUFPLENBRVQsQ0FBQSxDQUFBLElBQU02SyxFQUFhN0ssQ0FBSSxDQUFBLFVBQUEsQ0FDdkIsUUFBU21ILENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUkwRCxDQUFXLENBQUEsTUFBQSxDQUFRMUQsSUFBSyxDQUMxQyxJQUFNM0MsRUFBV3FHLENBQVcxRCxDQUFBQSxDQUFDLEVBQUUsSUFDL0IsQ0FBQSxHQUFJLFdBQVczQyxDQUFVLENBQUEsUUFBUSxHQUFLLFVBQVdBLENBQUFBLENBQUFBLENBQVUsYUFBYSxDQUN0RSxFQUFBLFVBQUEsQ0FBV0EsRUFBVSxRQUFRLENBQUEsRUFBSyxXQUFXQSxDQUFVLENBQUEsYUFBYSxFQUNwRSxPQUFPLENBQUEsQ0FFWCxDQUNBLE9BQU8sQ0FBQSxDQUNULENBTUEsSUFBTSxXQUFBLENBQWMsSUFBSSxjQUFlLEVBQUEsQ0FDcEMsaUJBQWlCLHdKQUN5RCxDQUFBLENBRTdFLFNBQVMsZUFBZ0J4RSxDQUFBQSxDQUFBQSxDQUFLOEssRUFBVSxDQUNsQyxpQkFBQSxDQUFrQjlLLENBQUcsQ0FDdkI4SyxFQUFBQSxDQUFBQSxDQUFTLEtBQUssU0FBVTlLLENBQUFBLENBQUcsQ0FBQyxDQUU5QixDQUFBLElBQU0rSyxDQUFPLENBQUEsV0FBQSxDQUFZLFFBQVMvSyxDQUFBQSxDQUFHLEVBQ2pDNEQsQ0FBTyxDQUFBLElBQUEsQ0FDWCxLQUFPQSxDQUFPbUgsQ0FBQUEsQ0FBQUEsQ0FBSyxhQUFlRCxFQUFBQSxDQUFBQSxDQUFTLEtBQUssU0FBVWxILENBQUFBLENBQUksQ0FBQyxFQUNqRSxDQUVBLFNBQVMsd0JBQXlCNUQsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUVyQyxJQUFNOEssQ0FBQUEsQ0FBVyxFQUNqQixDQUFBLEdBQUk5SyxhQUFlLGdCQUNqQixDQUFBLElBQUEsSUFBVzZELEtBQVM3RCxDQUFJLENBQUEsVUFBQSxDQUN0QixnQkFBZ0I2RCxDQUFPaUgsQ0FBQUEsQ0FBUSxPQUdqQyxlQUFnQjlLLENBQUFBLENBQUFBLENBQUs4SyxDQUFRLENBRS9CLENBQUEsT0FBT0EsQ0FDVCxDQU1BLFNBQVMsc0JBQXNCOUssQ0FBSyxDQUFBLENBQ2xDLEdBQUlBLENBQUFBLENBQUksZ0JBQWtCLENBQUEsQ0FDeEIsSUFBTWdMLENBQWtCLENBQUEsa0VBQUEsQ0FFbEJDLEVBQXFCLEVBQUMsQ0FDNUIsUUFBVy9KLENBQUssSUFBQSxVQUFBLENBQVksQ0FDMUIsSUFBTWlFLENBQUFBLENBQVksV0FBV2pFLENBQUMsQ0FBQSxDQUM5QixHQUFJaUUsQ0FBVSxDQUFBLFlBQUEsQ0FBYyxDQUMxQixJQUFJK0YsQ0FBQUEsQ0FBWS9GLEVBQVUsWUFBYSxFQUFBLENBQ25DK0YsR0FDRkQsQ0FBbUIsQ0FBQSxJQUFBLENBQUtDLENBQVMsRUFFckMsQ0FDRixDQUtBLE9BSGdCbEwsQ0FBQUEsQ0FBSSxpQkFBaUIsYUFBZ0JnTCxDQUFBQSxDQUFBQSxDQUFrQixvRkFDUEMsQ0FBbUIsQ0FBQSxJQUFBLEdBQU8sR0FBSUUsQ0FBQUEsQ0FBQUEsRUFBSyxLQUFPQSxDQUFDLENBQUEsQ0FBRSxJQUFLLENBQUEsRUFBRSxDQUFDLENBR3ZILE1BQ1MsT0FBQSxFQUVYLENBT0EsU0FBUywwQkFBMEI3SCxDQUFLLENBQUEsQ0FDdEMsSUFBTXRELENBQXlELENBQUEsT0FBQSxDQUFRLFVBQVVzRCxDQUFJLENBQUEsTUFBTSxFQUFHLDhCQUE4QixDQUFBLENBQ3RIb0QsRUFBZSxrQkFBbUJwRCxDQUFBQSxDQUFHLEVBQ3ZDb0QsQ0FDRkEsR0FBQUEsQ0FBQUEsQ0FBYSxrQkFBb0IxRyxDQUVyQyxFQUFBLENBS0EsU0FBUywyQkFBNEJzRCxDQUFBQSxDQUFBQSxDQUFLLENBQ3hDLElBQU1vRCxDQUFBQSxDQUFlLG1CQUFtQnBELENBQUcsQ0FBQSxDQUN2Q29ELElBQ0ZBLENBQWEsQ0FBQSxpQkFBQSxDQUFvQixNQUVyQyxDQU1BLFNBQVMsbUJBQW1CcEQsQ0FBSyxDQUFBLENBQy9CLElBQU10RCxDQUFNLENBQUEsT0FBQSxDQUFRLFVBQVVzRCxDQUFJLENBQUEsTUFBTSxFQUFHLDhCQUE4QixDQUFBLENBQ3pFLEdBQUksQ0FBQ3RELENBQUFBLENBQ0gsT0FFRixJQUFNb0wsQ0FBQUEsQ0FBTyxjQUFjLEdBQU0sQ0FBQSxlQUFBLENBQWdCcEwsRUFBSyxNQUFNLENBQUEsQ0FBR0EsRUFBSSxXQUFZLEVBQUMsR0FBSyxPQUFRQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FDeEcsQ0FBQSxHQUFLb0wsRUFHTCxPQUFPLGVBQUEsQ0FBZ0JBLENBQUksQ0FDN0IsQ0FLQSxTQUFTLGtCQUFtQnBMLENBQUFBLENBQUFBLENBQUssQ0FJL0JBLENBQUksQ0FBQSxnQkFBQSxDQUFpQixRQUFTLHlCQUF5QixDQUFBLENBQ3ZEQSxFQUFJLGdCQUFpQixDQUFBLFNBQUEsQ0FBVyx5QkFBeUIsQ0FBQSxDQUN6REEsQ0FBSSxDQUFBLGdCQUFBLENBQWlCLFdBQVksMkJBQTJCLEVBQzlELENBT0EsU0FBUyxtQkFBQSxDQUFvQkEsRUFBS3VJLENBQVc4QyxDQUFBQSxDQUFBQSxDQUFNLENBQ2pELElBQU10QixDQUFBQSxDQUFXLGdCQUFnQi9KLENBQUcsQ0FBQSxDQUMvQixNQUFNLE9BQVErSixDQUFBQSxDQUFBQSxDQUFTLFVBQVUsQ0FDcENBLEdBQUFBLENBQUFBLENBQVMsV0FBYSxFQUFDLENBQUEsQ0FFekIsSUFBSS9ILENBRUVzSixDQUFBQSxDQUFBQSxDQUFXLFNBQVNwSyxDQUFHLENBQUEsQ0FDM0IsVUFBVWxCLENBQUssQ0FBQSxVQUFXLENBQ3BCLGFBQWNBLENBQUFBLENBQUcsSUFHaEJnQyxDQUNIQSxHQUFBQSxDQUFBQSxDQUFPLElBQUksUUFBUyxDQUFBLE9BQUEsQ0FBU3FKLENBQUksQ0FFbkNySixDQUFBQSxDQUFBQSxDQUFBQSxDQUFLLEtBQUtoQyxDQUFLa0IsQ0FBQUEsQ0FBQyxHQUNsQixDQUFDLEVBQ0gsRUFDQWxCLENBQUksQ0FBQSxnQkFBQSxDQUFpQnVJLEVBQVcrQyxDQUFRLENBQUEsQ0FDeEN2QixFQUFTLFVBQVcsQ0FBQSxJQUFBLENBQUssQ0FBRSxLQUFPeEIsQ0FBQUEsQ0FBQUEsQ0FBVyxTQUFBK0MsQ0FBUyxDQUFDLEVBQ3pELENBS0EsU0FBUyxvQkFBb0J0TCxDQUFLLENBQUEsQ0FFaEMsaUJBQWlCQSxDQUFHLENBQUEsQ0FFcEIsUUFBU3NDLENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUl0QyxDQUFJLENBQUEsVUFBQSxDQUFXLE9BQVFzQyxDQUFLLEVBQUEsQ0FBQSxDQUM5QyxJQUFNL0IsQ0FBT1AsQ0FBQUEsQ0FBQUEsQ0FBSSxXQUFXc0MsQ0FBQyxDQUFBLENBQUUsS0FDekJvQixDQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBSSxVQUFXc0MsQ0FBQUEsQ0FBQyxDQUFFLENBQUEsS0FBQSxDQUNoQyxHQUFJLFVBQVcvQixDQUFBQSxDQUFBQSxDQUFNLE9BQU8sQ0FBSyxFQUFBLFVBQUEsQ0FBV0EsRUFBTSxZQUFZLENBQUEsQ0FBRyxDQUMvRCxJQUFNZ0wsQ0FBQUEsQ0FBa0JoTCxFQUFLLE9BQVEsQ0FBQSxLQUFLLEVBQUksQ0FDeENpTCxDQUFBQSxDQUFBQSxDQUFXakwsRUFBSyxLQUFNZ0wsQ0FBQUEsQ0FBQUEsQ0FBaUJBLEVBQWtCLENBQUMsQ0FBQSxDQUNoRSxHQUFJQyxDQUFhLEdBQUEsR0FBQSxFQUFPQSxJQUFhLEdBQUssQ0FBQSxDQUN4QyxJQUFJakQsQ0FBWWhJLENBQUFBLENBQUFBLENBQUssTUFBTWdMLENBQWtCLENBQUEsQ0FBQyxFQUUxQyxVQUFXaEQsQ0FBQUEsQ0FBQUEsQ0FBVyxHQUFHLENBQzNCQSxDQUFBQSxDQUFBQSxDQUFZLE9BQVNBLENBQ1osQ0FBQSxVQUFBLENBQVdBLEVBQVcsR0FBRyxDQUFBLENBQ2xDQSxFQUFZLE9BQVVBLENBQUFBLENBQUFBLENBQVUsTUFBTSxDQUFDLENBQUEsQ0FDOUIsV0FBV0EsQ0FBVyxDQUFBLE9BQU8sSUFDdENBLENBQVksQ0FBQSxPQUFBLENBQVVBLEVBQVUsS0FBTSxDQUFBLENBQUMsR0FHekMsbUJBQW9CdkksQ0FBQUEsQ0FBQUEsQ0FBS3VJLEVBQVc3RSxDQUFLLEVBQzNDLENBQ0YsQ0FDRixDQUNGLENBS0EsU0FBUyxRQUFBLENBQVMxRCxFQUFLLENBQ3JCLEdBQUksUUFBUUEsQ0FBSyxDQUFBLElBQUEsQ0FBSyxPQUFPLGVBQWUsQ0FBQSxDQUFHLENBQzdDLGNBQWVBLENBQUFBLENBQUcsRUFDbEIsTUFDRixDQUNBLElBQU0rSixDQUFXLENBQUEsZUFBQSxDQUFnQi9KLENBQUcsQ0FBQSxDQUNwQyxHQUFJK0osQ0FBQUEsQ0FBUyxXQUFhLGFBQWMvSixDQUFBQSxDQUFHLEVBQUcsQ0FFNUMsVUFBQSxDQUFXQSxDQUFHLENBRWQrSixDQUFBQSxDQUFBQSxDQUFTLFNBQVcsYUFBYy9KLENBQUFBLENBQUcsRUFFckMsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBSyx3QkFBd0IsQ0FHdENBLENBQUFBLENBQUFBLENBQUksUUFFTitKLENBQVMsQ0FBQSxTQUFBLENBQVkvSixFQUFJLEtBRzNCLENBQUEsQ0FBQSxJQUFNdUosRUFBZSxlQUFnQnZKLENBQUFBLENBQUcsRUFDVixZQUFhQSxDQUFBQSxDQUFBQSxDQUFLK0osRUFBVVIsQ0FBWSxDQUFBLEdBR2hFLHlCQUF5QnZKLENBQUssQ0FBQSxVQUFVLElBQU0sTUFDaEQsQ0FBQSxZQUFBLENBQWFBLEVBQUsrSixDQUFVUixDQUFBQSxDQUFZLEVBQy9CLFlBQWF2SixDQUFBQSxDQUFBQSxDQUFLLFlBQVksQ0FBQSxFQUN2Q3VKLENBQWEsQ0FBQSxPQUFBLENBQVEsU0FBU0ksQ0FBYSxDQUFBLENBRXpDLGtCQUFrQjNKLENBQUsySixDQUFBQSxDQUFBQSxDQUFhSSxFQUFVLFVBQVcsRUFDeEQsRUFDSCxDQUFDLElBTUQvSixDQUFJLENBQUEsT0FBQSxHQUFZLFFBQVcsZUFBZ0JBLENBQUFBLENBQUFBLENBQUssTUFBTSxDQUFNLEdBQUEsUUFBQSxFQUFZLGFBQWFBLENBQUssQ0FBQSxNQUFNLElBQ2xHLGtCQUFtQkEsQ0FBQUEsQ0FBRyxFQUd4QixZQUFhQSxDQUFBQSxDQUFBQSxDQUFLLHVCQUF1QixFQUMzQyxDQUNGLENBU0EsU0FBUyxXQUFBLENBQVlBLEVBQUssQ0FFeEIsR0FEQUEsRUFBTSxhQUFjQSxDQUFBQSxDQUFHLEVBQ25CLE9BQVFBLENBQUFBLENBQUFBLENBQUssSUFBSyxDQUFBLE1BQUEsQ0FBTyxlQUFlLENBQUEsQ0FBRyxDQUM3QyxjQUFlQSxDQUFBQSxDQUFHLEVBQ2xCLE1BQ0YsQ0FDQSxTQUFTQSxDQUFHLENBQUEsQ0FDWixRQUFRLHFCQUFzQkEsQ0FBQUEsQ0FBRyxFQUFHLFNBQVM2RCxDQUFBQSxDQUFPLENBQUUsUUFBU0EsQ0FBQUEsQ0FBSyxFQUFFLENBQUMsQ0FBQSxDQUN2RSxRQUFRLHdCQUF5QjdELENBQUFBLENBQUcsRUFBRyxtQkFBbUIsRUFDNUQsQ0FVQSxTQUFTLGNBQUEsQ0FBZUssRUFBSyxDQUMzQixPQUFPQSxFQUFJLE9BQVEsQ0FBQSxvQkFBQSxDQUFzQixPQUFPLENBQUUsQ0FBQSxXQUFBLEVBQ3BELENBT0EsU0FBUyxVQUFVa0ksQ0FBV0MsQ0FBQUEsQ0FBQUEsQ0FBUSxDQUNwQyxJQUFJbEYsQ0FBQUEsQ0FDSixPQUFJLE1BQU8sQ0FBQSxXQUFBLEVBQWUsT0FBTyxNQUFPLENBQUEsV0FBQSxFQUFnQixXQUd0REEsQ0FBTSxDQUFBLElBQUksWUFBWWlGLENBQVcsQ0FBQSxDQUFFLFFBQVMsQ0FBTSxDQUFBLENBQUEsVUFBQSxDQUFZLEdBQU0sUUFBVSxDQUFBLENBQUEsQ0FBQSxDQUFNLE9BQUFDLENBQU8sQ0FBQyxHQUU1RmxGLENBQU0sQ0FBQSxXQUFBLEdBQWMsV0FBWSxDQUFBLGFBQWEsRUFDN0NBLENBQUksQ0FBQSxlQUFBLENBQWdCaUYsRUFBVyxDQUFNLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FBTUMsQ0FBTSxDQUU1Q2xGLENBQUFBLENBQUFBLENBQ1QsQ0FPQSxTQUFTLGlCQUFBLENBQWtCdEQsRUFBS3VJLENBQVdDLENBQUFBLENBQUFBLENBQVEsQ0FDakQsWUFBYXhJLENBQUFBLENBQUFBLENBQUt1SSxDQUFXLENBQUEsWUFBQSxDQUFhLENBQUUsS0FBQSxDQUFPQSxDQUFVLENBQUdDLENBQUFBLENBQU0sQ0FBQyxFQUN6RSxDQU1BLFNBQVMscUJBQXNCRCxDQUFBQSxDQUFBQSxDQUFXLENBQ3hDLE9BQU9BLENBQUFBLEdBQWMsdUJBQ3ZCLENBV0EsU0FBUyxlQUFldkksQ0FBS3lMLENBQUFBLENBQUFBLENBQU0sQ0FDakMsT0FBUSxDQUFBLGFBQUEsQ0FBY3pMLENBQUcsQ0FBRyxDQUFBLFNBQVNtRixFQUFXLENBQzlDLEdBQUksQ0FDRnNHLENBQUt0RyxDQUFBQSxDQUFTLEVBQ2hCLENBQVNqRSxNQUFBQSxDQUFBQSxDQUFHLENBQ1YsUUFBU0EsQ0FBQUEsQ0FBQyxFQUNaLENBQ0YsQ0FBQyxFQUNILENBRUEsU0FBUyxTQUFTd0ssQ0FBSyxDQUFBLENBQ2pCLFFBQVEsS0FDVixDQUFBLE9BQUEsQ0FBUSxNQUFNQSxDQUFHLENBQUEsQ0FDUixRQUFRLEdBQ2pCLEVBQUEsT0FBQSxDQUFRLElBQUksU0FBV0EsQ0FBQUEsQ0FBRyxFQUU5QixDQVlBLFNBQVMsYUFBYTFMLENBQUt1SSxDQUFBQSxDQUFBQSxDQUFXQyxFQUFRLENBQzVDeEksQ0FBQUEsQ0FBTSxjQUFjQSxDQUFHLENBQUEsQ0FDbkJ3SSxHQUFVLElBQ1pBLEdBQUFBLENBQUFBLENBQVMsRUFFWEEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBTyxJQUFNeEksQ0FDYixDQUFBLElBQU11RCxFQUFRLFNBQVVnRixDQUFBQSxDQUFBQSxDQUFXQyxDQUFNLENBQ3JDLENBQUEsSUFBQSxDQUFLLFFBQVUsQ0FBQyxxQkFBQSxDQUFzQkQsQ0FBUyxDQUNqRCxFQUFBLElBQUEsQ0FBSyxPQUFPdkksQ0FBS3VJLENBQUFBLENBQUFBLENBQVdDLENBQU0sQ0FBQSxDQUVoQ0EsQ0FBTyxDQUFBLEtBQUEsR0FDVCxTQUFTQSxDQUFPLENBQUEsS0FBSyxFQUNyQixZQUFheEksQ0FBQUEsQ0FBQUEsQ0FBSyxhQUFjLENBQUUsU0FBQSxDQUFXd0ksQ0FBTyxDQUFDLENBQUEsQ0FBQSxDQUV2RCxJQUFJbUQsQ0FBYzNMLENBQUFBLENBQUFBLENBQUksY0FBY3VELENBQUssQ0FBQSxDQUNuQ3FJLEVBQVksY0FBZXJELENBQUFBLENBQVMsRUFDMUMsR0FBSW9ELENBQUFBLEVBQWVDLElBQWNyRCxDQUFXLENBQUEsQ0FDMUMsSUFBTXNELENBQWUsQ0FBQSxTQUFBLENBQVVELEVBQVdySSxDQUFNLENBQUEsTUFBTSxFQUN0RG9JLENBQWNBLENBQUFBLENBQUFBLEVBQWUzTCxFQUFJLGFBQWM2TCxDQUFBQSxDQUFZLEVBQzdELENBQ0EsT0FBQSxjQUFBLENBQWUsVUFBVTdMLENBQUcsQ0FBQSxDQUFHLFNBQVNtRixDQUFXLENBQUEsQ0FDakR3RyxFQUFjQSxDQUFnQnhHLEVBQUFBLENBQUFBLENBQVUsUUFBUW9ELENBQVdoRixDQUFBQSxDQUFLLElBQU0sQ0FBUyxDQUFBLEVBQUEsQ0FBQ0EsRUFBTSxpQkFDeEYsQ0FBQyxFQUNNb0ksQ0FDVCxDQUtBLElBQUkscUJBQXdCLENBQUEsUUFBQSxDQUFTLFNBQVcsUUFBUyxDQUFBLE1BQUEsQ0FLekQsU0FBUyxpQkFBb0IsRUFBQSxDQUUzQixPQURtQixXQUFZLEVBQUEsQ0FBRSxjQUFjLHdDQUF3QyxDQUFBLEVBQ2xFLGFBQWMsQ0FBQSxJQUNyQyxDQU1BLFNBQVMsa0JBQUEsQ0FBbUJ2SSxFQUFLMEksQ0FBUyxDQUFBLENBQ3hDLEdBQUksQ0FBQyxxQkFBQSxHQUNILE9BSUYsSUFBTUMsQ0FBWSxDQUFBLHdCQUFBLENBQXlCRCxDQUFPLENBQUEsQ0FDNUNFLEVBQVEsV0FBWSxFQUFBLENBQUUsTUFDdEJDLENBQVMsQ0FBQSxNQUFBLENBQU8sUUFFdEIsR0FBSSxJQUFBLENBQUssT0FBTyxnQkFBb0IsRUFBQSxDQUFBLENBQUcsQ0FFckMsWUFBYSxDQUFBLFVBQUEsQ0FBVyxvQkFBb0IsQ0FDNUMsQ0FBQSxNQUNGLENBRUE3SSxDQUFNLENBQUEsYUFBQSxDQUFjQSxDQUFHLENBRXZCLENBQUEsSUFBTThJLEVBQWUsU0FBVSxDQUFBLFlBQUEsQ0FBYSxRQUFRLG9CQUFvQixDQUFDLEdBQUssRUFBQyxDQUMvRSxRQUFTNUosQ0FBSSxDQUFBLENBQUEsQ0FBR0EsRUFBSTRKLENBQWEsQ0FBQSxNQUFBLENBQVE1SixJQUN2QyxHQUFJNEosQ0FBQUEsQ0FBYTVKLENBQUMsQ0FBRSxDQUFBLEdBQUEsR0FBUWMsQ0FBSyxDQUFBLENBQy9COEksQ0FBYSxDQUFBLE1BQUEsQ0FBTzVKLEVBQUcsQ0FBQyxDQUFBLENBQ3hCLEtBQ0YsQ0FJRixJQUFNNkosRUFBaUIsQ0FBRSxHQUFBLENBQUEvSSxFQUFLLE9BQVMySSxDQUFBQSxDQUFBQSxDQUFXLE1BQUFDLENBQU8sQ0FBQSxNQUFBLENBQUFDLENBQU8sQ0FLaEUsQ0FBQSxJQUhBLGFBQWEsV0FBWSxFQUFBLENBQUUsS0FBTSx5QkFBMkIsQ0FBQSxDQUFFLEtBQU1FLENBQWdCLENBQUEsS0FBQSxDQUFPRCxDQUFhLENBQUMsQ0FBQSxDQUV6R0EsRUFBYSxJQUFLQyxDQUFBQSxDQUFjLEVBQ3pCRCxDQUFhLENBQUEsTUFBQSxDQUFTLEtBQUssTUFBTyxDQUFBLGdCQUFBLEVBQ3ZDQSxFQUFhLEtBQU0sRUFBQSxDQUlyQixLQUFPQSxDQUFhLENBQUEsTUFBQSxDQUFTLENBQzNCLEVBQUEsR0FBSSxDQUNGLFlBQUEsQ0FBYSxRQUFRLG9CQUFzQixDQUFBLElBQUEsQ0FBSyxVQUFVQSxDQUFZLENBQUMsRUFDdkUsS0FDRixDQUFBLE1BQVNoTCxFQUFHLENBQ1YsaUJBQUEsQ0FBa0IsYUFBYyxDQUFBLElBQUEsQ0FBTSx5QkFBMEIsQ0FBRSxLQUFBLENBQU9BLEVBQUcsS0FBT2dMLENBQUFBLENBQWEsQ0FBQyxDQUNqR0EsQ0FBQUEsQ0FBQUEsQ0FBYSxRQUNmLENBRUosQ0FjQSxTQUFTLGdCQUFBLENBQWlCOUksRUFBSyxDQUM3QixHQUFJLENBQUMscUJBQXNCLEVBQUEsQ0FDekIsT0FBTyxJQUdUQSxDQUFBQSxDQUFBQSxDQUFNLGNBQWNBLENBQUcsQ0FBQSxDQUV2QixJQUFNOEksQ0FBZSxDQUFBLFNBQUEsQ0FBVSxhQUFhLE9BQVEsQ0FBQSxvQkFBb0IsQ0FBQyxDQUFLLEVBQUEsR0FDOUUsSUFBUzVKLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSTRKLENBQUFBLENBQUFBLENBQWEsT0FBUTVKLENBQ3ZDLEVBQUEsQ0FBQSxHQUFJNEosRUFBYTVKLENBQUMsQ0FBQSxDQUFFLE1BQVFjLENBQzFCLENBQUEsT0FBTzhJLEVBQWE1SixDQUFDLENBQUEsQ0FHekIsT0FBTyxJQUNULENBTUEsU0FBUyx3QkFBeUJ0QyxDQUFBQSxDQUFBQSxDQUFLLENBQ3JDLElBQU1vTSxDQUFBQSxDQUFZLEtBQUssTUFBTyxDQUFBLFlBQUEsQ0FDeEJDLEVBQThCck0sQ0FBSSxDQUFBLFNBQUEsQ0FBVSxFQUFJLENBQ3RELENBQUEsT0FBQSxPQUFBLENBQVEsUUFBUXFNLENBQU8sQ0FBQSxHQUFBLENBQU1ELENBQVMsQ0FBRyxDQUFBLFNBQVN2SSxDQUFPLENBQUEsQ0FDdkQsc0JBQXVCQSxDQUFBQSxDQUFBQSxDQUFPdUksQ0FBUyxFQUN6QyxDQUFDLEVBRUQsT0FBUSxDQUFBLE9BQUEsQ0FBUUMsRUFBTyx5QkFBeUIsQ0FBQSxDQUFHLFNBQVN4SSxDQUFPLENBQUEsQ0FDakVBLEVBQU0sZUFBZ0IsQ0FBQSxVQUFVLEVBQ2xDLENBQUMsQ0FBQSxDQUNNd0ksRUFBTSxTQUNmLENBRUEsU0FBUyx3QkFBMkIsRUFBQSxDQUNsQyxJQUFNck0sQ0FBTSxDQUFBLGlCQUFBLEdBQ05tRCxDQUFPLENBQUEscUJBQUEsRUFBeUIsU0FBUyxRQUFXLENBQUEsUUFBQSxDQUFTLE9BTy9EbUosQ0FDSixDQUFBLEdBQUksQ0FDRkEsQ0FBc0IsQ0FBQSxXQUFBLEdBQWMsYUFBYyxDQUFBLG9EQUFvRCxFQUN4RyxDQUFZLEtBQUEsQ0FFVkEsRUFBc0IsV0FBWSxFQUFBLENBQUUsY0FBYyxnREFBZ0QsRUFDcEcsQ0FDS0EsQ0FDSCxHQUFBLFlBQUEsQ0FBYSxhQUFjLENBQUEsSUFBQSxDQUFNLHlCQUEwQixDQUFFLElBQUEsQ0FBQW5KLEVBQU0sVUFBWW5ELENBQUFBLENBQUksQ0FBQyxDQUNwRixDQUFBLGtCQUFBLENBQW1CbUQsRUFBTW5ELENBQUcsQ0FBQSxDQUFBLENBRzFCLEtBQUssTUFBTyxDQUFBLGNBQUEsRUFBZ0IsUUFBUSxZQUFhLENBQUEsQ0FBRSxLQUFNLENBQUssQ0FBQSxDQUFBLENBQUcsYUFBYyxDQUFBLEtBQUEsQ0FBTyxPQUFPLFFBQVMsQ0FBQSxJQUFJLEVBQ2hILENBS0EsU0FBUyxtQkFBbUJtRCxDQUFNLENBQUEsQ0FFNUIsS0FBSyxNQUFPLENBQUEsbUJBQUEsR0FDZEEsQ0FBT0EsQ0FBQUEsQ0FBQUEsQ0FBSyxPQUFRLENBQUEsaUNBQUEsQ0FBbUMsRUFBRSxDQUNyRCxDQUFBLENBQUEsUUFBQSxDQUFTQSxFQUFNLEdBQUcsQ0FBQSxFQUFLLFNBQVNBLENBQU0sQ0FBQSxHQUFHLEtBQzNDQSxDQUFPQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FBRyxDQUFBLENBQUEsQ0FBRSxJQUd2QixJQUFLLENBQUEsTUFBQSxDQUFPLGdCQUNkLE9BQVEsQ0FBQSxTQUFBLENBQVUsQ0FBRSxJQUFNLENBQUEsQ0FBQSxDQUFLLEVBQUcsRUFBSUEsQ0FBQUEsQ0FBSSxFQUU1QyxxQkFBd0JBLENBQUFBLEVBQzFCLENBS0EsU0FBUyxtQkFBQSxDQUFvQkEsRUFBTSxDQUM3QixJQUFBLENBQUssT0FBTyxjQUFnQixFQUFBLE9BQUEsQ0FBUSxhQUFhLENBQUUsSUFBQSxDQUFNLEVBQUssQ0FBRyxDQUFBLEVBQUEsQ0FBSUEsQ0FBSSxDQUM3RSxDQUFBLHFCQUFBLENBQXdCQSxFQUMxQixDQUtBLFNBQVMsa0JBQWtCb0osQ0FBTyxDQUFBLENBQ2hDLFFBQVFBLENBQU8sQ0FBQSxTQUFTdEUsRUFBTSxDQUM1QkEsQ0FBQUEsQ0FBSyxLQUFLLEtBQVMsQ0FBQSxFQUNyQixDQUFDLEVBQ0gsQ0FLQSxTQUFTLHFCQUFzQjlFLENBQUFBLENBQUFBLENBQU0sQ0FDbkMsSUFBTXFKLENBQUFBLENBQVUsSUFBSSxjQUNkQyxDQUFBQSxDQUFBQSxDQUFVLENBQUUsSUFBQXRKLENBQUFBLENBQUFBLENBQU0sSUFBS3FKLENBQVEsQ0FBQSxDQUNyQyxhQUFhLFdBQVksRUFBQSxDQUFFLEtBQU0sdUJBQXlCQyxDQUFBQSxDQUFPLEVBQ2pFRCxDQUFRLENBQUEsSUFBQSxDQUFLLE1BQU9ySixDQUFNLENBQUEsQ0FBQSxDQUFJLENBQzlCcUosQ0FBQUEsQ0FBQUEsQ0FBUSxnQkFBaUIsQ0FBQSxZQUFBLENBQWMsTUFBTSxDQUM3Q0EsQ0FBQUEsQ0FBQUEsQ0FBUSxpQkFBaUIsNEJBQThCLENBQUEsTUFBTSxFQUM3REEsQ0FBUSxDQUFBLGdCQUFBLENBQWlCLGlCQUFrQixXQUFZLEVBQUEsQ0FBRSxTQUFTLElBQUksQ0FBQSxDQUN0RUEsRUFBUSxNQUFTLENBQUEsVUFBVyxDQUMxQixHQUFJLElBQUEsQ0FBSyxRQUFVLEdBQU8sRUFBQSxJQUFBLENBQUssT0FBUyxHQUFLLENBQUEsQ0FDM0MsYUFBYSxXQUFZLEVBQUEsQ0FBRSxLQUFNLDJCQUE2QkMsQ0FBQUEsQ0FBTyxFQUNyRSxJQUFNbEwsQ0FBQUEsQ0FBVyxhQUFhLElBQUssQ0FBQSxRQUFRLEVBRXJDOEYsQ0FBVTlGLENBQUFBLENBQUFBLENBQVMsY0FBYyx3Q0FBd0MsQ0FBQSxFQUFLQSxFQUM5RW1MLENBQWlCLENBQUEsaUJBQUEsR0FDakJwSCxDQUFhLENBQUEsY0FBQSxDQUFlb0gsQ0FBYyxDQUNoRCxDQUFBLFdBQUEsQ0FBWW5MLEVBQVMsS0FBSyxDQUFBLENBRTFCLGNBQWNtTCxDQUFnQnJGLENBQUFBLENBQUFBLENBQVMvQixDQUFVLENBQ2pELENBQUEsaUJBQUEsQ0FBa0JBLEVBQVcsS0FBSyxDQUFBLENBQ2xDLHNCQUF3Qm5DLENBQ3hCLENBQUEsWUFBQSxDQUFhLGFBQWMsQ0FBQSxJQUFBLENBQU0sc0JBQXVCLENBQUUsSUFBQSxDQUFBQSxFQUFNLFNBQVcsQ0FBQSxDQUFBLENBQUEsQ0FBTSxlQUFnQixJQUFLLENBQUEsUUFBUyxDQUFDLEVBQ2xILENBQUEsS0FDRSxrQkFBa0IsV0FBWSxFQUFBLENBQUUsS0FBTSxnQ0FBa0NzSixDQUFBQSxDQUFPLEVBRW5GLENBQ0FELENBQUFBLENBQUFBLENBQVEsSUFBSyxHQUNmLENBS0EsU0FBUyxlQUFlckosQ0FBTSxDQUFBLENBQzVCLDBCQUNBQSxDQUFBQSxDQUFBQSxDQUFPQSxHQUFRLFFBQVMsQ0FBQSxRQUFBLENBQVcsU0FBUyxNQUM1QyxDQUFBLElBQU13SixFQUFTLGdCQUFpQnhKLENBQUFBLENBQUksRUFDcEMsR0FBSXdKLENBQUFBLENBQVEsQ0FDVixJQUFNcEwsQ0FBQUEsQ0FBVyxhQUFhb0wsQ0FBTyxDQUFBLE9BQU8sRUFDdENELENBQWlCLENBQUEsaUJBQUEsR0FDakJwSCxDQUFhLENBQUEsY0FBQSxDQUFlb0gsQ0FBYyxDQUNoRCxDQUFBLFdBQUEsQ0FBWW5MLEVBQVMsS0FBSyxDQUFBLENBQzFCLGNBQWNtTCxDQUFnQm5MLENBQUFBLENBQUFBLENBQVUrRCxDQUFVLENBQ2xELENBQUEsaUJBQUEsQ0FBa0JBLEVBQVcsS0FBSyxDQUFBLENBQ2xDLFdBQVksQ0FBQSxVQUFBLENBQVcsVUFBVyxDQUNoQyxNQUFBLENBQU8sU0FBUyxDQUFHcUgsQ0FBQUEsQ0FBQUEsQ0FBTyxNQUFNLEVBQ2xDLENBQUEsQ0FBRyxDQUFDLENBQ0osQ0FBQSxxQkFBQSxDQUF3QnhKLEVBQ3hCLFlBQWEsQ0FBQSxXQUFBLEdBQWMsSUFBTSxDQUFBLHFCQUFBLENBQXVCLENBQUUsSUFBQUEsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUFNd0osQ0FBTyxDQUFDLEVBQ2hGLENBQ00sS0FBQSxJQUFBLENBQUssT0FBTyxvQkFHZCxDQUFBLE1BQUEsQ0FBTyxTQUFTLE1BQU8sQ0FBQSxDQUFBLENBQUksRUFFM0IscUJBQXNCeEosQ0FBQUEsQ0FBSSxFQUdoQyxDQU1BLFNBQVMsMkJBQTJCbkQsQ0FBSyxDQUFBLENBQ3ZDLElBQUk0TSxDQUFxQyxDQUFBLG9CQUFBLENBQXFCNU0sQ0FBSyxDQUFBLGNBQWMsQ0FDakYsQ0FBQSxPQUFJNE0sR0FBYyxJQUNoQkEsR0FBQUEsQ0FBQUEsQ0FBYSxDQUFDNU0sQ0FBRyxDQUFBLENBQUEsQ0FFbkIsUUFBUTRNLENBQVksQ0FBQSxTQUFTQyxFQUFJLENBQy9CLElBQU1uRyxFQUFlLGVBQWdCbUcsQ0FBQUEsQ0FBRSxFQUN2Q25HLENBQWEsQ0FBQSxZQUFBLENBQUEsQ0FBZ0JBLEVBQWEsWUFBZ0IsRUFBQSxDQUFBLEVBQUssRUFDL0RtRyxDQUFHLENBQUEsU0FBQSxDQUFVLElBQUksSUFBS0EsQ0FBQUEsQ0FBQUEsQ0FBRyxVQUFXLElBQUssQ0FBQSxNQUFBLENBQU8sWUFBWSxFQUM5RCxDQUFDLEVBQ01ELENBQ1QsQ0FNQSxTQUFTLGVBQWdCNU0sQ0FBQUEsQ0FBQUEsQ0FBSyxDQUM1QixJQUFJOE0sQ0FBQUEsQ0FBdUMscUJBQXFCOU0sQ0FBSyxDQUFBLGlCQUFpQixFQUN0RixPQUFJOE0sQ0FBQUEsRUFBZ0IsT0FDbEJBLENBQWUsQ0FBQSxJQUVqQixPQUFRQSxDQUFBQSxDQUFBQSxDQUFjLFNBQVNDLENBQWlCLENBQUEsQ0FDOUMsSUFBTXJHLENBQWUsQ0FBQSxlQUFBLENBQWdCcUcsQ0FBZSxDQUNwRHJHLENBQUFBLENBQUFBLENBQWEsY0FBZ0JBLENBQWEsQ0FBQSxZQUFBLEVBQWdCLEdBQUssQ0FDL0RxRyxDQUFBQSxDQUFBQSxDQUFnQixhQUFhLFVBQVksQ0FBQSxFQUFFLEVBQzNDQSxDQUFnQixDQUFBLFlBQUEsQ0FBYSx3QkFBeUIsRUFBRSxFQUMxRCxDQUFDLENBQ01ELENBQUFBLENBQ1QsQ0FNQSxTQUFTLHVCQUFBLENBQXdCRixFQUFZSSxDQUFVLENBQUEsQ0FDckQsUUFBUUosQ0FBWSxDQUFBLFNBQVNDLEVBQUksQ0FDL0IsSUFBTW5HLENBQWUsQ0FBQSxlQUFBLENBQWdCbUcsQ0FBRSxDQUFBLENBQ3ZDbkcsRUFBYSxZQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBYSxjQUFnQixDQUFLLEVBQUEsQ0FBQSxDQUMzREEsRUFBYSxZQUFpQixHQUFBLENBQUEsRUFDaENtRyxFQUFHLFNBQVUsQ0FBQSxNQUFBLENBQU8sS0FBS0EsQ0FBRyxDQUFBLFNBQUEsQ0FBVyxLQUFLLE1BQU8sQ0FBQSxZQUFZLEVBRW5FLENBQUMsQ0FBQSxDQUNELFFBQVFHLENBQVUsQ0FBQSxTQUFTRCxFQUFpQixDQUMxQyxJQUFNckcsRUFBZSxlQUFnQnFHLENBQUFBLENBQWUsRUFDcERyRyxDQUFhLENBQUEsWUFBQSxDQUFBLENBQWdCQSxFQUFhLFlBQWdCLEVBQUEsQ0FBQSxFQUFLLEVBQzNEQSxDQUFhLENBQUEsWUFBQSxHQUFpQixJQUNoQ3FHLENBQWdCLENBQUEsZUFBQSxDQUFnQixVQUFVLENBQzFDQSxDQUFBQSxDQUFBQSxDQUFnQixnQkFBZ0IsdUJBQXVCLENBQUEsRUFFM0QsQ0FBQyxFQUNILENBV0EsU0FBUyxZQUFhRSxDQUFBQSxDQUFBQSxDQUFXak4sRUFBSyxDQUNwQyxJQUFBLElBQVNzQyxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUkySyxFQUFVLE1BQVEzSyxDQUFBQSxDQUFBQSxFQUFBQSxDQUVwQyxHQURhMkssQ0FBVTNLLENBQUFBLENBQUMsRUFDZixVQUFXdEMsQ0FBQUEsQ0FBRyxFQUNyQixPQUFPLENBQUEsQ0FBQSxDQUdYLE9BQU8sQ0FDVCxDQUFBLENBTUEsU0FBUyxhQUFjNEcsQ0FBQUEsQ0FBQUEsQ0FBUyxDQUU5QixJQUFNNUcsQ0FBQUEsQ0FBdUM0RyxFQUs3QyxPQUpJNUcsQ0FBQUEsQ0FBSSxPQUFTLEVBQU1BLEVBQUFBLENBQUFBLENBQUksTUFBUSxJQUFRQSxFQUFBQSxDQUFBQSxDQUFJLFVBQVksT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBSyxvQkFBb0IsQ0FBQSxFQUl4RkEsQ0FBSSxDQUFBLElBQUEsR0FBUyxVQUFZQSxDQUFJLENBQUEsSUFBQSxHQUFTLFVBQVlBLENBQUksQ0FBQSxPQUFBLEdBQVksU0FBV0EsQ0FBSSxDQUFBLE9BQUEsR0FBWSxTQUFXQSxDQUFJLENBQUEsT0FBQSxHQUFZLE9BQ25ILENBRUxBLENBQUFBLENBQUFBLENBQUFBLENBQUksT0FBUyxVQUFjQSxFQUFBQSxDQUFBQSxDQUFJLE9BQVMsT0FDbkNBLENBQUFBLENBQUFBLENBQUksUUFFTixDQUNULENBQUEsQ0FLQSxTQUFTLGtCQUFtQk8sQ0FBQUEsQ0FBQUEsQ0FBTW1ELEVBQU93SixDQUFVLENBQUEsQ0FDN0MzTSxHQUFRLElBQVFtRCxFQUFBQSxDQUFBQSxFQUFTLE9BQ3ZCLEtBQU0sQ0FBQSxPQUFBLENBQVFBLENBQUssQ0FDckJBLENBQUFBLENBQUFBLENBQU0sUUFBUSxTQUFTeUosQ0FBQUEsQ0FBRyxDQUFFRCxDQUFTLENBQUEsTUFBQSxDQUFPM00sQ0FBTTRNLENBQUFBLENBQUMsRUFBRSxDQUFDLEVBRXRERCxDQUFTLENBQUEsTUFBQSxDQUFPM00sRUFBTW1ELENBQUssQ0FBQSxFQUdqQyxDQUtBLFNBQVMsdUJBQUEsQ0FBd0JuRCxFQUFNbUQsQ0FBT3dKLENBQUFBLENBQUFBLENBQVUsQ0FDdEQsR0FBSTNNLENBQUFBLEVBQVEsTUFBUW1ELENBQVMsRUFBQSxJQUFBLENBQU0sQ0FDakMsSUFBSTBKLENBQUFBLENBQVNGLEVBQVMsTUFBTzNNLENBQUFBLENBQUksRUFDN0IsS0FBTSxDQUFBLE9BQUEsQ0FBUW1ELENBQUssQ0FDckIwSixDQUFBQSxDQUFBQSxDQUFTQSxFQUFPLE1BQU9ELENBQUFBLENBQUFBLEVBQUt6SixFQUFNLE9BQVF5SixDQUFBQSxDQUFDLEVBQUksQ0FBQyxDQUFBLENBRWhEQyxFQUFTQSxDQUFPLENBQUEsTUFBQSxDQUFPRCxHQUFLQSxDQUFNekosR0FBQUEsQ0FBSyxDQUV6Q3dKLENBQUFBLENBQUFBLENBQVMsTUFBTzNNLENBQUFBLENBQUksRUFDcEIsT0FBUTZNLENBQUFBLENBQUFBLENBQVFELEdBQUtELENBQVMsQ0FBQSxNQUFBLENBQU8zTSxFQUFNNE0sQ0FBQyxDQUFDLEVBQy9DLENBQ0YsQ0FTQSxTQUFTLGlCQUFrQkYsQ0FBQUEsQ0FBQUEsQ0FBV0MsRUFBVUcsQ0FBUXJOLENBQUFBLENBQUFBLENBQUtzTixFQUFVLENBQ3JFLEdBQUksRUFBQXROLENBQU8sRUFBQSxJQUFBLEVBQVEsYUFBYWlOLENBQVdqTixDQUFBQSxDQUFHLEdBSzlDLENBRkVpTixHQUFBQSxDQUFBQSxDQUFVLEtBQUtqTixDQUFHLENBQUEsQ0FFaEIsY0FBY0EsQ0FBRyxDQUFBLENBQUcsQ0FDdEIsSUFBTU8sQ0FBQUEsQ0FBTyxnQkFBZ0JQLENBQUssQ0FBQSxNQUFNLEVBRXBDMEQsQ0FBUTFELENBQUFBLENBQUFBLENBQUksTUFDWkEsQ0FBZSxZQUFBLGlCQUFBLEVBQXFCQSxFQUFJLFFBQzFDMEQsR0FBQUEsQ0FBQUEsQ0FBUSxRQUFRMUQsQ0FBSSxDQUFBLGdCQUFBLENBQWlCLGdCQUFnQixDQUFDLENBQUEsQ0FBRSxJQUFJLFNBQVNrQixDQUFBQSxDQUFHLENBQUUsT0FBdUNBLENBQUFBLENBQUksS0FBTSxDQUFDLENBQUEsQ0FBQSxDQUcxSGxCLGFBQWUsZ0JBQW9CQSxFQUFBQSxDQUFBQSxDQUFJLFFBQ3pDMEQsQ0FBUSxDQUFBLE9BQUEsQ0FBUTFELEVBQUksS0FBSyxDQUFBLENBQUEsQ0FFM0IsbUJBQW1CTyxDQUFNbUQsQ0FBQUEsQ0FBQUEsQ0FBT3dKLENBQVEsQ0FDcENJLENBQUFBLENBQUFBLEVBQ0YsZ0JBQWdCdE4sQ0FBS3FOLENBQUFBLENBQU0sRUFFL0IsQ0FDSXJOLENBQUFBLFlBQWUsa0JBQ2pCLE9BQVFBLENBQUFBLENBQUFBLENBQUksU0FBVSxTQUFTdU4sQ0FBQUEsQ0FBTyxDQUNoQ04sQ0FBQUEsQ0FBVSxPQUFRTSxDQUFBQSxDQUFLLEdBQUssQ0FJOUIsQ0FBQSx1QkFBQSxDQUF3QkEsRUFBTSxJQUFNQSxDQUFBQSxDQUFBQSxDQUFNLE1BQU9MLENBQVEsQ0FBQSxDQUV6REQsRUFBVSxJQUFLTSxDQUFBQSxDQUFLLEVBRWxCRCxDQUNGLEVBQUEsZUFBQSxDQUFnQkMsRUFBT0YsQ0FBTSxFQUVqQyxDQUFDLENBQ0QsQ0FBQSxJQUFJLFNBQVNyTixDQUFHLENBQUEsQ0FBRSxRQUFRLFNBQVMwRCxDQUFBQSxDQUFPbkQsRUFBTSxDQUMxQ21ELENBQUFBLFlBQWlCLE1BQVFBLENBQU0sQ0FBQSxJQUFBLEdBQVMsSUFHNUMsa0JBQW1CbkQsQ0FBQUEsQ0FBQUEsQ0FBTW1ELEVBQU93SixDQUFRLEVBQzFDLENBQUMsQ0FFTCxFQUFBLENBQUEsQ0FPQSxTQUFTLGVBQWdCbE4sQ0FBQUEsQ0FBQUEsQ0FBS3FOLEVBQVEsQ0FDcEMsSUFBTXpHLEVBQXlENUcsQ0FDM0Q0RyxDQUFBQSxDQUFBQSxDQUFRLGVBQ1YsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBUywwQkFBMEIsQ0FDM0NBLENBQUFBLENBQUFBLENBQVEsZUFDWHlHLEdBQUFBLENBQUFBLENBQU8sS0FBSyxDQUFFLEdBQUEsQ0FBS3pHLEVBQVMsT0FBU0EsQ0FBQUEsQ0FBQUEsQ0FBUSxrQkFBbUIsUUFBVUEsQ0FBQUEsQ0FBQUEsQ0FBUSxRQUFTLENBQUMsQ0FBQSxDQUM1RixhQUFhQSxDQUFTLENBQUEsd0JBQUEsQ0FBMEIsQ0FBRSxPQUFTQSxDQUFBQSxDQUFBQSxDQUFRLGtCQUFtQixRQUFVQSxDQUFBQSxDQUFBQSxDQUFRLFFBQVMsQ0FBQyxDQUFBLENBQUEsRUFHeEgsQ0FRQSxTQUFTLGdCQUFBLENBQWlCNEcsRUFBVUMsQ0FBTyxDQUFBLENBQ3pDLFFBQVcxSyxDQUFPMEssSUFBQUEsQ0FBQUEsQ0FBTSxJQUFLLEVBQUEsQ0FDM0JELENBQVMsQ0FBQSxNQUFBLENBQU96SyxDQUFHLENBRXJCLENBQUEsT0FBQTBLLEVBQU0sT0FBUSxDQUFBLFNBQVMvSixFQUFPWCxDQUFLLENBQUEsQ0FDakN5SyxFQUFTLE1BQU96SyxDQUFBQSxDQUFBQSxDQUFLVyxDQUFLLEVBQzVCLENBQUMsRUFDTThKLENBQ1QsQ0FPQSxTQUFTLGNBQWV4TixDQUFBQSxDQUFBQSxDQUFLRSxFQUFNLENBRWpDLElBQU0rTSxFQUFZLEVBQUMsQ0FDYkMsRUFBVyxJQUFJLFFBQUEsQ0FDZlEsRUFBbUIsSUFBSSxRQUFBLENBRXZCTCxFQUFTLEVBQUMsQ0FDVjNHLEVBQWUsZUFBZ0IxRyxDQUFBQSxDQUFHLEVBQ3BDMEcsQ0FBYSxDQUFBLGlCQUFBLEVBQXFCLENBQUMsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBYSxpQkFBaUIsQ0FDaEZBLEdBQUFBLENBQUFBLENBQWEsa0JBQW9CLElBS25DLENBQUEsQ0FBQSxJQUFJNEcsRUFBWXROLENBQWUsWUFBQSxlQUFBLEVBQW1CQSxFQUFJLFVBQWUsR0FBQSxDQUFBLENBQUEsRUFBUyxrQkFBa0JBLENBQUssQ0FBQSxhQUFhLElBQU0sTUFjeEgsQ0FBQSxHQWJJMEcsRUFBYSxpQkFDZjRHLEdBQUFBLENBQUFBLENBQVdBLEdBQVk1RyxDQUFhLENBQUEsaUJBQUEsQ0FBa0IsaUJBQW1CLENBSXZFeEcsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBQUEsR0FBUyxPQUNYLGlCQUFrQitNLENBQUFBLENBQUFBLENBQVdTLEVBQWtCTCxDQUFRLENBQUEsT0FBQSxDQUFRck4sRUFBSyxNQUFNLENBQUEsQ0FBR3NOLENBQVEsQ0FJdkYsQ0FBQSxpQkFBQSxDQUFrQkwsRUFBV0MsQ0FBVUcsQ0FBQUEsQ0FBQUEsQ0FBUXJOLEVBQUtzTixDQUFRLENBQUEsQ0FHeEQ1RyxFQUFhLGlCQUFxQjFHLEVBQUFBLENBQUFBLENBQUksT0FBWSxHQUFBLFFBQUEsRUFDckRBLENBQUksQ0FBQSxPQUFBLEdBQVksU0FBVyxlQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxNQUFNLENBQU0sR0FBQSxRQUFBLENBQVcsQ0FDdEUsSUFBTTJOLENBQUFBLENBQVNqSCxFQUFhLGlCQUFzRTFHLEVBQUFBLENBQUFBLENBQzVGTyxFQUFPLGVBQWdCb04sQ0FBQUEsQ0FBQUEsQ0FBUSxNQUFNLENBQzNDLENBQUEsa0JBQUEsQ0FBbUJwTixFQUFNb04sQ0FBTyxDQUFBLEtBQUEsQ0FBT0QsQ0FBZ0IsRUFDekQsQ0FHQSxJQUFNRSxDQUFXLENBQUEsb0JBQUEsQ0FBcUI1TixFQUFLLFlBQVksQ0FBQSxDQUN2RCxlQUFRNE4sQ0FBVSxDQUFBLFNBQVNoSyxFQUFNLENBQy9CLGlCQUFBLENBQWtCcUosRUFBV0MsQ0FBVUcsQ0FBQUEsQ0FBQUEsQ0FBUSxVQUFVekosQ0FBSSxDQUFBLENBQUcwSixDQUFRLENBRW5FLENBQUEsT0FBQSxDQUFRMUosQ0FBTSxDQUFBLE1BQU0sQ0FDdkIsRUFBQSxPQUFBLENBQVEsYUFBYUEsQ0FBSSxDQUFBLENBQUUsaUJBQWlCLGNBQWMsQ0FBQSxDQUFHLFNBQVNpSyxDQUFZLENBQUEsQ0FDaEYsa0JBQWtCWixDQUFXQyxDQUFBQSxDQUFBQSxDQUFVRyxFQUFRUSxDQUFZUCxDQUFBQSxDQUFRLEVBQ3JFLENBQUMsRUFFTCxDQUFDLENBR0QsQ0FBQSxnQkFBQSxDQUFpQkosRUFBVVEsQ0FBZ0IsQ0FBQSxDQUVwQyxDQUFFLE1BQUFMLENBQUFBLENBQUFBLENBQVEsU0FBQUgsQ0FBVSxDQUFBLE1BQUEsQ0FBUSxjQUFjQSxDQUFRLENBQUUsQ0FDN0QsQ0FRQSxTQUFTLFlBQVlZLENBQVd2TixDQUFBQSxDQUFBQSxDQUFNd04sRUFBVyxDQUMzQ0QsQ0FBQUEsR0FBYyxLQUNoQkEsQ0FBYSxFQUFBLEdBQUEsQ0FBQSxDQUVYLE1BQU9DLENBQUFBLENBQVMsQ0FBTSxHQUFBLGlCQUFBLEdBQ3hCQSxFQUFZLElBQUssQ0FBQSxTQUFBLENBQVVBLENBQVMsQ0FFdEMsQ0FBQSxDQUFBLElBQU01QyxFQUFJLGtCQUFtQjRDLENBQUFBLENBQVMsRUFDdEMsT0FBQUQsQ0FBQUEsRUFBYSxtQkFBbUJ2TixDQUFJLENBQUEsQ0FBSSxJQUFNNEssQ0FDdkMyQyxDQUFBQSxDQUNULENBTUEsU0FBUyxTQUFBLENBQVVWLEVBQVEsQ0FDekJBLENBQUFBLENBQVMsbUJBQW1CQSxDQUFNLENBQUEsQ0FDbEMsSUFBSVUsQ0FBWSxDQUFBLEVBQUEsQ0FDaEIsT0FBQVYsQ0FBTyxDQUFBLE9BQUEsQ0FBUSxTQUFTMUosQ0FBT1gsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNsQytLLENBQVksQ0FBQSxXQUFBLENBQVlBLEVBQVcvSyxDQUFLVyxDQUFBQSxDQUFLLEVBQy9DLENBQUMsQ0FBQSxDQUNNb0ssQ0FDVCxDQVlBLFNBQVMsV0FBVzlOLENBQUtpRixDQUFBQSxDQUFBQSxDQUFRK0ksRUFBUSxDQUV2QyxJQUFNQyxFQUFVLENBQ2QsWUFBQSxDQUFjLE9BQ2QsWUFBYyxDQUFBLGVBQUEsQ0FBZ0JqTyxFQUFLLElBQUksQ0FBQSxDQUN2QyxrQkFBbUIsZUFBZ0JBLENBQUFBLENBQUFBLENBQUssTUFBTSxDQUM5QyxDQUFBLFdBQUEsQ0FBYSxrQkFBa0JpRixDQUFRLENBQUEsSUFBSSxFQUMzQyxnQkFBa0IsQ0FBQSxXQUFBLEdBQWMsUUFBUyxDQUFBLElBQzNDLEVBQ0EsT0FBb0JqRixtQkFBQUEsQ0FBQUEsQ0FBQUEsQ0FBSyxhQUFjLENBQU9pTyxDQUFBQSxDQUFBQSxDQUFPLEVBQ2pERCxDQUFXLEdBQUEsS0FBQSxDQUFBLEdBQ2JDLEVBQVEsV0FBVyxDQUFBLENBQUlELEdBRXJCLGVBQWdCaE8sQ0FBQUEsQ0FBRyxDQUFFLENBQUEsT0FBQSxHQUN2QmlPLENBQVEsQ0FBQSxZQUFZLEVBQUksTUFFbkJBLENBQUFBLENBQUFBLENBQ1QsQ0FVQSxTQUFTLFlBQUEsQ0FBYUMsRUFBYWxPLENBQUssQ0FBQSxDQUN0QyxJQUFNbU8sQ0FBYyxDQUFBLHdCQUFBLENBQXlCbk8sRUFBSyxXQUFXLENBQUEsQ0FDN0QsR0FBSW1PLENBQWEsQ0FBQSxDQUNmLEdBQUlBLENBQWdCLEdBQUEsTUFBQSxDQUNsQixPQUFPLElBQUksUUFBQSxDQUNOLEdBQUlBLENBQWdCLEdBQUEsR0FBQSxDQUN6QixPQUFPRCxDQUNGLENBQUEsR0FBSUMsRUFBWSxPQUFRLENBQUEsTUFBTSxJQUFNLENBQ3pDLENBQUEsT0FBQSxPQUFBLENBQVFBLEVBQVksTUFBTyxDQUFBLENBQUMsRUFBRSxLQUFNLENBQUEsR0FBRyxFQUFHLFNBQVM1TixDQUFBQSxDQUFNLENBQ3ZEQSxDQUFPQSxDQUFBQSxDQUFBQSxDQUFLLE1BQ1oyTixDQUFBQSxDQUFBQSxDQUFZLE9BQU8zTixDQUFJLEVBQ3pCLENBQUMsQ0FDTTJOLENBQUFBLENBQUFBLENBQ0YsQ0FDTCxJQUFNRSxDQUFBQSxDQUFZLElBQUksUUFDdEIsQ0FBQSxPQUFBLE9BQUEsQ0FBUUQsRUFBWSxLQUFNLENBQUEsR0FBRyxFQUFHLFNBQVM1TixDQUFBQSxDQUFNLENBQzdDQSxDQUFPQSxDQUFBQSxDQUFBQSxDQUFLLE1BQ1IyTixDQUFBQSxDQUFBQSxDQUFZLElBQUkzTixDQUFJLENBQUEsRUFDdEIyTixFQUFZLE1BQU8zTixDQUFBQSxDQUFJLEVBQUUsT0FBUSxDQUFBLFNBQVNtRCxFQUFPLENBQUUwSyxDQUFBQSxDQUFVLE9BQU83TixDQUFNbUQsQ0FBQUEsQ0FBSyxFQUFFLENBQUMsRUFFdEYsQ0FBQyxDQUFBLENBQ00wSyxDQUNULENBQ0YsTUFDU0YsT0FBQUEsQ0FFWCxDQU1BLFNBQVMsWUFBQSxDQUFhbE8sRUFBSyxDQUN6QixPQUFPLENBQUMsQ0FBQyxlQUFBLENBQWdCQSxFQUFLLE1BQU0sQ0FBQSxFQUFLLGdCQUFnQkEsQ0FBSyxDQUFBLE1BQU0sRUFBRSxPQUFRLENBQUEsR0FBRyxHQUFLLENBQ3hGLENBT0EsU0FBUyxvQkFBcUJBLENBQUFBLENBQUFBLENBQUtxTyxFQUFrQixDQUNuRCxJQUFNQyxFQUFXRCxDQUFvQixFQUFBLHdCQUFBLENBQXlCck8sRUFBSyxTQUFTLENBQUEsQ0FFdEVzSCxFQUFXLENBQ2YsU0FBQSxDQUFXLGdCQUFnQnRILENBQUcsQ0FBQSxDQUFFLFFBQVUsV0FBYyxDQUFBLElBQUEsQ0FBSyxPQUFPLGdCQUNwRSxDQUFBLFNBQUEsQ0FBVyxLQUFLLE1BQU8sQ0FBQSxnQkFBQSxDQUN2QixZQUFhLElBQUssQ0FBQSxNQUFBLENBQU8sa0JBQzNCLENBSUEsQ0FBQSxHQUhJLEtBQUssTUFBTyxDQUFBLHFCQUFBLEVBQXlCLGdCQUFnQkEsQ0FBRyxDQUFBLENBQUUsU0FBVyxDQUFDLFlBQUEsQ0FBYUEsQ0FBRyxDQUN4RnNILEdBQUFBLENBQUFBLENBQVMsS0FBTyxLQUVkZ0gsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBVSxDQUNaLElBQU1DLENBQUFBLENBQVEsa0JBQWtCRCxDQUFRLENBQUEsQ0FDeEMsR0FBSUMsQ0FBTSxDQUFBLE1BQUEsQ0FBUyxFQUNqQixJQUFTak0sSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJaU0sQ0FBQUEsQ0FBQUEsQ0FBTSxPQUFRak0sQ0FBSyxFQUFBLENBQUEsQ0FDckMsSUFBTW9CLENBQVE2SyxDQUFBQSxDQUFBQSxDQUFNak0sQ0FBQyxDQUFBLENBQ3JCLEdBQUlvQixDQUFBQSxDQUFNLFFBQVEsT0FBTyxDQUFBLEdBQU0sRUFDN0I0RCxDQUFTLENBQUEsU0FBQSxDQUFZLGNBQWM1RCxDQUFNLENBQUEsTUFBQSxDQUFPLENBQUMsQ0FBQyxDQUFBLENBQUEsS0FBQSxHQUN6Q0EsRUFBTSxPQUFRLENBQUEsU0FBUyxJQUFNLENBQ3RDNEQsQ0FBQUEsQ0FBQUEsQ0FBUyxZQUFjLGFBQWM1RCxDQUFBQSxDQUFBQSxDQUFNLE9BQU8sQ0FBQyxDQUFDLFVBQzNDQSxDQUFNLENBQUEsT0FBQSxDQUFRLGFBQWEsQ0FBTSxHQUFBLENBQUEsQ0FDMUM0RCxFQUFTLFVBQWE1RCxDQUFBQSxDQUFBQSxDQUFNLE9BQU8sRUFBRSxDQUFBLEdBQU0sZUFDbENBLENBQU0sQ0FBQSxPQUFBLENBQVEsY0FBYyxDQUFNLEdBQUEsQ0FBQSxDQUMzQzRELEVBQVMsV0FBYzVELENBQUFBLENBQUFBLENBQU0sTUFBTyxDQUFBLEVBQUUsQ0FBTSxHQUFBLE1BQUEsQ0FBQSxLQUFBLEdBQ25DQSxFQUFNLE9BQVEsQ0FBQSxTQUFTLElBQU0sQ0FBRyxDQUFBLENBRXpDLElBQUk4SyxDQURlOUssQ0FBQUEsQ0FBQUEsQ0FBTSxPQUFPLENBQUMsQ0FBQSxDQUNOLE1BQU0sR0FBRyxDQUFBLENBQ3BDLElBQU0rSyxDQUFZRCxDQUFBQSxDQUFBQSxDQUFVLEtBQzVCLENBQUEsSUFBSUUsRUFBY0YsQ0FBVSxDQUFBLE1BQUEsQ0FBUyxFQUFJQSxDQUFVLENBQUEsSUFBQSxDQUFLLEdBQUcsQ0FBSSxDQUFBLElBQUEsQ0FFL0RsSCxFQUFTLE1BQVNtSCxDQUFBQSxDQUFBQSxDQUNsQm5ILEVBQVMsWUFBZW9ILENBQUFBLEVBQzFCLFNBQVdoTCxDQUFNLENBQUEsT0FBQSxDQUFRLE9BQU8sQ0FBTSxHQUFBLENBQUEsQ0FBRyxDQUV2QyxJQUFJOEssQ0FBQUEsQ0FEYTlLLENBQU0sQ0FBQSxNQUFBLENBQU8sQ0FBQyxDQUFBLENBQ04sTUFBTSxHQUFHLENBQUEsQ0FDbEMsSUFBTWlMLENBQVVILENBQUFBLENBQUFBLENBQVUsS0FDMUIsQ0FBQSxJQUFJRSxFQUFjRixDQUFVLENBQUEsTUFBQSxDQUFTLEVBQUlBLENBQVUsQ0FBQSxJQUFBLENBQUssR0FBRyxDQUFJLENBQUEsSUFBQSxDQUMvRGxILEVBQVMsSUFBT3FILENBQUFBLENBQUFBLENBQ2hCckgsRUFBUyxVQUFhb0gsQ0FBQUEsRUFDeEIsU0FBV2hMLENBQU0sQ0FBQSxPQUFBLENBQVEsZUFBZSxDQUFNLEdBQUEsQ0FBQSxDQUFHLENBQy9DLElBQU1rTCxDQUFBQSxDQUFpQmxMLEVBQU0sTUFBTyxDQUFBLEVBQXNCLEVBQzFENEQsQ0FBUyxDQUFBLFdBQUEsQ0FBY3NILEdBQWtCLE9BQzNDLENBQUEsS0FBV3RNLEdBQUssQ0FDZGdGLENBQUFBLENBQUFBLENBQVMsVUFBWTVELENBRXJCLENBQUEsUUFBQSxDQUFTLGdDQUFrQ0EsQ0FBSyxFQUVwRCxDQUVKLENBQ0EsT0FBTzRELENBQ1QsQ0FNQSxTQUFTLGFBQWF0SCxDQUFLLENBQUEsQ0FDekIsT0FBTyx3QkFBeUJBLENBQUFBLENBQUFBLENBQUssYUFBYSxDQUFNLEdBQUEscUJBQUEsRUFDdkQsUUFBUUEsQ0FBSyxDQUFBLE1BQU0sR0FBSyxlQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxTQUFTLENBQU0sR0FBQSxxQkFDL0QsQ0FRQSxTQUFTLG1CQUFBLENBQW9CbUksRUFBS25JLENBQUs2TyxDQUFBQSxDQUFBQSxDQUFvQixDQUN6RCxJQUFJQyxDQUFBQSxDQUFvQixLQU14QixPQUxBLGNBQUEsQ0FBZTlPLEVBQUssU0FBU21GLENBQUFBLENBQVcsQ0FDbEMySixDQUFxQixFQUFBLElBQUEsR0FDdkJBLENBQW9CM0osQ0FBQUEsQ0FBQUEsQ0FBVSxnQkFBaUJnRCxDQUFBQSxDQUFBQSxDQUFLMEcsRUFBb0I3TyxDQUFHLENBQUEsRUFFL0UsQ0FBQyxDQUNHOE8sQ0FBQUEsQ0FBQUEsR0FHRSxhQUFhOU8sQ0FBRyxDQUFBLENBR1gsaUJBQWlCLElBQUksUUFBQSxDQUFZLG1CQUFtQjZPLENBQWtCLENBQUMsRUFFdkUsU0FBVUEsQ0FBQUEsQ0FBa0IsRUFHekMsQ0FPQSxTQUFTLGVBQWU1SixDQUFRLENBQUEsQ0FDOUIsT0FBTyxDQUFFLEtBQUEsQ0FBTyxFQUFJLENBQUEsSUFBQSxDQUFNLENBQUNBLENBQU0sQ0FBRSxDQUNyQyxDQU1BLFNBQVMsa0JBQWtCb0MsQ0FBU0MsQ0FBQUEsQ0FBQUEsQ0FBVSxDQUM1QyxJQUFNeUgsQ0FBQUEsQ0FBUTFILEVBQVEsQ0FBQyxDQUFBLENBQ2pCMkIsRUFBTzNCLENBQVFBLENBQUFBLENBQUFBLENBQVEsT0FBUyxDQUFDLENBQUEsQ0FDdkMsR0FBSUMsQ0FBUyxDQUFBLE1BQUEsQ0FBUSxDQUNuQixJQUFJckMsQ0FBQUEsQ0FBUyxLQUNUcUMsQ0FBUyxDQUFBLFlBQUEsR0FDWHJDLEVBQVMsU0FBVSxDQUFBLGdCQUFBLENBQWlCOEosRUFBT3pILENBQVMsQ0FBQSxZQUFZLENBQUMsQ0FFL0RBLENBQUFBLENBQUFBLENBQUFBLENBQVMsU0FBVyxLQUFVeUgsR0FBQUEsQ0FBQUEsRUFBUzlKLEtBQ3pDQSxDQUFTQSxDQUFBQSxDQUFBQSxFQUFVOEosRUFDbkI5SixDQUFPLENBQUEsU0FBQSxDQUFZLEdBRWpCcUMsQ0FBUyxDQUFBLE1BQUEsR0FBVyxXQUFhMEIsQ0FBUS9ELEVBQUFBLENBQUFBLENBQUFBLEdBQzNDQSxFQUFTQSxDQUFVK0QsRUFBQUEsQ0FBQUEsQ0FDbkIvRCxFQUFPLFNBQVlBLENBQUFBLENBQUFBLENBQU8sY0FFOUIsQ0FDQSxHQUFJcUMsQ0FBUyxDQUFBLElBQUEsQ0FBTSxDQUNqQixJQUFJckMsRUFBUyxJQUNiLENBQUEsR0FBSXFDLEVBQVMsVUFBWSxDQUFBLENBQ3ZCLElBQUkxQyxDQUFZMEMsQ0FBQUEsQ0FBQUEsQ0FBUyxXQUNyQkEsQ0FBUyxDQUFBLFVBQUEsR0FBZSxXQUMxQjFDLENBQVksQ0FBQSxNQUFBLENBQUEsQ0FFZEssRUFBUyxTQUFVLENBQUEsZ0JBQUEsQ0FBaUI4SixFQUFPbkssQ0FBUyxDQUFDLEVBQ3ZELENBQ0kwQyxDQUFBQSxDQUFTLE9BQVMsS0FBVXlILEdBQUFBLENBQUFBLEVBQVM5SixLQUN2Q0EsQ0FBU0EsQ0FBQUEsQ0FBQUEsRUFBVThKLEVBRW5COUosQ0FBTyxDQUFBLGNBQUEsQ0FBZSxDQUFFLEtBQU8sQ0FBQSxPQUFBLENBQVMsU0FBVSxJQUFLLENBQUEsTUFBQSxDQUFPLGNBQWUsQ0FBQyxDQUFBLENBQUEsQ0FFNUVxQyxFQUFTLElBQVMsR0FBQSxRQUFBLEdBQWEwQixHQUFRL0QsQ0FDekNBLENBQUFBLEdBQUFBLENBQUFBLENBQVNBLEdBQVUrRCxDQUVuQi9ELENBQUFBLENBQUFBLENBQU8sZUFBZSxDQUFFLEtBQUEsQ0FBTyxNQUFPLFFBQVUsQ0FBQSxJQUFBLENBQUssT0FBTyxjQUFlLENBQUMsR0FFaEYsQ0FDRixDQVNBLFNBQVMsbUJBQW9CakYsQ0FBQUEsQ0FBQUEsQ0FBSzBCLEVBQU1zTixDQUFlNUIsQ0FBQUEsQ0FBQUEsQ0FBUSxDQUk3RCxHQUhJQSxDQUFBQSxFQUFVLE9BQ1pBLENBQVMsQ0FBQSxJQUVQcE4sQ0FBTyxFQUFBLElBQUEsQ0FDVCxPQUFPb04sQ0FFVCxDQUFBLElBQU10TSxFQUFpQixpQkFBa0JkLENBQUFBLENBQUFBLENBQUswQixDQUFJLENBQ2xELENBQUEsR0FBSVosRUFBZ0IsQ0FDbEIsSUFBSVQsRUFBTVMsQ0FBZSxDQUFBLElBQUEsRUFDckJtTyxDQUFBQSxDQUFBQSxDQUFnQkQsQ0FDcEIsQ0FBQSxHQUFJM08sSUFBUSxPQUNWLENBQUEsT0FBTyxLQUVMQSxDQUFJLENBQUEsT0FBQSxDQUFRLGFBQWEsQ0FBTSxHQUFBLENBQUEsRUFDakNBLEVBQU1BLENBQUksQ0FBQSxNQUFBLENBQU8sRUFBRSxDQUNuQjRPLENBQUFBLENBQUFBLENBQWdCLElBQ1A1TyxDQUFJLENBQUEsT0FBQSxDQUFRLEtBQUssQ0FBTSxHQUFBLENBQUEsR0FDaENBLEVBQU1BLENBQUksQ0FBQSxNQUFBLENBQU8sQ0FBQyxDQUNsQjRPLENBQUFBLENBQUFBLENBQWdCLElBRWQ1TyxDQUFJLENBQUEsT0FBQSxDQUFRLEdBQUcsQ0FBTSxHQUFBLENBQUEsR0FDdkJBLEVBQU0sR0FBTUEsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUVwQixJQUFJNk8sQ0FBQUEsQ0FDQUQsRUFDRkMsQ0FBYSxDQUFBLFNBQUEsQ0FBVWxQLEVBQUssVUFBVyxDQUFFLE9BQU8sUUFBQSxDQUFTLFVBQWFLLENBQUFBLENBQUFBLENBQU0sR0FBRyxDQUFFLEVBQUUsRUFBRyxFQUFFLEVBRXhGNk8sQ0FBYSxDQUFBLFNBQUEsQ0FBVTdPLENBQUcsQ0FFNUIsQ0FBQSxJQUFBLElBQVcwQyxLQUFPbU0sQ0FDWkEsQ0FBQUEsQ0FBQUEsQ0FBVyxlQUFlbk0sQ0FBRyxDQUFBLEVBQzNCcUssRUFBT3JLLENBQUcsQ0FBQSxFQUFLLE9BQ2pCcUssQ0FBT3JLLENBQUFBLENBQUcsRUFBSW1NLENBQVduTSxDQUFBQSxDQUFHLEdBSXBDLENBQ0EsT0FBTyxvQkFBb0IsU0FBVSxDQUFBLFNBQUEsQ0FBVS9DLENBQUcsQ0FBQyxDQUFBLENBQUcwQixFQUFNc04sQ0FBZTVCLENBQUFBLENBQU0sQ0FDbkYsQ0FRQSxTQUFTLFVBQVVwTixDQUFLbVAsQ0FBQUEsQ0FBQUEsQ0FBUUMsQ0FBWSxDQUFBLENBQzFDLE9BQUksSUFBQSxDQUFLLE9BQU8sU0FDUEQsQ0FBQUEsQ0FBQUEsSUFFUCxpQkFBa0JuUCxDQUFBQSxDQUFBQSxDQUFLLDBCQUEwQixDQUMxQ29QLENBQUFBLENBQUFBLENBRVgsQ0FPQSxTQUFTLG1CQUFBLENBQW9CcFAsRUFBS3FQLENBQWdCLENBQUEsQ0FDaEQsT0FBTyxtQkFBb0JyUCxDQUFBQSxDQUFBQSxDQUFLLFVBQVcsQ0FBTXFQLENBQUFBLENBQUFBLENBQWMsQ0FDakUsQ0FPQSxTQUFTLG9CQUFvQnJQLENBQUtxUCxDQUFBQSxDQUFBQSxDQUFnQixDQUNoRCxPQUFPLG1CQUFBLENBQW9CclAsRUFBSyxTQUFXLENBQUEsQ0FBQSxDQUFBLENBQU9xUCxDQUFjLENBQ2xFLENBTUEsU0FBUyxpQkFBa0JyUCxDQUFBQSxDQUFBQSxDQUFLLENBQzlCLE9BQU8sWUFBQSxDQUFhLG9CQUFvQkEsQ0FBRyxDQUFBLENBQUcsb0JBQW9CQSxDQUFHLENBQUMsQ0FDeEUsQ0FPQSxTQUFTLHFCQUFxQm1JLENBQUtDLENBQUFBLENBQUFBLENBQVFrSCxFQUFhLENBQ3RELEdBQUlBLElBQWdCLElBQ2xCLENBQUEsR0FBSSxDQUNGbkgsQ0FBSSxDQUFBLGdCQUFBLENBQWlCQyxFQUFRa0gsQ0FBVyxFQUMxQyxNQUFZLENBRVZuSCxDQUFBQSxDQUFJLGlCQUFpQkMsQ0FBUSxDQUFBLGtCQUFBLENBQW1Ca0gsQ0FBVyxDQUFDLENBQUEsQ0FDNURuSCxFQUFJLGdCQUFpQkMsQ0FBQUEsQ0FBQUEsQ0FBUyxtQkFBb0IsTUFBTSxFQUMxRCxDQUVKLENBTUEsU0FBUyxvQkFBb0JELENBQUssQ0FBQSxDQUVoQyxHQUFJQSxDQUFJLENBQUEsV0FBQSxFQUFlLE9BQVEsR0FBUyxDQUFBLEdBQUEsQ0FDdEMsR0FBSSxDQUNGLElBQU0vRSxDQUFBQSxDQUFNLElBQUksR0FBSStFLENBQUFBLENBQUFBLENBQUksV0FBVyxDQUNuQyxDQUFBLE9BQU8vRSxFQUFJLFFBQVdBLENBQUFBLENBQUFBLENBQUksTUFDNUIsQ0FBWSxLQUFBLENBQ1Ysa0JBQWtCLFdBQVksRUFBQSxDQUFFLEtBQU0scUJBQXVCLENBQUEsQ0FBRSxJQUFLK0UsQ0FBSSxDQUFBLFdBQVksQ0FBQyxFQUN2RixDQUVKLENBT0EsU0FBUyxTQUFBLENBQVVBLEVBQUtvSCxDQUFRLENBQUEsQ0FDOUIsT0FBT0EsQ0FBTyxDQUFBLElBQUEsQ0FBS3BILEVBQUkscUJBQXNCLEVBQUMsQ0FDaEQsQ0FZQSxTQUFTLFdBQVdqSSxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTWdCLEVBQVMsQ0FFdkMsT0FEQWpFLEVBQThCQSxDQUFLLENBQUEsV0FBQSxHQUMvQmlFLENBQ0VBLENBQUFBLENBQUFBLFlBQW1CLFNBQVcsT0FBT0EsQ0FBQUEsRUFBWSxTQUM1QyxnQkFBaUJqRSxDQUFBQSxDQUFBQSxDQUFNaUQsRUFBTSxJQUFNLENBQUEsSUFBQSxDQUFNLENBQzlDLGNBQWdCLENBQUEsYUFBQSxDQUFjZ0IsQ0FBTyxDQUNyQyxDQUFBLGFBQUEsQ0FBZSxFQUNqQixDQUFDLENBQUEsQ0FFTSxpQkFBaUJqRSxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTSxjQUFjZ0IsQ0FBUSxDQUFBLE1BQU0sRUFBR0EsQ0FBUSxDQUFBLEtBQUEsQ0FDekUsQ0FDRSxPQUFTQSxDQUFBQSxDQUFBQSxDQUFRLFFBQ2pCLE9BQVNBLENBQUFBLENBQUFBLENBQVEsUUFDakIsTUFBUUEsQ0FBQUEsQ0FBQUEsQ0FBUSxPQUNoQixjQUFnQixDQUFBLGFBQUEsQ0FBY0EsRUFBUSxNQUFNLENBQUEsQ0FDNUMsWUFBY0EsQ0FBQUEsQ0FBQUEsQ0FBUSxJQUN0QixDQUFBLE1BQUEsQ0FBUUEsRUFBUSxNQUNoQixDQUFBLGFBQUEsQ0FBZSxFQUNqQixDQUFDLENBQUEsQ0FHRSxpQkFBaUJqRSxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUFNLElBQU0sQ0FBQSxDQUM5QyxjQUFlLENBQ2pCLENBQUEsQ0FBQyxDQUVMLENBTUEsU0FBUyxnQkFBZ0JuRCxDQUFLLENBQUEsQ0FDNUIsSUFBTW9DLENBQU0sQ0FBQSxHQUNaLEtBQU9wQyxDQUFBQSxFQUNMb0MsRUFBSSxJQUFLcEMsQ0FBQUEsQ0FBRyxFQUNaQSxDQUFNQSxDQUFBQSxDQUFBQSxDQUFJLGNBRVosT0FBT29DLENBQ1QsQ0FRQSxTQUFTLFVBQUEsQ0FBV3BDLEVBQUttRCxDQUFNcU0sQ0FBQUEsQ0FBQUEsQ0FBZSxDQUM1QyxJQUFJQyxDQUFBQSxDQUNBck0sRUFXSixPQVZJLE9BQU8sS0FBUSxVQUNqQkEsRUFBQUEsQ0FBQUEsQ0FBTSxJQUFJLEdBQUlELENBQUFBLENBQUFBLENBQU0sU0FBUyxRQUFTLENBQUEsSUFBSSxFQUUxQ3NNLENBRGUsQ0FBQSxRQUFBLENBQVMsU0FBUyxNQUNYck0sR0FBQUEsQ0FBQUEsQ0FBSSxTQUcxQkEsQ0FBTUQsQ0FBQUEsQ0FBQUEsQ0FDTnNNLEVBQVcsVUFBV3RNLENBQUFBLENBQUFBLENBQU0sU0FBUyxRQUFTLENBQUEsTUFBTSxHQUdsRCxJQUFLLENBQUEsTUFBQSxDQUFPLGtCQUNWLENBQUNzTSxDQUFBQSxDQUNJLEdBR0osWUFBYXpQLENBQUFBLENBQUFBLENBQUssbUJBQW9CLFlBQWEsQ0FBQSxDQUFFLElBQUFvRCxDQUFLLENBQUEsUUFBQSxDQUFBcU0sQ0FBUyxDQUFHRCxDQUFBQSxDQUFhLENBQUMsQ0FDN0YsQ0FNQSxTQUFTLGtCQUFBLENBQW1CRSxDQUFLLENBQUEsQ0FDL0IsR0FBSUEsQ0FBZSxZQUFBLFFBQUEsQ0FBVSxPQUFPQSxDQUNwQyxDQUFBLElBQU14QyxFQUFXLElBQUksUUFBQSxDQUNyQixRQUFXbkssQ0FBTzJNLElBQUFBLENBQUFBLENBQ1pBLEVBQUksY0FBZTNNLENBQUFBLENBQUcsSUFDcEIsT0FBTzJNLENBQUFBLENBQUkzTSxDQUFHLENBQUUsQ0FBQSxPQUFBLEVBQVksV0FDOUIyTSxDQUFJM00sQ0FBQUEsQ0FBRyxFQUFFLE9BQVEsQ0FBQSxTQUFTb0ssRUFBRyxDQUFFRCxDQUFBQSxDQUFTLE9BQU9uSyxDQUFLb0ssQ0FBQUEsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUMvQyxPQUFPdUMsQ0FBSTNNLENBQUFBLENBQUcsR0FBTSxRQUFZLEVBQUEsRUFBRTJNLEVBQUkzTSxDQUFHLENBQUEsV0FBYSxJQUMvRG1LLENBQUFBLENBQUFBLENBQUFBLENBQVMsTUFBT25LLENBQUFBLENBQUFBLENBQUssS0FBSyxTQUFVMk0sQ0FBQUEsQ0FBQUEsQ0FBSTNNLENBQUcsQ0FBQyxDQUFDLEVBRTdDbUssQ0FBUyxDQUFBLE1BQUEsQ0FBT25LLEVBQUsyTSxDQUFJM00sQ0FBQUEsQ0FBRyxDQUFDLENBSW5DLENBQUEsQ0FBQSxPQUFPbUssQ0FDVCxDQVFBLFNBQVMsbUJBQW1CQSxDQUFVM00sQ0FBQUEsQ0FBQUEsQ0FBTW9QLEVBQU8sQ0FFakQsT0FBTyxJQUFJLEtBQU1BLENBQUFBLENBQUFBLENBQU8sQ0FDdEIsR0FBSyxDQUFBLFNBQVMxSyxFQUFRbEMsQ0FBSyxDQUFBLENBQ3pCLE9BQUksT0FBT0EsQ0FBQUEsRUFBUSxTQUFpQmtDLENBQU9sQyxDQUFBQSxDQUFHLEVBQzFDQSxDQUFRLEdBQUEsUUFBQSxDQUFpQmtDLEVBQU8sTUFDaENsQyxDQUFBQSxDQUFBQSxHQUFRLE1BQ0gsQ0FBQSxTQUFTVyxDQUFPLENBQUEsQ0FDckJ1QixFQUFPLElBQUt2QixDQUFBQSxDQUFLLEVBQ2pCd0osQ0FBUyxDQUFBLE1BQUEsQ0FBTzNNLEVBQU1tRCxDQUFLLEVBQzdCLEVBRUUsT0FBT3VCLENBQUFBLENBQU9sQyxDQUFHLENBQU0sRUFBQSxVQUFBLENBQ2xCLFVBQVcsQ0FDaEJrQyxDQUFBQSxDQUFPbEMsQ0FBRyxDQUFFLENBQUEsS0FBQSxDQUFNa0MsRUFBUSxTQUFTLENBQUEsQ0FDbkNpSSxFQUFTLE1BQU8zTSxDQUFBQSxDQUFJLEVBQ3BCMEUsQ0FBTyxDQUFBLE9BQUEsQ0FBUSxTQUFTa0ksQ0FBRyxDQUFBLENBQUVELEVBQVMsTUFBTzNNLENBQUFBLENBQUFBLENBQU00TSxDQUFDLEVBQUUsQ0FBQyxFQUN6RCxDQUdFbEksQ0FBQUEsQ0FBQUEsQ0FBT2xDLENBQUcsQ0FBS2tDLEVBQUFBLENBQUFBLENBQU9sQyxDQUFHLENBQUUsQ0FBQSxNQUFBLEdBQVcsRUFDakNrQyxDQUFPbEMsQ0FBQUEsQ0FBRyxFQUFFLENBQUMsQ0FBQSxDQUVia0MsRUFBT2xDLENBQUcsQ0FFckIsRUFDQSxHQUFLLENBQUEsU0FBU2tDLEVBQVEySyxDQUFPbE0sQ0FBQUEsQ0FBQUEsQ0FBTyxDQUNsQyxPQUFBdUIsQ0FBQUEsQ0FBTzJLLENBQUssQ0FBSWxNLENBQUFBLENBQUFBLENBQ2hCd0osRUFBUyxNQUFPM00sQ0FBQUEsQ0FBSSxFQUNwQjBFLENBQU8sQ0FBQSxPQUFBLENBQVEsU0FBU2tJLENBQUcsQ0FBQSxDQUFFRCxFQUFTLE1BQU8zTSxDQUFBQSxDQUFBQSxDQUFNNE0sQ0FBQyxFQUFFLENBQUMsRUFDaEQsQ0FDVCxDQUFBLENBQ0YsQ0FBQyxDQUNILENBTUEsU0FBUyxhQUFjRCxDQUFBQSxDQUFBQSxDQUFVLENBQy9CLE9BQU8sSUFBSSxLQUFBLENBQU1BLEVBQVUsQ0FDekIsR0FBQSxDQUFLLFNBQVNqSSxDQUFRMUUsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUMxQixHQUFJLE9BQU9BLEdBQVMsUUFFbEIsQ0FBQSxPQUFPLFFBQVEsR0FBSTBFLENBQUFBLENBQUFBLENBQVExRSxDQUFJLENBRWpDLENBQUEsR0FBSUEsSUFBUyxRQUVYLENBQUEsT0FBTyxJQUFNLE1BQU8sQ0FBQSxXQUFBLENBQVkyTSxDQUFRLENBRTFDLENBQUEsR0FBSTNNLEtBQVEwRSxDQUVWLENBQUEsT0FBSSxPQUFPQSxDQUFPMUUsQ0FBQUEsQ0FBSSxHQUFNLFVBQ25CLENBQUEsVUFBVyxDQUNoQixPQUFPMk0sQ0FBQUEsQ0FBUzNNLENBQUksQ0FBRSxDQUFBLEtBQUEsQ0FBTTJNLEVBQVUsU0FBUyxDQUNqRCxFQUVPakksQ0FBTzFFLENBQUFBLENBQUksRUFHdEIsSUFBTW9QLENBQUFBLENBQVF6QyxFQUFTLE1BQU8zTSxDQUFBQSxDQUFJLEVBRWxDLEdBQUlvUCxDQUFBQSxDQUFNLFNBQVcsQ0FFZCxDQUFBLE9BQUlBLEVBQU0sTUFBVyxHQUFBLENBQUEsQ0FDbkJBLEVBQU0sQ0FBQyxDQUFBLENBRVAsbUJBQW1CMUssQ0FBUTFFLENBQUFBLENBQUFBLENBQU1vUCxDQUFLLENBRWpELENBQUEsQ0FDQSxJQUFLLFNBQVMxSyxDQUFBQSxDQUFRMUUsRUFBTW1ELENBQU8sQ0FBQSxDQUNqQyxPQUFJLE9BQU9uRCxDQUFBQSxFQUFTLFNBQ1gsQ0FFVDBFLENBQUFBLEVBQUFBLENBQUFBLENBQU8sT0FBTzFFLENBQUksQ0FBQSxDQUNkLE9BQU9tRCxDQUFNLENBQUEsT0FBQSxFQUFZLFdBQzNCQSxDQUFNLENBQUEsT0FBQSxDQUFRLFNBQVN5SixDQUFBQSxDQUFHLENBQUVsSSxDQUFBQSxDQUFPLE9BQU8xRSxDQUFNNE0sQ0FBQUEsQ0FBQyxFQUFFLENBQUMsQ0FBQSxDQUMzQyxPQUFPekosQ0FBVSxFQUFBLFFBQUEsRUFBWSxFQUFFQSxDQUFpQixZQUFBLElBQUEsQ0FBQSxDQUN6RHVCLEVBQU8sTUFBTzFFLENBQUFBLENBQUFBLENBQU0sS0FBSyxTQUFVbUQsQ0FBQUEsQ0FBSyxDQUFDLENBRXpDdUIsQ0FBQUEsQ0FBQUEsQ0FBTyxPQUFPMUUsQ0FBTW1ELENBQUFBLENBQUssRUFFcEIsQ0FDVCxDQUFBLENBQUEsQ0FBQSxDQUNBLGVBQWdCLFNBQVN1QixDQUFBQSxDQUFRMUUsRUFBTSxDQUNyQyxPQUFJLE9BQU9BLENBQVMsRUFBQSxRQUFBLEVBQ2xCMEUsRUFBTyxNQUFPMUUsQ0FBQUEsQ0FBSSxFQUViLENBQ1QsQ0FBQSxDQUFBLENBRUEsUUFBUyxTQUFTMEUsQ0FBQUEsQ0FBUSxDQUN4QixPQUFPLE9BQUEsQ0FBUSxRQUFRLE1BQU8sQ0FBQSxXQUFBLENBQVlBLENBQU0sQ0FBQyxDQUNuRCxFQUNBLHdCQUEwQixDQUFBLFNBQVNBLEVBQVE0SyxDQUFNLENBQUEsQ0FDL0MsT0FBTyxPQUFRLENBQUEsd0JBQUEsQ0FBeUIsT0FBTyxXQUFZNUssQ0FBQUEsQ0FBTSxFQUFHNEssQ0FBSSxDQUMxRSxDQUNGLENBQUMsQ0FDSCxDQVdBLFNBQVMsZ0JBQUEsQ0FBaUIzUCxFQUFNaUQsQ0FBTW5ELENBQUFBLENBQUFBLENBQUt1RCxFQUFPdU0sQ0FBS0MsQ0FBQUEsQ0FBQUEsQ0FBVyxDQUNoRSxJQUFJQyxDQUFBQSxDQUFVLEtBQ1ZDLENBQVMsQ0FBQSxJQUFBLENBRWIsR0FEQUgsQ0FBTUEsQ0FBQUEsQ0FBQUEsRUFBb0IsRUFDdEJBLENBQUFBLENBQUFBLENBQUksYUFBaUIsRUFBQSxPQUFPLE9BQVksQ0FBQSxHQUFBLENBQzFDLElBQUlJLENBQVUsQ0FBQSxJQUFJLFFBQVEsU0FBU0MsQ0FBQUEsQ0FBVUMsRUFBUyxDQUNwREosQ0FBQUEsQ0FBVUcsRUFDVkYsQ0FBU0csQ0FBQUEsRUFDWCxDQUFDLENBRUNwUSxDQUFBQSxDQUFBQSxFQUFPLE9BQ1RBLENBQU0sQ0FBQSxXQUFBLEdBQWMsSUFFdEIsQ0FBQSxDQUFBLElBQU1xUSxFQUFrQlAsQ0FBSSxDQUFBLE9BQUEsRUFBVyxtQkFDakNRLENBQVNSLENBQUFBLENBQUFBLENBQUksUUFBVSxJQUU3QixDQUFBLEdBQUksQ0FBQyxZQUFhOVAsQ0FBQUEsQ0FBRyxFQUVuQixPQUFVZ1EsU0FBQUEsQ0FBQUEsQ0FBTyxFQUNWRSxDQUVULENBQUEsSUFBTWpMLEVBQVM2SyxDQUFJLENBQUEsY0FBQSxFQUFrQixVQUFVLFNBQVU5UCxDQUFBQSxDQUFHLENBQUMsQ0FBQSxDQUM3RCxHQUFJaUYsQ0FBQUEsRUFBVSxNQUFRQSxDQUFVLEVBQUEsU0FBQSxDQUM5Qix5QkFBa0JqRixDQUFLLENBQUEsa0JBQUEsQ0FBb0IsQ0FBRSxNQUFRLENBQUEsaUJBQUEsQ0FBa0JBLEVBQUssV0FBVyxDQUFFLENBQUMsQ0FDMUYsQ0FBQSxTQUFBLENBQVVpUSxDQUFNLENBQ1RDLENBQUFBLENBQUFBLENBR1QsSUFBSUssQ0FBVSxDQUFBLGVBQUEsQ0FBZ0J2USxDQUFHLENBQzNCd1EsQ0FBQUEsQ0FBQUEsQ0FBWUQsRUFBUSxpQkFFMUIsQ0FBQSxHQUFJQyxFQUFXLENBQ2IsSUFBTUMsRUFBYSxlQUFnQkQsQ0FBQUEsQ0FBQUEsQ0FBVyxZQUFZLENBQ3REQyxDQUFBQSxDQUFBQSxFQUFjLE9BQ2hCdE4sQ0FBT3NOLENBQUFBLENBQUFBLENBQUFBLENBR1QsSUFBTUMsQ0FBYSxDQUFBLGVBQUEsQ0FBZ0JGLEVBQVcsWUFBWSxDQUFBLENBQ3RERSxDQUFjLEVBQUEsSUFBQSxFQUVaQSxDQUFXLENBQUEsV0FBQSxLQUFrQixRQUMvQnhRLEdBQUFBLENBQUFBLENBQThCd1EsR0FHcEMsQ0FFQSxJQUFNQyxFQUFrQix3QkFBeUIzUSxDQUFBQSxDQUFBQSxDQUFLLFlBQVksQ0FFbEUsQ0FBQSxHQUFJK1AsSUFBYyxLQUtaLENBQUEsRUFBQSxZQUFBLENBQWEvUCxFQUFLLGNBREMsQ0FBQSxDQUFFLE9BQUFpRixDQUFRLENBQUEsR0FBQSxDQUFBakYsRUFBSyxJQUFBbUQsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUFBakQsQ0FBTSxDQUFBLGVBQUEsQ0FBaUJxRCxFQUFPLEdBQUF1TSxDQUFBQSxDQUFBQSxDQUFLLGFBSDFELFNBQVNjLENBQUFBLENBQWtCLENBQzlDLE9BQU8sZ0JBQUEsQ0FBaUIxUSxFQUFNaUQsQ0FBTW5ELENBQUFBLENBQUFBLENBQUt1RCxFQUFPdU0sQ0FBSyxDQUFBLENBQUMsQ0FBQ2MsQ0FBZ0IsQ0FDekUsRUFDNkYsUUFBVUQsQ0FBQUEsQ0FBZ0IsQ0FDbkUsQ0FBTSxHQUFBLENBQUEsQ0FBQSxDQUN4RCxpQkFBVVgsQ0FBTyxDQUFBLENBQ1ZFLEVBSVgsSUFBSVcsQ0FBQUEsQ0FBVTdRLEVBQ1Y4USxDQUFlLENBQUEsd0JBQUEsQ0FBeUI5USxFQUFLLFNBQVMsQ0FBQSxDQUN0RCtRLEVBQWdCLElBQ2hCQyxDQUFBQSxDQUFBQSxDQUFZLEdBQ2hCLEdBQUlGLENBQUFBLENBQWMsQ0FDaEIsSUFBTUcsQ0FBQUEsQ0FBY0gsRUFBYSxLQUFNLENBQUEsR0FBRyxFQUNwQzNQLENBQVc4UCxDQUFBQSxDQUFBQSxDQUFZLENBQUMsQ0FBRSxDQUFBLElBQUEsR0FTaEMsR0FSSTlQLENBQUFBLEdBQWEsT0FDZjBQLENBQVUsQ0FBQSxlQUFBLENBQWdCN1EsRUFBSyxTQUFTLENBQUEsQ0FFeEM2USxFQUFVLFNBQVUsQ0FBQSxnQkFBQSxDQUFpQjdRLENBQUttQixDQUFBQSxDQUFRLENBQUMsQ0FBQSxDQUdyRDJQLEdBQWdCRyxDQUFZLENBQUEsQ0FBQyxHQUFLLE1BQVEsRUFBQSxJQUFBLEdBQzFDVixDQUFVLENBQUEsZUFBQSxDQUFnQk0sQ0FBTyxDQUM3QkMsQ0FBQUEsQ0FBQUEsR0FBaUIsUUFBVVAsQ0FBUSxDQUFBLEdBQUEsRUFBT0EsRUFBUSxTQUFjLEdBQUEsQ0FBQSxDQUFBLENBQ2xFLGlCQUFVUCxDQUFPLENBQUEsQ0FDVkUsRUFDRixHQUFJWSxDQUFBQSxHQUFpQixRQUFTLENBQ25DLEdBQUlQLEVBQVEsR0FDVixDQUFBLE9BQUEsU0FBQSxDQUFVUCxDQUFPLENBQ1ZFLENBQUFBLENBQUFBLENBRVBjLEVBQVksQ0FFaEIsRUFBQSxDQUFBLEtBQVdGLElBQWlCLFNBQzFCLENBQUEsWUFBQSxDQUFhRCxFQUFTLFlBQVksQ0FBQSxDQUN6QkMsRUFBYSxPQUFRLENBQUEsT0FBTyxJQUFNLENBRTNDQyxHQUFBQSxDQUFBQSxDQUFBQSxDQURzQkQsRUFBYSxLQUFNLENBQUEsR0FBRyxFQUNiLENBQUMsQ0FBQSxFQUFLLFFBQVEsSUFBSyxFQUFBLEVBRXRELENBRUEsR0FBSVAsQ0FBQUEsQ0FBUSxJQUNWLEdBQUlBLENBQUFBLENBQVEsVUFDVixZQUFhTSxDQUFBQSxDQUFBQSxDQUFTLFlBQVksQ0FDN0IsQ0FBQSxLQUFBLENBQ0wsR0FBSUUsQ0FBaUIsRUFBQSxJQUFBLENBQU0sQ0FDekIsR0FBSXhOLENBQUFBLENBQU8sQ0FDVCxJQUFNaUgsQ0FBQUEsQ0FBWSxnQkFBZ0JqSCxDQUFLLENBQUEsQ0FDbkNpSCxHQUFhQSxDQUFVLENBQUEsV0FBQSxFQUFlQSxFQUFVLFdBQVksQ0FBQSxLQUFBLEdBQzlEdUcsRUFBZ0J2RyxDQUFVLENBQUEsV0FBQSxDQUFZLE9BRTFDLENBQ0l1RyxDQUFBQSxFQUFpQixJQUNuQkEsR0FBQUEsQ0FBQUEsQ0FBZ0IsTUFFcEIsRUFBQSxDQUNBLE9BQUlSLENBQVEsQ0FBQSxjQUFBLEVBQWtCLE9BQzVCQSxDQUFRLENBQUEsY0FBQSxDQUFpQixFQUV2QlEsQ0FBQUEsQ0FBQUEsQ0FBQUEsR0FBa0IsU0FBV1IsQ0FBUSxDQUFBLGNBQUEsQ0FBZSxTQUFXLENBQ2pFQSxDQUFBQSxDQUFBQSxDQUFRLGVBQWUsSUFBSyxDQUFBLFVBQVcsQ0FDckMsZ0JBQWlCclEsQ0FBQUEsQ0FBQUEsQ0FBTWlELEVBQU1uRCxDQUFLdUQsQ0FBQUEsQ0FBQUEsQ0FBT3VNLENBQUcsRUFDOUMsQ0FBQyxFQUNRaUIsQ0FBa0IsR0FBQSxLQUFBLENBQzNCUixFQUFRLGNBQWUsQ0FBQSxJQUFBLENBQUssVUFBVyxDQUNyQyxnQkFBQSxDQUFpQnJRLEVBQU1pRCxDQUFNbkQsQ0FBQUEsQ0FBQUEsQ0FBS3VELEVBQU91TSxDQUFHLEVBQzlDLENBQUMsQ0FDUWlCLENBQUFBLENBQUFBLEdBQWtCLFNBQzNCUixDQUFRLENBQUEsY0FBQSxDQUFpQixFQUN6QkEsQ0FBQUEsQ0FBQUEsQ0FBUSxlQUFlLElBQUssQ0FBQSxVQUFXLENBQ3JDLGdCQUFpQnJRLENBQUFBLENBQUFBLENBQU1pRCxFQUFNbkQsQ0FBS3VELENBQUFBLENBQUFBLENBQU91TSxDQUFHLEVBQzlDLENBQUMsR0FFSCxTQUFVRSxDQUFBQSxDQUFPLEVBQ1ZFLENBQ1QsQ0FHRixJQUFNL0gsQ0FBTSxDQUFBLElBQUksZUFDaEJvSSxDQUFRLENBQUEsR0FBQSxDQUFNcEksRUFDZG9JLENBQVEsQ0FBQSxTQUFBLENBQVlTLEVBQ3BCLElBQU1FLENBQUFBLENBQWlCLFVBQVcsQ0FDaENYLENBQUFBLENBQVEsSUFBTSxJQUNkQSxDQUFBQSxDQUFBQSxDQUFRLFVBQVksQ0FDaEJBLENBQUFBLENBQUFBLENBQUFBLENBQVEsZ0JBQWtCLElBQzlCQSxFQUFBQSxDQUFBQSxDQUFRLGNBQWUsQ0FBQSxNQUFBLENBQVMsQ0FDUkEsRUFBQUEsQ0FBQUEsQ0FBUSxlQUFlLEtBQU0sRUFBQSxHQUd2RCxDQUNNWSxDQUFBQSxDQUFBQSxDQUFpQix5QkFBeUJuUixDQUFLLENBQUEsV0FBVyxFQUNoRSxHQUFJbVIsQ0FBQUEsQ0FBZ0IsQ0FDbEIsSUFBSUMsQ0FBQUEsQ0FBaUIsT0FBT0QsQ0FBYyxDQUFBLENBRTFDLEdBQUlDLENBQW1CLEdBQUEsSUFBQSxFQUN2QixDQUFDLFlBQWFwUixDQUFBQSxDQUFBQSxDQUFLLGNBQWUsQ0FBRSxNQUFBLENBQVFvUixFQUFnQixNQUFBbk0sQ0FBQUEsQ0FBTyxDQUFDLENBQ2xFLENBQUEsT0FBQSxTQUFBLENBQVUrSyxDQUFPLENBQ2pCa0IsQ0FBQUEsQ0FBQUEsR0FDT2hCLENBRVgsQ0FFQSxHQUFJUyxDQUFtQixFQUFBLENBQUNaLEdBQ2xCLENBQUMsT0FBQSxDQUFRWSxDQUFlLENBQUEsQ0FDMUIsT0FBVVgsU0FBQUEsQ0FBQUEsQ0FBTyxFQUNqQmtCLENBQWUsRUFBQSxDQUNSaEIsRUFJWCxJQUFJakMsQ0FBQUEsQ0FBVSxXQUFXak8sQ0FBS2lGLENBQUFBLENBQUFBLENBQVFtTSxDQUFjLENBRWhEbFIsQ0FBQUEsQ0FBQUEsR0FBUyxPQUFTLENBQUMsWUFBQSxDQUFhRixDQUFHLENBQ3JDaU8sR0FBQUEsQ0FBQUEsQ0FBUSxjQUFjLENBQUksQ0FBQSxtQ0FBQSxDQUFBLENBR3hCNkIsRUFBSSxPQUNON0IsR0FBQUEsQ0FBQUEsQ0FBVSxhQUFhQSxDQUFTNkIsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPLENBRTdDLENBQUEsQ0FBQSxJQUFNNUwsRUFBVSxjQUFlbEUsQ0FBQUEsQ0FBQUEsQ0FBS0UsQ0FBSSxDQUNwQ21OLENBQUFBLENBQUFBLENBQVNuSixFQUFRLE1BQ2ZtTixDQUFBQSxDQUFBQSxDQUFjbk4sRUFBUSxRQUN4QjRMLENBQUFBLENBQUFBLENBQUksUUFDTixnQkFBaUJ1QixDQUFBQSxDQUFBQSxDQUFhLGtCQUFtQnZCLENBQUFBLENBQUFBLENBQUksTUFBTSxDQUFDLEVBRTlELElBQU1ULENBQUFBLENBQWlCLG1CQUFtQixpQkFBa0JyUCxDQUFBQSxDQUFHLENBQUMsQ0FDMURzUixDQUFBQSxDQUFBQSxDQUFjLGlCQUFpQkQsQ0FBYWhDLENBQUFBLENBQWMsRUFDNURrQyxDQUFtQixDQUFBLFlBQUEsQ0FBYUQsRUFBYXRSLENBQUcsQ0FBQSxDQUVoRCxLQUFLLE1BQU8sQ0FBQSxtQkFBQSxFQUF1QkUsSUFBUyxLQUM5Q3FSLEVBQUFBLENBQUFBLENBQWlCLElBQUksdUJBQXlCLENBQUEsZUFBQSxDQUFnQnRNLEVBQVEsSUFBSSxDQUFBLEVBQUssTUFBTSxDQUluRjlCLENBQUFBLENBQUFBLENBQUFBLEVBQVEsTUFBUUEsQ0FBUyxHQUFBLEVBQUEsSUFDM0JBLEVBQU8sV0FBWSxFQUFBLENBQUUsU0FBUyxJQVNoQyxDQUFBLENBQUEsSUFBTXFPLEVBQW9CLG1CQUFvQnhSLENBQUFBLENBQUFBLENBQUssWUFBWSxDQUV6RHlSLENBQUFBLENBQUFBLENBQWUsZ0JBQWdCelIsQ0FBRyxDQUFBLENBQUUsUUFFdEMwUixDQUFlLENBQUEsSUFBQSxDQUFLLE9BQU8sdUJBQXdCLENBQUEsT0FBQSxDQUFReFIsQ0FBSSxDQUFLLEVBQUEsQ0FBQSxDQUdsRXNQLEVBQWdCLENBQ3BCLE9BQUEsQ0FBU2lDLEVBQ1QsWUFBQUMsQ0FBQUEsQ0FBQUEsQ0FDQSxTQUFVSCxDQUNWLENBQUEsVUFBQSxDQUFZLGNBQWNBLENBQWdCLENBQUEsQ0FDMUMsbUJBQW9CRCxDQUNwQixDQUFBLG9CQUFBLENBQXNCLGNBQWNBLENBQVcsQ0FBQSxDQUMvQyxRQUFBckQsQ0FDQSxDQUFBLE1BQUEsQ0FBQWhKLEVBQ0EsSUFBQS9FLENBQUFBLENBQUFBLENBQ0EsT0FBQW1OLENBQ0EsQ0FBQSxlQUFBLENBQWlCeUMsRUFBSSxXQUFlMEIsRUFBQUEsQ0FBQUEsQ0FBa0IsYUFBZSxJQUFLLENBQUEsTUFBQSxDQUFPLGVBQ2pGLENBQUEsT0FBQSxDQUFTMUIsQ0FBSSxDQUFBLE9BQUEsRUFBVzBCLEVBQWtCLE9BQVcsRUFBQSxJQUFBLENBQUssT0FBTyxPQUNqRSxDQUFBLElBQUEsQ0FBQXJPLEVBQ0EsZUFBaUJJLENBQUFBLENBQ25CLEVBRUEsR0FBSSxDQUFDLGFBQWF2RCxDQUFLLENBQUEsb0JBQUEsQ0FBc0J3UCxDQUFhLENBQ3hELENBQUEsT0FBQSxTQUFBLENBQVVRLENBQU8sQ0FDakJrQixDQUFBQSxDQUFBQSxHQUNPaEIsQ0FXVCxDQUFBLEdBUEEvTSxFQUFPcU0sQ0FBYyxDQUFBLElBQUEsQ0FDckJ0UCxFQUFPc1AsQ0FBYyxDQUFBLElBQUEsQ0FDckJ2QixFQUFVdUIsQ0FBYyxDQUFBLE9BQUEsQ0FDeEIrQixFQUFtQixrQkFBbUIvQixDQUFBQSxDQUFBQSxDQUFjLFVBQVUsQ0FDOURuQyxDQUFBQSxDQUFBQSxDQUFTbUMsRUFBYyxNQUN2QmtDLENBQUFBLENBQUFBLENBQWVsQyxFQUFjLFlBRXpCbkMsQ0FBQUEsQ0FBQUEsRUFBVUEsRUFBTyxNQUFTLENBQUEsQ0FBQSxDQUM1QixvQkFBYXJOLENBQUssQ0FBQSx3QkFBQSxDQUEwQndQLENBQWEsQ0FDekQsQ0FBQSxTQUFBLENBQVVRLENBQU8sQ0FDakJrQixDQUFBQSxDQUFBQSxHQUNPaEIsQ0FHVCxDQUFBLElBQU15QixFQUFZeE8sQ0FBSyxDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQzFCeU8sQ0FBQUEsQ0FBQUEsQ0FBZUQsRUFBVSxDQUFDLENBQUEsQ0FDMUJFLEVBQVNGLENBQVUsQ0FBQSxDQUFDLEVBRXRCRyxDQUFZM08sQ0FBQUEsQ0FBQUEsQ0FpQmhCLEdBaEJJdU8sQ0FDRkksR0FBQUEsQ0FBQUEsQ0FBWUYsRUFDTSxDQUFDTCxDQUFBQSxDQUFpQixNQUFPLENBQUEsSUFBQSxHQUFPLElBRTVDTyxHQUFBQSxDQUFBQSxDQUFVLFFBQVEsR0FBRyxDQUFBLENBQUksRUFDM0JBLENBQWEsRUFBQSxHQUFBLENBRWJBLENBQWEsRUFBQSxHQUFBLENBRWZBLENBQWEsRUFBQSxTQUFBLENBQVVQLENBQWdCLENBQ25DTSxDQUFBQSxDQUFBQSxHQUNGQyxHQUFhLEdBQU1ELENBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQUFBLENBS3JCLENBQUMsVUFBVzdSLENBQUFBLENBQUFBLENBQUs4UixFQUFXdEMsQ0FBYSxDQUFBLENBQzNDLHlCQUFrQnhQLENBQUssQ0FBQSxrQkFBQSxDQUFvQndQLENBQWEsQ0FDeEQsQ0FBQSxTQUFBLENBQVVTLENBQU0sQ0FDVEMsQ0FBQUEsQ0FBQUEsQ0FTVCxHQU5BL0gsQ0FBSSxDQUFBLElBQUEsQ0FBS2pJLEVBQUssV0FBWSxFQUFBLENBQUc0UixFQUFXLENBQUksQ0FBQSxDQUFBLENBQzVDM0osRUFBSSxnQkFBaUIsQ0FBQSxXQUFXLEVBQ2hDQSxDQUFJLENBQUEsZUFBQSxDQUFrQnFILEVBQWMsZUFDcENySCxDQUFBQSxDQUFBQSxDQUFJLFFBQVVxSCxDQUFjLENBQUEsT0FBQSxDQUd4QixDQUFBZ0MsQ0FBa0IsQ0FBQSxTQUFBLENBQUEsQ0FHcEIsUUFBV3BKLENBQVU2RixJQUFBQSxDQUFBQSxDQUNuQixHQUFJQSxDQUFRLENBQUEsY0FBQSxDQUFlN0YsQ0FBTSxDQUFHLENBQUEsQ0FDbEMsSUFBTWtILENBQWNyQixDQUFBQSxDQUFBQSxDQUFRN0YsQ0FBTSxDQUNsQyxDQUFBLG9CQUFBLENBQXFCRCxFQUFLQyxDQUFRa0gsQ0FBQUEsQ0FBVyxFQUMvQyxDQUtKLENBQUEsSUFBTXlDLEVBQWUsQ0FDbkIsR0FBQSxDQUFBNUosRUFDQSxNQUFBbEQsQ0FBQUEsQ0FBQUEsQ0FDQSxjQUFBdUssQ0FDQSxDQUFBLEdBQUEsQ0FBQU0sRUFDQSxPQUFTMkIsQ0FBQUEsQ0FBQUEsQ0FDVCxPQUFBbkIsQ0FDQSxDQUFBLFFBQUEsQ0FBVSxDQUNSLFdBQWFuTixDQUFBQSxDQUFBQSxDQUNiLGlCQUFrQjJPLENBQ2xCLENBQUEsWUFBQSxDQUFjLEtBQ2QsTUFBQUQsQ0FBQUEsQ0FDRixDQUNGLENBdURBLENBQUEsR0FyREExSixDQUFJLENBQUEsTUFBQSxDQUFTLFVBQVcsQ0FDdEIsR0FBSSxDQUNGLElBQU02SixFQUFZLGVBQWdCaFMsQ0FBQUEsQ0FBRyxFQVVyQyxHQVRBK1IsQ0FBQUEsQ0FBYSxTQUFTLFlBQWUsQ0FBQSxtQkFBQSxDQUFvQjVKLENBQUcsQ0FDNURrSSxDQUFBQSxDQUFBQSxDQUFnQnJRLEVBQUsrUixDQUFZLENBQUEsQ0FDN0JBLEVBQWEsY0FBbUIsR0FBQSxDQUFBLENBQUEsRUFDbEMsd0JBQXdCbkYsQ0FBWXFGLENBQUFBLENBQVcsRUFFakQsWUFBYWpTLENBQUFBLENBQUFBLENBQUssb0JBQXFCK1IsQ0FBWSxDQUFBLENBQ25ELGFBQWEvUixDQUFLLENBQUEsa0JBQUEsQ0FBb0IrUixDQUFZLENBRzlDLENBQUEsQ0FBQyxhQUFhL1IsQ0FBRyxDQUFBLENBQUcsQ0FDdEIsSUFBSWtTLENBQUFBLENBQXNCLEtBQzFCLEtBQU9GLENBQUFBLENBQVUsTUFBUyxDQUFBLENBQUEsRUFBS0UsQ0FBdUIsRUFBQSxJQUFBLEVBQU0sQ0FDMUQsSUFBTUMsQ0FBQUEsQ0FBdUJILEVBQVUsS0FBTSxFQUFBLENBQ3pDLGFBQWFHLENBQW9CLENBQUEsR0FDbkNELEVBQXNCQyxDQUUxQixFQUFBLENBQ0lELElBQ0YsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBcUIsb0JBQXFCSCxDQUFZLENBQUEsQ0FDbkUsYUFBYUcsQ0FBcUIsQ0FBQSxrQkFBQSxDQUFvQkgsQ0FBWSxDQUV0RSxFQUFBLENBQ0EsVUFBVS9CLENBQU8sQ0FBQSxDQUNqQmtCLElBQ0YsQ0FBQSxNQUFTaFEsRUFBRyxDQUNWLE1BQUEsaUJBQUEsQ0FBa0JsQixFQUFLLGtCQUFvQixDQUFBLFlBQUEsQ0FBYSxDQUFFLEtBQU9rQixDQUFBQSxDQUFFLEVBQUc2USxDQUFZLENBQUMsRUFDN0U3USxDQUNSLENBQ0YsQ0FDQWlILENBQUFBLENBQUFBLENBQUksT0FBVSxDQUFBLFVBQVcsQ0FDdkIsdUJBQXdCeUUsQ0FBQUEsQ0FBQUEsQ0FBWXFGLENBQVcsQ0FDL0MsQ0FBQSxpQkFBQSxDQUFrQmpTLEVBQUssbUJBQXFCK1IsQ0FBQUEsQ0FBWSxFQUN4RCxpQkFBa0IvUixDQUFBQSxDQUFBQSxDQUFLLGlCQUFrQitSLENBQVksQ0FBQSxDQUNyRCxVQUFVOUIsQ0FBTSxDQUFBLENBQ2hCaUIsSUFDRixDQUFBLENBQ0EvSSxFQUFJLE9BQVUsQ0FBQSxVQUFXLENBQ3ZCLHVCQUF3QnlFLENBQUFBLENBQUFBLENBQVlxRixDQUFXLENBQy9DLENBQUEsaUJBQUEsQ0FBa0JqUyxFQUFLLG1CQUFxQitSLENBQUFBLENBQVksRUFDeEQsaUJBQWtCL1IsQ0FBQUEsQ0FBQUEsQ0FBSyxpQkFBa0IrUixDQUFZLENBQUEsQ0FDckQsVUFBVTlCLENBQU0sQ0FBQSxDQUNoQmlCLElBQ0YsQ0FBQSxDQUNBL0ksRUFBSSxTQUFZLENBQUEsVUFBVyxDQUN6Qix1QkFBd0J5RSxDQUFBQSxDQUFBQSxDQUFZcUYsQ0FBVyxDQUMvQyxDQUFBLGlCQUFBLENBQWtCalMsRUFBSyxtQkFBcUIrUixDQUFBQSxDQUFZLEVBQ3hELGlCQUFrQi9SLENBQUFBLENBQUFBLENBQUssZUFBZ0IrUixDQUFZLENBQUEsQ0FDbkQsVUFBVTlCLENBQU0sQ0FBQSxDQUNoQmlCLElBQ0YsQ0FBQSxDQUNJLENBQUMsWUFBYWxSLENBQUFBLENBQUFBLENBQUsscUJBQXNCK1IsQ0FBWSxDQUFBLENBQ3ZELGlCQUFVL0IsQ0FBTyxDQUFBLENBQ2pCa0IsR0FDT2hCLENBQUFBLENBQUFBLENBRVQsSUFBSXRELENBQWEsQ0FBQSwwQkFBQSxDQUEyQjVNLENBQUcsQ0FDM0NpUyxDQUFBQSxDQUFBQSxDQUFjLGdCQUFnQmpTLENBQUcsQ0FBQSxDQUVyQyxRQUFRLENBQUMsV0FBQSxDQUFhLFNBQVcsQ0FBQSxVQUFBLENBQVksT0FBTyxDQUFBLENBQUcsU0FBU3VJLENBQVcsQ0FBQSxDQUN6RSxRQUFRLENBQUNKLENBQUFBLENBQUtBLEVBQUksTUFBTSxDQUFBLENBQUcsU0FBU2xELENBQVEsQ0FBQSxDQUMxQ0EsRUFBTyxnQkFBaUJzRCxDQUFBQSxDQUFBQSxDQUFXLFNBQVNoRixDQUFPLENBQUEsQ0FDakQsYUFBYXZELENBQUssQ0FBQSxXQUFBLENBQWN1SSxFQUFXLENBQ3pDLGdCQUFBLENBQWtCaEYsRUFBTSxnQkFDeEIsQ0FBQSxNQUFBLENBQVFBLEVBQU0sTUFDZCxDQUFBLEtBQUEsQ0FBT0EsRUFBTSxLQUNmLENBQUMsRUFDSCxDQUFDLEVBQ0gsQ0FBQyxFQUNILENBQUMsRUFDRCxZQUFhdkQsQ0FBQUEsQ0FBQUEsQ0FBSyxrQkFBbUIrUixDQUFZLENBQUEsQ0FDakQsSUFBTUssRUFBU1YsQ0FBQUEsQ0FBQUEsQ0FBZSxLQUFPLG1CQUFvQnZKLENBQUFBLENBQUFBLENBQUtuSSxFQUFLdVIsQ0FBZ0IsQ0FBQSxDQUNuRixPQUFBcEosQ0FBSSxDQUFBLElBQUEsQ0FBS2lLLEVBQU0sQ0FDUmxDLENBQUFBLENBQ1QsQ0FhQSxTQUFTLHVCQUFBLENBQXdCbFEsRUFBSytSLENBQWMsQ0FBQSxDQUNsRCxJQUFNNUosQ0FBTTRKLENBQUFBLENBQUFBLENBQWEsSUFLckJNLENBQWtCLENBQUEsSUFBQSxDQUNsQkMsRUFBa0IsSUFhdEIsQ0FBQSxHQVpJLFVBQVVuSyxDQUFLLENBQUEsV0FBVyxHQUM1QmtLLENBQWtCbEssQ0FBQUEsQ0FBQUEsQ0FBSSxrQkFBa0IsU0FBUyxDQUFBLENBQ2pEbUssRUFBa0IsTUFDVCxFQUFBLFNBQUEsQ0FBVW5LLEVBQUssZUFBZSxDQUFBLEVBQ3ZDa0ssRUFBa0JsSyxDQUFJLENBQUEsaUJBQUEsQ0FBa0IsYUFBYSxDQUFBLENBQ3JEbUssQ0FBa0IsQ0FBQSxNQUFBLEVBQ1QsVUFBVW5LLENBQUssQ0FBQSxrQkFBa0IsSUFDMUNrSyxDQUFrQmxLLENBQUFBLENBQUFBLENBQUksa0JBQWtCLGdCQUFnQixDQUFBLENBQ3hEbUssRUFBa0IsU0FJaEJELENBQUFBLENBQUFBLENBQUFBLENBQ0YsT0FBSUEsQ0FBb0IsR0FBQSxPQUFBLENBQ2YsRUFFQSxDQUFBLENBQ0wsS0FBTUMsQ0FDTixDQUFBLElBQUEsQ0FBTUQsQ0FDUixDQU9KLENBQUEsSUFBTUUsRUFBY1IsQ0FBYSxDQUFBLFFBQUEsQ0FBUyxpQkFDcENTLENBQWVULENBQUFBLENBQUFBLENBQWEsU0FBUyxZQUVyQ1UsQ0FBQUEsQ0FBQUEsQ0FBVSx5QkFBeUJ6UyxDQUFLLENBQUEsYUFBYSxFQUNyRDBTLENBQWEsQ0FBQSx3QkFBQSxDQUF5QjFTLEVBQUssZ0JBQWdCLENBQUEsQ0FDM0QyUyxFQUFtQixlQUFnQjNTLENBQUFBLENBQUcsRUFBRSxPQUUxQzRTLENBQUFBLENBQUFBLENBQVcsS0FDWHpQLENBQU8sQ0FBQSxJQUFBLENBYVgsT0FYSXNQLENBQ0ZHLEVBQUFBLENBQUFBLENBQVcsT0FDWHpQLENBQU9zUCxDQUFBQSxDQUFBQSxFQUNFQyxHQUNURSxDQUFXLENBQUEsU0FBQSxDQUNYelAsRUFBT3VQLENBQ0VDLEVBQUFBLENBQUFBLEdBQ1RDLEVBQVcsTUFDWHpQLENBQUFBLENBQUFBLENBQU9xUCxHQUFnQkQsQ0FHckJwUCxDQUFBQSxDQUFBQSxDQUFBQSxDQUVFQSxJQUFTLE9BQ0osQ0FBQSxJQUlMQSxDQUFTLEdBQUEsTUFBQSxHQUNYQSxFQUFPcVAsQ0FBZ0JELEVBQUFBLENBQUFBLENBQUFBLENBSXJCUixFQUFhLFFBQVMsQ0FBQSxNQUFBLEVBQVU1TyxFQUFLLE9BQVEsQ0FBQSxHQUFHLElBQU0sQ0FDeERBLENBQUFBLEdBQUFBLENBQUFBLENBQU9BLEVBQU8sR0FBTTRPLENBQUFBLENBQUFBLENBQWEsU0FBUyxNQUdyQyxDQUFBLENBQUEsQ0FDTCxJQUFNYSxDQUFBQSxDQUFBQSxDQUNOLElBQUF6UCxDQUFBQSxDQUNGLEdBRU8sRUFFWCxDQU9BLFNBQVMsV0FBQSxDQUFZMFAsRUFBd0JDLENBQVEsQ0FBQSxDQUNuRCxJQUFJQyxDQUFTLENBQUEsSUFBSSxPQUFPRixDQUF1QixDQUFBLElBQUksRUFDbkQsT0FBT0UsQ0FBQUEsQ0FBTyxLQUFLRCxDQUFPLENBQUEsUUFBQSxDQUFTLEVBQUUsQ0FBQyxDQUN4QyxDQU1BLFNBQVMsdUJBQUEsQ0FBd0IzSyxFQUFLLENBQ3BDLElBQUEsSUFBUzdGLEVBQUksQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSSxLQUFLLE1BQU8sQ0FBQSxnQkFBQSxDQUFpQixPQUFRQSxDQUFLLEVBQUEsQ0FBQSxDQUU1RCxJQUFJMFEsQ0FBMEIsQ0FBQSxJQUFBLENBQUssT0FBTyxnQkFBaUIxUSxDQUFBQSxDQUFDLENBQzVELENBQUEsR0FBSSxXQUFZMFEsQ0FBQUEsQ0FBQUEsQ0FBeUI3SyxFQUFJLE1BQU0sQ0FBQSxDQUNqRCxPQUFPNkssQ0FFWCxDQUVBLE9BQU8sQ0FDTCxJQUFBLENBQU0sRUFDUixDQUNGLENBS0EsU0FBUyxXQUFZaEgsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUMxQixHQUFJQSxDQUFBQSxDQUFPLENBQ1QsSUFBTWlILENBQUFBLENBQVcsS0FBSyxPQUFPLENBQUEsQ0FDekJBLEVBQ0ZBLENBQVMsQ0FBQSxTQUFBLENBQVlqSCxFQUVyQixNQUFPLENBQUEsUUFBQSxDQUFTLE1BQVFBLEVBRTVCLENBQ0YsQ0FNQSxTQUFTLGtCQUFBLENBQW1CaE0sRUFBSytSLENBQWMsQ0FBQSxDQUM3QyxJQUFNNUosQ0FBTTRKLENBQUFBLENBQUFBLENBQWEsSUFDckI5TSxDQUFTOE0sQ0FBQUEsQ0FBQUEsQ0FBYSxNQUNwQmpDLENBQUFBLENBQUFBLENBQU1pQyxDQUFhLENBQUEsR0FBQSxDQUNuQm1CLEVBQXFCbkIsQ0FBYSxDQUFBLE1BQUEsQ0FFeEMsR0FBSSxDQUFDLFlBQUEsQ0FBYS9SLEVBQUssbUJBQXFCK1IsQ0FBQUEsQ0FBWSxFQUFHLE9BTTNELEdBSkksVUFBVTVKLENBQUssQ0FBQSxjQUFjLEdBQy9CLG1CQUFvQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxhQUFjbkksQ0FBRyxDQUFBLENBR3hDLFVBQVVtSSxDQUFLLENBQUEsZUFBZSxFQUFHLENBQ25DLHdCQUFBLEdBQ0EsSUFBSWdMLENBQUFBLENBQWVoTCxFQUFJLGlCQUFrQixDQUFBLGFBQWEsRUFFdEQsSUFBSWlMLENBQUFBLENBQ0FELEVBQWEsT0FBUSxDQUFBLEdBQUcsSUFBTSxDQUNoQ0MsR0FBQUEsQ0FBQUEsQ0FBbUIsVUFBVUQsQ0FBWSxDQUFBLENBRXpDQSxFQUFlQyxDQUFpQixDQUFBLElBQUEsQ0FDaEMsT0FBT0EsQ0FBaUIsQ0FBQSxJQUFBLENBQUEsQ0FFMUIsV0FBVyxLQUFPRCxDQUFBQSxDQUFBQSxDQUFjQyxDQUFnQixDQUFFLENBQUEsSUFBQSxDQUFLLFVBQVcsQ0FDaEUsa0JBQUEsQ0FBbUJELENBQVksRUFDakMsQ0FBQyxFQUNELE1BQ0YsQ0FFQSxJQUFNRSxDQUFnQixDQUFBLFNBQUEsQ0FBVWxMLEVBQUssY0FBYyxDQUFBLEVBQUtBLEVBQUksaUJBQWtCLENBQUEsWUFBWSxJQUFNLE1BRWhHLENBQUEsR0FBSSxVQUFVQSxDQUFLLENBQUEsZUFBZSxFQUFHLENBQ25DNEosQ0FBQUEsQ0FBYSxlQUFpQixDQUM5QixDQUFBLENBQUEsUUFBQSxDQUFTLEtBQU81SixDQUFJLENBQUEsaUJBQUEsQ0FBa0IsYUFBYSxDQUNuRGtMLENBQUFBLENBQUFBLEVBQWlCLFFBQVMsQ0FBQSxNQUFBLEVBQzFCLENBQUEsTUFDRixDQUVBLEdBQUlBLENBQUFBLENBQWUsQ0FDakJ0QixDQUFhLENBQUEsY0FBQSxDQUFpQixHQUM5QixRQUFTLENBQUEsTUFBQSxHQUNULE1BQ0YsQ0FFSSxVQUFVNUosQ0FBSyxDQUFBLGVBQWUsSUFDNUJBLENBQUksQ0FBQSxpQkFBQSxDQUFrQixhQUFhLENBQU0sR0FBQSxNQUFBLENBQzNDNEosRUFBYSxNQUFTL1IsQ0FBQUEsQ0FBQUEsQ0FFdEIrUixFQUFhLE1BQVMsQ0FBQSxTQUFBLENBQVUsaUJBQWlCL1IsQ0FBS21JLENBQUFBLENBQUFBLENBQUksa0JBQWtCLGFBQWEsQ0FBQyxDQUFDLENBSS9GLENBQUEsQ0FBQSxJQUFNbUwsRUFBZ0IsdUJBQXdCdFQsQ0FBQUEsQ0FBQUEsQ0FBSytSLENBQVksQ0FFekR3QixDQUFBQSxDQUFBQSxDQUFtQix3QkFBd0JwTCxDQUFHLENBQUEsQ0FDOUNxTCxFQUFhRCxDQUFpQixDQUFBLElBQUEsQ0FDaENFLEVBQVUsQ0FBQyxDQUFDRixFQUFpQixLQUM3QkcsQ0FBQUEsQ0FBQUEsQ0FBYyxLQUFLLE1BQU8sQ0FBQSxXQUFBLEVBQWVILEVBQWlCLFdBQzFESSxDQUFBQSxDQUFBQSxDQUFpQkosRUFBaUIsTUFDbENBLENBQUFBLENBQUFBLENBQWlCLFNBQ25CeEIsQ0FBYSxDQUFBLE1BQUEsQ0FBUyxVQUFVLGdCQUFpQi9SLENBQUFBLENBQUFBLENBQUt1VCxFQUFpQixNQUFNLENBQUMsR0FFaEYsSUFBSUssQ0FBQUEsQ0FBZTlELEVBQUksWUFDbkI4RCxDQUFBQSxDQUFBQSxFQUFnQixNQUFRTCxDQUFpQixDQUFBLFlBQUEsR0FDM0NLLEVBQWVMLENBQWlCLENBQUEsWUFBQSxDQUFBLENBSTlCLFVBQVVwTCxDQUFLLENBQUEsZUFBZSxJQUM1QkEsQ0FBSSxDQUFBLGlCQUFBLENBQWtCLGFBQWEsQ0FBTSxHQUFBLE1BQUEsQ0FDM0M0SixDQUFhLENBQUEsTUFBQSxDQUFTL1IsQ0FFdEIrUixDQUFBQSxDQUFBQSxDQUFhLE9BQVMsU0FBVSxDQUFBLGdCQUFBLENBQWlCL1IsRUFBS21JLENBQUksQ0FBQSxpQkFBQSxDQUFrQixhQUFhLENBQUMsQ0FBQyxHQUczRixTQUFVQSxDQUFBQSxDQUFBQSxDQUFLLGFBQWEsQ0FDOUJ5TCxHQUFBQSxDQUFBQSxDQUFlekwsRUFBSSxpQkFBa0IsQ0FBQSxXQUFXLEdBR2xELElBQUkwTCxDQUFBQSxDQUFpQjFMLEVBQUksUUFFckIxQyxDQUFBQSxDQUFBQSxDQUFvQixhQUFhLENBQ25DLFVBQUEsQ0FBQStOLEVBQ0EsY0FBQUssQ0FBQUEsQ0FBQUEsQ0FDQSxRQUFBSixDQUNBLENBQUEsV0FBQSxDQUFBQyxFQUNBLGNBQUFDLENBQUFBLENBQ0YsRUFBRzVCLENBQVksQ0FBQSxDQUVmLEdBQUksRUFBQXdCLENBQUFBLENBQWlCLE9BQVMsQ0FBQyxZQUFBLENBQWF0TyxFQUFRc08sQ0FBaUIsQ0FBQSxLQUFBLENBQU85TixDQUFpQixDQUV4RixDQUFBLEVBQUEsWUFBQSxDQUFhUixFQUFRLGlCQUFtQlEsQ0FBQUEsQ0FBaUIsRUFZOUQsQ0FWQVIsR0FBQUEsQ0FBQUEsQ0FBU1EsRUFBa0IsTUFDM0JvTyxDQUFBQSxDQUFBQSxDQUFpQnBPLEVBQWtCLGNBQ25DZ08sQ0FBQUEsQ0FBQUEsQ0FBVWhPLEVBQWtCLE9BQzVCaU8sQ0FBQUEsQ0FBQUEsQ0FBY2pPLEVBQWtCLFdBQ2hDa08sQ0FBQUEsQ0FBQUEsQ0FBaUJsTyxFQUFrQixjQUVuQ3NNLENBQUFBLENBQUFBLENBQWEsT0FBUzlNLENBQ3RCOE0sQ0FBQUEsQ0FBQUEsQ0FBYSxPQUFTMEIsQ0FDdEIxQixDQUFBQSxDQUFBQSxDQUFhLFdBQWEsQ0FBQzBCLENBQUFBLENBRXZCaE8sRUFBa0IsVUFBWSxDQUFBLENBQzVCMEMsRUFBSSxNQUFXLEdBQUEsR0FBQSxFQUNqQixjQUFjbkksQ0FBRyxDQUFBLENBR25CLGVBQWVBLENBQUssQ0FBQSxTQUFTbUYsQ0FBVyxDQUFBLENBQ3RDME8sQ0FBaUIxTyxDQUFBQSxDQUFBQSxDQUFVLGtCQUFrQjBPLENBQWdCMUwsQ0FBQUEsQ0FBQUEsQ0FBS25JLENBQUcsRUFDdkUsQ0FBQyxFQUdHc1QsQ0FBYyxDQUFBLElBQUEsRUFDaEIsMEJBR0UsQ0FBQSxTQUFBLENBQVVuTCxFQUFLLGFBQWEsQ0FBQSxHQUM5QnlMLEVBQWV6TCxDQUFJLENBQUEsaUJBQUEsQ0FBa0IsV0FBVyxDQUVsRCxDQUFBLENBQUEsSUFBSWIsRUFBVyxvQkFBcUJ0SCxDQUFBQSxDQUFBQSxDQUFLNFQsQ0FBWSxDQUVoRHRNLENBQUFBLENBQUFBLENBQVMsZUFBZSxhQUFhLENBQUEsR0FDeENBLEVBQVMsV0FBY29NLENBQUFBLENBQUFBLENBQUFBLENBR3pCek8sRUFBTyxTQUFVLENBQUEsR0FBQSxDQUFJLEtBQUssTUFBTyxDQUFBLGFBQWEsRUFHOUMsSUFBSTZPLENBQUFBLENBQWdCLEtBQ2hCQyxDQUFlLENBQUEsSUFBQSxDQUVmYixDQUNGUyxHQUFBQSxDQUFBQSxDQUFpQlQsQ0FHZixDQUFBLENBQUEsU0FBQSxDQUFVL0ssRUFBSyxlQUFlLENBQUEsR0FDaEN3TCxFQUFpQnhMLENBQUksQ0FBQSxpQkFBQSxDQUFrQixhQUFhLENBR3RELENBQUEsQ0FBQSxJQUFNNkwsRUFBWSx3QkFBeUJoVSxDQUFBQSxDQUFBQSxDQUFLLGVBQWUsQ0FDekRzUSxDQUFBQSxDQUFBQSxDQUFTLHlCQUF5QnRRLENBQUssQ0FBQSxXQUFXLEVBRXBEaVUsQ0FBUyxDQUFBLFVBQVcsQ0FDdEIsR0FBSSxDQUVFWCxFQUFjLElBQ2hCLEdBQUEsWUFBQSxDQUFhLGFBQWMsQ0FBQSxJQUFBLENBQU0sMkJBQTRCLFlBQWEsQ0FBQSxDQUFFLFFBQVNBLENBQWMsQ0FBQSxDQUFHdkIsQ0FBWSxDQUFDLENBQUEsQ0FDL0d1QixFQUFjLElBQVMsR0FBQSxNQUFBLEVBQ3pCLG1CQUFtQkEsQ0FBYyxDQUFBLElBQUksQ0FDckMsQ0FBQSxZQUFBLENBQWEsV0FBWSxFQUFBLENBQUUsS0FBTSx3QkFBMEIsQ0FBQSxDQUFFLEtBQU1BLENBQWMsQ0FBQSxJQUFLLENBQUMsQ0FFdkYsR0FBQSxtQkFBQSxDQUFvQkEsRUFBYyxJQUFJLENBQUEsQ0FDdEMsYUFBYSxXQUFZLEVBQUEsQ0FBRSxLQUFNLHdCQUEwQixDQUFBLENBQUUsS0FBTUEsQ0FBYyxDQUFBLElBQUssQ0FBQyxDQUkzRixDQUFBLENBQUEsQ0FBQSxJQUFBLENBQUtyTyxFQUFRNE8sQ0FBZ0J2TSxDQUFBQSxDQUFBQSxDQUFVLENBQ3JDLE1BQVFxTSxDQUFBQSxDQUFBQSxFQUFrQnJELEVBQzFCLFNBQUEwRCxDQUFBQSxDQUFBQSxDQUNBLFVBQVdqQyxDQUNYLENBQUEsTUFBQSxDQUFRQSxFQUFhLFFBQVMsQ0FBQSxNQUFBLENBQzlCLGVBQWdCL1IsQ0FDaEIsQ0FBQSxpQkFBQSxDQUFtQixVQUFXLENBQzVCLEdBQUksVUFBVW1JLENBQUssQ0FBQSx5QkFBeUIsRUFBRyxDQUM3QyxJQUFJK0wsRUFBV2xVLENBQ1YsQ0FBQSxZQUFBLENBQWFBLENBQUcsQ0FDbkJrVSxHQUFBQSxDQUFBQSxDQUFXLGFBQWMsQ0FBQSxJQUFBLENBQUEsQ0FFM0Isb0JBQW9CL0wsQ0FBSyxDQUFBLHVCQUFBLENBQXlCK0wsQ0FBUSxFQUM1RCxDQUNGLEVBQ0EsbUJBQXFCLENBQUEsVUFBVyxDQUM5QixHQUFJLFNBQUEsQ0FBVS9MLEVBQUssMkJBQTJCLENBQUEsQ0FBRyxDQUMvQyxJQUFJK0wsQ0FBQUEsQ0FBV2xVLEVBQ1YsWUFBYUEsQ0FBQUEsQ0FBRyxJQUNuQmtVLENBQVcsQ0FBQSxXQUFBLEdBQWMsSUFFM0IsQ0FBQSxDQUFBLG1CQUFBLENBQW9CL0wsRUFBSyx5QkFBMkIrTCxDQUFBQSxDQUFRLEVBQzlELENBQ0EsU0FBQSxDQUFVSixDQUFhLEVBQ3pCLENBQ0YsQ0FBQyxFQUNILENBQVM1UyxNQUFBQSxDQUFBQSxDQUFHLENBQ1YsTUFBa0JsQixpQkFBQUEsQ0FBQUEsQ0FBQUEsQ0FBSyxpQkFBa0IrUixDQUFZLENBQUEsQ0FDckQsVUFBVWdDLENBQVksQ0FBQSxDQUNoQjdTLENBQ1IsQ0FDRixDQUFBLENBRUlpVCxFQUFtQixJQUFLLENBQUEsTUFBQSxDQUFPLHNCQUtuQyxHQUpJN00sQ0FBQUEsQ0FBUyxlQUFlLFlBQVksQ0FBQSxHQUN0QzZNLEVBQW1CN00sQ0FBUyxDQUFBLFVBQUEsQ0FBQSxDQUcxQjZNLEdBQ0ksWUFBYW5VLENBQUFBLENBQUFBLENBQUssd0JBQXlCK1IsQ0FBWSxDQUFBLEVBQ3ZELE9BQU8sT0FBWSxDQUFBLEdBQUEsRUFFbkIsU0FBUyxtQkFBcUIsQ0FBQSxDQUNwQyxJQUFNcUMsQ0FBZ0IsQ0FBQSxJQUFJLFFBQVEsU0FBU2pFLENBQUFBLENBQVVDLEVBQVMsQ0FDNUQwRCxDQUFBQSxDQUFnQjNELEVBQ2hCNEQsQ0FBZTNELENBQUFBLEVBQ2pCLENBQUMsQ0FFS2lFLENBQUFBLENBQUFBLENBQWNKLEVBQ3BCQSxDQUFTLENBQUEsVUFBVyxDQUVsQixRQUFTLENBQUEsbUJBQUEsQ0FBb0IsVUFBVyxDQUN0QyxPQUFBSSxHQUNPRCxDQUFBQSxDQUNULENBQUMsRUFDSCxFQUNGLENBRUk5TSxDQUFTLENBQUEsU0FBQSxDQUFZLEVBQ3ZCLFNBQVUsRUFBQSxDQUFFLFdBQVcyTSxDQUFRM00sQ0FBQUEsQ0FBQUEsQ0FBUyxTQUFTLENBRWpEMk0sQ0FBQUEsQ0FBQUEsR0FFSixDQUNJUixDQUFBQSxFQUNGLGtCQUFrQnpULENBQUssQ0FBQSxvQkFBQSxDQUFzQixhQUFhLENBQUUsS0FBQSxDQUFPLDhCQUFnQ21JLENBQUksQ0FBQSxNQUFBLENBQVMsUUFBVzRKLENBQUFBLENBQUFBLENBQWEsUUFBUyxDQUFBLFdBQVksRUFBR0EsQ0FBWSxDQUFDLEdBRWpMLENBT0EsSUFBTSxXQUFhLEVBQUMsQ0FNcEIsU0FBUyxhQUFnQixFQUFBLENBQ3ZCLE9BQU8sQ0FDTCxJQUFBLENBQU0sU0FBU3VDLENBQUssQ0FBQSxDQUFFLE9BQU8sSUFBSyxDQUFBLENBQ2xDLGFBQWMsVUFBVyxDQUFFLE9BQU8sSUFBSyxDQUFBLENBQ3ZDLFFBQVMsU0FBUy9ULENBQUFBLENBQU0rQyxFQUFLLENBQUUsT0FBTyxFQUFLLENBQzNDLENBQUEsaUJBQUEsQ0FBbUIsU0FBU2lSLENBQU1wTSxDQUFBQSxDQUFBQSxDQUFLbkksRUFBSyxDQUFFLE9BQU91VSxDQUFLLENBQzFELENBQUEsWUFBQSxDQUFjLFNBQVN2UCxDQUFXLENBQUEsQ0FBRSxPQUFPLENBQU0sQ0FBQSxDQUFBLENBQ2pELFdBQVksU0FBU0EsQ0FBQUEsQ0FBV0MsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFBQSxDQUFZLENBQUUsT0FBTyxDQUFBLENBQU0sRUFDN0UsZ0JBQWtCLENBQUEsU0FBUzZDLEVBQUtxTSxDQUFZeFUsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUFFLE9BQU8sSUFBSyxDQUNqRSxDQUNGLENBVUEsU0FBUyxlQUFnQk8sQ0FBQUEsQ0FBQUEsQ0FBTTRFLEVBQVcsQ0FDcENBLENBQUFBLENBQVUsTUFDWkEsQ0FBVSxDQUFBLElBQUEsQ0FBSyxXQUFXLENBRTVCLENBQUEsVUFBQSxDQUFXNUUsQ0FBSSxDQUFJLENBQUEsWUFBQSxDQUFhLGVBQWlCNEUsQ0FBQUEsQ0FBUyxFQUM1RCxDQVNBLFNBQVMsZUFBZ0I1RSxDQUFBQSxDQUFBQSxDQUFNLENBQzdCLE9BQU8sV0FBV0EsQ0FBSSxFQUN4QixDQVVBLFNBQVMsYUFBQSxDQUFjUCxFQUFLeVUsQ0FBb0JDLENBQUFBLENBQUFBLENBQW9CLENBSWxFLEdBSElELENBQUFBLEVBQXNCLE9BQ3hCQSxDQUFxQixDQUFBLElBRW5CelUsQ0FBTyxFQUFBLElBQUEsQ0FDVCxPQUFPeVUsQ0FFTEMsQ0FBQUEsQ0FBQUEsRUFBc0IsT0FDeEJBLENBQXFCLENBQUEsSUFFdkIsSUFBTUMsQ0FBQUEsQ0FBdUIsa0JBQWtCM1UsQ0FBSyxDQUFBLFFBQVEsRUFDNUQsT0FBSTJVLENBQUFBLEVBQ0YsUUFBUUEsQ0FBcUIsQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUFHLENBQUEsU0FBU0MsRUFBZSxDQUUvRCxHQURBQSxFQUFnQkEsQ0FBYyxDQUFBLE9BQUEsQ0FBUSxJQUFNLENBQUEsRUFBRSxDQUMxQ0EsQ0FBQUEsQ0FBQUEsQ0FBYyxNQUFNLENBQUcsQ0FBQSxDQUFDLEdBQUssU0FBVyxDQUFBLENBQzFDRixFQUFtQixJQUFLRSxDQUFBQSxDQUFBQSxDQUFjLE1BQU0sQ0FBQyxDQUFDLEVBQzlDLE1BQ0YsQ0FDQSxHQUFJRixDQUFtQixDQUFBLE9BQUEsQ0FBUUUsQ0FBYSxDQUFJLENBQUEsQ0FBQSxDQUFHLENBQ2pELElBQU16UCxDQUFBQSxDQUFZLFdBQVd5UCxDQUFhLENBQUEsQ0FDdEN6UCxHQUFhc1AsQ0FBbUIsQ0FBQSxPQUFBLENBQVF0UCxDQUFTLENBQUksQ0FBQSxDQUFBLEVBQ3ZEc1AsRUFBbUIsSUFBS3RQLENBQUFBLENBQVMsRUFFckMsQ0FDRixDQUFDLEVBRUksYUFBYyxDQUFBLFNBQUEsQ0FBVSxVQUFVbkYsQ0FBRyxDQUFDLENBQUd5VSxDQUFBQSxDQUFBQSxDQUFvQkMsQ0FBa0IsQ0FDeEYsQ0FLQSxJQUFJLE9BQUEsQ0FBVSxHQUNkLFdBQVksRUFBQSxDQUFFLGlCQUFpQixrQkFBb0IsQ0FBQSxVQUFXLENBQzVELE9BQVUsQ0FBQSxDQUFBLEVBQ1osQ0FBQyxDQVNELENBQUEsU0FBUyxNQUFNRyxDQUFJLENBQUEsQ0FHYixTQUFXLFdBQVksRUFBQSxDQUFFLGFBQWUsVUFDMUNBLENBQUFBLENBQUFBLEdBRUEsV0FBWSxFQUFBLENBQUUsaUJBQWlCLGtCQUFvQkEsQ0FBQUEsQ0FBRSxFQUV6RCxDQUVBLFNBQVMsdUJBQXdCLENBQy9CLEdBQUksS0FBSyxNQUFPLENBQUEsc0JBQUEsR0FBMkIsR0FBTyxDQUNoRCxJQUFNQyxFQUFpQixJQUFLLENBQUEsTUFBQSxDQUFPLGlCQUFtQixDQUFXLFFBQUEsRUFBQSxJQUFBLENBQUssT0FBTyxnQkFBZ0IsQ0FBQSxDQUFBLENBQUEsQ0FBTSxHQUNuRyxXQUFZLEVBQUEsQ0FBRSxLQUFLLGtCQUFtQixDQUFBLFdBQUEsQ0FDcEMsU0FBV0EsQ0FBaUIsQ0FBQSxVQUFBLENBQ3pCLEtBQUssTUFBTyxDQUFBLGNBQUEsQ0FBaUIscUJBQzdCLElBQUssQ0FBQSxNQUFBLENBQU8sYUFBZSxJQUFPLENBQUEsSUFBQSxDQUFLLE9BQU8sY0FBaUIsQ0FBQSx3REFBQSxDQUMvRCxLQUFLLE1BQU8sQ0FBQSxZQUFBLENBQWUsSUFBTSxJQUFLLENBQUEsTUFBQSxDQUFPLGVBQWlCLCtEQUMxRCxFQUNYLENBQ0YsQ0FFQSxTQUFTLGVBQWdCLENBRXZCLElBQU1sTyxFQUFVLFdBQVksRUFBQSxDQUFFLGNBQWMsMEJBQTBCLENBQUEsQ0FDdEUsT0FBSUEsQ0FBQUEsQ0FDSyxTQUFVQSxDQUFBQSxDQUFBQSxDQUFRLE9BQU8sQ0FFekIsQ0FBQSxJQUVYLENBRUEsU0FBUyxlQUFBLEVBQWtCLENBQ3pCLElBQU1tTyxDQUFBQSxDQUFhLGVBQ2ZBLENBQUFBLENBQUFBLEdBQ0YsS0FBSyxNQUFTLENBQUEsWUFBQSxDQUFhLEtBQUssTUFBUUEsQ0FBQUEsQ0FBVSxHQUV0RCxDQUdBLE9BQUEsS0FBQSxDQUFNLFVBQVcsQ0FDZixlQUFBLEdBQ0EscUJBQXNCLEVBQUEsQ0FDdEIsSUFBSUMsQ0FBTyxDQUFBLFdBQUEsR0FBYyxJQUN6QixDQUFBLFdBQUEsQ0FBWUEsQ0FBSSxDQUNoQixDQUFBLElBQU1DLEVBQWUsV0FBWSxFQUFBLENBQUUsaUJBQ2pDLHNEQUNGLENBQUEsQ0FDQUQsRUFBSyxnQkFBaUIsQ0FBQSxZQUFBLENBQWMsU0FBUzFSLENBQUssQ0FBQSxDQUNoRCxJQUFNMkIsQ0FBUzNCLENBQUFBLENBQUFBLENBQUksT0FDYm9ELENBQWUsQ0FBQSxlQUFBLENBQWdCekIsQ0FBTSxDQUN2Q3lCLENBQUFBLENBQUFBLEVBQWdCQSxFQUFhLEdBQy9CQSxFQUFBQSxDQUFBQSxDQUFhLElBQUksS0FBTSxHQUUzQixDQUFDLENBRUQsQ0FBQSxJQUFNd08sRUFBbUIsTUFBTyxDQUFBLFVBQUEsQ0FBYSxPQUFPLFVBQVcsQ0FBQSxJQUFBLENBQUssTUFBTSxDQUFJLENBQUEsSUFBQSxDQUU5RSxPQUFPLFVBQWEsQ0FBQSxTQUFTM1IsRUFBTyxDQUM5QkEsQ0FBQUEsQ0FBTSxPQUFTQSxDQUFNLENBQUEsS0FBQSxDQUFNLE1BQzdCLGNBQWUsRUFBQSxDQUNmLFFBQVEwUixDQUFjLENBQUEsU0FBU2pWLEVBQUssQ0FDbEMsWUFBQSxDQUFhQSxDQUFLLENBQUEsZUFBQSxDQUFpQixDQUNqQyxRQUFBLENBQVUsYUFDVixDQUFBLFlBQ0YsQ0FBQyxFQUNILENBQUMsR0FFR2tWLENBQ0ZBLEVBQUFBLENBQUFBLENBQWlCM1IsQ0FBSyxFQUc1QixDQUFBLENBQ0EsV0FBWSxDQUFBLFVBQUEsQ0FBVyxVQUFXLENBQ2hDLFlBQUEsQ0FBYXlSLEVBQU0sV0FBYSxDQUFBLEVBQUUsQ0FDbENBLENBQUFBLENBQUFBLENBQU8sS0FDVCxDQUFHLENBQUEsQ0FBQyxFQUNOLENBQUMsQ0FBQSxDQUVNLElBQ1QsQ0FBRyxFQUFBLENBZ0xJRyxFQUFRcFYsRUNoaUtmLENBQUEsU0FBU3FWLEdBQVVDLENBQWVqUyxDQUFBQSxDQUFBQSxDQUFhLENBQzdDLEdBQUlpUyxDQUFBQSxHQUFhLFNBQ2YsT0FBTyxDQUFBLENBQUEsQ0FFVCxJQUFNQyxDQUFpQkQsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFNLEdBQUcsQ0FBQSxDQUNuQ0UsRUFBVW5TLENBQUksQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUM3QixDQUFBLElBQUEsSUFBU2QsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJaVQsRUFBUSxNQUFRalQsQ0FBQUEsQ0FBQUEsRUFBQUEsQ0FBSyxDQUN2QyxJQUFNa1QsQ0FBQUEsQ0FBb0JGLEVBQWUsS0FBTSxFQUFBLENBQ3pDRyxFQUFjRixDQUFRalQsQ0FBQUEsQ0FBQyxFQUM3QixHQUFJa1QsQ0FBQUEsR0FBc0JDLEdBQWVELENBQXNCLEdBQUEsR0FBQSxDQUM3RCxPQUFPLENBRVQsQ0FBQSxDQUFBLEdBQ0VGLEVBQWUsTUFBVyxHQUFBLENBQUEsRUFDekJBLEVBQWUsTUFBVyxHQUFBLENBQUEsRUFBS0EsRUFBZSxDQUFDLENBQUEsR0FBTSxHQUV0RCxPQUFPLENBQUEsQ0FFWCxDQUNBLE9BQU8sQ0FDVCxDQUFBLENBRUEsU0FBU0ksRUFBWXZTLENBQUFBLENBQUFBLENBQWMsQ0FDakMsSUFBTXdTLENBQUFBLENBQWVSLEVBQUssT0FBUSxDQUFBLGFBQWEsRUFDL0MsSUFBUzdTLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSXFULENBQUFBLENBQUFBLENBQWEsT0FBUXJULENBQUssRUFBQSxDQUFBLENBQzVDLElBQU10QyxDQUFNMlYsQ0FBQUEsQ0FBQUEsQ0FBYXJULENBQUMsQ0FDdEI4UyxDQUFBQSxFQUFBQSxDQUFVcFYsRUFBSSxZQUFhLENBQUEsV0FBVyxFQUFHbUQsQ0FBSSxDQUFBLEVBQy9DZ1MsRUFBSyxPQUFRblYsQ0FBQUEsQ0FBQUEsQ0FBSyxZQUFhLElBQUksRUFFdkMsQ0FDRixDQUVBbVYsQ0FBQUEsQ0FBSyxnQkFBZ0IsV0FBYSxDQUFBLENBRWhDLFFBQVMsU0FBVTVVLENBQUFBLENBQU0rQyxDQUFLLENBQUEsQ0FDNUIsR0FBSSxFQUFFQSxhQUFlLFdBQ25CLENBQUEsQ0FBQSxPQUFPLEdBRVQsR0FBSS9DLENBQUFBLEdBQVMsb0JBQXFCLENBQ2hDLElBQU1xVixFQUFTdFMsQ0FBSSxDQUFBLE1BQUEsQ0FBTyxjQUd4QnNTLENBQ0FBLEVBQUFBLENBQUFBLENBQU8sT0FBUyxLQUNoQnRTLEVBQUFBLENBQUFBLENBQUksUUFBVSxJQUNkQSxFQUFBQSxDQUFBQSxDQUFJLGtCQUFrQixPQUN0QkEsRUFBQUEsQ0FBQUEsQ0FBSSxPQUFPLFlBQWEsQ0FBQSxXQUFXLElBQU0sUUFFekNvUyxFQUFBQSxFQUFBQSxDQUFZRSxFQUFPLElBQUksRUFFM0IsQ0FDRixDQUNGLENBQUMsRUNwREQsU0FBU0MsRUFBQUEsQ0FBZXhWLEVBQWEsQ0FDakMsT0FBT0EsRUFBSSxPQUFRLENBQUEsb0JBQUEsQ0FBc0IsT0FBTyxDQUFBLENBQUUsV0FBWSxFQUNsRSxDQUVBLElBQU15VixFQUFBQSxDQUFnQixDQUFDLHdCQUEwQixDQUFBLHVCQUFBLENBQXlCLGtCQUFtQixnQkFBa0IsQ0FBQSxtQkFBQSxDQUFxQixtQkFBb0Isb0JBQXNCLENBQUEscUJBQUEsQ0FBdUIsb0JBQW9CLENBRXpOLENBQUEsU0FBU0MsR0FBVXhOLENBQW1CQyxDQUFBQSxDQUFBQSxDQUFhLENBQy9DLElBQUlsRixDQUFBQSxDQUNKLE9BQUksTUFBTyxDQUFBLFdBQUEsRUFBZSxPQUFPLE1BQU8sQ0FBQSxXQUFBLEVBQWdCLFdBRXBEQSxDQUFNLENBQUEsSUFBSSxZQUFZaUYsQ0FBVyxDQUFBLENBQUUsUUFBUyxDQUFPLENBQUEsQ0FBQSxVQUFBLENBQVksR0FBTSxRQUFVLENBQUEsQ0FBQSxDQUFBLENBQU0sT0FBQUMsQ0FBTyxDQUFDLEdBRTdGbEYsQ0FBTSxDQUFBLFFBQUEsQ0FBUyxZQUFZLGFBQWEsQ0FBQSxDQUN4Q0EsRUFBSSxlQUFnQmlGLENBQUFBLENBQUFBLENBQVcsR0FBTSxDQUFNQyxDQUFBQSxDQUFBQSxDQUFNLEdBRTlDbEYsQ0FDWCxDQUVBLFNBQVMwUyxDQUFnQi9RLENBQUFBLENBQUFBLENBQXFCMUUsRUFBY2dELENBQW9CMFMsQ0FBQUEsQ0FBQUEsQ0FBNkIsQ0FDdEdILEVBQWMsQ0FBQSxRQUFBLENBQVN2VixDQUFJLENBRzFCMEUsRUFBQUEsQ0FBQUEsRUFBVUEsRUFBTyxRQUNqQixFQUFBLEtBQUEsQ0FBTSxLQUFLQSxDQUFPLENBQUEsUUFBUSxFQUFFLE9BQVMvRCxDQUFBQSxDQUFBQSxFQUFNLENBRXZDLElBQU1xSCxDQUFBQSxDQURRc04sR0FBZXRWLENBQUksQ0FBQSxDQUNULFFBQVEsT0FBUyxDQUFBLFNBQVMsRUFDbEQsR0FBSSxDQUFDMFYsRUFBVSxHQUFJL1UsQ0FBQUEsQ0FBZ0IsQ0FBRyxDQUFBLENBQ2xDLEdBQUdBLENBQUFBLENBQUUsYUFBYXFILENBQVMsQ0FBQSxDQUFHLENBQzFCLElBQU0yTixDQUFBQSxDQUFXSCxHQUFVeE4sQ0FBVSxDQUFBLE9BQUEsQ0FBUSxVQUFXLE9BQU8sQ0FBQSxDQUFHLENBQzlELEdBQUdoRixDQUFBQSxDQUFNLE9BQ1QsTUFBUXJDLENBQUFBLENBQ1osQ0FBQyxDQUNEZ1YsQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFPLElBQU8sQ0FBQSxrQkFBQSxDQUN2QmhWLEVBQUUsYUFBY2dWLENBQUFBLENBQVEsRUFDeEJELENBQVUsQ0FBQSxHQUFBLENBQUkvVSxDQUFnQixFQUNsQyxDQUNJQSxFQUFFLFFBQ0Y4VSxFQUFBQSxDQUFBQSxDQUFnQjlVLEVBQWtCWCxDQUFNZ0QsQ0FBQUEsQ0FBQUEsQ0FBTzBTLENBQVMsRUFFaEUsQ0FDSixDQUFDLEVBRVQsQ0FJQWQsRUFBSyxlQUFnQixDQUFBLGtCQUFBLENBQW9CLENBQ3JDLE9BQVMsQ0FBQSxDQUFDNVUsRUFBTStDLENBQTZCLEdBQUEsQ0FJekMsR0FISSxFQUFFQSxDQUFBQSxZQUFlLGNBR2xCQSxDQUFJLENBQUEsTUFBQSxDQUFPLE9BQVMsa0JBQ25CLENBQUEsT0FBTyxHQUVYLElBQU0yUyxDQUFBQSxDQUFZLElBQUksR0FDaEJoUixDQUFBQSxDQUFBQSxDQUFTM0IsRUFBSSxNQUF5QkEsRUFBQUEsQ0FBQUEsQ0FBSSxPQUFPLE1BQ3ZELENBQUEsT0FBQTBTLEVBQWdCL1EsQ0FBUTFFLENBQUFBLENBQUFBLENBQU0rQyxFQUFLMlMsQ0FBUyxDQUFBLENBQ3JDLEVBQ1gsQ0FDSixDQUFDLEVDM0REZCxDQUFLLENBQUEsZUFBQSxDQUFnQixRQUFTLENBRTVCLE9BQUEsQ0FBUyxTQUFVNVUsQ0FBTStDLENBQUFBLENBQUFBLENBQUssQ0FDeEIsT0FBQSxDQUFRLEtBQ1YsQ0FBQSxPQUFBLENBQVEsTUFBTS9DLENBQU0rQyxDQUFBQSxDQUFHLEVBQ2QsT0FDVCxFQUFBLE9BQUEsQ0FBUSxJQUFJLFFBQVUvQyxDQUFBQSxDQUFBQSxDQUFNK0MsQ0FBRyxFQUluQyxDQUNGLENBQUMsQ0NaRCxDQUFBLElBQU1zUyxFQUFjVCxDQUFLLENBQUEsTUFBQSxDQUdyQmIsRUFFRTZCLEVBQWEsQ0FBQSxZQUFBLENBR25CLFNBQVNDLENBQVcvVixDQUFBQSxDQUFBQSxDQUFheUQsRUFBZ0IsQ0FDL0MsT0FBT3pELEVBQUksU0FBVSxDQUFBLENBQUEsQ0FBR3lELEVBQU8sTUFBTSxDQUFBLEdBQU1BLENBQzdDLENBT0EsU0FBU3VTLEdBQWtCclcsQ0FBY3NXLENBQUFBLENBQUFBLENBQXdCLENBQy9ELEdBQUksQ0FBQ3RXLEdBQU8sQ0FBQ3NXLENBQUFBLENBQWdCLE9BQU8sSUFFcEMsQ0FBQSxJQUFNQyxFQUFXRCxDQUFlLENBQUEsUUFBQSxHQVMxQkUsQ0FBb0IsQ0FBQSxDQUN4QkQsRUFFQUEsQ0FBUyxDQUFBLE1BQUEsQ0FBTyxFQUFHLENBQUMsQ0FBQSxDQUFJLElBQ3hCQSxDQUFTLENBQUEsTUFBQSxDQUFPLEVBQUcsQ0FBQyxDQUFBLENBQUksSUFFeEJBLENBQVMsQ0FBQSxNQUFBLENBQU8sRUFBRyxDQUFDLENBQUEsQ0FBSSxJQUN4QkEsQ0FBUyxDQUFBLE1BQUEsQ0FBTyxFQUFHLENBQUMsQ0FBQSxDQUFJLElBQ3hCQSxDQUFTLENBQUEsTUFBQSxDQUFPLEVBQUcsQ0FBQyxDQUFBLENBQUksS0FDeEJBLENBQVMsQ0FBQSxNQUFBLENBQU8sRUFBRyxDQUFDLENBQUEsQ0FBSSxLQUV4QixHQUNBLENBQUEsR0FBQSxDQUNBLEtBQ0EsQ0FBQSxLQUNGLENBQ0lILENBQUFBLENBQUFBLENBQUFBLENBQVdHLEVBQVUsR0FBRyxDQUFBLEVBQUtILEVBQVdHLENBQVUsQ0FBQSxHQUFHLElBQ3ZEQyxDQUFrQixDQUFBLElBQUEsQ0FBSyxPQUFPLENBR2hDLENBQUEsSUFBQSxJQUFTbFUsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJa1UsRUFBa0IsTUFBUWxVLENBQUFBLENBQUFBLEVBQUFBLENBQUssQ0FDakQsSUFBTVosQ0FBQUEsQ0FBT3lVLEdBQWFLLENBQWtCbFUsQ0FBQUEsQ0FBQyxFQUN2Q21VLENBQVluQyxDQUFBQSxDQUFBQSxDQUFJLHlCQUF5QnRVLENBQUswQixDQUFBQSxDQUFJLEVBQ3hELEdBQUkrVSxDQUFBQSxDQUNGLE9BQUlBLENBQWMsR0FBQSxNQUFBLENBQ1RuQyxFQUFJLGVBQWdCdFUsQ0FBQUEsQ0FBQUEsQ0FBSzBCLENBQUksQ0FFN0I0UyxDQUFBQSxDQUFBQSxDQUFJLGlCQUFpQnRVLENBQUt5VyxDQUFBQSxDQUFTLENBR2hELENBRUEsT0FBTyxJQUNULENBR0EsU0FBU0MsQ0FBQUEsQ0FBZ0JwVCxFQUFrQixDQUNyQ0EsQ0FBQUEsQ0FBSSxPQUFPLE9BQ1RzUyxDQUFBQSxDQUFBQSxDQUFPLDRCQUNUdFMsQ0FBSSxDQUFBLE1BQUEsQ0FBTyxRQUFVLENBRWRzUyxDQUFBQSxDQUFBQSxDQUFBQSxDQUFBQSxDQUFPLDBCQUNoQnRTLENBQUksQ0FBQSxNQUFBLENBQU8sUUFBVSxDQUV6QixDQUFBLEVBQUEsQ0FFQTZSLEVBQUssZUFBZ0IsQ0FBQSxrQkFBQSxDQUFvQixDQUV2QyxJQUFPd0IsQ0FBQUEsQ0FBQUEsRUFBVyxDQUNoQnJDLENBQU1xQyxDQUFBQSxDQUFBQSxDQUVGZixFQUFPLHlCQUE4QixHQUFBLEtBQUEsQ0FBQSxHQUN2Q0EsRUFBTyx5QkFBNEIsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUVqQ0EsRUFBTyx1QkFBNEIsR0FBQSxLQUFBLENBQUEsR0FDckNBLEVBQU8sdUJBQTBCLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FFL0JBLEVBQU8sNkJBQWtDLEdBQUEsS0FBQSxDQUFBLEdBQzNDQSxDQUFPLENBQUEsNkJBQUEsQ0FBZ0MsQ0FFckNBLENBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQU8sc0NBQXdDLEtBQ2pEQSxDQUFBQSxHQUFBQSxDQUFBQSxDQUFPLG9DQUFzQyxDQUVqRCxDQUFBLEVBQUEsQ0FBQSxDQUdBLFFBQVMsQ0FBQ3JWLENBQUFBLENBQU0rQyxJQUFRLENBQ3RCLEdBQUksRUFBRUEsQ0FBZSxZQUFBLFdBQUEsQ0FBQSxDQUNuQixPQUFPLENBRVQsQ0FBQSxDQUFBLEdBQ0UvQyxJQUFTLGlCQUNUK0MsRUFBQUEsQ0FBQUEsQ0FBSSxPQUFPLEdBQ1hBLEVBQUFBLENBQUFBLENBQUksT0FBTyxHQUFJLENBQUEsTUFBQSxHQUFXLElBQzFCLENBQ0EsR0FBSUEsRUFBSSxNQUFPLENBQUEsTUFBQSxHQUNUc1MsRUFBTyw2QkFNVEEsRUFBQUEsQ0FBQUEsQ0FBTyxxQ0FDUHRTLENBQUksQ0FBQSxNQUFBLENBQU8sSUFBSSxxQkFBc0IsRUFBQSxDQUFFLE1BQU0sZUFBZSxDQUFBLENBQUEsQ0FFNUQsT0FBQUEsQ0FBSSxDQUFBLE1BQUEsQ0FBTyxXQUFhLENBQ3hCb1QsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBZ0JwVCxDQUFHLENBQ1osQ0FBQSxDQUFBLENBQUEsQ0FHWCxHQUFJLENBQUNBLENBQUFBLENBQUksT0FBTyxhQUNkLENBQUEsT0FBTyxHQUVULElBQU0yQixDQUFBQSxDQUFTb1IsR0FDYi9TLENBQUksQ0FBQSxNQUFBLENBQU8sY0FBYyxHQUN6QkEsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPLEdBQUksQ0FBQSxNQUNqQixFQUNBLE9BQUkyQixDQUFBQSxHQUNGeVIsRUFBZ0JwVCxDQUFHLENBQUEsQ0FDbkJBLEVBQUksTUFBTyxDQUFBLFVBQUEsQ0FBYSxHQUN4QkEsQ0FBSSxDQUFBLE1BQUEsQ0FBTyxPQUFTMkIsQ0FFZixDQUFBLENBQUEsQ0FBQSxDQUNULENBQ0YsQ0FDRixDQUFDLEVDcklEa1EsQ0FBSyxDQUFBLGVBQUEsQ0FBZ0IsZ0JBQWtCLENBQUEsQ0FFckMsT0FBUyxDQUFBLENBQUM1VSxFQUFNK0MsQ0FBUSxHQUFBLENBQ3RCLEdBQUksRUFBRUEsQ0FBQUEsWUFBZSxhQUNuQixPQUFPLENBQUEsQ0FBQSxDQUVULEdBQUkvQyxDQUFTLEdBQUEsbUJBQUEsQ0FBcUIsQ0FDaEMsR0FBSSxDQUFDK0MsRUFBSSxNQUFVLEVBQUEsQ0FBQ0EsRUFBSSxNQUFPLENBQUEsR0FBQSxDQUM3QixPQUVGLElBQU13UCxDQUFBQSxDQUFTeFAsRUFBSSxNQUFPLENBQUEsR0FBQSxDQUFJLE9BQzFCd1AsQ0FBVSxFQUFBLEdBQUEsRUFDWnFDLEVBQUssT0FBUSxDQUFBLDZCQUE2QixFQUFFLE9BQVN2TyxDQUFBQSxDQUFBQSxFQUFZLENBQy9EdU8sQ0FBSyxDQUFBLE9BQUEsQ0FBUXZPLEVBQVMscUJBQXVCLENBQUEsQ0FBRSxPQUFBa00sQ0FBTyxDQUFDLEVBQ3pELENBQUMsRUFFTCxDQUNGLENBQ0YsQ0FBQyxFQ2xCRCxJQUFJOEQsQ0FBQUEsQ0FBYyxHQUVsQnpCLENBQUssQ0FBQSxlQUFBLENBQWdCLGFBQWMsQ0FDL0IsSUFBQSxDQUFNLFVBQVksQ0FFZCxJQUFJMEIsRUFBVSxDQUNkLENBQUEsQ0FBQSxJQUFBLElBQVdqUSxLQUFXLEtBQU0sQ0FBQSxJQUFBLENBQUt1TyxFQUFLLE9BQVEsQ0FBQSxVQUFVLENBQUMsQ0FFckQsQ0FBQSxHQURjdk8sRUFBUSxZQUFhLENBQUEsUUFBUSxHQUNqQyxLQUFNLENBQUEsR0FBRyxFQUFFLFFBQVMsQ0FBQSxZQUFZLEVBQUcsQ0FDekNpUSxDQUFBQSxDQUFVLEdBQ1YsS0FDSixDQUdKLEdBQUcsQ0FBQ0EsQ0FBQUEsQ0FDQSxPQUdKLE9BQUEsQ0FBUSxHQUFJLENBQUEsbUNBQW1DLEVBRS9DLElBQU1DLENBQUFBLENBQWMsSUFBSSxXQUFZLENBQUEsaUJBQWlCLEVBRXJEQSxDQUFZLENBQUEsU0FBQSxDQUFZLFNBQVN2VCxDQUFPLENBQUEsQ0FDcEMsSUFBTXdULENBQVV4VCxDQUFBQSxDQUFBQSxDQUFNLEtBRW5CcVQsQ0FBZ0IsR0FBQSxFQUFBLEdBQ2ZBLEVBQWNHLENBRWZILENBQUFBLENBQUFBLENBQUFBLEdBQWdCRyxJQUNmSCxDQUFjRyxDQUFBQSxDQUFBQSxDQUNkQyxJQUVSLEVBQUEsQ0FBQSxDQUVBRixFQUFZLE9BQVUsQ0FBQSxTQUFTN1QsRUFBTyxDQUNsQyxPQUFBLENBQVEsTUFBTSxvQkFBc0JBLENBQUFBLENBQUssRUFDN0MsRUFFSixDQUFBLENBRUEsUUFBUyxTQUFVMUMsQ0FBQUEsQ0FBTStDLEVBQUssRUFHbEMsQ0FBQyxDQUVELENBQUEsU0FBUzBULElBQVMsQ0FDZCxNQUFBLENBQU8sU0FBUyxNQUFPLEdBQzNCLENDL0NBLElBQU1DLEVBQUFBLENBQWUsa0NBRXJCOUIsQ0FBSyxDQUFBLGVBQUEsQ0FBZ0IsUUFBUyxDQUUxQixPQUFBLENBQVMsU0FBVTVVLENBQU0rQyxDQUFBQSxDQUFBQSxDQUFLLENBQ3hCL0MsQ0FBUyxHQUFBLDJCQUFBLEVBQStCK0MsRUFBSSxNQUMzQzRULEVBQUFBLENBQUFBLENBQXdCNVQsRUFBSSxNQUFxQixFQUV4RCxDQUNKLENBQUMsQ0FBQSxDQUVNLFNBQVM0VCxDQUF3QnRRLENBQUFBLENBQUFBLENBQXNCLENBQzNELElBQU1pRSxDQUFBQSxDQUFhLE1BQU0sSUFBS2pFLENBQUFBLENBQUFBLENBQVEsVUFBVSxDQUMvQyxDQUFBLElBQUEsSUFBU2pDLEtBQWFrRyxDQUFZLENBQUEsQ0FDL0IsSUFBTXNNLENBQUFBLENBQVV4UyxDQUFVLENBQUEsS0FBQSxDQUFNLE1BQU1zUyxFQUFhLENBQUEsRUFBSyxFQUN2RCxDQUFBLElBQUEsSUFBUzVWLEtBQVM4VixDQUFTLENBQUEsQ0FDdkIsSUFBTXhSLENBQUt0RSxDQUFBQSxDQUFBQSxDQUFNLFFBQVEsSUFBTSxDQUFBLEVBQUUsRUFBRSxPQUFRLENBQUEsUUFBQSxDQUFVLEVBQUUsQ0FBRSxDQUFBLE9BQUEsQ0FBUSxJQUFLLEVBQUUsQ0FBQSxDQUNsRStWLEVBQU0sUUFBUyxDQUFBLGNBQUEsQ0FBZXpSLENBQUUsQ0FDbkN5UixDQUFBQSxDQUFBQSxFQUFPQSxFQUFJLE9BQVksR0FBQSxRQUFBLEdBQ3RCLFFBQVEsS0FBTSxDQUFBLG9DQUFBLENBQXNDelIsQ0FBRSxDQUN0RHlSLENBQUFBLENBQUFBLENBQUksUUFFWixFQUFBLENBQ0osQ0FDSixDQ3ZCQSxJQUFJOUMsQ0FBWSxDQUFBLElBQUEsQ0FDWnJILENBQVksQ0FBQSxJQUFJLElBRXBCa0ksQ0FBSyxDQUFBLGVBQUEsQ0FBZ0IsTUFBTyxDQUN4QixJQUFBLENBQU0sU0FBVXdCLENBQVEsQ0FBQSxDQUNwQnJDLEVBQU1xQyxFQUNWLENBQUEsQ0FFQSxRQUFTLFNBQVVwVyxDQUFBQSxDQUFNK0MsRUFBSyxDQUMxQixJQUFNMkIsRUFBUzNCLENBQUksQ0FBQSxNQUFBLENBQ25CLEdBQUsyQixDQUFrQixZQUFBLFdBQUEsR0FJcEIxRSxJQUFTLDJCQUNSMlcsRUFBQUEsQ0FBQUEsQ0FBd0JqUyxDQUFNLENBRy9CMUUsQ0FBQUEsQ0FBQUEsR0FBUywwQkFBMEIsQ0FDbEMsSUFBTXVLLEVBQVcsUUFBUyxDQUFBLGdCQUFBLENBQWlCLGVBQWUsQ0FDMUQsQ0FBQSxJQUFBLElBQVNsRSxLQUFXLEtBQU0sQ0FBQSxJQUFBLENBQUtrRSxDQUFRLENBQUcsQ0FBQSxDQUN0QyxJQUFNMUgsQ0FBQUEsQ0FBTXdELENBQVEsQ0FBQSxZQUFBLENBQWEsYUFBYSxDQUMzQ3hELENBQUFBLENBQUFBLEVBQU8sQ0FBQzZKLENBQVUsQ0FBQSxHQUFBLENBQUk3SixDQUFHLENBQ3hCaVUsR0FBQUEsRUFBQUEsQ0FBbUJ6USxFQUFTeEQsQ0FBRyxDQUFBLENBQy9CNkosRUFBVSxHQUFJN0osQ0FBQUEsQ0FBRyxHQUV6QixDQUNKLENBQ0osQ0FDSixDQUFDLENBQUEsQ0FFRCxTQUFTaVUsRUFBbUJELENBQUFBLENBQUFBLENBQWNoVSxFQUFhLENBQ25ELEdBQUcsQ0FBQ0EsQ0FDQSxDQUFBLE9BRUosUUFBUSxJQUFLLENBQUEsMkJBQUEsQ0FBNkJBLENBQUcsQ0FDN0MsQ0FBQSxJQUFNMFQsRUFBYyxJQUFJLFdBQUEsQ0FBWTFULENBQUcsQ0FFdkMwVCxDQUFBQSxDQUFBQSxDQUFZLGlCQUFpQixPQUFTLENBQUEsU0FBU3ZULEVBQU8sQ0FDbEQ0UixDQUFBQSxDQUFLLFFBQVFpQyxDQUFLLENBQUEsZUFBQSxDQUFpQixDQUFDLEtBQU83VCxDQUFBQSxDQUFLLENBQUMsRUFDckQsQ0FBQyxFQUVEdVQsQ0FBWSxDQUFBLE1BQUEsQ0FBUyxTQUFTdlQsQ0FBTyxDQUFBLENBQ2pDNFIsRUFBSyxPQUFRaUMsQ0FBQUEsQ0FBQUEsQ0FBSyxlQUFnQixDQUFDLEtBQUEsQ0FBTzdULENBQUssQ0FBQyxFQUNwRCxFQUVBdVQsQ0FBWSxDQUFBLE9BQUEsQ0FBVSxTQUFTdlQsQ0FBTyxDQUFBLENBQ2xDNFIsRUFBSyxPQUFRaUMsQ0FBQUEsQ0FBQUEsQ0FBSyxnQkFBaUIsQ0FBQyxLQUFBLENBQU83VCxDQUFLLENBQUMsQ0FBQSxDQUM3Q3VULEVBQVksVUFBYyxFQUFBLFdBQUEsQ0FBWSxRQUN0QzNCLENBQUssQ0FBQSxPQUFBLENBQVFpQyxDQUFLLENBQUEsZUFBQSxDQUFpQixDQUFDLEtBQUEsQ0FBTzdULENBQUssQ0FBQyxFQUV6RCxFQUVBdVQsQ0FBWSxDQUFBLFNBQUEsQ0FBWSxTQUFTdlQsQ0FBTyxDQUFBLENBQ3BDLElBQU0rQixDQUFhZ1AsQ0FBQUEsQ0FBQUEsQ0FBSSxlQUFlOEMsQ0FBRyxDQUFBLENBQ3pDakMsRUFBSyxPQUFRaUMsQ0FBQUEsQ0FBQUEsQ0FBSyx3QkFBeUIsQ0FBQyxLQUFBLENBQU83VCxDQUFLLENBQUMsQ0FBQSxDQUN6RCxJQUFNNUIsQ0FBVzRCLENBQUFBLENBQUFBLENBQU0sS0FDakJoQyxDQUFXK1MsQ0FBQUEsQ0FBQUEsQ0FBSSxhQUFhM1MsQ0FBUSxDQUFBLENBQ3BDMlYsRUFBVyxLQUFNLENBQUEsSUFBQSxDQUFLL1YsRUFBUyxRQUFRLENBQUEsQ0FDN0MsUUFBU3NDLENBQVN5VCxJQUFBQSxDQUFBQSxDQUNkaEQsRUFBSSxPQUFRQSxDQUFBQSxDQUFBQSxDQUFJLGtCQUFrQnpRLENBQU8sQ0FBQSxhQUFhLEdBQUssTUFBUUEsQ0FBQUEsQ0FBQUEsQ0FBT3lCLENBQVUsQ0FFakZ6QixDQUFBQSxDQUFBQSxDQUFNLFVBQVksUUFBWUEsRUFBQUEsQ0FBQUEsQ0FBTSxHQUFHLFVBQVcsQ0FBQSxRQUFRLEdBQ3pELFFBQVMsQ0FBQSxJQUFBLENBQUssWUFBWUEsQ0FBSyxDQUFBLENBR3ZDc1IsRUFBSyxPQUFRaUMsQ0FBQUEsQ0FBQUEsQ0FBSyx1QkFBd0IsQ0FBQyxLQUFBLENBQU83VCxDQUFLLENBQUMsRUFDNUQsRUFDSixDQzdEQSxTQUFTZ1UsR0FBU2xVLENBQW9ELENBQUEsQ0FDcEUsSUFBSW1VLENBQVUsQ0FBQSxNQUFBLENBQU8sU0FBUyxJQUM5QixDQUFBLFdBQUEsQ0FBWSxJQUFNLENBQ1osTUFBQSxDQUFPLFNBQVMsSUFBU0EsR0FBQUEsQ0FBQUEsR0FDM0JuVSxDQUFTbVUsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFPLENBQUEsUUFBQSxDQUFTLElBQUksQ0FDdENBLENBQUFBLENBQUFBLENBQVUsT0FBTyxRQUFTLENBQUEsSUFBQSxFQUU5QixFQUFHLEdBQUcsRUFDUixDQUVBRCxFQUFTLENBQUEsQ0FBQ0UsRUFBR0MsQ0FBVyxHQUFBLENBQ3RCQyxHQUFZRCxDQUFNLEVBQ3BCLENBQUMsQ0FFRCxDQUFBLFNBQVNDLEdBQVlELENBQWdCLENBQUEsQ0FDbkMsSUFBSXRVLENBQU0sQ0FBQSxJQUFJLElBQUlzVSxDQUFNLENBQUEsQ0FFeEIsU0FBUyxnQkFBaUIsQ0FBQSxjQUFjLEVBQUUsT0FBUSxDQUFBLFNBQVU5USxFQUFTLENBQ25FLElBQU0wQixFQUFXMUIsQ0FBUSxDQUFBLFlBQUEsQ0FBYSxZQUFZLENBQ2xELENBQUEsR0FBSSxDQUFDMEIsQ0FDSCxDQUFBLE9BR0YsR0FEY0EsQ0FBUyxDQUFBLEtBQUEsQ0FBTSxJQUFJLENBQ3ZCLENBQUEsSUFBQSxDQUFNNkMsR0FBTUEsQ0FBTSxHQUFBLEtBQUssRUFDL0JnSyxDQUFLLENBQUEsSUFBQSxDQUFLdk8sRUFBUyxLQUFPLENBQUEsQ0FDeEIsVUFBVyxXQUNYLENBQUEsU0FBQSxDQUFXLEVBQ1gsV0FBYSxDQUFBLENBQ2YsQ0FBQyxDQUVELENBQUEsS0FBQSxJQUFBLEdBQVMsQ0FBQzdELENBQUtxSyxDQUFBQSxDQUFNLElBQUtoSyxDQUFJLENBQUEsWUFBQSxDQUFjLENBQzFDLElBQUltRixDQUFBQSxDQUFZLE1BQVF4RixDQUN4QixDQUFBLEdBQUl1RixFQUFTLFFBQVNDLENBQUFBLENBQVMsRUFBRyxDQUNoQyxPQUFBLENBQVEsSUFBSSxZQUFjQSxDQUFBQSxDQUFTLENBQ25DNE0sQ0FBQUEsQ0FBQUEsQ0FBSyxPQUFRdk8sQ0FBQUEsQ0FBQUEsQ0FBUzJCLEVBQVcsSUFBSSxDQUFBLENBQ3JDLEtBQ0YsQ0FDRixDQUVKLENBQUMsQ0FFRCxDQUFBLFFBQUEsQ0FBUyxpQkFBaUIsZUFBZSxDQUFBLENBQUUsUUFBU2hHLENBQU8sRUFBQSxDQUN6RCxJQUFJcVYsQ0FBVyxDQUFBLENBQUEsQ0FBQSxDQUNmLFFBQVNyWCxDQUFRZ0MsSUFBQUEsQ0FBQUEsQ0FBRyxtQkFDbEIsQ0FBQSxHQUFJaEMsRUFBSyxVQUFXLENBQUEsc0JBQXNCLEVBQUcsQ0FDM0MsSUFBSWMsRUFBUWQsQ0FBSyxDQUFBLE9BQUEsQ0FBUSx1QkFBd0IsRUFBRSxDQUFBLENBRW5ELEdBRFk2QyxDQUFJLENBQUEsWUFBQSxDQUFhLElBQUkvQixDQUFLLENBQUEsQ0FDM0IsQ0FDVDhULENBQUssQ0FBQSxJQUFBLENBQUs1UyxDQUFJQSxDQUFBQSxDQUFBQSxDQUFHLFlBQWFoQyxDQUFBQSxDQUFJLEdBQUssRUFBSSxDQUFBLENBQ3pDLFVBQVcsV0FDWCxDQUFBLFNBQUEsQ0FBVyxFQUNYLFdBQWEsQ0FBQSxDQUNmLENBQUMsQ0FDRHFYLENBQUFBLENBQUFBLENBQVcsR0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLEVBQVUsQ0FDYixJQUFJQyxFQUFhdFYsQ0FBRyxDQUFBLFlBQUEsQ0FBYSxxQkFBcUIsQ0FDbERzVixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXZlbnQuZGV0YWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmxextensions/trigger-children.ts b/framework/assets/js/htmxextensions/trigger-children.ts index f39fa23d..7f5b8b5f 100644 --- a/framework/assets/js/htmxextensions/trigger-children.ts +++ b/framework/assets/js/htmxextensions/trigger-children.ts @@ -1,4 +1,4 @@ -import htmx, {HtmxSettleInfo, HtmxSwapStyle} from "htmx.org"; +import htmx from "htmx.org"; function kebabEventName(str: string) { return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase() @@ -28,7 +28,10 @@ function triggerChildren(target: HTMLElement, name: string, event: CustomEvent, const eventName = kehab.replace("htmx:", "hx-on::") if (!triggered.has(e as HTMLElement)) { if(e.hasAttribute(eventName)) { - const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), event.detail) + const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), { + ...event.detail, + target: e, + }) newEvent.detail.meta = 'trigger-children' e.dispatchEvent(newEvent) triggered.add(e as HTMLElement); @@ -42,6 +45,7 @@ function triggerChildren(target: HTMLElement, name: string, event: CustomEvent, } +// @ts-ignore htmx.defineExtension("trigger-children", { onEvent: (name, evt: Event | CustomEvent) => { if (!(evt instanceof CustomEvent)) { @@ -55,33 +59,4 @@ htmx.defineExtension("trigger-children", { triggerChildren(target, name, evt, triggered); return true; }, - init: function (api: any): void { - }, - transformResponse: function ( - text: string, - xhr: XMLHttpRequest, - elt: Element, - ): string { - return text; - }, - isInlineSwap: function (swapStyle: HtmxSwapStyle): boolean { - return false; - }, - handleSwap: function ( - swapStyle: HtmxSwapStyle, - target: Node, - fragment: Node, - settleInfo: HtmxSettleInfo, - ): boolean | Node[] { - return false; - }, - encodeParameters: function ( - xhr: XMLHttpRequest, - parameters: FormData, - elt: Node, - ) { - }, - getSelectors: function (): string[] | null { - return null; - }, }); From 5cf90208d8f3f2d7b5b3ca5b994e047f7013f6a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 6 Oct 2024 16:22:21 +0000 Subject: [PATCH 024/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 89a5a03c..c769fb29 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce + github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c8c885a5..53ff112d 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 83303805..b07b81ec 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce + github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 4a60744d..cd0a0408 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 0e3e6a9a..628bf48a 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce +require github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 501295c7..5767c889 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index e73d7f42..8cb2012f 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce + github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 319b8fb8..cf6bb626 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 00c46241..d1e3c32e 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce +require github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 501295c7..5767c889 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce h1:rXx1TN9tg/8n/ZRmiATUsgdGm2LPMKzFhyYs3Q1RiMM= -github.com/maddalax/htmgo/framework v0.0.0-20241004162115-805e5729e1ce/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 1014f6c961078d4b9d617d97df6f72c17e0e6cf9 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 7 Oct 2024 12:57:24 -0500 Subject: [PATCH 025/145] add htmx to window small swap fix copy public assets to dist if changed --- cli/htmgo/tasks/reloader/reloader.go | 5 +++++ framework/assets/dist/htmgo.js | 4 ++-- framework/assets/js/htmgo.ts | 3 +++ framework/h/swap.go | 7 +++++-- templates/starter/assets.go | 13 +++++++++++++ templates/starter/assets_prod.go | 16 ++++++++++++++++ templates/starter/internal/embedded/os.go | 17 +++++++++++++++++ templates/starter/main.go | 6 +----- 8 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 templates/starter/assets.go create mode 100644 templates/starter/assets_prod.go create mode 100644 templates/starter/internal/embedded/os.go diff --git a/cli/htmgo/tasks/reloader/reloader.go b/cli/htmgo/tasks/reloader/reloader.go index 48fefc4c..7133b7af 100644 --- a/cli/htmgo/tasks/reloader/reloader.go +++ b/cli/htmgo/tasks/reloader/reloader.go @@ -108,6 +108,11 @@ func OnFileChange(version string, events []*fsnotify.Event) { //tasks.Run = true } + // something in public folder changed + if c.HasAnyPrefix("assets/public/") { + copyassets.CopyAssets() + } + if hasTask { slog.Info("file changed", slog.String("version", version), slog.String("file", c.Name())) } diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index 9f1455ed..fd740d47 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=T;let H=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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QUEsc0JBQXNCLEVBQUcsQ0FDM0MsSUFBSWMsRUFBUWQsQ0FBSyxDQUFBLE9BQUEsQ0FBUSx1QkFBd0IsRUFBRSxDQUFBLENBRW5ELEdBRFk2QyxDQUFJLENBQUEsWUFBQSxDQUFhLElBQUkvQixDQUFLLENBQUEsQ0FDM0IsQ0FDVDhULENBQUssQ0FBQSxJQUFBLENBQUs1UyxDQUFJQSxDQUFBQSxDQUFBQSxDQUFHLFlBQWFoQyxDQUFBQSxDQUFJLEdBQUssRUFBSSxDQUFBLENBQ3pDLFVBQVcsV0FDWCxDQUFBLFNBQUEsQ0FBVyxFQUNYLFdBQWEsQ0FBQSxDQUNmLENBQUMsQ0FDRHFYLENBQUFBLENBQUFBLENBQVcsR0FDWCxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLEVBQVUsQ0FDYixJQUFJQyxFQUFhdFYsQ0FBRyxDQUFBLFlBQUEsQ0FBYSxxQkFBcUIsQ0FDbERzVixDQUFBQSxDQUFBQSxFQUNGMUMsRUFBSyxJQUNINVMsQ0FBQUEsQ0FBQUEsQ0FDQUEsRUFBRyxZQUFhLENBQUEsc0JBQUEsQ0FBeUJzVixDQUFVLENBQUssRUFBQSxFQUFBLENBQ3hELENBQUUsU0FBVyxDQUFBLFdBQUEsQ0FBYSxVQUFXLENBQUcsQ0FBQSxXQUFBLENBQWEsQ0FBRSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6YmVmb3JlU3dhcCcsICdodG14OmFmdGVyU3dhcCcsICdodG14OmJlZm9yZU9uTG9hZCcsICdodG14OmFmdGVyT25Mb2FkJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXZlbnQuZGV0YWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBlLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICBlLmRpc3BhdGNoRXZlbnQobmV3RXZlbnQpXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgY29uc3QgYXR0cmlidXRlcyA9IEFycmF5LmZyb20oZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGZvciAobGV0IGF0dHJpYnV0ZSBvZiBhdHRyaWJ1dGVzKSB7XG4gICAgICAgY29uc3QgbWF0Y2hlcyA9IGF0dHJpYnV0ZS52YWx1ZS5tYXRjaChldmFsRnVuY1JlZ2V4KSB8fCBbXVxuICAgICAgICBmb3IgKGxldCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCBpZCA9IG1hdGNoLnJlcGxhY2UoXCIoKVwiLCBcIlwiKS5yZXBsYWNlKFwiKHRoaXMpXCIsIFwiXCIpLnJlcGxhY2UoXCI7XCIsIFwiXCIpXG4gICAgICAgICAgICBjb25zdCBlbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIGlmKGVsZSAmJiBlbGUudGFnTmFtZSA9PT0gXCJTQ1JJUFRcIikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJyZW1vdmluZyBhc3NvY2lhdGVkIHNjcmlwdCB3aXRoIGlkXCIsIGlkKVxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmUoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSAnaHRteC5vcmcnXG5pbXBvcnQge3JlbW92ZUFzc29jaWF0ZWRTY3JpcHRzfSBmcm9tIFwiLi9odG1nb1wiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInNzZVwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKGFwaVJlZikge1xuICAgICAgICBhcGkgPSBhcGlSZWY7XG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0O1xuICAgICAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpIHtcbiAgICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKHRhcmdldCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZihuYW1lID09PSAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW3NzZS1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwic3NlLWNvbm5lY3RcIikhO1xuICAgICAgICAgICAgICAgIGlmKHVybCAmJiAhcHJvY2Vzc2VkLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RFdmVudFNvdXJjZShlbGVtZW50LCB1cmwpXG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQodXJsKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0pXG5cbmZ1bmN0aW9uIGNvbm5lY3RFdmVudFNvdXJjZShlbGU6IEVsZW1lbnQsIHVybDogc3RyaW5nKSB7XG4gICAgaWYoIXVybCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdDb25uZWN0aW5nIHRvIEV2ZW50U291cmNlJywgdXJsKVxuICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHVybCk7XG5cbiAgICBldmVudFNvdXJjZS5hZGRFdmVudExpc3RlbmVyKFwiY2xvc2VcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9KVxuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZU9wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBpZiAoZXZlbnRTb3VyY2UucmVhZHlTdGF0ZSA9PSBFdmVudFNvdXJjZS5DTE9TRUQpIHtcbiAgICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gYXBpLm1ha2VTZXR0bGVJbmZvKGVsZSk7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VCZWZvcmVNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5kYXRhXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gYXBpLm1ha2VGcmFnbWVudChyZXNwb25zZSkgYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBBcnJheS5mcm9tKGZyYWdtZW50LmNoaWxkcmVuKTtcbiAgICAgICAgZm9yIChsZXQgY2hpbGQgb2YgY2hpbGRyZW4pIHtcbiAgICAgICAgICAgIGFwaS5vb2JTd2FwKGFwaS5nZXRBdHRyaWJ1dGVWYWx1ZShjaGlsZCwgJ2h4LXN3YXAtb29iJykgfHwgJ3RydWUnLCBjaGlsZCwgc2V0dGxlSW5mbyk7XG4gICAgICAgICAgICAvLyBzdXBwb3J0IGh0bWdvIGV2YWxfXyBzY3JpcHRzXG4gICAgICAgICAgICBpZihjaGlsZC50YWdOYW1lID09PSAnU0NSSVBUJyAmJiBjaGlsZC5pZC5zdGFydHNXaXRoKFwiX19ldmFsXCIpKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUFmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvc3NlXCJcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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cUJBQXFCLENBQ2xEc1YsQ0FBQUEsQ0FBQUEsRUFDRjFDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCc1YsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmJlZm9yZVN3YXAnLCAnaHRteDphZnRlclN3YXAnLCAnaHRteDpiZWZvcmVPbkxvYWQnLCAnaHRteDphZnRlck9uTG9hZCcsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gQHRzLWlnbm9yZVxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJzc2VcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzc2UtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNzZS1jb25uZWN0XCIpITtcbiAgICAgICAgICAgICAgICBpZih1cmwgJiYgIXByb2Nlc3NlZC5oYXModXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0RXZlbnRTb3VyY2UoZWxlbWVudCwgdXJsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYWRkKHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuXG5mdW5jdGlvbiBjb25uZWN0RXZlbnRTb3VyY2UoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnQ29ubmVjdGluZyB0byBFdmVudFNvdXJjZScsIHVybClcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIGV2ZW50U291cmNlLm9ub3BlbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhlbGUpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 898d00b2..29cb7091 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -8,6 +8,9 @@ import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; import "./htmxextensions/sse" +// @ts-ignore +window.htmx = htmx; + function watchUrl(callback: (oldUrl: string, newUrl: string) => void) { let lastUrl = window.location.href; setInterval(() => { diff --git a/framework/h/swap.go b/framework/h/swap.go index 127d05b8..fa96e43d 100644 --- a/framework/h/swap.go +++ b/framework/h/swap.go @@ -63,11 +63,14 @@ func SwapMany(ctx *RequestContext, elements ...*Element) *Element { return Empty() } for _, element := range elements { - element.AppendChild(outOfBandSwap("")) + if element.tag != "" { + element.AppendChild(outOfBandSwap("")) + } } - return Fragment(Map(elements, func(arg *Element) Ren { + res := Fragment(Map(elements, func(arg *Element) Ren { return arg })...) + return res } func SwapManyX(ctx *RequestContext, args ...SwapArg) *Element { diff --git a/templates/starter/assets.go b/templates/starter/assets.go new file mode 100644 index 00000000..1114223c --- /dev/null +++ b/templates/starter/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "io/fs" + "starter-template/internal/embedded" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/templates/starter/assets_prod.go b/templates/starter/assets_prod.go new file mode 100644 index 00000000..f0598e1c --- /dev/null +++ b/templates/starter/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/templates/starter/internal/embedded/os.go b/templates/starter/internal/embedded/os.go new file mode 100644 index 00000000..ddfd55f5 --- /dev/null +++ b/templates/starter/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/templates/starter/main.go b/templates/starter/main.go index bd79fac9..bab347c3 100644 --- a/templates/starter/main.go +++ b/templates/starter/main.go @@ -1,7 +1,6 @@ package main import ( - "embed" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "io/fs" @@ -9,9 +8,6 @@ import ( "starter-template/__htmgo" ) -//go:embed assets/dist/* -var StaticAssets embed.FS - func main() { locator := service.NewLocator() @@ -19,7 +15,7 @@ func main() { ServiceLocator: locator, LiveReload: true, Register: func(app *h.App) { - sub, err := fs.Sub(StaticAssets, "assets/dist") + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") if err != nil { panic(err) From b353aa90f4573c53609fbcbc5d05a9dc0adfda7e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 7 Oct 2024 17:58:32 +0000 Subject: [PATCH 026/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index c769fb29..4fcff5cc 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b + github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 53ff112d..17827857 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index b07b81ec..5ed37d7a 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b + github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index cd0a0408..e292b38b 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 628bf48a..66ed73cd 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b +require github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 5767c889..f1e7c3d9 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 8cb2012f..a96a60bf 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b + github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index cf6bb626..98035903 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index d1e3c32e..50706b46 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b +require github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 5767c889..f1e7c3d9 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= +github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 9f53e8b2aac93f265c94f5df0d21901a1abf3cfe Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 8 Oct 2024 12:48:28 -0500 Subject: [PATCH 027/145] websocket stuff wip --- examples/sse-with-state/.dockerignore | 11 + examples/sse-with-state/.gitignore | 6 + examples/sse-with-state/Dockerfile | 38 +++ examples/sse-with-state/Taskfile.yml | 20 ++ examples/sse-with-state/assets.go | 13 + examples/sse-with-state/assets/css/input.css | 3 + examples/sse-with-state/assets_prod.go | 16 ++ examples/sse-with-state/event/listener.go | 124 +++++++++ examples/sse-with-state/go.mod | 14 ++ examples/sse-with-state/go.sum | 24 ++ .../sse-with-state/internal/embedded/os.go | 17 ++ examples/sse-with-state/internal/random.go | 13 + examples/sse-with-state/main.go | 39 +++ examples/sse-with-state/pages/index.go | 41 +++ examples/sse-with-state/pages/root.go | 21 ++ examples/sse-with-state/partials/click.go | 19 ++ examples/sse-with-state/partials/index.go | 80 ++++++ examples/sse-with-state/partials/repeater.go | 77 ++++++ examples/sse-with-state/sse/handler.go | 203 +++++++++++++++ examples/sse-with-state/sse/manager.go | 235 ++++++++++++++++++ examples/sse-with-state/state/state.go | 67 +++++ examples/sse-with-state/tailwind.config.js | 5 + framework/assets/dist/htmgo.js | 4 +- framework/assets/js/htmgo.ts | 3 +- framework/assets/js/htmxextensions/sse.ts | 72 ------ .../js/htmxextensions/ws-event-handler.ts | 44 ++++ framework/assets/js/htmxextensions/ws.ts | 89 +++++++ framework/assets/js/util/dom.ts | 0 framework/h/app.go | 4 +- framework/h/extensions.go | 2 +- framework/h/header.go | 2 +- framework/h/qs.go | 2 +- framework/h/tag.go | 5 + 33 files changed, 1233 insertions(+), 80 deletions(-) create mode 100644 examples/sse-with-state/.dockerignore create mode 100644 examples/sse-with-state/.gitignore create mode 100644 examples/sse-with-state/Dockerfile create mode 100644 examples/sse-with-state/Taskfile.yml create mode 100644 examples/sse-with-state/assets.go create mode 100644 examples/sse-with-state/assets/css/input.css create mode 100644 examples/sse-with-state/assets_prod.go create mode 100644 examples/sse-with-state/event/listener.go create mode 100644 examples/sse-with-state/go.mod create mode 100644 examples/sse-with-state/go.sum create mode 100644 examples/sse-with-state/internal/embedded/os.go create mode 100644 examples/sse-with-state/internal/random.go create mode 100644 examples/sse-with-state/main.go create mode 100644 examples/sse-with-state/pages/index.go create mode 100644 examples/sse-with-state/pages/root.go create mode 100644 examples/sse-with-state/partials/click.go create mode 100644 examples/sse-with-state/partials/index.go create mode 100644 examples/sse-with-state/partials/repeater.go create mode 100644 examples/sse-with-state/sse/handler.go create mode 100644 examples/sse-with-state/sse/manager.go create mode 100644 examples/sse-with-state/state/state.go create mode 100644 examples/sse-with-state/tailwind.config.js delete mode 100644 framework/assets/js/htmxextensions/sse.ts create mode 100644 framework/assets/js/htmxextensions/ws-event-handler.ts create mode 100644 framework/assets/js/htmxextensions/ws.ts create mode 100644 framework/assets/js/util/dom.ts diff --git a/examples/sse-with-state/.dockerignore b/examples/sse-with-state/.dockerignore new file mode 100644 index 00000000..fb47686a --- /dev/null +++ b/examples/sse-with-state/.dockerignore @@ -0,0 +1,11 @@ +# Project exclude paths +/tmp/ +node_modules/ +dist/ +js/dist +js/node_modules +go.work +go.work.sum +.idea +!framework/assets/dist +__htmgo \ No newline at end of file diff --git a/examples/sse-with-state/.gitignore b/examples/sse-with-state/.gitignore new file mode 100644 index 00000000..3d6a9799 --- /dev/null +++ b/examples/sse-with-state/.gitignore @@ -0,0 +1,6 @@ +/assets/dist +tmp +node_modules +.idea +__htmgo +dist \ No newline at end of file diff --git a/examples/sse-with-state/Dockerfile b/examples/sse-with-state/Dockerfile new file mode 100644 index 00000000..a522f64f --- /dev/null +++ b/examples/sse-with-state/Dockerfile @@ -0,0 +1,38 @@ +# Stage 1: Build the Go binary +FROM golang:1.23-alpine AS builder + +RUN apk update +RUN apk add git +RUN apk add curl + +# Set the working directory inside the container +WORKDIR /app + +# Copy go.mod and go.sum files +COPY go.mod go.sum ./ + +# Download and cache the Go modules +RUN go mod download + +# Copy the source code into the container +COPY . . + +# Build the Go binary for Linux +RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build + + +# Stage 2: Create the smallest possible image +FROM gcr.io/distroless/base-debian11 + +# Set the working directory inside the container +WORKDIR /app + +# Copy the Go binary from the builder stage +COPY --from=builder /app/dist . + +# Expose the necessary port (replace with your server port) +EXPOSE 3000 + + +# Command to run the binary +CMD ["./sse-with-state"] diff --git a/examples/sse-with-state/Taskfile.yml b/examples/sse-with-state/Taskfile.yml new file mode 100644 index 00000000..695006f0 --- /dev/null +++ b/examples/sse-with-state/Taskfile.yml @@ -0,0 +1,20 @@ +version: '3' + +tasks: + run: + cmds: + - go run github.com/maddalax/htmgo/cli/htmgo@latest run + silent: true + + build: + cmds: + - go run github.com/maddalax/htmgo/cli/htmgo@latest build + + docker: + cmds: + - docker build . + + watch: + cmds: + - go run github.com/maddalax/htmgo/cli/htmgo@latest watch + silent: true \ No newline at end of file diff --git a/examples/sse-with-state/assets.go b/examples/sse-with-state/assets.go new file mode 100644 index 00000000..63021d16 --- /dev/null +++ b/examples/sse-with-state/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "io/fs" + "sse-with-state/internal/embedded" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/examples/sse-with-state/assets/css/input.css b/examples/sse-with-state/assets/css/input.css new file mode 100644 index 00000000..bd6213e1 --- /dev/null +++ b/examples/sse-with-state/assets/css/input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/examples/sse-with-state/assets_prod.go b/examples/sse-with-state/assets_prod.go new file mode 100644 index 00000000..f0598e1c --- /dev/null +++ b/examples/sse-with-state/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/examples/sse-with-state/event/listener.go b/examples/sse-with-state/event/listener.go new file mode 100644 index 00000000..08c6762a --- /dev/null +++ b/examples/sse-with-state/event/listener.go @@ -0,0 +1,124 @@ +package event + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "github.com/puzpuzpuz/xsync/v3" + "sse-with-state/internal" + "sse-with-state/sse" + "sse-with-state/state" +) + +type HandlerData struct { + SessionId state.SessionId + Socket *sse.SocketConnection + Manager *sse.SocketManager +} + +type Handler func(data HandlerData) + +type handlerWrapper struct { + handler Handler + sessionId state.SessionId +} + +type ServerSideEvent struct { + Event string + Payload map[string]any + SessionId state.SessionId +} + +var Map = xsync.NewMapOf[string, handlerWrapper]() +var ServerSideEventMap = xsync.NewMapOf[string, *xsync.MapOf[string, handlerWrapper]]() +var socketMessageListener = make(chan sse.SocketEvent, 100) +var serverSideMessageListener = make(chan ServerSideEvent, 100) + +func AddServerSideHandler(ctx *h.RequestContext, id string, event string, handler Handler) { + sessionId := state.GetSessionId(ctx) + + wrapper := handlerWrapper{ + handler: handler, + sessionId: sessionId, + } + + handlers, ok := ServerSideEventMap.Load(event) + if !ok { + ServerSideEventMap.Store(event, xsync.NewMapOf[string, handlerWrapper]()) + } + + handlers, _ = ServerSideEventMap.Load(event) + handlers.Store(id, wrapper) + + fmt.Printf("added server side handler for %s, %v\n", event, handlers) +} + +func AddHandler(ctx *h.RequestContext, event string, handler Handler) *h.AttributeMapOrdered { + handlerId := fmt.Sprintf("event_%s_%s", event, internal.RandSeq(30)) + for { + _, ok := Map.Load(handlerId) + if ok { + handlerId = fmt.Sprintf("event_%s_%s", event, internal.RandSeq(30)) + } else { + break + } + } + sessionId := state.GetSessionId(ctx) + Map.Store(handlerId, handlerWrapper{ + handler: handler, + sessionId: sessionId, + }) + return h.AttributePairs( + "data-handler-id", handlerId, + "data-handler-event", event, + ) +} + +func PushServerSideEvent(sessionId state.SessionId, event string) { + serverSideMessageListener <- ServerSideEvent{ + Event: event, + Payload: make(map[string]any), + SessionId: sessionId, + } +} + +func PushElement(data HandlerData, el *h.Element) { + data.Manager.SendHtml(data.Socket.Id, h.Render(el)) +} + +func StartListener(locator *service.Locator) { + manager := service.Get[sse.SocketManager](locator) + manager.Listen(socketMessageListener) + go func() { + for { + select { + case sevent := <-serverSideMessageListener: + handlers, ok := ServerSideEventMap.Load(sevent.Event) + if ok { + handlers.Range(func(key string, value handlerWrapper) bool { + go value.handler(HandlerData{ + SessionId: sevent.SessionId, + Socket: manager.Get(string(sevent.SessionId)), + Manager: manager, + }) + return true + }) + } + case event := <-socketMessageListener: + if event.Type == sse.MessageEvent { + handlerId := event.Payload["id"].(string) + eventName := event.Payload["event"].(string) + cb, ok := Map.Load(handlerId) + if ok { + fmt.Printf("calling %s handler for session: %s\n", eventName, cb.sessionId) + go cb.handler(HandlerData{ + SessionId: cb.sessionId, + Socket: manager.Get(event.SocketId), + Manager: manager, + }) + } + } + } + } + }() +} diff --git a/examples/sse-with-state/go.mod b/examples/sse-with-state/go.mod new file mode 100644 index 00000000..f10fa8a8 --- /dev/null +++ b/examples/sse-with-state/go.mod @@ -0,0 +1,14 @@ +module sse-with-state + +go 1.23.0 + +require github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b + +require ( + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/gobwas/httphead v0.1.0 // indirect + github.com/gobwas/pool v0.2.1 // indirect + github.com/gobwas/ws v1.4.0 // indirect + github.com/google/uuid v1.6.0 // indirect + golang.org/x/sys v0.6.0 // indirect +) diff --git a/examples/sse-with-state/go.sum b/examples/sse-with-state/go.sum new file mode 100644 index 00000000..94d56347 --- /dev/null +++ b/examples/sse-with-state/go.sum @@ -0,0 +1,24 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= +github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= +github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= +github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= +github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= +github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= +github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/sse-with-state/internal/embedded/os.go b/examples/sse-with-state/internal/embedded/os.go new file mode 100644 index 00000000..ddfd55f5 --- /dev/null +++ b/examples/sse-with-state/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/examples/sse-with-state/internal/random.go b/examples/sse-with-state/internal/random.go new file mode 100644 index 00000000..cdd54167 --- /dev/null +++ b/examples/sse-with-state/internal/random.go @@ -0,0 +1,13 @@ +package internal + +import "math/rand" + +var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +func RandSeq(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} diff --git a/examples/sse-with-state/main.go b/examples/sse-with-state/main.go new file mode 100644 index 00000000..408b40a4 --- /dev/null +++ b/examples/sse-with-state/main.go @@ -0,0 +1,39 @@ +package main + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "io/fs" + "net/http" + "sse-with-state/__htmgo" + "sse-with-state/event" + "sse-with-state/sse" +) + +func main() { + locator := service.NewLocator() + + service.Set[sse.SocketManager](locator, service.Singleton, func() *sse.SocketManager { + return sse.NewSocketManager() + }) + + event.StartListener(locator) + + h.Start(h.AppOpts{ + ServiceLocator: locator, + LiveReload: true, + Register: func(app *h.App) { + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") + + if err != nil { + panic(err) + } + + http.FileServerFS(sub) + + app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) + app.Router.Handle("/ws/test", sse.HandleWs()) + __htmgo.Register(app.Router) + }, + }) +} diff --git a/examples/sse-with-state/pages/index.go b/examples/sse-with-state/pages/index.go new file mode 100644 index 00000000..7c1528d6 --- /dev/null +++ b/examples/sse-with-state/pages/index.go @@ -0,0 +1,41 @@ +package pages + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "sse-with-state/partials" + "sse-with-state/state" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + state.NewState(ctx) + return h.NewPage( + RootPage( + h.Div( + h.Attribute("ws-connect", fmt.Sprintf("/ws/test")), + h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), + h.H3(h.Id("intro-text"), h.Text("Repeater Example"), h.Class("text-2xl")), + + partials.CounterForm(ctx, partials.CounterProps{Id: "counter-1"}), + + partials.Repeater(ctx, partials.RepeaterProps{ + Id: "repeater-1", + AddButton: h.Button( + h.Text("+ Add Item"), + ), + RemoveButton: func(index int, children ...h.Ren) *h.Element { + return h.Button( + h.Text("Remove"), + h.Children(children...), + ) + }, + Item: func(index int) *h.Element { + return h.Input("text", + h.Class("border border-gray-300 rounded p-2"), + h.Value(fmt.Sprintf("item %d", index))) + }, + }), + ), + ), + ) +} diff --git a/examples/sse-with-state/pages/root.go b/examples/sse-with-state/pages/root.go new file mode 100644 index 00000000..63374f17 --- /dev/null +++ b/examples/sse-with-state/pages/root.go @@ -0,0 +1,21 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RootPage(children ...h.Ren) h.Ren { + return h.Html( + h.HxExtension(h.BaseExtensions()), + h.Head( + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Div( + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Fragment(children...), + ), + ), + ) +} diff --git a/examples/sse-with-state/partials/click.go b/examples/sse-with-state/partials/click.go new file mode 100644 index 00000000..4339b033 --- /dev/null +++ b/examples/sse-with-state/partials/click.go @@ -0,0 +1,19 @@ +package partials + +import ( + "github.com/maddalax/htmgo/framework/h" + "sse-with-state/event" +) + +func OnClick(ctx *h.RequestContext, handler event.Handler) *h.AttributeMapOrdered { + return event.AddHandler(ctx, "click", handler) +} + +func OnServerSideEvent(ctx *h.RequestContext, id string, eventName string, handler event.Handler) h.Ren { + event.AddServerSideHandler(ctx, id, eventName, handler) + return h.Empty() +} + +func OnMouseOver(ctx *h.RequestContext, handler event.Handler) *h.AttributeMapOrdered { + return event.AddHandler(ctx, "mouseover", handler) +} diff --git a/examples/sse-with-state/partials/index.go b/examples/sse-with-state/partials/index.go new file mode 100644 index 00000000..097ebe65 --- /dev/null +++ b/examples/sse-with-state/partials/index.go @@ -0,0 +1,80 @@ +package partials + +import ( + "github.com/maddalax/htmgo/framework/h" + "sse-with-state/event" + "sse-with-state/state" +) + +func UseState[T any](sessionId state.SessionId, key string, initial T) (func() T, func(T)) { + var get = func() T { + return state.Get[T](sessionId, key, initial) + } + var set = func(value T) { + state.Set(sessionId, key, value) + } + return get, set +} + +type Counter struct { + Count func() int + Increment func() +} + +func UseCounter(sessionId state.SessionId, id string) Counter { + get, set := UseState(sessionId, id, 0) + + var increment = func() { + set(get() + 1) + } + + return Counter{ + Count: get, + Increment: increment, + } +} + +type CounterProps struct { + Id string +} + +func CounterForm(ctx *h.RequestContext, props CounterProps) *h.Element { + if props.Id == "" { + props.Id = h.GenId() + } + counter := UseCounter(state.GetSessionId(ctx), props.Id) + return h.Div( + h.Attribute("hx-swap", "none"), + h.Class("flex flex-col gap-3 items-center"), + h.Id(props.Id), + h.P( + h.Id("counter-text-"+props.Id), + h.AttributePairs( + "id", "counter", + "class", "text-xl", + "name", "count", + "text", "count", + ), + h.TextF("Count: %d", counter.Count()), + ), + h.Button( + h.Class("bg-rose-400 hover:bg-rose-500 text-white font-bold py-2 px-4 rounded"), + h.Type("submit"), + h.Text("Increment"), + OnServerSideEvent(ctx, props.Id, "increment", func(data event.HandlerData) { + counter.Increment() + event.PushElement(data, CounterForm(ctx, props)) + }), + //OnMouseOver(ctx, func(data event.HandlerData) { + // counter.Increment() + // updated := CounterForm(ctx, props) + // event.PushElement(data, updated) + //}), + //OnClick(ctx, func(data event.HandlerData) { + // counter.Increment() + // updated := CounterForm(ctx, props) + // event.PushElement(data, updated) + //}), + ), + ) +} diff --git a/examples/sse-with-state/partials/repeater.go b/examples/sse-with-state/partials/repeater.go new file mode 100644 index 00000000..4addcfae --- /dev/null +++ b/examples/sse-with-state/partials/repeater.go @@ -0,0 +1,77 @@ +package partials + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "sse-with-state/event" +) + +type RepeaterProps struct { + Item func(index int) *h.Element + RemoveButton func(index int, children ...h.Ren) *h.Element + AddButton *h.Element + DefaultItems []*h.Element + Id string + currentIndex int +} + +func (props *RepeaterProps) itemId(index int) string { + return fmt.Sprintf("%s-repeater-item-%d", props.Id, index) +} + +func (props *RepeaterProps) addButtonId() string { + return fmt.Sprintf("%s-repeater-add-button", props.Id) +} + +func repeaterItem(ctx *h.RequestContext, item *h.Element, index int, props *RepeaterProps) *h.Element { + id := props.itemId(index) + return h.Div( + h.Class("flex gap-2 items-center"), + h.Id(id), + item, + props.RemoveButton(index, + h.ClassIf(index == 0, "opacity-0 disabled"), + h.If(index == 0, h.Disabled()), + OnClick(ctx, func(data event.HandlerData) { + props.currentIndex-- + event.PushElement(data, + h.Div( + h.Attribute("hx-swap-oob", fmt.Sprintf("delete:#%s", id)), + repeaterItem( + ctx, item, index, props, + ), + ), + ) + }), + ), + ) +} + +func Repeater(ctx *h.RequestContext, props RepeaterProps) *h.Element { + if props.Id == "" { + props.Id = h.GenId() + } + return h.Div( + h.Class("flex flex-col gap-2"), + h.List(props.DefaultItems, func(item *h.Element, index int) *h.Element { + return repeaterItem(ctx, item, index, &props) + }), + h.Div( + h.Id(props.addButtonId()), + h.Class("flex justify-center"), + props.AddButton, + OnClick(ctx, func(data event.HandlerData) { + event.PushServerSideEvent(data.SessionId, "increment") + event.PushElement(data, + h.Div( + h.Attribute("hx-swap-oob", "beforebegin:#"+props.addButtonId()), + repeaterItem( + ctx, props.Item(props.currentIndex), props.currentIndex, &props, + ), + ), + ) + props.currentIndex++ + }), + ), + ) +} diff --git a/examples/sse-with-state/sse/handler.go b/examples/sse-with-state/sse/handler.go new file mode 100644 index 00000000..751d946b --- /dev/null +++ b/examples/sse-with-state/sse/handler.go @@ -0,0 +1,203 @@ +package sse + +import ( + "encoding/json" + "fmt" + "github.com/gobwas/ws" + "github.com/gobwas/ws/wsutil" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "log/slog" + "net/http" + "sync" + "time" +) + +func HandleWs() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) + locator := cc.ServiceLocator() + manager := service.Get[SocketManager](locator) + + sessionCookie, _ := r.Cookie("state") + sessionId := "" + + if sessionCookie != nil { + sessionId = sessionCookie.Value + } + + if sessionId == "" { + w.WriteHeader(http.StatusUnauthorized) + return + } + + conn, _, _, err := ws.UpgradeHTTP(r, w) + if err != nil { + slog.Info("failed to upgrade", slog.String("error", err.Error())) + return + } + /* + Large buffer in case the client disconnects while we are writing + we don't want to block the writer + */ + done := make(chan bool, 1000) + writer := make(WriterChan, 1000) + + wg := sync.WaitGroup{} + + manager.Add("all", sessionId, writer, done) + + /* + * This goroutine is responsible for writing messages to the client + */ + wg.Add(1) + go func() { + defer manager.Disconnect(sessionId) + defer wg.Done() + + defer func() { + fmt.Printf("empting channels\n") + for len(writer) > 0 { + <-writer + } + for len(done) > 0 { + <-done + } + }() + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + + for { + select { + case <-done: + fmt.Printf("closing connection: \n") + return + case <-ticker.C: + manager.Ping(sessionId) + case message := <-writer: + err = wsutil.WriteServerMessage(conn, ws.OpText, []byte(message)) + if err != nil { + return + } + } + } + }() + + /* + * This goroutine is responsible for reading messages from the client + */ + go func() { + defer conn.Close() + for { + msg, op, err := wsutil.ReadClientData(conn) + if err != nil { + return + } + if op != ws.OpText { + return + } + m := make(map[string]any) + err = json.Unmarshal(msg, &m) + if err != nil { + return + } + manager.OnMessage(sessionId, m) + } + }() + + wg.Wait() + } +} + +func Handle() http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + // Set the necessary headers + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + w.Header().Set("Access-Control-Allow-Origin", "*") // Optional for CORS + + cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) + locator := cc.ServiceLocator() + manager := service.Get[SocketManager](locator) + + sessionCookie, _ := r.Cookie("state") + sessionId := "" + + if sessionCookie != nil { + sessionId = sessionCookie.Value + } + + ctx := r.Context() + + /* + Large buffer in case the client disconnects while we are writing + we don't want to block the writer + */ + done := make(chan bool, 1000) + writer := make(WriterChan, 1000) + + wg := sync.WaitGroup{} + wg.Add(1) + + /* + * This goroutine is responsible for writing messages to the client + */ + go func() { + defer wg.Done() + defer manager.Disconnect(sessionId) + + defer func() { + fmt.Printf("empting channels\n") + for len(writer) > 0 { + <-writer + } + for len(done) > 0 { + <-done + } + }() + + ticker := time.NewTicker(5 * time.Second) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-done: + fmt.Printf("closing connection: \n") + return + case <-ticker.C: + manager.Ping(sessionId) + case message := <-writer: + _, err := fmt.Fprintf(w, message) + if err != nil { + done <- true + } else { + flusher, ok := w.(http.Flusher) + if ok { + flusher.Flush() + } + } + } + } + }() + + /** + * This goroutine is responsible for adding the client to the room + */ + wg.Add(1) + go func() { + defer wg.Done() + if sessionId == "" { + manager.writeCloseRaw(writer, "no session") + return + } + + manager.Add("all", sessionId, writer, done) + }() + + wg.Wait() + } +} diff --git a/examples/sse-with-state/sse/manager.go b/examples/sse-with-state/sse/manager.go new file mode 100644 index 00000000..20c80752 --- /dev/null +++ b/examples/sse-with-state/sse/manager.go @@ -0,0 +1,235 @@ +package sse + +import ( + "fmt" + "github.com/puzpuzpuz/xsync/v3" + "strings" + "time" +) + +type EventType string +type WriterChan chan string +type DoneChan chan bool + +const ( + ConnectedEvent EventType = "connected" + DisconnectedEvent EventType = "disconnected" + MessageEvent EventType = "message" +) + +type SocketEvent struct { + SocketId string + RoomId string + Type EventType + Payload map[string]any +} + +type CloseEvent struct { + Code int + Reason string +} + +type SocketConnection struct { + Id string + RoomId string + Done DoneChan + Writer WriterChan +} + +type SocketManager struct { + sockets *xsync.MapOf[string, *xsync.MapOf[string, SocketConnection]] + idToRoom *xsync.MapOf[string, string] + listeners []chan SocketEvent +} + +func NewSocketManager() *SocketManager { + return &SocketManager{ + sockets: xsync.NewMapOf[string, *xsync.MapOf[string, SocketConnection]](), + idToRoom: xsync.NewMapOf[string, string](), + } +} + +func (manager *SocketManager) ForEachSocket(roomId string, cb func(conn SocketConnection)) { + sockets, ok := manager.sockets.Load(roomId) + if !ok { + return + } + sockets.Range(func(id string, conn SocketConnection) bool { + cb(conn) + return true + }) +} + +func (manager *SocketManager) Listen(listener chan SocketEvent) { + if manager.listeners == nil { + manager.listeners = make([]chan SocketEvent, 0) + } + if listener != nil { + manager.listeners = append(manager.listeners, listener) + } +} + +func (manager *SocketManager) dispatch(event SocketEvent) { + fmt.Printf("dispatching event: %s\n", event.Type) + done := make(chan struct{}, 1) + go func() { + for { + select { + case <-done: + fmt.Printf("dispatched event: %s\n", event.Type) + return + case <-time.After(5 * time.Second): + fmt.Printf("havent dispatched event after 5s, chan blocked: %s\n", event.Type) + } + } + }() + for _, listener := range manager.listeners { + listener <- event + } + done <- struct{}{} +} + +func (manager *SocketManager) OnMessage(id string, message map[string]any) { + socket := manager.Get(id) + if socket == nil { + return + } + manager.dispatch(SocketEvent{ + SocketId: id, + Type: MessageEvent, + Payload: message, + RoomId: socket.RoomId, + }) +} + +func (manager *SocketManager) Add(roomId string, id string, writer WriterChan, done DoneChan) { + manager.idToRoom.Store(id, roomId) + + sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { + return xsync.NewMapOf[string, SocketConnection]() + }) + + sockets.Store(id, SocketConnection{ + Id: id, + Writer: writer, + RoomId: roomId, + Done: done, + }) + + s, ok := sockets.Load(id) + if !ok { + return + } + + manager.dispatch(SocketEvent{ + SocketId: s.Id, + Type: ConnectedEvent, + RoomId: s.RoomId, + Payload: map[string]any{}, + }) + + fmt.Printf("User %s connected to %s\n", id, roomId) +} + +func (manager *SocketManager) OnClose(id string) { + socket := manager.Get(id) + if socket == nil { + return + } + manager.dispatch(SocketEvent{ + SocketId: id, + Type: DisconnectedEvent, + RoomId: socket.RoomId, + Payload: map[string]any{}, + }) + manager.sockets.Delete(id) +} + +func (manager *SocketManager) CloseWithMessage(id string, message string) { + conn := manager.Get(id) + if conn != nil { + defer manager.OnClose(id) + manager.writeText(*conn, message) + conn.Done <- true + } +} + +func (manager *SocketManager) Disconnect(id string) { + conn := manager.Get(id) + if conn != nil { + manager.OnClose(id) + conn.Done <- true + } +} + +func (manager *SocketManager) Get(id string) *SocketConnection { + roomId, ok := manager.idToRoom.Load(id) + if !ok { + return nil + } + sockets, ok := manager.sockets.Load(roomId) + if !ok { + return nil + } + conn, ok := sockets.Load(id) + return &conn +} + +func (manager *SocketManager) Ping(id string) { + conn := manager.Get(id) + if conn != nil { + manager.writeText(*conn, "ping") + } +} + +func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { + manager.writeTextRaw(writer, message) +} + +func (manager *SocketManager) writeTextRaw(writer WriterChan, message string) { + timeout := 3 * time.Second + select { + case writer <- message: + case <-time.After(timeout): + fmt.Printf("could not send %s to channel after %s\n", message, timeout) + } +} + +func (manager *SocketManager) writeText(socket SocketConnection, message string) { + if socket.Writer == nil { + return + } + manager.writeTextRaw(socket.Writer, message) +} + +func (manager *SocketManager) BroadcastText(roomId string, message string, predicate func(conn SocketConnection) bool) { + sockets, ok := manager.sockets.Load(roomId) + + if !ok { + return + } + + sockets.Range(func(id string, conn SocketConnection) bool { + if predicate(conn) { + manager.writeText(conn, message) + } + return true + }) +} + +func (manager *SocketManager) SendHtml(id string, message string) { + conn := manager.Get(id) + minified := strings.ReplaceAll(message, "\n", "") + minified = strings.ReplaceAll(minified, "\t", "") + minified = strings.TrimSpace(minified) + if conn != nil { + manager.writeText(*conn, minified) + } +} + +func (manager *SocketManager) SendText(id string, message string) { + conn := manager.Get(id) + if conn != nil { + manager.writeText(*conn, message) + } +} diff --git a/examples/sse-with-state/state/state.go b/examples/sse-with-state/state/state.go new file mode 100644 index 00000000..9fe72c7c --- /dev/null +++ b/examples/sse-with-state/state/state.go @@ -0,0 +1,67 @@ +package state + +import ( + "github.com/google/uuid" + "github.com/maddalax/htmgo/framework/h" + "github.com/puzpuzpuz/xsync/v3" + "net/http" +) + +type SessionId string + +var cache = xsync.NewMapOf[SessionId, *xsync.MapOf[string, any]]() + +type State struct { + SessionId SessionId +} + +func NewState(ctx *h.RequestContext) *State { + id := GetSessionId(ctx) + cache.Store(id, xsync.NewMapOf[string, any]()) + return &State{ + SessionId: id, + } +} + +func GetSessionId(ctx *h.RequestContext) SessionId { + stateCookie, err := ctx.Request.Cookie("state") + sessionId := "" + if err == nil { + sessionId = stateCookie.Value + } else { + sessionId = uuid.NewString() + } + + c := http.Cookie{ + Name: "state", + Value: sessionId, + } + ctx.Response.Header().Set("Set-Cookie", c.String()) + + return SessionId(sessionId) +} + +func Update[T any](sessionId SessionId, key string, compute func(prev T) T) T { + actual := Get[T](sessionId, key, *new(T)) + next := compute(actual) + Set(sessionId, key, next) + return next +} + +func Get[T any](sessionId SessionId, key string, fallback T) T { + actual, _ := cache.LoadOrCompute(sessionId, func() *xsync.MapOf[string, any] { + return xsync.NewMapOf[string, any]() + }) + value, exists := actual.Load(key) + if exists { + return value.(T) + } + return fallback +} + +func Set(sessionId SessionId, key string, value any) { + actual, _ := cache.LoadOrCompute(sessionId, func() *xsync.MapOf[string, any] { + return xsync.NewMapOf[string, any]() + }) + actual.Store(key, value) +} diff --git a/examples/sse-with-state/tailwind.config.js b/examples/sse-with-state/tailwind.config.js new file mode 100644 index 00000000..b18125c8 --- /dev/null +++ b/examples/sse-with-state/tailwind.config.js @@ -0,0 +1,5 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["**/*.go"], + plugins: [], +}; diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index fd740d47..c6e7ef96 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var re=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(I){return issueAjaxRequest(e,t,n,r,o,!!I)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},F=getClosestAttributeValue(n,"hx-prompt");if(F){var L=prompt(F);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),P=v.errors,M=v.formData;o.values&&overrideFormData(M,formDataFromObject(o.values));let W=formDataFromObject(getExpressionVars(n)),X=overrideFormData(M,W),q=filterValues(X,n);htmx.config.getCacheBusterParam&&e==="get"&&q.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let j=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,V=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:V,formData:q,parameters:formDataProxy(q),unfilteredFormData:X,unfilteredParameters:formDataProxy(X),headers:R,target:c,verb:e,errors:P,withCredentials:o.credentials||j.credentials||htmx.config.withCredentials,timeout:o.timeout||j.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,q=formDataFromObject(w.parameters),P=w.errors,V=w.useUrlParams,P&&P.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let $=t.split("#"),te=$[0],z=$[1],O=t;if(V&&(O=te,!q.keys().next().done&&(O.indexOf("?")<0?O+="?":O+="&",O+=urlEncode(q),z&&(O+="#"+z))),!verifyPath(n,O,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),O,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!j.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:f,pathInfo:{requestPath:t,finalRequestPath:O,responsePath:null,anchor:z}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(k,U),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let I=g.shift();bodyContains(I)&&(E=I);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(k,U),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(k,U),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(k,U),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var k=addRequestIndicatorClasses(n),U=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(I){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:I.lengthComputable,loaded:I.loaded,total:I.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ne=V?null:encodeParamsForBody(m,n,q);return m.send(ne),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,x.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=re;function oe(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=se(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=le(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&Q(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return Q(r,e,t,n),!0}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,B,ue="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function ce(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,J(t),!0;if(!t.detail.requestConfig)return !0;let n=ce(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(J(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var _="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;_===""&&(_=r),_!==r&&(_=r,fe());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function fe(){window.location.reload();}var de=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&G(t.target);}});function G(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(de)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var N=null,Z=new Set,D=null;h.defineExtension("ws",{init:function(e){N=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&G(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[ws-connect]");for(let o of Array.from(r)){let i=o.getAttribute("ws-connect");i&&!Z.has(i)&&(ee(o,i),Z.add(i));}}}});function he(e,t=100,n=1e4){let r=Math.random();return Math.min(t*Math.pow(2,e)*r,n)}function ee(e,t,n=0){if(t)return !t.startsWith("ws://")&&!t.startsWith("wss://")&&(t=(window.location.protocol==="https:"?"wss://":"ws://")+window.location.host+t),console.info("connecting to ws",t),D=new WebSocket(t),D.addEventListener("close",function(r){h.trigger(e,"htmx:wsClose",{event:r});let o=he(n);console.info(`ws closed, reconnecting in ${o}ms`),setTimeout(()=>{ee(e,t,n+1);},o);}),D.addEventListener("open",function(r){h.trigger(e,"htmx:wsOpen",{event:r});}),D.addEventListener("error",function(r){h.trigger(e,"htmx:wsError",{event:r});}),D.addEventListener("message",function(r){console.debug("ws message:",r.data);let o=N.makeSettleInfo(e);h.trigger(e,"htmx:wsBeforeMessage",{event:r});let i=r.data,s=N.makeFragment(i),l=Array.from(s.children);for(let a of l)N.oobSwap(N.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:wsAfterMessage",{event:r});}),D}window.onload=ge;function ge(){console.log("add ws event handlers"),new MutationObserver(n).observe(document.body,{childList:!0,subtree:!0});let t=new Set;function n(){let r=new Set;document.querySelectorAll("[data-handler-id]").forEach(o=>{let i=o.getAttribute("data-handler-id"),s=o.getAttribute("data-handler-event");i==null||s==null||(r.add(i),!t.has(i)&&(t.add(i),o.addEventListener(s,l=>{console.log("sending event",i,s,D),D!=null&&D.readyState===WebSocket.OPEN&&D.send(JSON.stringify({id:i,event:s}));})));});for(let o of t)r.has(o)||t.delete(o);console.log("size",t.size);}n();}window.htmx=h;function me(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}me((e,t)=>{Ee(t);});function Ee(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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cUJBQXFCLENBQ2xEc1YsQ0FBQUEsQ0FBQUEsRUFDRjFDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCc1YsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmJlZm9yZVN3YXAnLCAnaHRteDphZnRlclN3YXAnLCAnaHRteDpiZWZvcmVPbkxvYWQnLCAnaHRteDphZnRlck9uTG9hZCcsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gQHRzLWlnbm9yZVxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJzc2VcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzc2UtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNzZS1jb25uZWN0XCIpITtcbiAgICAgICAgICAgICAgICBpZih1cmwgJiYgIXByb2Nlc3NlZC5oYXModXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0RXZlbnRTb3VyY2UoZWxlbWVudCwgdXJsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYWRkKHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuXG5mdW5jdGlvbiBjb25uZWN0RXZlbnRTb3VyY2UoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnQ29ubmVjdGluZyB0byBFdmVudFNvdXJjZScsIHVybClcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIGV2ZW50U291cmNlLm9ub3BlbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhlbGUpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bXhleHRlbnNpb25zL3dzLWV2ZW50LWhhbmRsZXIudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsIndzIiwiY29ubmVjdFdzIiwiZXhwb25lbnRpYWxCYWNrb2ZmIiwiYXR0ZW1wdCIsImJhc2VEZWxheSIsIm1heERlbGF5Iiwiaml0dGVyIiwiY2hpbGRyZW4iLCJhZGRXc0V2ZW50SGFuZGxlcnMiLCJyZWdpc3RlciIsImFkZGVkIiwiaWRzIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElB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QSxDQUVELFNBQVMsZ0JBQWlCLENBQUEsZUFBZSxFQUFFLE9BQVNoRyxDQUFBQSxDQUFBQSxFQUFPLENBQ3pELElBQUkrVixDQUFBQSxDQUFXLEdBQ2YsSUFBUy9YLElBQUFBLENBQUFBLElBQVFnQyxFQUFHLGlCQUFrQixFQUFBLENBQ3BDLEdBQUloQyxDQUFLLENBQUEsVUFBQSxDQUFXLHNCQUFzQixDQUFHLENBQUEsQ0FDM0MsSUFBSWMsQ0FBUWQsQ0FBQUEsQ0FBQUEsQ0FBSyxRQUFRLHNCQUF3QixDQUFBLEVBQUUsRUFFbkQsR0FEWTZDLENBQUFBLENBQUksYUFBYSxHQUFJL0IsQ0FBQUEsQ0FBSyxFQUMzQixDQUNUOFQsQ0FBQUEsQ0FBSyxJQUFLNVMsQ0FBQUEsQ0FBQUEsQ0FBSUEsQ0FBRyxDQUFBLFlBQUEsQ0FBYWhDLENBQUksQ0FBSyxFQUFBLEVBQUEsQ0FBSSxDQUN6QyxTQUFXLENBQUEsV0FBQSxDQUNYLFVBQVcsQ0FDWCxDQUFBLFdBQUEsQ0FBYSxDQUNmLENBQUMsQ0FBQSxDQUNEK1gsRUFBVyxDQUNYLENBQUEsQ0FBQSxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLENBQVUsQ0FBQSxDQUNiLElBQUlDLENBQUFBLENBQWFoVyxDQUFHLENBQUEsWUFBQSxDQUFhLHFCQUFxQixDQUNsRGdXLENBQUFBLENBQUFBLEVBQ0ZwRCxFQUFLLElBQ0g1UyxDQUFBQSxDQUFBQSxDQUNBQSxFQUFHLFlBQWEsQ0FBQSxzQkFBQSxDQUF5QmdXLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgaWdub3JlZEV2ZW50cyA9IFsnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCAnaHRteDpiZWZvcmVTd2FwJywgJ2h0bXg6YWZ0ZXJTd2FwJywgJ2h0bXg6YmVmb3JlT25Mb2FkJywgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCAnaHRteDpjb25maWdSZXF1ZXN0JywgJ2h0bXg6Y29uZmlnUmVzcG9uc2UnLCAnaHRteDpyZXNwb25zZUVycm9yJ107XG5cbmZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWU6IHN0cmluZywgZGV0YWlsOiBhbnkpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQ6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDdXN0b21FdmVudCwgdHJpZ2dlcmVkOiBTZXQ8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYoaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0YXJnZXQuY2hpbGRyZW4pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtlaGFiID0ga2ViYWJFdmVudE5hbWUobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZWhhYi5yZXBsYWNlKFwiaHRteDpcIiwgXCJoeC1vbjo6XCIpXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJlZC5oYXMoZSBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZihlLmhhc0F0dHJpYnV0ZShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5ldmVudC5kZXRhaWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmRldGFpbC5tZXRhID0gJ3RyaWdnZXItY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8vIEB0cy1pZ25vcmVcbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5pbXBvcnQge2FkZFdzRXZlbnRIYW5kbGVyc30gZnJvbSBcIi4vd3MtZXZlbnQtaGFuZGxlclwiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuZXhwb3J0IGxldCB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwid3NcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3cy1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwid3MtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdzKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gZXhwb25lbnRpYWxCYWNrb2ZmKGF0dGVtcHQ6IG51bWJlciwgYmFzZURlbGF5ID0gMTAwLCBtYXhEZWxheSA9IDEwMDAwKSB7XG4gICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogYmFzZURlbGF5ICogKDIgXiBhdHRlbXB0KSB3aXRoIGppdHRlclxuICAgIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCk7IC8vIEFkZGluZyByYW5kb21uZXNzIHRvIHByZXZlbnQgY29sbGlzaW9uc1xuICAgIHJldHVybiBNYXRoLm1pbihiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSAqIGppdHRlciwgbWF4RGVsYXkpO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0V3MoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZywgYXR0ZW1wdDogbnVtYmVyID0gMCkge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmKCF1cmwuc3RhcnRzV2l0aCgnd3M6Ly8nKSAmJiAhdXJsLnN0YXJ0c1dpdGgoJ3dzczovLycpKSB7XG4gICAgICAgIGNvbnN0IGlzU2VjdXJlID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICB1cmwgPSAoaXNTZWN1cmUgPyAnd3NzOi8vJyA6ICd3czovLycpICsgd2luZG93LmxvY2F0aW9uLmhvc3QgKyB1cmxcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdjb25uZWN0aW5nIHRvIHdzJywgdXJsKVxuICAgIHdzID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuXG4gICAgd3MuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c0Nsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgZGVsYXkgPSBleHBvbmVudGlhbEJhY2tvZmYoYXR0ZW1wdCk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgd3MgY2xvc2VkLCByZWNvbm5lY3RpbmcgaW4gJHtkZWxheX1tc2ApXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29ubmVjdFdzKGVsZSwgdXJsLCBhdHRlbXB0ICsgMSlcbiAgICAgICAgfSwgZGVsYXkpXG4gICAgfSlcblxuICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c09wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCd3cyBtZXNzYWdlOicsIGV2ZW50LmRhdGEpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c0FmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIHJldHVybiB3c1xufVxuIiwiaW1wb3J0IHt3c30gZnJvbSBcIi4vd3NcIjtcblxud2luZG93Lm9ubG9hZCA9IGFkZFdzRXZlbnRIYW5kbGVycztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdzRXZlbnRIYW5kbGVycygpIHtcbiAgICBjb25zb2xlLmxvZygnYWRkIHdzIGV2ZW50IGhhbmRsZXJzJylcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHJlZ2lzdGVyKVxuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pXG5cbiAgICBsZXQgYWRkZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKCkge1xuICAgICAgICBsZXQgaWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1oYW5kbGVyLWlkXVwiKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtaGFuZGxlci1pZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhhbmRsZXItZXZlbnRcIik7XG5cbiAgICAgICAgICAgIGlmKGlkID09IG51bGwgfHwgZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWRzLmFkZChpZCk7XG4gICAgICAgICAgICBpZiAoYWRkZWQuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZGVkLmFkZChpZCk7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlbmRpbmcgZXZlbnQnLCBpZCwgZXZlbnQsIHdzKVxuICAgICAgICAgICAgICAgIGlmKHdzICE9IG51bGwgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7aWQsIGV2ZW50fSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICBmb3IgKGxldCBpZCBvZiBhZGRlZCkge1xuICAgICAgICAgICAgaWYgKCFpZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgIGFkZGVkLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3NpemUnLCBhZGRlZC5zaXplKVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKClcbn1cblxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvd3NcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy93cy1ldmVudC1oYW5kbGVyXCJcblxuLy8gQHRzLWlnbm9yZVxud2luZG93Lmh0bXggPSBodG14O1xuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 29cb7091..b2feebb2 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -6,7 +6,8 @@ import "./htmxextensions/response-targets"; import "./htmxextensions/mutation-error"; import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; -import "./htmxextensions/sse" +import "./htmxextensions/ws" +import "./htmxextensions/ws-event-handler" // @ts-ignore window.htmx = htmx; diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts deleted file mode 100644 index b4b7a19e..00000000 --- a/framework/assets/js/htmxextensions/sse.ts +++ /dev/null @@ -1,72 +0,0 @@ -import htmx from 'htmx.org' -import {removeAssociatedScripts} from "./htmgo"; - -let api : any = null; -let processed = new Set() - -htmx.defineExtension("sse", { - init: function (apiRef) { - api = apiRef; - }, - // @ts-ignore - onEvent: function (name, evt) { - const target = evt.target; - if(!(target instanceof HTMLElement)) { - return - } - - if(name === 'htmx:beforeCleanupElement') { - removeAssociatedScripts(target); - } - - if(name === 'htmx:beforeProcessNode') { - const elements = document.querySelectorAll('[sse-connect]'); - for (let element of Array.from(elements)) { - const url = element.getAttribute("sse-connect")!; - if(url && !processed.has(url)) { - connectEventSource(element, url) - processed.add(url) - } - } - } - } -}) - -function connectEventSource(ele: Element, url: string) { - if(!url) { - return - } - console.info('Connecting to EventSource', url) - const eventSource = new EventSource(url); - - eventSource.addEventListener("close", function(event) { - htmx.trigger(ele, "htmx:sseClose", {event: event}); - }) - - eventSource.onopen = function(event) { - htmx.trigger(ele, "htmx:sseOpen", {event: event}); - } - - eventSource.onerror = function(event) { - htmx.trigger(ele, "htmx:sseError", {event: event}); - if (eventSource.readyState == EventSource.CLOSED) { - htmx.trigger(ele, "htmx:sseClose", {event: event}); - } - } - - eventSource.onmessage = function(event) { - const settleInfo = api.makeSettleInfo(ele); - htmx.trigger(ele, "htmx:sseBeforeMessage", {event: event}); - const response = event.data - const fragment = api.makeFragment(response) as DocumentFragment; - const children = Array.from(fragment.children); - for (let child of children) { - api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, settleInfo); - // support htmgo eval__ scripts - if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { - document.body.appendChild(child); - } - } - htmx.trigger(ele, "htmx:sseAfterMessage", {event: event}); - } -} diff --git a/framework/assets/js/htmxextensions/ws-event-handler.ts b/framework/assets/js/htmxextensions/ws-event-handler.ts new file mode 100644 index 00000000..29cd4e36 --- /dev/null +++ b/framework/assets/js/htmxextensions/ws-event-handler.ts @@ -0,0 +1,44 @@ +import {ws} from "./ws"; + +window.onload = addWsEventHandlers; + +export function addWsEventHandlers() { + console.log('add ws event handlers') + const observer = new MutationObserver(register) + observer.observe(document.body, {childList: true, subtree: true}) + + let added = new Set(); + + function register() { + let ids = new Set(); + document.querySelectorAll("[data-handler-id]").forEach(element => { + const id = element.getAttribute("data-handler-id"); + const event = element.getAttribute("data-handler-event"); + + if(id == null || event == null) { + return; + } + + ids.add(id); + if (added.has(id)) { + return; + } + added.add(id); + element.addEventListener(event, (e) => { + console.log('sending event', id, event, ws) + if(ws != null && ws.readyState === WebSocket.OPEN) { + ws.send(JSON.stringify({id, event})); + } + }); + }) + for (let id of added) { + if (!ids.has(id)) { + added.delete(id); + } + } + console.log('size', added.size) + } + + register() +} + diff --git a/framework/assets/js/htmxextensions/ws.ts b/framework/assets/js/htmxextensions/ws.ts new file mode 100644 index 00000000..4c35837f --- /dev/null +++ b/framework/assets/js/htmxextensions/ws.ts @@ -0,0 +1,89 @@ +import htmx from 'htmx.org' +import {removeAssociatedScripts} from "./htmgo"; +import {addWsEventHandlers} from "./ws-event-handler"; + +let api : any = null; +let processed = new Set() +export let ws: WebSocket | null = null; + +htmx.defineExtension("ws", { + init: function (apiRef) { + api = apiRef; + }, + // @ts-ignore + onEvent: function (name, evt) { + const target = evt.target; + if(!(target instanceof HTMLElement)) { + return + } + + if(name === 'htmx:beforeCleanupElement') { + removeAssociatedScripts(target); + } + + if(name === 'htmx:beforeProcessNode') { + const elements = document.querySelectorAll('[ws-connect]'); + for (let element of Array.from(elements)) { + const url = element.getAttribute("ws-connect")!; + if(url && !processed.has(url)) { + connectWs(element, url) + processed.add(url) + } + } + } + } +}) + +function exponentialBackoff(attempt: number, baseDelay = 100, maxDelay = 10000) { + // Exponential backoff: baseDelay * (2 ^ attempt) with jitter + const jitter = Math.random(); // Adding randomness to prevent collisions + return Math.min(baseDelay * Math.pow(2, attempt) * jitter, maxDelay); +} + +function connectWs(ele: Element, url: string, attempt: number = 0) { + if(!url) { + return + } + if(!url.startsWith('ws://') && !url.startsWith('wss://')) { + const isSecure = window.location.protocol === 'https:' + url = (isSecure ? 'wss://' : 'ws://') + window.location.host + url + } + console.info('connecting to ws', url) + ws = new WebSocket(url); + + ws.addEventListener("close", function(event) { + htmx.trigger(ele, "htmx:wsClose", {event: event}); + const delay = exponentialBackoff(attempt); + console.info(`ws closed, reconnecting in ${delay}ms`) + setTimeout(() => { + connectWs(ele, url, attempt + 1) + }, delay) + }) + + ws.addEventListener("open", function(event) { + htmx.trigger(ele, "htmx:wsOpen", {event: event}); + }) + + ws.addEventListener("error", function(event) { + htmx.trigger(ele, "htmx:wsError", {event: event}); + }) + + ws.addEventListener("message", function(event) { + console.debug('ws message:', event.data) + const settleInfo = api.makeSettleInfo(ele); + htmx.trigger(ele, "htmx:wsBeforeMessage", {event: event}); + const response = event.data + const fragment = api.makeFragment(response) as DocumentFragment; + const children = Array.from(fragment.children); + for (let child of children) { + api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, settleInfo); + // support htmgo eval__ scripts + if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { + document.body.appendChild(child); + } + } + htmx.trigger(ele, "htmx:wsAfterMessage", {event: event}); + }) + + return ws +} diff --git a/framework/assets/js/util/dom.ts b/framework/assets/js/util/dom.ts new file mode 100644 index 00000000..e69de29b diff --git a/framework/h/app.go b/framework/h/app.go index e8c6f5e3..d369f7d4 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -20,7 +20,7 @@ type RequestContext struct { Response http.ResponseWriter locator *service.Locator isBoosted bool - currentBrowserUrl string + CurrentBrowserUrl string hxPromptResponse string isHxRequest bool hxTargetId string @@ -80,7 +80,7 @@ const RequestContextKey = "htmgo.request.context" func populateHxFields(cc *RequestContext) { cc.isBoosted = cc.Request.Header.Get(hx.BoostedHeader) == "true" cc.isBoosted = cc.Request.Header.Get(hx.BoostedHeader) == "true" - cc.currentBrowserUrl = cc.Request.Header.Get(hx.CurrentUrlHeader) + cc.CurrentBrowserUrl = cc.Request.Header.Get(hx.CurrentUrlHeader) cc.hxPromptResponse = cc.Request.Header.Get(hx.PromptResponseHeader) cc.isHxRequest = cc.Request.Header.Get(hx.RequestHeader) == "true" cc.hxTargetId = cc.Request.Header.Get(hx.TargetIdHeader) diff --git a/framework/h/extensions.go b/framework/h/extensions.go index 8eda90d4..52cbe129 100644 --- a/framework/h/extensions.go +++ b/framework/h/extensions.go @@ -3,7 +3,7 @@ package h import "strings" func BaseExtensions() string { - extensions := []string{"path-deps", "response-targets", "mutation-error", "htmgo", "sse"} + extensions := []string{"path-deps", "response-targets", "mutation-error", "htmgo", "sse", "ws"} if IsDevelopment() { extensions = append(extensions, "livereload") } diff --git a/framework/h/header.go b/framework/h/header.go index aba7c0af..ed13f9a0 100644 --- a/framework/h/header.go +++ b/framework/h/header.go @@ -16,7 +16,7 @@ func PushUrlHeader(url string) *Headers { } func PushQsHeader(ctx *RequestContext, qs *Qs) *Headers { - parsed, err := url.Parse(ctx.currentBrowserUrl) + parsed, err := url.Parse(ctx.CurrentBrowserUrl) if err != nil { return NewHeaders() } diff --git a/framework/h/qs.go b/framework/h/qs.go index 75fad83b..a7cfb3ed 100644 --- a/framework/h/qs.go +++ b/framework/h/qs.go @@ -51,7 +51,7 @@ func (q *Qs) ToString() string { func GetQueryParam(ctx *RequestContext, key string) string { value, ok := ctx.Request.URL.Query()[key] if value == nil || !ok { - current := ctx.currentBrowserUrl + current := ctx.CurrentBrowserUrl if current != "" { u, err := url.Parse(current) if err == nil { diff --git a/framework/h/tag.go b/framework/h/tag.go index 23fd3b4c..55c3dd10 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -2,6 +2,7 @@ package h import ( "fmt" + "github.com/maddalax/htmgo/framework/internal/util" "strconv" ) @@ -153,6 +154,10 @@ func Div(children ...Ren) *Element { return Tag("div", children...) } +func GenId() string { + return util.RandSeq(6) +} + func Article(children ...Ren) *Element { return Tag("article", children...) } From f3cb95960c8819605658647acb816881031c4dd9 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 9 Oct 2024 10:28:41 -0500 Subject: [PATCH 028/145] fix watcher to watch newly added dirs add utility methods to RequestContext Fix GetPartialPath --- cli/htmgo/watcher.go | 29 ++++++++++++++++++++++++++++- framework/h/app.go | 41 ++++++++++++++++++++++++++++++++++++++++- framework/h/base.go | 2 +- 3 files changed, 69 insertions(+), 3 deletions(-) diff --git a/cli/htmgo/watcher.go b/cli/htmgo/watcher.go index f2a0ee8b..809e7e09 100644 --- a/cli/htmgo/watcher.go +++ b/cli/htmgo/watcher.go @@ -35,10 +35,37 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { for { select { case event, ok := <-watcher.Events: + slog.Debug("event:", slog.String("name", event.Name), slog.String("op", event.Op.String())) + if !ok { return } - slog.Debug("event:", slog.String("name", event.Name), slog.String("op", event.Op.String())) + + if event.Has(fsnotify.Remove) { + err = watcher.Remove(event.Name) + if err != nil { + slog.Error("Error removing directory from watcher:", slog.String("path", event.Name), slog.String("error", err.Error())) + } else { + slog.Debug("Stopped watching directory:", slog.String("path", event.Name)) + } + } + + if event.Has(fsnotify.Create) { + info, err := os.Stat(event.Name) + if err != nil { + slog.Error("Error getting file info:", slog.String("path", event.Name), slog.String("error", err.Error())) + continue + } + if info.IsDir() { + err = watcher.Add(event.Name) + if err != nil { + slog.Error("Error adding directory to watcher:", slog.String("path", event.Name), slog.String("error", err.Error())) + } else { + slog.Debug("Watching directory:", slog.String("path", event.Name)) + } + } + } + if event.Has(fsnotify.Write) || event.Has(fsnotify.Remove) || event.Has(fsnotify.Rename) { events = append(events, &event) debouncer.Do(func() { diff --git a/framework/h/app.go b/framework/h/app.go index d369f7d4..f18e3850 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -29,14 +29,54 @@ type RequestContext struct { kv map[string]interface{} } +func GetRequestContext(r *http.Request) *RequestContext { + return r.Context().Value(RequestContextKey).(*RequestContext) +} + func (c *RequestContext) FormValue(key string) string { return c.Request.FormValue(key) } +func (c *RequestContext) Header(key string) string { + return c.Request.Header.Get(key) +} + +func (c *RequestContext) UrlParam(key string) string { + return chi.URLParam(c.Request, key) +} + func (c *RequestContext) QueryParam(key string) string { return c.Request.URL.Query().Get(key) } +func (c *RequestContext) IsBoosted() bool { + return c.isBoosted +} + +func (c *RequestContext) IsHxRequest() bool { + return c.isHxRequest +} + +func (c *RequestContext) HxPromptResponse() string { + return c.hxPromptResponse +} + +func (c *RequestContext) HxTargetId() string { + return c.hxTargetId +} + +func (c *RequestContext) HxTriggerName() string { + return c.hxTriggerName +} + +func (c *RequestContext) HxTriggerId() string { + return c.hxTriggerId +} + +func (c *RequestContext) HxCurrentBrowserUrl() string { + return c.CurrentBrowserUrl +} + func (c *RequestContext) Set(key string, value interface{}) { if c.kv == nil { c.kv = make(map[string]interface{}) @@ -78,7 +118,6 @@ func Start(opts AppOpts) { const RequestContextKey = "htmgo.request.context" func populateHxFields(cc *RequestContext) { - cc.isBoosted = cc.Request.Header.Get(hx.BoostedHeader) == "true" cc.isBoosted = cc.Request.Header.Get(hx.BoostedHeader) == "true" cc.CurrentBrowserUrl = cc.Request.Header.Get(hx.CurrentUrlHeader) cc.hxPromptResponse = cc.Request.Header.Get(hx.PromptResponseHeader) diff --git a/framework/h/base.go b/framework/h/base.go index 1ec82a14..ec0030fe 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -85,7 +85,7 @@ func SwapManyXPartial(ctx *RequestContext, swaps ...SwapArg) *Partial { } func GetPartialPath(partial PartialFunc) string { - return runtime.FuncForPC(reflect.ValueOf(partial).Pointer()).Name() + return "/" + runtime.FuncForPC(reflect.ValueOf(partial).Pointer()).Name() } func GetPartialPathWithQs(partial func(ctx *RequestContext) *Partial, qs *Qs) string { From 0b38bcaa21ed4e2f8d44444684ffe643e7323660 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 9 Oct 2024 10:30:14 -0500 Subject: [PATCH 029/145] Revert "websocket stuff wip" This reverts commit 9f53e8b2 --- examples/sse-with-state/.dockerignore | 11 - examples/sse-with-state/.gitignore | 6 - examples/sse-with-state/Dockerfile | 38 --- examples/sse-with-state/Taskfile.yml | 20 -- examples/sse-with-state/assets.go | 13 - examples/sse-with-state/assets/css/input.css | 3 - examples/sse-with-state/assets_prod.go | 16 -- examples/sse-with-state/event/listener.go | 124 --------- examples/sse-with-state/go.mod | 14 -- examples/sse-with-state/go.sum | 24 -- .../sse-with-state/internal/embedded/os.go | 17 -- examples/sse-with-state/internal/random.go | 13 - examples/sse-with-state/main.go | 39 --- examples/sse-with-state/pages/index.go | 41 --- examples/sse-with-state/pages/root.go | 21 -- examples/sse-with-state/partials/click.go | 19 -- examples/sse-with-state/partials/index.go | 80 ------ examples/sse-with-state/partials/repeater.go | 77 ------ examples/sse-with-state/sse/handler.go | 203 --------------- examples/sse-with-state/sse/manager.go | 235 ------------------ examples/sse-with-state/state/state.go | 67 ----- examples/sse-with-state/tailwind.config.js | 5 - framework/assets/dist/htmgo.js | 4 +- framework/assets/js/htmgo.ts | 3 +- framework/assets/js/htmxextensions/sse.ts | 72 ++++++ .../js/htmxextensions/ws-event-handler.ts | 44 ---- framework/assets/js/htmxextensions/ws.ts | 89 ------- framework/assets/js/util/dom.ts | 0 framework/h/extensions.go | 2 +- framework/h/header.go | 2 +- framework/h/qs.go | 2 +- framework/h/tag.go | 5 - 32 files changed, 78 insertions(+), 1231 deletions(-) delete mode 100644 examples/sse-with-state/.dockerignore delete mode 100644 examples/sse-with-state/.gitignore delete mode 100644 examples/sse-with-state/Dockerfile delete mode 100644 examples/sse-with-state/Taskfile.yml delete mode 100644 examples/sse-with-state/assets.go delete mode 100644 examples/sse-with-state/assets/css/input.css delete mode 100644 examples/sse-with-state/assets_prod.go delete mode 100644 examples/sse-with-state/event/listener.go delete mode 100644 examples/sse-with-state/go.mod delete mode 100644 examples/sse-with-state/go.sum delete mode 100644 examples/sse-with-state/internal/embedded/os.go delete mode 100644 examples/sse-with-state/internal/random.go delete mode 100644 examples/sse-with-state/main.go delete mode 100644 examples/sse-with-state/pages/index.go delete mode 100644 examples/sse-with-state/pages/root.go delete mode 100644 examples/sse-with-state/partials/click.go delete mode 100644 examples/sse-with-state/partials/index.go delete mode 100644 examples/sse-with-state/partials/repeater.go delete mode 100644 examples/sse-with-state/sse/handler.go delete mode 100644 examples/sse-with-state/sse/manager.go delete mode 100644 examples/sse-with-state/state/state.go delete mode 100644 examples/sse-with-state/tailwind.config.js create mode 100644 framework/assets/js/htmxextensions/sse.ts delete mode 100644 framework/assets/js/htmxextensions/ws-event-handler.ts delete mode 100644 framework/assets/js/htmxextensions/ws.ts delete mode 100644 framework/assets/js/util/dom.ts diff --git a/examples/sse-with-state/.dockerignore b/examples/sse-with-state/.dockerignore deleted file mode 100644 index fb47686a..00000000 --- a/examples/sse-with-state/.dockerignore +++ /dev/null @@ -1,11 +0,0 @@ -# Project exclude paths -/tmp/ -node_modules/ -dist/ -js/dist -js/node_modules -go.work -go.work.sum -.idea -!framework/assets/dist -__htmgo \ No newline at end of file diff --git a/examples/sse-with-state/.gitignore b/examples/sse-with-state/.gitignore deleted file mode 100644 index 3d6a9799..00000000 --- a/examples/sse-with-state/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/assets/dist -tmp -node_modules -.idea -__htmgo -dist \ No newline at end of file diff --git a/examples/sse-with-state/Dockerfile b/examples/sse-with-state/Dockerfile deleted file mode 100644 index a522f64f..00000000 --- a/examples/sse-with-state/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -# Stage 1: Build the Go binary -FROM golang:1.23-alpine AS builder - -RUN apk update -RUN apk add git -RUN apk add curl - -# Set the working directory inside the container -WORKDIR /app - -# Copy go.mod and go.sum files -COPY go.mod go.sum ./ - -# Download and cache the Go modules -RUN go mod download - -# Copy the source code into the container -COPY . . - -# Build the Go binary for Linux -RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build - - -# Stage 2: Create the smallest possible image -FROM gcr.io/distroless/base-debian11 - -# Set the working directory inside the container -WORKDIR /app - -# Copy the Go binary from the builder stage -COPY --from=builder /app/dist . - -# Expose the necessary port (replace with your server port) -EXPOSE 3000 - - -# Command to run the binary -CMD ["./sse-with-state"] diff --git a/examples/sse-with-state/Taskfile.yml b/examples/sse-with-state/Taskfile.yml deleted file mode 100644 index 695006f0..00000000 --- a/examples/sse-with-state/Taskfile.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: '3' - -tasks: - run: - cmds: - - go run github.com/maddalax/htmgo/cli/htmgo@latest run - silent: true - - build: - cmds: - - go run github.com/maddalax/htmgo/cli/htmgo@latest build - - docker: - cmds: - - docker build . - - watch: - cmds: - - go run github.com/maddalax/htmgo/cli/htmgo@latest watch - silent: true \ No newline at end of file diff --git a/examples/sse-with-state/assets.go b/examples/sse-with-state/assets.go deleted file mode 100644 index 63021d16..00000000 --- a/examples/sse-with-state/assets.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !prod -// +build !prod - -package main - -import ( - "io/fs" - "sse-with-state/internal/embedded" -) - -func GetStaticAssets() fs.FS { - return embedded.NewOsFs() -} diff --git a/examples/sse-with-state/assets/css/input.css b/examples/sse-with-state/assets/css/input.css deleted file mode 100644 index bd6213e1..00000000 --- a/examples/sse-with-state/assets/css/input.css +++ /dev/null @@ -1,3 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; \ No newline at end of file diff --git a/examples/sse-with-state/assets_prod.go b/examples/sse-with-state/assets_prod.go deleted file mode 100644 index f0598e1c..00000000 --- a/examples/sse-with-state/assets_prod.go +++ /dev/null @@ -1,16 +0,0 @@ -//go:build prod -// +build prod - -package main - -import ( - "embed" - "io/fs" -) - -//go:embed assets/dist/* -var staticAssets embed.FS - -func GetStaticAssets() fs.FS { - return staticAssets -} diff --git a/examples/sse-with-state/event/listener.go b/examples/sse-with-state/event/listener.go deleted file mode 100644 index 08c6762a..00000000 --- a/examples/sse-with-state/event/listener.go +++ /dev/null @@ -1,124 +0,0 @@ -package event - -import ( - "fmt" - "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/service" - "github.com/puzpuzpuz/xsync/v3" - "sse-with-state/internal" - "sse-with-state/sse" - "sse-with-state/state" -) - -type HandlerData struct { - SessionId state.SessionId - Socket *sse.SocketConnection - Manager *sse.SocketManager -} - -type Handler func(data HandlerData) - -type handlerWrapper struct { - handler Handler - sessionId state.SessionId -} - -type ServerSideEvent struct { - Event string - Payload map[string]any - SessionId state.SessionId -} - -var Map = xsync.NewMapOf[string, handlerWrapper]() -var ServerSideEventMap = xsync.NewMapOf[string, *xsync.MapOf[string, handlerWrapper]]() -var socketMessageListener = make(chan sse.SocketEvent, 100) -var serverSideMessageListener = make(chan ServerSideEvent, 100) - -func AddServerSideHandler(ctx *h.RequestContext, id string, event string, handler Handler) { - sessionId := state.GetSessionId(ctx) - - wrapper := handlerWrapper{ - handler: handler, - sessionId: sessionId, - } - - handlers, ok := ServerSideEventMap.Load(event) - if !ok { - ServerSideEventMap.Store(event, xsync.NewMapOf[string, handlerWrapper]()) - } - - handlers, _ = ServerSideEventMap.Load(event) - handlers.Store(id, wrapper) - - fmt.Printf("added server side handler for %s, %v\n", event, handlers) -} - -func AddHandler(ctx *h.RequestContext, event string, handler Handler) *h.AttributeMapOrdered { - handlerId := fmt.Sprintf("event_%s_%s", event, internal.RandSeq(30)) - for { - _, ok := Map.Load(handlerId) - if ok { - handlerId = fmt.Sprintf("event_%s_%s", event, internal.RandSeq(30)) - } else { - break - } - } - sessionId := state.GetSessionId(ctx) - Map.Store(handlerId, handlerWrapper{ - handler: handler, - sessionId: sessionId, - }) - return h.AttributePairs( - "data-handler-id", handlerId, - "data-handler-event", event, - ) -} - -func PushServerSideEvent(sessionId state.SessionId, event string) { - serverSideMessageListener <- ServerSideEvent{ - Event: event, - Payload: make(map[string]any), - SessionId: sessionId, - } -} - -func PushElement(data HandlerData, el *h.Element) { - data.Manager.SendHtml(data.Socket.Id, h.Render(el)) -} - -func StartListener(locator *service.Locator) { - manager := service.Get[sse.SocketManager](locator) - manager.Listen(socketMessageListener) - go func() { - for { - select { - case sevent := <-serverSideMessageListener: - handlers, ok := ServerSideEventMap.Load(sevent.Event) - if ok { - handlers.Range(func(key string, value handlerWrapper) bool { - go value.handler(HandlerData{ - SessionId: sevent.SessionId, - Socket: manager.Get(string(sevent.SessionId)), - Manager: manager, - }) - return true - }) - } - case event := <-socketMessageListener: - if event.Type == sse.MessageEvent { - handlerId := event.Payload["id"].(string) - eventName := event.Payload["event"].(string) - cb, ok := Map.Load(handlerId) - if ok { - fmt.Printf("calling %s handler for session: %s\n", eventName, cb.sessionId) - go cb.handler(HandlerData{ - SessionId: cb.sessionId, - Socket: manager.Get(event.SocketId), - Manager: manager, - }) - } - } - } - } - }() -} diff --git a/examples/sse-with-state/go.mod b/examples/sse-with-state/go.mod deleted file mode 100644 index f10fa8a8..00000000 --- a/examples/sse-with-state/go.mod +++ /dev/null @@ -1,14 +0,0 @@ -module sse-with-state - -go 1.23.0 - -require github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b - -require ( - github.com/go-chi/chi/v5 v5.1.0 // indirect - github.com/gobwas/httphead v0.1.0 // indirect - github.com/gobwas/pool v0.2.1 // indirect - github.com/gobwas/ws v1.4.0 // indirect - github.com/google/uuid v1.6.0 // indirect - golang.org/x/sys v0.6.0 // indirect -) diff --git a/examples/sse-with-state/go.sum b/examples/sse-with-state/go.sum deleted file mode 100644 index 94d56347..00000000 --- a/examples/sse-with-state/go.sum +++ /dev/null @@ -1,24 +0,0 @@ -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= -github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.4.0 h1:CTaoG1tojrh4ucGPcoJFiAQUAsEWekEWvLy7GsVNqGs= -github.com/gobwas/ws v1.4.0/go.mod h1:G3gNqMNtPppf5XUz7O4shetPpcZ1VJ7zt18dlUeakrc= -github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= -github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b h1:LzZTNwIGe0RHiEJZlpnpN8GRnKg2lCZppMX+JIyeF/g= -github.com/maddalax/htmgo/framework v0.0.0-20241006162137-150c87b4560b/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/sse-with-state/internal/embedded/os.go b/examples/sse-with-state/internal/embedded/os.go deleted file mode 100644 index ddfd55f5..00000000 --- a/examples/sse-with-state/internal/embedded/os.go +++ /dev/null @@ -1,17 +0,0 @@ -package embedded - -import ( - "io/fs" - "os" -) - -type OsFs struct { -} - -func (receiver OsFs) Open(name string) (fs.File, error) { - return os.Open(name) -} - -func NewOsFs() OsFs { - return OsFs{} -} diff --git a/examples/sse-with-state/internal/random.go b/examples/sse-with-state/internal/random.go deleted file mode 100644 index cdd54167..00000000 --- a/examples/sse-with-state/internal/random.go +++ /dev/null @@ -1,13 +0,0 @@ -package internal - -import "math/rand" - -var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") - -func RandSeq(n int) string { - b := make([]rune, n) - for i := range b { - b[i] = letters[rand.Intn(len(letters))] - } - return string(b) -} diff --git a/examples/sse-with-state/main.go b/examples/sse-with-state/main.go deleted file mode 100644 index 408b40a4..00000000 --- a/examples/sse-with-state/main.go +++ /dev/null @@ -1,39 +0,0 @@ -package main - -import ( - "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/service" - "io/fs" - "net/http" - "sse-with-state/__htmgo" - "sse-with-state/event" - "sse-with-state/sse" -) - -func main() { - locator := service.NewLocator() - - service.Set[sse.SocketManager](locator, service.Singleton, func() *sse.SocketManager { - return sse.NewSocketManager() - }) - - event.StartListener(locator) - - h.Start(h.AppOpts{ - ServiceLocator: locator, - LiveReload: true, - Register: func(app *h.App) { - sub, err := fs.Sub(GetStaticAssets(), "assets/dist") - - if err != nil { - panic(err) - } - - http.FileServerFS(sub) - - app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) - app.Router.Handle("/ws/test", sse.HandleWs()) - __htmgo.Register(app.Router) - }, - }) -} diff --git a/examples/sse-with-state/pages/index.go b/examples/sse-with-state/pages/index.go deleted file mode 100644 index 7c1528d6..00000000 --- a/examples/sse-with-state/pages/index.go +++ /dev/null @@ -1,41 +0,0 @@ -package pages - -import ( - "fmt" - "github.com/maddalax/htmgo/framework/h" - "sse-with-state/partials" - "sse-with-state/state" -) - -func IndexPage(ctx *h.RequestContext) *h.Page { - state.NewState(ctx) - return h.NewPage( - RootPage( - h.Div( - h.Attribute("ws-connect", fmt.Sprintf("/ws/test")), - h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - h.H3(h.Id("intro-text"), h.Text("Repeater Example"), h.Class("text-2xl")), - - partials.CounterForm(ctx, partials.CounterProps{Id: "counter-1"}), - - partials.Repeater(ctx, partials.RepeaterProps{ - Id: "repeater-1", - AddButton: h.Button( - h.Text("+ Add Item"), - ), - RemoveButton: func(index int, children ...h.Ren) *h.Element { - return h.Button( - h.Text("Remove"), - h.Children(children...), - ) - }, - Item: func(index int) *h.Element { - return h.Input("text", - h.Class("border border-gray-300 rounded p-2"), - h.Value(fmt.Sprintf("item %d", index))) - }, - }), - ), - ), - ) -} diff --git a/examples/sse-with-state/pages/root.go b/examples/sse-with-state/pages/root.go deleted file mode 100644 index 63374f17..00000000 --- a/examples/sse-with-state/pages/root.go +++ /dev/null @@ -1,21 +0,0 @@ -package pages - -import ( - "github.com/maddalax/htmgo/framework/h" -) - -func RootPage(children ...h.Ren) h.Ren { - return h.Html( - h.HxExtension(h.BaseExtensions()), - h.Head( - h.Link("/public/main.css", "stylesheet"), - h.Script("/public/htmgo.js"), - ), - h.Body( - h.Div( - h.Class("flex flex-col gap-2 bg-white h-full"), - h.Fragment(children...), - ), - ), - ) -} diff --git a/examples/sse-with-state/partials/click.go b/examples/sse-with-state/partials/click.go deleted file mode 100644 index 4339b033..00000000 --- a/examples/sse-with-state/partials/click.go +++ /dev/null @@ -1,19 +0,0 @@ -package partials - -import ( - "github.com/maddalax/htmgo/framework/h" - "sse-with-state/event" -) - -func OnClick(ctx *h.RequestContext, handler event.Handler) *h.AttributeMapOrdered { - return event.AddHandler(ctx, "click", handler) -} - -func OnServerSideEvent(ctx *h.RequestContext, id string, eventName string, handler event.Handler) h.Ren { - event.AddServerSideHandler(ctx, id, eventName, handler) - return h.Empty() -} - -func OnMouseOver(ctx *h.RequestContext, handler event.Handler) *h.AttributeMapOrdered { - return event.AddHandler(ctx, "mouseover", handler) -} diff --git a/examples/sse-with-state/partials/index.go b/examples/sse-with-state/partials/index.go deleted file mode 100644 index 097ebe65..00000000 --- a/examples/sse-with-state/partials/index.go +++ /dev/null @@ -1,80 +0,0 @@ -package partials - -import ( - "github.com/maddalax/htmgo/framework/h" - "sse-with-state/event" - "sse-with-state/state" -) - -func UseState[T any](sessionId state.SessionId, key string, initial T) (func() T, func(T)) { - var get = func() T { - return state.Get[T](sessionId, key, initial) - } - var set = func(value T) { - state.Set(sessionId, key, value) - } - return get, set -} - -type Counter struct { - Count func() int - Increment func() -} - -func UseCounter(sessionId state.SessionId, id string) Counter { - get, set := UseState(sessionId, id, 0) - - var increment = func() { - set(get() + 1) - } - - return Counter{ - Count: get, - Increment: increment, - } -} - -type CounterProps struct { - Id string -} - -func CounterForm(ctx *h.RequestContext, props CounterProps) *h.Element { - if props.Id == "" { - props.Id = h.GenId() - } - counter := UseCounter(state.GetSessionId(ctx), props.Id) - return h.Div( - h.Attribute("hx-swap", "none"), - h.Class("flex flex-col gap-3 items-center"), - h.Id(props.Id), - h.P( - h.Id("counter-text-"+props.Id), - h.AttributePairs( - "id", "counter", - "class", "text-xl", - "name", "count", - "text", "count", - ), - h.TextF("Count: %d", counter.Count()), - ), - h.Button( - h.Class("bg-rose-400 hover:bg-rose-500 text-white font-bold py-2 px-4 rounded"), - h.Type("submit"), - h.Text("Increment"), - OnServerSideEvent(ctx, props.Id, "increment", func(data event.HandlerData) { - counter.Increment() - event.PushElement(data, CounterForm(ctx, props)) - }), - //OnMouseOver(ctx, func(data event.HandlerData) { - // counter.Increment() - // updated := CounterForm(ctx, props) - // event.PushElement(data, updated) - //}), - //OnClick(ctx, func(data event.HandlerData) { - // counter.Increment() - // updated := CounterForm(ctx, props) - // event.PushElement(data, updated) - //}), - ), - ) -} diff --git a/examples/sse-with-state/partials/repeater.go b/examples/sse-with-state/partials/repeater.go deleted file mode 100644 index 4addcfae..00000000 --- a/examples/sse-with-state/partials/repeater.go +++ /dev/null @@ -1,77 +0,0 @@ -package partials - -import ( - "fmt" - "github.com/maddalax/htmgo/framework/h" - "sse-with-state/event" -) - -type RepeaterProps struct { - Item func(index int) *h.Element - RemoveButton func(index int, children ...h.Ren) *h.Element - AddButton *h.Element - DefaultItems []*h.Element - Id string - currentIndex int -} - -func (props *RepeaterProps) itemId(index int) string { - return fmt.Sprintf("%s-repeater-item-%d", props.Id, index) -} - -func (props *RepeaterProps) addButtonId() string { - return fmt.Sprintf("%s-repeater-add-button", props.Id) -} - -func repeaterItem(ctx *h.RequestContext, item *h.Element, index int, props *RepeaterProps) *h.Element { - id := props.itemId(index) - return h.Div( - h.Class("flex gap-2 items-center"), - h.Id(id), - item, - props.RemoveButton(index, - h.ClassIf(index == 0, "opacity-0 disabled"), - h.If(index == 0, h.Disabled()), - OnClick(ctx, func(data event.HandlerData) { - props.currentIndex-- - event.PushElement(data, - h.Div( - h.Attribute("hx-swap-oob", fmt.Sprintf("delete:#%s", id)), - repeaterItem( - ctx, item, index, props, - ), - ), - ) - }), - ), - ) -} - -func Repeater(ctx *h.RequestContext, props RepeaterProps) *h.Element { - if props.Id == "" { - props.Id = h.GenId() - } - return h.Div( - h.Class("flex flex-col gap-2"), - h.List(props.DefaultItems, func(item *h.Element, index int) *h.Element { - return repeaterItem(ctx, item, index, &props) - }), - h.Div( - h.Id(props.addButtonId()), - h.Class("flex justify-center"), - props.AddButton, - OnClick(ctx, func(data event.HandlerData) { - event.PushServerSideEvent(data.SessionId, "increment") - event.PushElement(data, - h.Div( - h.Attribute("hx-swap-oob", "beforebegin:#"+props.addButtonId()), - repeaterItem( - ctx, props.Item(props.currentIndex), props.currentIndex, &props, - ), - ), - ) - props.currentIndex++ - }), - ), - ) -} diff --git a/examples/sse-with-state/sse/handler.go b/examples/sse-with-state/sse/handler.go deleted file mode 100644 index 751d946b..00000000 --- a/examples/sse-with-state/sse/handler.go +++ /dev/null @@ -1,203 +0,0 @@ -package sse - -import ( - "encoding/json" - "fmt" - "github.com/gobwas/ws" - "github.com/gobwas/ws/wsutil" - "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/service" - "log/slog" - "net/http" - "sync" - "time" -) - -func HandleWs() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) - locator := cc.ServiceLocator() - manager := service.Get[SocketManager](locator) - - sessionCookie, _ := r.Cookie("state") - sessionId := "" - - if sessionCookie != nil { - sessionId = sessionCookie.Value - } - - if sessionId == "" { - w.WriteHeader(http.StatusUnauthorized) - return - } - - conn, _, _, err := ws.UpgradeHTTP(r, w) - if err != nil { - slog.Info("failed to upgrade", slog.String("error", err.Error())) - return - } - /* - Large buffer in case the client disconnects while we are writing - we don't want to block the writer - */ - done := make(chan bool, 1000) - writer := make(WriterChan, 1000) - - wg := sync.WaitGroup{} - - manager.Add("all", sessionId, writer, done) - - /* - * This goroutine is responsible for writing messages to the client - */ - wg.Add(1) - go func() { - defer manager.Disconnect(sessionId) - defer wg.Done() - - defer func() { - fmt.Printf("empting channels\n") - for len(writer) > 0 { - <-writer - } - for len(done) > 0 { - <-done - } - }() - - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() - - for { - select { - case <-done: - fmt.Printf("closing connection: \n") - return - case <-ticker.C: - manager.Ping(sessionId) - case message := <-writer: - err = wsutil.WriteServerMessage(conn, ws.OpText, []byte(message)) - if err != nil { - return - } - } - } - }() - - /* - * This goroutine is responsible for reading messages from the client - */ - go func() { - defer conn.Close() - for { - msg, op, err := wsutil.ReadClientData(conn) - if err != nil { - return - } - if op != ws.OpText { - return - } - m := make(map[string]any) - err = json.Unmarshal(msg, &m) - if err != nil { - return - } - manager.OnMessage(sessionId, m) - } - }() - - wg.Wait() - } -} - -func Handle() http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - // Set the necessary headers - w.Header().Set("Content-Type", "text/event-stream") - w.Header().Set("Cache-Control", "no-cache") - w.Header().Set("Connection", "keep-alive") - w.Header().Set("Access-Control-Allow-Origin", "*") // Optional for CORS - - cc := r.Context().Value(h.RequestContextKey).(*h.RequestContext) - locator := cc.ServiceLocator() - manager := service.Get[SocketManager](locator) - - sessionCookie, _ := r.Cookie("state") - sessionId := "" - - if sessionCookie != nil { - sessionId = sessionCookie.Value - } - - ctx := r.Context() - - /* - Large buffer in case the client disconnects while we are writing - we don't want to block the writer - */ - done := make(chan bool, 1000) - writer := make(WriterChan, 1000) - - wg := sync.WaitGroup{} - wg.Add(1) - - /* - * This goroutine is responsible for writing messages to the client - */ - go func() { - defer wg.Done() - defer manager.Disconnect(sessionId) - - defer func() { - fmt.Printf("empting channels\n") - for len(writer) > 0 { - <-writer - } - for len(done) > 0 { - <-done - } - }() - - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() - - for { - select { - case <-ctx.Done(): - return - case <-done: - fmt.Printf("closing connection: \n") - return - case <-ticker.C: - manager.Ping(sessionId) - case message := <-writer: - _, err := fmt.Fprintf(w, message) - if err != nil { - done <- true - } else { - flusher, ok := w.(http.Flusher) - if ok { - flusher.Flush() - } - } - } - } - }() - - /** - * This goroutine is responsible for adding the client to the room - */ - wg.Add(1) - go func() { - defer wg.Done() - if sessionId == "" { - manager.writeCloseRaw(writer, "no session") - return - } - - manager.Add("all", sessionId, writer, done) - }() - - wg.Wait() - } -} diff --git a/examples/sse-with-state/sse/manager.go b/examples/sse-with-state/sse/manager.go deleted file mode 100644 index 20c80752..00000000 --- a/examples/sse-with-state/sse/manager.go +++ /dev/null @@ -1,235 +0,0 @@ -package sse - -import ( - "fmt" - "github.com/puzpuzpuz/xsync/v3" - "strings" - "time" -) - -type EventType string -type WriterChan chan string -type DoneChan chan bool - -const ( - ConnectedEvent EventType = "connected" - DisconnectedEvent EventType = "disconnected" - MessageEvent EventType = "message" -) - -type SocketEvent struct { - SocketId string - RoomId string - Type EventType - Payload map[string]any -} - -type CloseEvent struct { - Code int - Reason string -} - -type SocketConnection struct { - Id string - RoomId string - Done DoneChan - Writer WriterChan -} - -type SocketManager struct { - sockets *xsync.MapOf[string, *xsync.MapOf[string, SocketConnection]] - idToRoom *xsync.MapOf[string, string] - listeners []chan SocketEvent -} - -func NewSocketManager() *SocketManager { - return &SocketManager{ - sockets: xsync.NewMapOf[string, *xsync.MapOf[string, SocketConnection]](), - idToRoom: xsync.NewMapOf[string, string](), - } -} - -func (manager *SocketManager) ForEachSocket(roomId string, cb func(conn SocketConnection)) { - sockets, ok := manager.sockets.Load(roomId) - if !ok { - return - } - sockets.Range(func(id string, conn SocketConnection) bool { - cb(conn) - return true - }) -} - -func (manager *SocketManager) Listen(listener chan SocketEvent) { - if manager.listeners == nil { - manager.listeners = make([]chan SocketEvent, 0) - } - if listener != nil { - manager.listeners = append(manager.listeners, listener) - } -} - -func (manager *SocketManager) dispatch(event SocketEvent) { - fmt.Printf("dispatching event: %s\n", event.Type) - done := make(chan struct{}, 1) - go func() { - for { - select { - case <-done: - fmt.Printf("dispatched event: %s\n", event.Type) - return - case <-time.After(5 * time.Second): - fmt.Printf("havent dispatched event after 5s, chan blocked: %s\n", event.Type) - } - } - }() - for _, listener := range manager.listeners { - listener <- event - } - done <- struct{}{} -} - -func (manager *SocketManager) OnMessage(id string, message map[string]any) { - socket := manager.Get(id) - if socket == nil { - return - } - manager.dispatch(SocketEvent{ - SocketId: id, - Type: MessageEvent, - Payload: message, - RoomId: socket.RoomId, - }) -} - -func (manager *SocketManager) Add(roomId string, id string, writer WriterChan, done DoneChan) { - manager.idToRoom.Store(id, roomId) - - sockets, ok := manager.sockets.LoadOrCompute(roomId, func() *xsync.MapOf[string, SocketConnection] { - return xsync.NewMapOf[string, SocketConnection]() - }) - - sockets.Store(id, SocketConnection{ - Id: id, - Writer: writer, - RoomId: roomId, - Done: done, - }) - - s, ok := sockets.Load(id) - if !ok { - return - } - - manager.dispatch(SocketEvent{ - SocketId: s.Id, - Type: ConnectedEvent, - RoomId: s.RoomId, - Payload: map[string]any{}, - }) - - fmt.Printf("User %s connected to %s\n", id, roomId) -} - -func (manager *SocketManager) OnClose(id string) { - socket := manager.Get(id) - if socket == nil { - return - } - manager.dispatch(SocketEvent{ - SocketId: id, - Type: DisconnectedEvent, - RoomId: socket.RoomId, - Payload: map[string]any{}, - }) - manager.sockets.Delete(id) -} - -func (manager *SocketManager) CloseWithMessage(id string, message string) { - conn := manager.Get(id) - if conn != nil { - defer manager.OnClose(id) - manager.writeText(*conn, message) - conn.Done <- true - } -} - -func (manager *SocketManager) Disconnect(id string) { - conn := manager.Get(id) - if conn != nil { - manager.OnClose(id) - conn.Done <- true - } -} - -func (manager *SocketManager) Get(id string) *SocketConnection { - roomId, ok := manager.idToRoom.Load(id) - if !ok { - return nil - } - sockets, ok := manager.sockets.Load(roomId) - if !ok { - return nil - } - conn, ok := sockets.Load(id) - return &conn -} - -func (manager *SocketManager) Ping(id string) { - conn := manager.Get(id) - if conn != nil { - manager.writeText(*conn, "ping") - } -} - -func (manager *SocketManager) writeCloseRaw(writer WriterChan, message string) { - manager.writeTextRaw(writer, message) -} - -func (manager *SocketManager) writeTextRaw(writer WriterChan, message string) { - timeout := 3 * time.Second - select { - case writer <- message: - case <-time.After(timeout): - fmt.Printf("could not send %s to channel after %s\n", message, timeout) - } -} - -func (manager *SocketManager) writeText(socket SocketConnection, message string) { - if socket.Writer == nil { - return - } - manager.writeTextRaw(socket.Writer, message) -} - -func (manager *SocketManager) BroadcastText(roomId string, message string, predicate func(conn SocketConnection) bool) { - sockets, ok := manager.sockets.Load(roomId) - - if !ok { - return - } - - sockets.Range(func(id string, conn SocketConnection) bool { - if predicate(conn) { - manager.writeText(conn, message) - } - return true - }) -} - -func (manager *SocketManager) SendHtml(id string, message string) { - conn := manager.Get(id) - minified := strings.ReplaceAll(message, "\n", "") - minified = strings.ReplaceAll(minified, "\t", "") - minified = strings.TrimSpace(minified) - if conn != nil { - manager.writeText(*conn, minified) - } -} - -func (manager *SocketManager) SendText(id string, message string) { - conn := manager.Get(id) - if conn != nil { - manager.writeText(*conn, message) - } -} diff --git a/examples/sse-with-state/state/state.go b/examples/sse-with-state/state/state.go deleted file mode 100644 index 9fe72c7c..00000000 --- a/examples/sse-with-state/state/state.go +++ /dev/null @@ -1,67 +0,0 @@ -package state - -import ( - "github.com/google/uuid" - "github.com/maddalax/htmgo/framework/h" - "github.com/puzpuzpuz/xsync/v3" - "net/http" -) - -type SessionId string - -var cache = xsync.NewMapOf[SessionId, *xsync.MapOf[string, any]]() - -type State struct { - SessionId SessionId -} - -func NewState(ctx *h.RequestContext) *State { - id := GetSessionId(ctx) - cache.Store(id, xsync.NewMapOf[string, any]()) - return &State{ - SessionId: id, - } -} - -func GetSessionId(ctx *h.RequestContext) SessionId { - stateCookie, err := ctx.Request.Cookie("state") - sessionId := "" - if err == nil { - sessionId = stateCookie.Value - } else { - sessionId = uuid.NewString() - } - - c := http.Cookie{ - Name: "state", - Value: sessionId, - } - ctx.Response.Header().Set("Set-Cookie", c.String()) - - return SessionId(sessionId) -} - -func Update[T any](sessionId SessionId, key string, compute func(prev T) T) T { - actual := Get[T](sessionId, key, *new(T)) - next := compute(actual) - Set(sessionId, key, next) - return next -} - -func Get[T any](sessionId SessionId, key string, fallback T) T { - actual, _ := cache.LoadOrCompute(sessionId, func() *xsync.MapOf[string, any] { - return xsync.NewMapOf[string, any]() - }) - value, exists := actual.Load(key) - if exists { - return value.(T) - } - return fallback -} - -func Set(sessionId SessionId, key string, value any) { - actual, _ := cache.LoadOrCompute(sessionId, func() *xsync.MapOf[string, any] { - return xsync.NewMapOf[string, any]() - }) - actual.Store(key, value) -} diff --git a/examples/sse-with-state/tailwind.config.js b/examples/sse-with-state/tailwind.config.js deleted file mode 100644 index b18125c8..00000000 --- a/examples/sse-with-state/tailwind.config.js +++ /dev/null @@ -1,5 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -module.exports = { - content: ["**/*.go"], - plugins: [], -}; diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index c6e7ef96..fd740d47 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var re=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(I){return issueAjaxRequest(e,t,n,r,o,!!I)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,H=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;H=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=H;let T=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},F=getClosestAttributeValue(n,"hx-prompt");if(F){var L=prompt(F);if(L===null||!triggerEvent(n,"htmx:prompt",{prompt:L,target:c}))return maybeCall(s),T(),a}if(S&&!i&&!confirm(S))return maybeCall(s),T(),a;let R=getHeaders(n,c,L);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),P=v.errors,M=v.formData;o.values&&overrideFormData(M,formDataFromObject(o.values));let W=formDataFromObject(getExpressionVars(n)),X=overrideFormData(M,W),q=filterValues(X,n);htmx.config.getCacheBusterParam&&e==="get"&&q.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let j=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,V=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:V,formData:q,parameters:formDataProxy(q),unfilteredFormData:X,unfilteredParameters:formDataProxy(X),headers:R,target:c,verb:e,errors:P,withCredentials:o.credentials||j.credentials||htmx.config.withCredentials,timeout:o.timeout||j.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),T(),a;if(t=w.path,e=w.verb,R=w.headers,q=formDataFromObject(w.parameters),P=w.errors,V=w.useUrlParams,P&&P.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),T(),a;let $=t.split("#"),te=$[0],z=$[1],O=t;if(V&&(O=te,!q.keys().next().done&&(O.indexOf("?")<0?O+="?":O+="&",O+=urlEncode(q),z&&(O+="#"+z))),!verifyPath(n,O,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),O,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!j.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:f,pathInfo:{requestPath:t,finalRequestPath:O,responsePath:null,anchor:z}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(k,U),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let I=g.shift();bodyContains(I)&&(E=I);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),T();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(k,U),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),T();},m.onabort=function(){removeRequestIndicators(k,U),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),T();},m.ontimeout=function(){removeRequestIndicators(k,U),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),T();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),T(),a;var k=addRequestIndicatorClasses(n),U=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(I){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:I.lengthComputable,loaded:I.loaded,total:I.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ne=V?null:encodeParamsForBody(m,n,q);return m.send(ne),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(L,x.swapDelay):L();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=re;function oe(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=se(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=le(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&Q(o,t,n,r);}});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return Q(r,e,t,n),!0}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,B,ue="hx-target-";function K(e,t){return e.substring(0,t.length)===t}function ce(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(K(n,"4")||K(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,J(t),!0;if(!t.detail.requestConfig)return !0;let n=ce(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(J(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&h.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{h.trigger(r,"htmx:mutation-error",{status:n});});}}});var _="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;_===""&&(_=r),_!==r&&(_=r,fe());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function fe(){window.location.reload();}var de=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&G(t.target);}});function G(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(de)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var N=null,Z=new Set,D=null;h.defineExtension("ws",{init:function(e){N=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&G(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[ws-connect]");for(let o of Array.from(r)){let i=o.getAttribute("ws-connect");i&&!Z.has(i)&&(ee(o,i),Z.add(i));}}}});function he(e,t=100,n=1e4){let r=Math.random();return Math.min(t*Math.pow(2,e)*r,n)}function ee(e,t,n=0){if(t)return !t.startsWith("ws://")&&!t.startsWith("wss://")&&(t=(window.location.protocol==="https:"?"wss://":"ws://")+window.location.host+t),console.info("connecting to ws",t),D=new WebSocket(t),D.addEventListener("close",function(r){h.trigger(e,"htmx:wsClose",{event:r});let o=he(n);console.info(`ws closed, reconnecting in ${o}ms`),setTimeout(()=>{ee(e,t,n+1);},o);}),D.addEventListener("open",function(r){h.trigger(e,"htmx:wsOpen",{event:r});}),D.addEventListener("error",function(r){h.trigger(e,"htmx:wsError",{event:r});}),D.addEventListener("message",function(r){console.debug("ws message:",r.data);let o=N.makeSettleInfo(e);h.trigger(e,"htmx:wsBeforeMessage",{event:r});let i=r.data,s=N.makeFragment(i),l=Array.from(s.children);for(let a of l)N.oobSwap(N.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:wsAfterMessage",{event:r});}),D}window.onload=ge;function ge(){console.log("add ws event handlers"),new MutationObserver(n).observe(document.body,{childList:!0,subtree:!0});let t=new Set;function n(){let r=new Set;document.querySelectorAll("[data-handler-id]").forEach(o=>{let i=o.getAttribute("data-handler-id"),s=o.getAttribute("data-handler-event");i==null||s==null||(r.add(i),!t.has(i)&&(t.add(i),o.addEventListener(s,l=>{console.log("sending event",i,s,D),D!=null&&D.readyState===WebSocket.OPEN&&D.send(JSON.stringify({id:i,event:s}));})));});for(let o of t)r.has(o)||t.delete(o);console.log("size",t.size);}n();}window.htmx=h;function me(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}me((e,t)=>{Ee(t);});function Ee(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy93cy50cyIsIi4uL2pzL2h0bXhleHRlbnNpb25zL3dzLWV2ZW50LWhhbmRsZXIudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsIndzIiwiY29ubmVjdFdzIiwiZXhwb25lbnRpYWxCYWNrb2ZmIiwiYXR0ZW1wdCIsImJhc2VEZWxheSIsIm1heERlbGF5Iiwiaml0dGVyIiwiY2hpbGRyZW4iLCJhZGRXc0V2ZW50SGFuZGxlcnMiLCJyZWdpc3RlciIsImFkZGVkIiwiaWRzIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElB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QSxDQUVELFNBQVMsZ0JBQWlCLENBQUEsZUFBZSxFQUFFLE9BQVNoRyxDQUFBQSxDQUFBQSxFQUFPLENBQ3pELElBQUkrVixDQUFBQSxDQUFXLEdBQ2YsSUFBUy9YLElBQUFBLENBQUFBLElBQVFnQyxFQUFHLGlCQUFrQixFQUFBLENBQ3BDLEdBQUloQyxDQUFLLENBQUEsVUFBQSxDQUFXLHNCQUFzQixDQUFHLENBQUEsQ0FDM0MsSUFBSWMsQ0FBUWQsQ0FBQUEsQ0FBQUEsQ0FBSyxRQUFRLHNCQUF3QixDQUFBLEVBQUUsRUFFbkQsR0FEWTZDLENBQUFBLENBQUksYUFBYSxHQUFJL0IsQ0FBQUEsQ0FBSyxFQUMzQixDQUNUOFQsQ0FBQUEsQ0FBSyxJQUFLNVMsQ0FBQUEsQ0FBQUEsQ0FBSUEsQ0FBRyxDQUFBLFlBQUEsQ0FBYWhDLENBQUksQ0FBSyxFQUFBLEVBQUEsQ0FBSSxDQUN6QyxTQUFXLENBQUEsV0FBQSxDQUNYLFVBQVcsQ0FDWCxDQUFBLFdBQUEsQ0FBYSxDQUNmLENBQUMsQ0FBQSxDQUNEK1gsRUFBVyxDQUNYLENBQUEsQ0FBQSxLQUNGLENBQ0YsQ0FFRixHQUFJLENBQUNBLENBQVUsQ0FBQSxDQUNiLElBQUlDLENBQUFBLENBQWFoVyxDQUFHLENBQUEsWUFBQSxDQUFhLHFCQUFxQixDQUNsRGdXLENBQUFBLENBQUFBLEVBQ0ZwRCxFQUFLLElBQ0g1UyxDQUFBQSxDQUFBQSxDQUNBQSxFQUFHLFlBQWEsQ0FBQSxzQkFBQSxDQUF5QmdXLENBQVUsQ0FBSyxFQUFBLEVBQUEsQ0FDeEQsQ0FBRSxTQUFXLENBQUEsV0FBQSxDQUFhLFVBQVcsQ0FBRyxDQUFBLFdBQUEsQ0FBYSxDQUFFLENBQ3pELEVBRUosQ0FDRixDQUFDLEVBQ0giLCJmaWxlIjoiaHRtZ28uanMiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgaHRteCA9IChmdW5jdGlvbigpIHtcbiAgJ3VzZSBzdHJpY3QnXG5cbiAgLy8gUHVibGljIEFQSVxuICBjb25zdCBodG14ID0ge1xuICAgIC8vIFRzYyBtYWRuZXNzIGhlcmUsIGFzc2lnbmluZyB0aGUgZnVuY3Rpb25zIGRpcmVjdGx5IHJlc3VsdHMgaW4gYW4gaW52YWxpZCBUeXBlU2NyaXB0IG91dHB1dCwgYnV0IHJlYXNzaWduaW5nIGlzIGZpbmVcbiAgICAvKiBFdmVudCBwcm9jZXNzaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygb25Mb2FkSGVscGVyfSAqL1xuICAgIG9uTG9hZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwcm9jZXNzTm9kZX0gKi9cbiAgICBwcm9jZXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZEV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsfSAqL1xuICAgIG9mZjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0cmlnZ2VyRXZlbnR9ICovXG4gICAgdHJpZ2dlcjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhamF4SGVscGVyfSAqL1xuICAgIGFqYXg6IG51bGwsXG4gICAgLyogRE9NIHF1ZXJ5aW5nIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kfSAqL1xuICAgIGZpbmQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZEFsbH0gKi9cbiAgICBmaW5kQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGNsb3Nlc3R9ICovXG4gICAgY2xvc2VzdDogbnVsbCxcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBpbnB1dCB2YWx1ZXMgdGhhdCB3b3VsZCByZXNvbHZlIGZvciBhIGdpdmVuIGVsZW1lbnQgdmlhIHRoZSBodG14IHZhbHVlIHJlc29sdXRpb24gbWVjaGFuaXNtXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN2YWx1ZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0IHRoZSBlbGVtZW50IHRvIHJlc29sdmUgdmFsdWVzIG9uXG4gICAgICogQHBhcmFtIHtIdHRwVmVyYn0gdHlwZSB0aGUgcmVxdWVzdCB0eXBlIChlLmcuICoqZ2V0Kiogb3IgKipwb3N0KiopIG5vbi1HRVQncyB3aWxsIGluY2x1ZGUgdGhlIGVuY2xvc2luZyBmb3JtIG9mIHRoZSBlbGVtZW50LiBEZWZhdWx0cyB0byAqKnBvc3QqKlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAgICovXG4gICAgdmFsdWVzOiBmdW5jdGlvbihlbHQsIHR5cGUpIHtcbiAgICAgIGNvbnN0IGlucHV0VmFsdWVzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB0eXBlIHx8ICdwb3N0JylcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlcy52YWx1ZXNcbiAgICB9LFxuICAgIC8qIERPTSBtYW5pcHVsYXRpb24gaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFkZENsYXNzVG9FbGVtZW50fSAqL1xuICAgIGFkZENsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnR9ICovXG4gICAgcmVtb3ZlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdG9nZ2xlQ2xhc3NPbkVsZW1lbnR9ICovXG4gICAgdG9nZ2xlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdGFrZUNsYXNzRm9yRWxlbWVudH0gKi9cbiAgICB0YWtlQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2Ygc3dhcH0gKi9cbiAgICBzd2FwOiBudWxsLFxuICAgIC8qIEV4dGVuc2lvbiBlbnRyeXBvaW50cyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGRlZmluZUV4dGVuc2lvbn0gKi9cbiAgICBkZWZpbmVFeHRlbnNpb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXh0ZW5zaW9ufSAqL1xuICAgIHJlbW92ZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dBbGx9ICovXG4gICAgbG9nQWxsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ05vbmV9ICovXG4gICAgbG9nTm9uZTogbnVsbCxcbiAgICAvKiBEZWJ1Z2dpbmcgKi9cbiAgICAvKipcbiAgICAgKiBUaGUgbG9nZ2VyIGh0bXggdXNlcyB0byBsb2cgd2l0aFxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nZ2VyXG4gICAgICovXG4gICAgbG9nZ2VyOiBudWxsLFxuICAgIC8qKlxuICAgICAqIEEgcHJvcGVydHkgaG9sZGluZyB0aGUgY29uZmlndXJhdGlvbiBodG14IHVzZXMgYXQgcnVudGltZS5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB1c2luZyBhIFttZXRhIHRhZ10oaHR0cHM6Ly9odG14Lm9yZy9kb2NzLyNjb25maWcpIGlzIHRoZSBwcmVmZXJyZWQgbWVjaGFuaXNtIGZvciBzZXR0aW5nIHRoZXNlIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjb25maWdcbiAgICAgKi9cbiAgICBjb25maWc6IHtcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byB1c2UgaGlzdG9yeS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUVuYWJsZWQ6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBudW1iZXIgb2YgcGFnZXMgdG8ga2VlcCBpbiAqKmxvY2FsU3RvcmFnZSoqIGZvciBoaXN0b3J5IHN1cHBvcnQuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDEwXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlDYWNoZVNpemU6IDEwLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICByZWZyZXNoT25IaXN0b3J5TWlzczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IHN3YXAgc3R5bGUgdG8gdXNlIGlmICoqW2h4LXN3YXBdKGh0dHBzOi8vaHRteC5vcmcvYXR0cmlidXRlcy9oeC1zd2FwKSoqIGlzIG9taXR0ZWQuXG4gICAgICAgKiBAdHlwZSBIdG14U3dhcFN0eWxlXG4gICAgICAgKiBAZGVmYXVsdCAnaW5uZXJIVE1MJ1xuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcFN0eWxlOiAnaW5uZXJIVE1MJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiByZWNlaXZpbmcgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIgYW5kIGRvaW5nIHRoZSBzd2FwLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwRGVsYXk6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gY29tcGxldGluZyB0aGUgY29udGVudCBzd2FwIGFuZCBzZXR0bGluZyBhdHRyaWJ1dGVzLlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAyMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U2V0dGxlRGVsYXk6IDIwLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0cnVlLCBodG14IHdpbGwgaW5qZWN0IGEgc21hbGwgYW1vdW50IG9mIENTUyBpbnRvIHRoZSBwYWdlIHRvIG1ha2UgaW5kaWNhdG9ycyBpbnZpc2libGUgdW5sZXNzIHRoZSAqKmh0bXgtaW5kaWNhdG9yKiogY2xhc3MgaXMgcHJlc2VudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgaW5jbHVkZUluZGljYXRvclN0eWxlczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIGluZGljYXRvcnMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1pbmRpY2F0b3InXG4gICAgICAgKi9cbiAgICAgIGluZGljYXRvckNsYXNzOiAnaHRteC1pbmRpY2F0b3InLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdHJpZ2dlcmluZyBlbGVtZW50cyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXJlcXVlc3QnXG4gICAgICAgKi9cbiAgICAgIHJlcXVlc3RDbGFzczogJ2h0bXgtcmVxdWVzdCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byB0ZW1wb3JhcmlseSBwbGFjZSBvbiBlbGVtZW50cyB0aGF0IGh0bXggaGFzIGFkZGVkIHRvIHRoZSBET00uXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWFkZGVkJ1xuICAgICAgICovXG4gICAgICBhZGRlZENsYXNzOiAnaHRteC1hZGRlZCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc2V0dGxpbmcnXG4gICAgICAgKi9cbiAgICAgIHNldHRsaW5nQ2xhc3M6ICdodG14LXNldHRsaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHN3YXBwaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zd2FwcGluZydcbiAgICAgICAqL1xuICAgICAgc3dhcHBpbmdDbGFzczogJ2h0bXgtc3dhcHBpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvd3MgdGhlIHVzZSBvZiBldmFsLWxpa2UgZnVuY3Rpb25hbGl0eSBpbiBodG14LCB0byBlbmFibGUgKipoeC12YXJzKiosIHRyaWdnZXIgY29uZGl0aW9ucyAmIHNjcmlwdCB0YWcgZXZhbHVhdGlvbi4gQ2FuIGJlIHNldCB0byAqKmZhbHNlKiogZm9yIENTUCBjb21wYXRpYmlsaXR5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd0V2YWw6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byBmYWxzZSwgZGlzYWJsZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHNjcmlwdCB0YWdzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd1NjcmlwdFRhZ3M6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHNjcmlwdHMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVNjcmlwdE5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc3R5bGVzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTdHlsZU5vbmNlOiAnJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGF0dHJpYnV0ZXMgdG8gc2V0dGxlIGR1cmluZyB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdbXVxuICAgICAgICogQGRlZmF1bHQgWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXVxuICAgICAgICovXG4gICAgICBhdHRyaWJ1dGVzVG9TZXR0bGU6IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93IGNyb3NzLXNpdGUgQWNjZXNzLUNvbnRyb2wgcmVxdWVzdHMgdXNpbmcgY3JlZGVudGlhbHMgc3VjaCBhcyBjb29raWVzLCBhdXRob3JpemF0aW9uIGhlYWRlcnMgb3IgVExTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgdGltZW91dDogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgKipnZXRXZWJTb2NrZXRSZWNvbm5lY3REZWxheSoqIGZvciByZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBjb25uZWN0aW9uIGxvc3MgYnkgdGhlIGV2ZW50IGNvZGUgKipBYm5vcm1hbCBDbG9zdXJlKiosICoqU2VydmljZSBSZXN0YXJ0Kiogb3IgKipUcnkgQWdhaW4gTGF0ZXIqKi5cbiAgICAgICAqIEB0eXBlIHsnZnVsbC1qaXR0ZXInIHwgKChyZXRyeUNvdW50Om51bWJlcikgPT4gbnVtYmVyKX1cbiAgICAgICAqIEBkZWZhdWx0IFwiZnVsbC1qaXR0ZXJcIlxuICAgICAgICovXG4gICAgICB3c1JlY29ubmVjdERlbGF5OiAnZnVsbC1qaXR0ZXInLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgdHlwZSBvZiBiaW5hcnkgZGF0YSBiZWluZyByZWNlaXZlZCBvdmVyIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICogQHR5cGUgQmluYXJ5VHlwZVxuICAgICAgICogQGRlZmF1bHQgJ2Jsb2InXG4gICAgICAgKi9cbiAgICAgIHdzQmluYXJ5VHlwZTogJ2Jsb2InLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJ1xuICAgICAgICovXG4gICAgICBkaXNhYmxlU2VsZWN0b3I6ICdbaHgtZGlzYWJsZV0sIFtkYXRhLWh4LWRpc2FibGVdJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgeydhdXRvJyB8ICdpbnN0YW50JyB8ICdzbW9vdGgnfVxuICAgICAgICogQGRlZmF1bHQgJ2luc3RhbnQnXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEJlaGF2aW9yOiAnaW5zdGFudCcsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRoZSBmb2N1c2VkIGVsZW1lbnQgc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRGb2N1c1Njcm9sbDogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBpbmNsdWRlIGEgY2FjaGUtYnVzdGluZyBwYXJhbWV0ZXIgaW4gR0VUIHJlcXVlc3RzIHRvIGF2b2lkIGNhY2hpbmcgcGFydGlhbCByZXNwb25zZXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdldENhY2hlQnVzdGVyUGFyYW06IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgaHRteCB3aWxsIHVzZSB0aGUgVmlldyBUcmFuc2l0aW9uIEFQSSB3aGVuIHN3YXBwaW5nIGluIG5ldyBjb250ZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2xvYmFsVmlld1RyYW5zaXRpb25zOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogaHRteCB3aWxsIGZvcm1hdCByZXF1ZXN0cyB3aXRoIHRoZXNlIG1ldGhvZHMgYnkgZW5jb2RpbmcgdGhlaXIgcGFyYW1ldGVycyBpbiB0aGUgVVJMLCBub3QgdGhlIHJlcXVlc3QgYm9keVxuICAgICAgICogQHR5cGUgeyhIdHRwVmVyYilbXX1cbiAgICAgICAqIEBkZWZhdWx0IFsnZ2V0JywgJ2RlbGV0ZSddXG4gICAgICAgKi9cbiAgICAgIG1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zOiBbJ2dldCcsICdkZWxldGUnXSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGRpc2FibGVzIGh0bXgtYmFzZWQgcmVxdWVzdHMgdG8gbm9uLW9yaWdpbiBob3N0cy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHNlbGZSZXF1ZXN0c09ubHk6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlIGh0bXggd2lsbCBub3QgdXBkYXRlIHRoZSB0aXRsZSBvZiB0aGUgZG9jdW1lbnQgd2hlbiBhIHRpdGxlIHRhZyBpcyBmb3VuZCBpbiBuZXcgY29udGVudFxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgaWdub3JlVGl0bGU6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRoZSB0YXJnZXQgb2YgYSBib29zdGVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIHNjcm9sbEludG9WaWV3T25Cb29zdDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNhY2hlIHRvIHN0b3JlIGV2YWx1YXRlZCB0cmlnZ2VyIHNwZWNpZmljYXRpb25zIGludG8uXG4gICAgICAgKiBZb3UgbWF5IGRlZmluZSBhIHNpbXBsZSBvYmplY3QgdG8gdXNlIGEgbmV2ZXItY2xlYXJpbmcgY2FjaGUsIG9yIGltcGxlbWVudCB5b3VyIG93biBzeXN0ZW0gdXNpbmcgYSBbcHJveHkgb2JqZWN0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9Qcm94eSlcbiAgICAgICAqIEB0eXBlIHtPYmplY3R8bnVsbH1cbiAgICAgICAqIEBkZWZhdWx0IG51bGxcbiAgICAgICAqL1xuICAgICAgdHJpZ2dlclNwZWNzQ2FjaGU6IG51bGwsXG4gICAgICAvKiogQHR5cGUgYm9vbGVhbiAqL1xuICAgICAgZGlzYWJsZUluaGVyaXRhbmNlOiBmYWxzZSxcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1tdICovXG4gICAgICByZXNwb25zZUhhbmRsaW5nOiBbXG4gICAgICAgIHsgY29kZTogJzIwNCcsIHN3YXA6IGZhbHNlIH0sXG4gICAgICAgIHsgY29kZTogJ1syM10uLicsIHN3YXA6IHRydWUgfSxcbiAgICAgICAgeyBjb2RlOiAnWzQ1XS4uJywgc3dhcDogZmFsc2UsIGVycm9yOiB0cnVlIH1cbiAgICAgIF0sXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gcHJvY2VzcyBPT0Igc3dhcHMgb24gZWxlbWVudHMgdGhhdCBhcmUgbmVzdGVkIHdpdGhpbiB0aGUgbWFpbiByZXNwb25zZSBlbGVtZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBhbGxvd05lc3RlZE9vYlN3YXBzOiB0cnVlXG4gICAgfSxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBwYXJzZUludGVydmFsfSAqL1xuICAgIHBhcnNlSW50ZXJ2YWw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgaW50ZXJuYWxFdmFsfSAqL1xuICAgIF86IG51bGwsXG4gICAgdmVyc2lvbjogJzIuMC4yJ1xuICB9XG4gIC8vIFRzYyBtYWRuZXNzIHBhcnQgMlxuICBodG14Lm9uTG9hZCA9IG9uTG9hZEhlbHBlclxuICBodG14LnByb2Nlc3MgPSBwcm9jZXNzTm9kZVxuICBodG14Lm9uID0gYWRkRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC5vZmYgPSByZW1vdmVFdmVudExpc3RlbmVySW1wbFxuICBodG14LnRyaWdnZXIgPSB0cmlnZ2VyRXZlbnRcbiAgaHRteC5hamF4ID0gYWpheEhlbHBlclxuICBodG14LmZpbmQgPSBmaW5kXG4gIGh0bXguZmluZEFsbCA9IGZpbmRBbGxcbiAgaHRteC5jbG9zZXN0ID0gY2xvc2VzdFxuICBodG14LnJlbW92ZSA9IHJlbW92ZUVsZW1lbnRcbiAgaHRteC5hZGRDbGFzcyA9IGFkZENsYXNzVG9FbGVtZW50XG4gIGh0bXgucmVtb3ZlQ2xhc3MgPSByZW1vdmVDbGFzc0Zyb21FbGVtZW50XG4gIGh0bXgudG9nZ2xlQ2xhc3MgPSB0b2dnbGVDbGFzc09uRWxlbWVudFxuICBodG14LnRha2VDbGFzcyA9IHRha2VDbGFzc0ZvckVsZW1lbnRcbiAgaHRteC5zd2FwID0gc3dhcFxuICBodG14LmRlZmluZUV4dGVuc2lvbiA9IGRlZmluZUV4dGVuc2lvblxuICBodG14LnJlbW92ZUV4dGVuc2lvbiA9IHJlbW92ZUV4dGVuc2lvblxuICBodG14LmxvZ0FsbCA9IGxvZ0FsbFxuICBodG14LmxvZ05vbmUgPSBsb2dOb25lXG4gIGh0bXgucGFyc2VJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWxcbiAgaHRteC5fID0gaW50ZXJuYWxFdmFsXG5cbiAgY29uc3QgaW50ZXJuYWxBUEkgPSB7XG4gICAgYWRkVHJpZ2dlckhhbmRsZXIsXG4gICAgYm9keUNvbnRhaW5zLFxuICAgIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSxcbiAgICBmaW5kVGhpc0VsZW1lbnQsXG4gICAgZmlsdGVyVmFsdWVzLFxuICAgIHN3YXAsXG4gICAgaGFzQXR0cmlidXRlLFxuICAgIGdldEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0TWF0Y2gsXG4gICAgZ2V0RXhwcmVzc2lvblZhcnMsXG4gICAgZ2V0SGVhZGVycyxcbiAgICBnZXRJbnB1dFZhbHVlcyxcbiAgICBnZXRJbnRlcm5hbERhdGEsXG4gICAgZ2V0U3dhcFNwZWNpZmljYXRpb24sXG4gICAgZ2V0VHJpZ2dlclNwZWNzLFxuICAgIGdldFRhcmdldCxcbiAgICBtYWtlRnJhZ21lbnQsXG4gICAgbWVyZ2VPYmplY3RzLFxuICAgIG1ha2VTZXR0bGVJbmZvLFxuICAgIG9vYlN3YXAsXG4gICAgcXVlcnlTZWxlY3RvckV4dCxcbiAgICBzZXR0bGVJbW1lZGlhdGVseSxcbiAgICBzaG91bGRDYW5jZWwsXG4gICAgdHJpZ2dlckV2ZW50LFxuICAgIHRyaWdnZXJFcnJvckV2ZW50LFxuICAgIHdpdGhFeHRlbnNpb25zXG4gIH1cblxuICBjb25zdCBWRVJCUyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCddXG4gIGNvbnN0IFZFUkJfU0VMRUNUT1IgPSBWRVJCUy5tYXAoZnVuY3Rpb24odmVyYikge1xuICAgIHJldHVybiAnW2h4LScgKyB2ZXJiICsgJ10sIFtkYXRhLWh4LScgKyB2ZXJiICsgJ10nXG4gIH0pLmpvaW4oJywgJylcblxuICBjb25zdCBIRUFEX1RBR19SRUdFWCA9IG1ha2VUYWdSZWdFeCgnaGVhZCcpXG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVXRpbGl0aWVzXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge1JlZ0V4cH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VUYWdSZWdFeCh0YWcsIGdsb2JhbCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYDwke3RhZ30oXFxcXHNbXj5dKj58PikoW1xcXFxzXFxcXFNdKj8pPFxcXFwvJHt0YWd9PmAsXG4gICAgICBnbG9iYWwgPyAnZ2ltJyA6ICdpbScpXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGFuIGludGVydmFsIHN0cmluZyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBodG14IGRvZXMuIFVzZWZ1bCBmb3IgcGx1Z2lucyB0aGF0IGhhdmUgdGltaW5nLXJlbGF0ZWQgYXR0cmlidXRlcy5cbiAgICpcbiAgICogQ2F1dGlvbjogQWNjZXB0cyBhbiBpbnQgZm9sbG93ZWQgYnkgZWl0aGVyICoqcyoqIG9yICoqbXMqKi4gQWxsIG90aGVyIHZhbHVlcyB1c2UgKipwYXJzZUZsb2F0KipcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcGFyc2VJbnRlcnZhbFxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyIHRpbWluZyBzdHJpbmdcbiAgICogQHJldHVybnMge251bWJlcnx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUludGVydmFsKHN0cikge1xuICAgIGlmIChzdHIgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfVxuXG4gICAgbGV0IGludGVydmFsID0gTmFOXG4gICAgaWYgKHN0ci5zbGljZSgtMikgPT0gJ21zJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMikpXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdzJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMFxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAnbScpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDAgKiA2MFxuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyKVxuICAgIH1cbiAgICByZXR1cm4gaXNOYU4oaW50ZXJ2YWwpID8gdW5kZWZpbmVkIDogaW50ZXJ2YWxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmF3QXR0cmlidXRlKGVsdCwgbmFtZSkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIGVsdC5nZXRBdHRyaWJ1dGUobmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIC8vIHJlc29sdmUgd2l0aCBib3RoIGh4IGFuZCBkYXRhLWh4IHByZWZpeGVzXG4gIGZ1bmN0aW9uIGhhc0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gISFlbHQuaGFzQXR0cmlidXRlICYmIChlbHQuaGFzQXR0cmlidXRlKHF1YWxpZmllZE5hbWUpIHx8XG4gICAgICBlbHQuaGFzQXR0cmlidXRlKCdkYXRhLScgKyBxdWFsaWZpZWROYW1lKSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcXVhbGlmaWVkTmFtZVxuICAgKiBAcmV0dXJucyB7KHN0cmluZyB8IG51bGwpfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuIGdldFJhd0F0dHJpYnV0ZShlbHQsIHF1YWxpZmllZE5hbWUpIHx8IGdldFJhd0F0dHJpYnV0ZShlbHQsICdkYXRhLScgKyBxdWFsaWZpZWROYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcmVudEVsdChlbHQpIHtcbiAgICBjb25zdCBwYXJlbnQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIGlmICghcGFyZW50ICYmIGVsdC5wYXJlbnROb2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdCkgcmV0dXJuIGVsdC5wYXJlbnROb2RlXG4gICAgcmV0dXJuIHBhcmVudFxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldERvY3VtZW50KCkge1xuICAgIHJldHVybiBkb2N1bWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtOb2RlfERvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Um9vdE5vZGUoZWx0LCBnbG9iYWwpIHtcbiAgICByZXR1cm4gZWx0LmdldFJvb3ROb2RlID8gZWx0LmdldFJvb3ROb2RlKHsgY29tcG9zZWQ6IGdsb2JhbCB9KSA6IGdldERvY3VtZW50KClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0geyhlOk5vZGUpID0+IGJvb2xlYW59IGNvbmRpdGlvblxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0TWF0Y2goZWx0LCBjb25kaXRpb24pIHtcbiAgICB3aGlsZSAoZWx0ICYmICFjb25kaXRpb24oZWx0KSkge1xuICAgICAgZWx0ID0gcGFyZW50RWx0KGVsdClcbiAgICB9XG5cbiAgICByZXR1cm4gZWx0IHx8IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGluaXRpYWxFbGVtZW50XG4gICAqIEBwYXJhbSB7RWxlbWVudH0gYW5jZXN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoaW5pdGlhbEVsZW1lbnQsIGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgYXR0cmlidXRlTmFtZSlcbiAgICBjb25zdCBkaXNpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1kaXNpbmhlcml0JylcbiAgICB2YXIgaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtaW5oZXJpdCcpXG4gICAgaWYgKGluaXRpYWxFbGVtZW50ICE9PSBhbmNlc3Rvcikge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmRpc2FibGVJbmhlcml0YW5jZSkge1xuICAgICAgICBpZiAoaW5oZXJpdCAmJiAoaW5oZXJpdCA9PT0gJyonIHx8IGluaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGRpc2luaGVyaXQgJiYgKGRpc2luaGVyaXQgPT09ICcqJyB8fCBkaXNpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICByZXR1cm4gJ3Vuc2V0J1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBsZXQgY2xvc2VzdEF0dHIgPSBudWxsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZSkge1xuICAgICAgcmV0dXJuICEhKGNsb3Nlc3RBdHRyID0gZ2V0QXR0cmlidXRlVmFsdWVXaXRoRGlzaW5oZXJpdGFuY2UoZWx0LCBhc0VsZW1lbnQoZSksIGF0dHJpYnV0ZU5hbWUpKVxuICAgIH0pXG4gICAgaWYgKGNsb3Nlc3RBdHRyICE9PSAndW5zZXQnKSB7XG4gICAgICByZXR1cm4gY2xvc2VzdEF0dHJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSB7XG4gICAgLy8gQHRzLWlnbm9yZTogbm9uLXN0YW5kYXJkIHByb3BlcnRpZXMgZm9yIGJyb3dzZXIgY29tcGF0aWJpbGl0eVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRWYXJpYWJsZVxuICAgIGNvbnN0IG1hdGNoZXNGdW5jdGlvbiA9IGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgKGVsdC5tYXRjaGVzIHx8IGVsdC5tYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1zTWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgZWx0LndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBlbHQub01hdGNoZXNTZWxlY3RvcilcbiAgICByZXR1cm4gISFtYXRjaGVzRnVuY3Rpb24gJiYgbWF0Y2hlc0Z1bmN0aW9uLmNhbGwoZWx0LCBzZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGFydFRhZyhzdHIpIHtcbiAgICBjb25zdCB0YWdNYXRjaGVyID0gLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKS9pXG4gICAgY29uc3QgbWF0Y2ggPSB0YWdNYXRjaGVyLmV4ZWMoc3RyKVxuICAgIGlmIChtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hdGNoWzFdLnRvTG93ZXJDYXNlKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSFRNTChyZXNwKSB7XG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpXG4gICAgcmV0dXJuIHBhcnNlci5wYXJzZUZyb21TdHJpbmcocmVzcCwgJ3RleHQvaHRtbCcpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBlbHQpIHtcbiAgICB3aGlsZSAoZWx0LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kKGVsdC5jaGlsZE5vZGVzWzBdKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge0hUTUxTY3JpcHRFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZHVwbGljYXRlU2NyaXB0KHNjcmlwdCkge1xuICAgIGNvbnN0IG5ld1NjcmlwdCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnc2NyaXB0JylcbiAgICBmb3JFYWNoKHNjcmlwdC5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBuZXdTY3JpcHQuc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICB9KVxuICAgIG5ld1NjcmlwdC50ZXh0Q29udGVudCA9IHNjcmlwdC50ZXh0Q29udGVudFxuICAgIG5ld1NjcmlwdC5hc3luYyA9IGZhbHNlXG4gICAgaWYgKGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlKSB7XG4gICAgICBuZXdTY3JpcHQubm9uY2UgPSBodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZVxuICAgIH1cbiAgICByZXR1cm4gbmV3U2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpIHtcbiAgICByZXR1cm4gc2NyaXB0Lm1hdGNoZXMoJ3NjcmlwdCcpICYmIChzY3JpcHQudHlwZSA9PT0gJ3RleHQvamF2YXNjcmlwdCcgfHwgc2NyaXB0LnR5cGUgPT09ICdtb2R1bGUnIHx8IHNjcmlwdC50eXBlID09PSAnJylcbiAgfVxuXG4gIC8qKlxuICAgKiB3ZSBoYXZlIHRvIG1ha2UgbmV3IGNvcGllcyBvZiBzY3JpcHQgdGFncyB0aGF0IHdlIGFyZSBnb2luZyB0byBpbnNlcnQgYmVjYXVzZVxuICAgKiBTT01FIGJyb3dzZXJzIChub3Qgc2F5aW5nIHdobywgYnV0IGl0IGludm9sdmVzIGFuIGVsZW1lbnQgYW5kIGFuIGFuaW1hbCkgZG9uJ3RcbiAgICogZXhlY3V0ZSBzY3JpcHRzIGNyZWF0ZWQgaW4gPHRlbXBsYXRlPiB0YWdzIHdoZW4gdGhleSBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NXG4gICAqIGFuZCBhbGwgdGhlIG90aGVycyBkbyBsbWFvXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpIHtcbiAgICBBcnJheS5mcm9tKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpKS5mb3JFYWNoKC8qKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHQgKi8gKHNjcmlwdCkgPT4ge1xuICAgICAgaWYgKGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSkge1xuICAgICAgICBjb25zdCBuZXdTY3JpcHQgPSBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KVxuICAgICAgICBjb25zdCBwYXJlbnQgPSBzY3JpcHQucGFyZW50Tm9kZVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3U2NyaXB0LCBzY3JpcHQpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHNjcmlwdC5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7RG9jdW1lbnRGcmFnbWVudCAmIHt0aXRsZT86IHN0cmluZ319IERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGVcbiAgICogQGRlc2NyaXB0aW9uICBhIGRvY3VtZW50IGZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgcmVzcG9uc2UgSFRNTCwgaW5jbHVkaW5nXG4gICAqIGEgYHRpdGxlYCBwcm9wZXJ0eSBmb3IgYW55IHRpdGxlIGluZm9ybWF0aW9uIGZvdW5kXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgSFRNTFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZX1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VGcmFnbWVudChyZXNwb25zZSkge1xuICAgIC8vIHN0cmlwIGhlYWQgdGFnIHRvIGRldGVybWluZSBzaGFwZSBvZiByZXNwb25zZSB3ZSBhcmUgZGVhbGluZyB3aXRoXG4gICAgY29uc3QgcmVzcG9uc2VXaXRoTm9IZWFkID0gcmVzcG9uc2UucmVwbGFjZShIRUFEX1RBR19SRUdFWCwgJycpXG4gICAgY29uc3Qgc3RhcnRUYWcgPSBnZXRTdGFydFRhZyhyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi9cbiAgICBsZXQgZnJhZ21lbnRcbiAgICBpZiAoc3RhcnRUYWcgPT09ICdodG1sJykge1xuICAgICAgLy8gaWYgaXQgaXMgYSBmdWxsIGRvY3VtZW50LCBwYXJzZSBpdCBhbmQgcmV0dXJuIHRoZSBib2R5XG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIGlmIChzdGFydFRhZyA9PT0gJ2JvZHknKSB7XG4gICAgICAvLyBwYXJzZSBib2R5IHcvbyB3cmFwcGluZyBpbiB0ZW1wbGF0ZVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZVdpdGhOb0hlYWQpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3RoZXJ3aXNlIHdlIGhhdmUgbm9uLWJvZHkgcGFydGlhbCBIVE1MIGNvbnRlbnQsIHNvIHdyYXAgaXQgaW4gYSB0ZW1wbGF0ZSB0byBtYXhpbWl6ZSBwYXJzaW5nIGZsZXhpYmlsaXR5XG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwoJzxib2R5Pjx0ZW1wbGF0ZSBjbGFzcz1cImludGVybmFsLWh0bXgtd3JhcHBlclwiPicgKyByZXNwb25zZVdpdGhOb0hlYWQgKyAnPC90ZW1wbGF0ZT48L2JvZHk+JylcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKGRvYy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpLmNvbnRlbnQpXG4gICAgICAvLyBleHRyYWN0IHRpdGxlIGludG8gZnJhZ21lbnQgZm9yIGxhdGVyIHByb2Nlc3NpbmdcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG5cbiAgICAgIC8vIGZvciBsZWdhY3kgcmVhc29ucyB3ZSBzdXBwb3J0IGEgdGl0bGUgdGFnIGF0IHRoZSByb290IGxldmVsIG9mIG5vbi1ib2R5IHJlc3BvbnNlcywgc28gd2UgbmVlZCB0byBoYW5kbGUgaXRcbiAgICAgIHZhciB0aXRsZUVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbGVtZW50ICYmIHRpdGxlRWxlbWVudC5wYXJlbnROb2RlID09PSBmcmFnbWVudCkge1xuICAgICAgICB0aXRsZUVsZW1lbnQucmVtb3ZlKClcbiAgICAgICAgZnJhZ21lbnQudGl0bGUgPSB0aXRsZUVsZW1lbnQuaW5uZXJUZXh0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmcmFnbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93U2NyaXB0VGFncykge1xuICAgICAgICBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBzY3JpcHQgdGFncyBpZiBzY3JpcHRzIGFyZSBkaXNhYmxlZFxuICAgICAgICBmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKS5mb3JFYWNoKChzY3JpcHQpID0+IHNjcmlwdC5yZW1vdmUoKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVDYWxsKGZ1bmMpIHtcbiAgICBpZiAoZnVuYykge1xuICAgICAgZnVuYygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBpc1R5cGUobywgdHlwZSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykgPT09ICdbb2JqZWN0ICcgKyB0eXBlICsgJ10nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIEZ1bmN0aW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNGdW5jdGlvbihvKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvID09PSAnZnVuY3Rpb24nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHsqfSBvXG4gICAqIEByZXR1cm5zIHtvIGlzIE9iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUmF3T2JqZWN0KG8pIHtcbiAgICByZXR1cm4gaXNUeXBlKG8sICdPYmplY3QnKVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IE9uSGFuZGxlclxuICAgKiBAcHJvcGVydHkgeyhrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwKXxzdHJpbmd9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IExpc3RlbmVySW5mb1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IG9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14Tm9kZUludGVybmFsRGF0YVxuICAgKiBFbGVtZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtpbml0SGFzaF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYm9vc3RlZF1cbiAgICogQHByb3BlcnR5IHtPbkhhbmRsZXJbXX0gW29uSGFuZGxlcnNdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICogQHByb3BlcnR5IHtMaXN0ZW5lckluZm9bXX0gW2xpc3RlbmVySW5mb3NdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NhbmNlbGxlZF1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbdHJpZ2dlcmVkT25jZV1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheWVkXVxuICAgKiBAcHJvcGVydHkge251bWJlcnxudWxsfSBbdGhyb3R0bGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbGFzdFZhbHVlXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb2FkZWRdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFt2ZXJiXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwb2xsaW5nXVxuICAgKiBAcHJvcGVydHkge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8bnVsbH0gW2xhc3RCdXR0b25DbGlja2VkXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3JlcXVlc3RDb3VudF1cbiAgICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0gW3hocl1cbiAgICogQHByb3BlcnR5IHsoKCkgPT4gdm9pZClbXX0gW3F1ZXVlZFJlcXVlc3RzXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFthYm9ydGFibGVdXG4gICAqXG4gICAqIEV2ZW50IGRhdGFcbiAgICogQHByb3BlcnR5IHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IFt0cmlnZ2VyU3BlY11cbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldFtdfSBbaGFuZGxlZEZvcl1cbiAgICovXG5cbiAgLyoqXG4gICAqIGdldEludGVybmFsRGF0YSByZXRyaWV2ZXMgXCJwcml2YXRlXCIgZGF0YSBzdG9yZWQgYnkgaHRteCB3aXRoaW4gYW4gZWxlbWVudFxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEV2ZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SW50ZXJuYWxEYXRhKGVsdCkge1xuICAgIGNvbnN0IGRhdGFQcm9wID0gJ2h0bXgtaW50ZXJuYWwtZGF0YSdcbiAgICBsZXQgZGF0YSA9IGVsdFtkYXRhUHJvcF1cbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIGRhdGEgPSBlbHRbZGF0YVByb3BdID0ge31cbiAgICB9XG4gICAgcmV0dXJuIGRhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiB0b0FycmF5IGNvbnZlcnRzIGFuIEFycmF5TGlrZSBvYmplY3QgaW50byBhIHJlYWwgYXJyYXkuXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHJldHVybnMge1RbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRvQXJyYXkoYXJyKSB7XG4gICAgY29uc3QgcmV0dXJuQXJyID0gW11cbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXR1cm5BcnIucHVzaChhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5BcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge1RbXXxOYW1lZE5vZGVNYXB8SFRNTENvbGxlY3Rpb258SFRNTEZvcm1Db250cm9sc0NvbGxlY3Rpb258QXJyYXlMaWtlPFQ+fSBhcnJcbiAgICogQHBhcmFtIHsoVCkgPT4gdm9pZH0gZnVuY1xuICAgKi9cbiAgZnVuY3Rpb24gZm9yRWFjaChhcnIsIGZ1bmMpIHtcbiAgICBpZiAoYXJyKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBmdW5jKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzU2Nyb2xsZWRJbnRvVmlldyhlbCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVxuICAgIGNvbnN0IGVsZW1Ub3AgPSByZWN0LnRvcFxuICAgIGNvbnN0IGVsZW1Cb3R0b20gPSByZWN0LmJvdHRvbVxuICAgIHJldHVybiBlbGVtVG9wIDwgd2luZG93LmlubmVySGVpZ2h0ICYmIGVsZW1Cb3R0b20gPj0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gYm9keUNvbnRhaW5zKGVsdCkge1xuICAgIC8vIElFIEZpeFxuICAgIGNvbnN0IHJvb3ROb2RlID0gZWx0LmdldFJvb3ROb2RlICYmIGVsdC5nZXRSb290Tm9kZSgpXG4gICAgaWYgKHJvb3ROb2RlICYmIHJvb3ROb2RlIGluc3RhbmNlb2Ygd2luZG93LlNoYWRvd1Jvb3QpIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMocm9vdE5vZGUuaG9zdClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHNwbGl0T25XaGl0ZXNwYWNlKHRyaWdnZXIpIHtcbiAgICByZXR1cm4gdHJpZ2dlci50cmltKCkuc3BsaXQoL1xccysvKVxuICB9XG5cbiAgLyoqXG4gICAqIG1lcmdlT2JqZWN0cyB0YWtlcyBhbGwgdGhlIGtleXMgZnJvbVxuICAgKiBvYmoyIGFuZCBkdXBsaWNhdGVzIHRoZW0gaW50byBvYmoxXG4gICAqIEB0ZW1wbGF0ZSBUMVxuICAgKiBAdGVtcGxhdGUgVDJcbiAgICogQHBhcmFtIHtUMX0gb2JqMVxuICAgKiBAcGFyYW0ge1QyfSBvYmoyXG4gICAqIEByZXR1cm5zIHtUMSAmIFQyfVxuICAgKi9cbiAgZnVuY3Rpb24gbWVyZ2VPYmplY3RzKG9iajEsIG9iajIpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmoyKSB7XG4gICAgICBpZiAob2JqMi5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgICAgICBvYmoxW2tleV0gPSBvYmoyW2tleV1cbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgcmV0dXJuIG9iajFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30galN0cmluZ1xuICAgKiBAcmV0dXJucyB7YW55fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUpTT04oalN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShqU3RyaW5nKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dFcnJvcihlcnJvcilcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkge1xuICAgIGNvbnN0IHRlc3QgPSAnaHRteDpsb2NhbFN0b3JhZ2VUZXN0J1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0ZXN0LCB0ZXN0KVxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGVzdClcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChwYXRoKVxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBwYXRoID0gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfVxuICAgICAgLy8gcmVtb3ZlIHRyYWlsaW5nIHNsYXNoLCB1bmxlc3MgaW5kZXggcGFnZVxuICAgICAgaWYgKCEoL15cXC8kLy50ZXN0KHBhdGgpKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXC8rJC8sICcnKVxuICAgICAgfVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBiZSBraW5kIHRvIElFMTEsIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCBVUkwoKVxuICAgICAgcmV0dXJuIHBhdGhcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gcHVibGljIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gaW50ZXJuYWxFdmFsKHN0cikge1xuICAgIHJldHVybiBtYXliZUV2YWwoZ2V0RG9jdW1lbnQoKS5ib2R5LCBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBldmFsKHN0cilcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjYWxsYmFjayBmb3IgdGhlICoqaHRteDpsb2FkKiogZXZlbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvY2VzcyBuZXcgY29udGVudCwgZm9yIGV4YW1wbGUgaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50IHdpdGggYSBqYXZhc2NyaXB0IGxpYnJhcnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25Mb2FkXG4gICAqXG4gICAqIEBwYXJhbSB7KGVsdDogTm9kZSkgPT4gdm9pZH0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIHRvIGNhbGwgb24gbmV3bHkgbG9hZGVkIGNvbnRlbnRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvbkxvYWRIZWxwZXIoY2FsbGJhY2spIHtcbiAgICBjb25zdCB2YWx1ZSA9IGh0bXgub24oJ2h0bXg6bG9hZCcsIC8qKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldnQgKi8gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjYWxsYmFjayhldnQuZGV0YWlsLmVsdClcbiAgICB9KVxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIExvZyBhbGwgaHRteCBldmVudHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dBbGxcbiAgICovXG4gIGZ1bmN0aW9uIGxvZ0FsbCgpIHtcbiAgICBodG14LmxvZ2dlciA9IGZ1bmN0aW9uKGVsdCwgZXZlbnQsIGRhdGEpIHtcbiAgICAgIGlmIChjb25zb2xlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50LCBlbHQsIGRhdGEpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nTm9uZSgpIHtcbiAgICBodG14LmxvZ2dlciA9IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbiBlbGVtZW50IG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudCBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFsbCBlbGVtZW50cyBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZEFsbFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yIHRoZSByb290IGVsZW1lbnQgdG8gZmluZCB0aGUgbWF0Y2hpbmcgZWxlbWVudHMgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD59XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQWxsKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmRBbGwoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMgV2luZG93XG4gICAqL1xuICBmdW5jdGlvbiBnZXRXaW5kb3coKSB7XG4gICAgcmV0dXJuIHdpbmRvd1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFbGVtZW50KGVsdCwgZGVsYXkpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUVsZW1lbnQoZWx0KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50RWx0KGVsdCkucmVtb3ZlQ2hpbGQoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gZWx0XG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0h0bWxFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqIEByZXR1cm4ge1BhcmVudE5vZGV8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzUGFyZW50Tm9kZShlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudCB8fCBlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYSBjbGFzcyB0byB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWRkQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgY2xhc3MgdG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byBhZGRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJlZm9yZSBjbGFzcyBpcyBhZGRlZFxuICAgKi9cbiAgZnVuY3Rpb24gYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eiwgZGVsYXkpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0LmNsYXNzTGlzdCAmJiBlbHQuY2xhc3NMaXN0LmFkZChjbGF6eilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNsYXNzIGZyb20gdGhlIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gbm9kZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgY2xhc3MgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcyBiZWZvcmUgY2xhc3MgaXMgcmVtb3ZlZClcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQobm9kZSwgY2xhenosIGRlbGF5KSB7XG4gICAgbGV0IGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KG5vZGUpKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShjbGF6eilcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG5vIGNsYXNzZXMgbGVmdCwgcmVtb3ZlIHRoZSBjbGFzcyBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0LnJlbW92ZUF0dHJpYnV0ZSgnY2xhc3MnKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgdGhlIGdpdmVuIGNsYXNzIG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdG9nZ2xlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRvZ2dsZSB0aGUgY2xhc3Mgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0b2dnbGVcbiAgICovXG4gIGZ1bmN0aW9uIHRvZ2dsZUNsYXNzT25FbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBlbHQuY2xhc3NMaXN0LnRvZ2dsZShjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyB0aGUgZ2l2ZW4gY2xhc3MgZnJvbSBpdHMgc2libGluZ3MsIHNvIHRoYXQgYW1vbmcgaXRzIHNpYmxpbmdzLCBvbmx5IHRoZSBnaXZlbiBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgY2xhc3MuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Rha2VDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIHRha2UgdGhlIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdGFrZVxuICAgKi9cbiAgZnVuY3Rpb24gdGFrZUNsYXNzRm9yRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZm9yRWFjaChlbHQucGFyZW50RWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXp6KVxuICAgIH0pXG4gICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGVsdCksIGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoaW5nIGVsZW1lbnQgaW4gdGhlIGdpdmVuIGVsZW1lbnRzIHBhcmVudGFnZSwgaW5jbHVzaXZlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2Nsb3Nlc3RcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIGZpbmQgdGhlIHNlbGVjdG9yIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIHRoZSBzZWxlY3RvciB0byBmaW5kXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBjbG9zZXN0KGVsdCwgc2VsZWN0b3IpIHtcbiAgICBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChlbHQpKVxuICAgIGlmIChlbHQgJiYgZWx0LmNsb3Nlc3QpIHtcbiAgICAgIHJldHVybiBlbHQuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyByZW1vdmUgd2hlbiBJRSBnb2VzIGF3YXlcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKGVsdCA9PSBudWxsIHx8IG1hdGNoZXMoZWx0LCBzZWxlY3RvcikpIHtcbiAgICAgICAgICByZXR1cm4gZWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHdoaWxlIChlbHQgPSBlbHQgJiYgYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSlcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBwcmVmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3VmZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBzdWZmaXgpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoIC0gc3VmZml4Lmxlbmd0aCkgPT09IHN1ZmZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpIHtcbiAgICBjb25zdCB0cmltbWVkU2VsZWN0b3IgPSBzZWxlY3Rvci50cmltKClcbiAgICBpZiAoc3RhcnRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICc8JykgJiYgZW5kc1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnLz4nKSkge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3Rvci5zdWJzdHJpbmcoMSwgdHJpbW1lZFNlbGVjdG9yLmxlbmd0aCAtIDIpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfEVsZW1lbnR8RG9jdW1lbnR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEBwYXJhbSB7Ym9vbGVhbj19IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLCBnbG9iYWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignY2xvc2VzdCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtjbG9zZXN0KGFzRWxlbWVudChlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOCkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2ZpbmQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbZmluZChhc1BhcmVudE5vZGUoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ25leHQnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLm5leHRFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ25leHQgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkZvcndhcmRRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncHJldmlvdXMnKSB7XG4gICAgICByZXR1cm4gW2FzRWxlbWVudChlbHQpLnByZXZpb3VzRWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdwcmV2aW91cyAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuQmFja3dhcmRzUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoOSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2RvY3VtZW50Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudF1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnd2luZG93Jykge1xuICAgICAgcmV0dXJuIFt3aW5kb3ddXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ2JvZHknKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50LmJvZHldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3Jvb3QnKSB7XG4gICAgICByZXR1cm4gW2dldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZ2xvYmFsICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHNlbGVjdG9yLnNsaWNlKDcpLCB0cnVlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdG9BcnJheShhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3IpKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkZvcndhcmRRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX1BSRUNFRElORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5CYWNrd2FyZHNRdWVyeSA9IGZ1bmN0aW9uKHN0YXJ0LCBtYXRjaCwgZ2xvYmFsKSB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShzdGFydCwgZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChtYXRjaClcbiAgICBmb3IgKGxldCBpID0gcmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd31cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3RvcilbMF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZ2V0RG9jdW1lbnQoKS5ib2R5LCBlbHRPclNlbGVjdG9yKVswXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdGVtcGxhdGUge0V2ZW50VGFyZ2V0fSBUXG4gICAqIEBwYXJhbSB7VHxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtUfSBbY29udGV4dF1cbiAgICogQHJldHVybnMge0VsZW1lbnR8VHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVRhcmdldChlbHRPclNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGZpbmQoYXNQYXJlbnROb2RlKGNvbnRleHQpIHx8IGRvY3VtZW50LCBlbHRPclNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7a2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcHxzdHJpbmd9IEFueUV2ZW50TmFtZVxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gRXZlbnRBcmdzXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXR9IHRhcmdldFxuICAgKiBAcHJvcGVydHkge0FueUV2ZW50TmFtZX0gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxBbnlFdmVudE5hbWV9IGFyZzFcbiAgICogQHBhcmFtIHtBbnlFdmVudE5hbWV8RXZlbnRMaXN0ZW5lcn0gYXJnMlxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXVxuICAgKiBAcmV0dXJucyB7RXZlbnRBcmdzfVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oYXJnMikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZ2V0RG9jdW1lbnQoKS5ib2R5LFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMSksXG4gICAgICAgIGxpc3RlbmVyOiBhcmcyXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogcmVzb2x2ZVRhcmdldChhcmcxKSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzIpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnM1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb25cbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBsaXN0ZW5lciB0byB8IHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3IgfCB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICBjb25zdCBiID0gaXNGdW5jdGlvbihhcmcyKVxuICAgIHJldHVybiBiID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvZmZcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGFyZzEgdGhlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfEV2ZW50TGlzdGVuZXJ9IGFyZzIgdGhlIGV2ZW50IG5hbWUgdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lciBmcm9tIHwgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oYXJnMikgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTm9kZSBwcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3QgRFVNTVlfRUxUID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdvdXRwdXQnKSAvLyBkdW1teSBlbGVtZW50IGZvciBiYWQgc2VsZWN0b3JzXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0ck5hbWVcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgYXR0ck5hbWUpIHtcbiAgICBjb25zdCBhdHRyVGFyZ2V0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0ck5hbWUpXG4gICAgaWYgKGF0dHJUYXJnZXQpIHtcbiAgICAgIGlmIChhdHRyVGFyZ2V0ID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIFtmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyTmFtZSldXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgYXR0clRhcmdldClcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBsb2dFcnJvcignVGhlIHNlbGVjdG9yIFwiJyArIGF0dHJUYXJnZXQgKyAnXCIgb24gJyArIGF0dHJOYW1lICsgJyByZXR1cm5lZCBubyBtYXRjaGVzIScpXG4gICAgICAgICAgcmV0dXJuIFtEVU1NWV9FTFRdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJpYnV0ZSkge1xuICAgIHJldHVybiBhc0VsZW1lbnQoZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICByZXR1cm4gZ2V0QXR0cmlidXRlVmFsdWUoYXNFbGVtZW50KGVsdCksIGF0dHJpYnV0ZSkgIT0gbnVsbFxuICAgIH0pKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlfFdpbmRvd3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VGFyZ2V0KGVsdCkge1xuICAgIGNvbnN0IHRhcmdldFN0ciA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKVxuICAgIGlmICh0YXJnZXRTdHIpIHtcbiAgICAgIGlmICh0YXJnZXRTdHIgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRhcmdldFN0cilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAoZGF0YS5ib29zdGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUobmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZXNUb1NldHRsZSA9IGh0bXguY29uZmlnLmF0dHJpYnV0ZXNUb1NldHRsZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlc1RvU2V0dGxlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobmFtZSA9PT0gYXR0cmlidXRlc1RvU2V0dGxlW2ldKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VUb1xuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlRnJvbVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvbmVBdHRyaWJ1dGVzKG1lcmdlVG8sIG1lcmdlRnJvbSkge1xuICAgIGZvckVhY2gobWVyZ2VUby5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoIW1lcmdlRnJvbS5oYXNBdHRyaWJ1dGUoYXR0ci5uYW1lKSAmJiBzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnJlbW92ZUF0dHJpYnV0ZShhdHRyLm5hbWUpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKG1lcmdlRnJvbS5hdHRyaWJ1dGVzLCBmdW5jdGlvbihhdHRyKSB7XG4gICAgICBpZiAoc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpIHtcbiAgICBjb25zdCBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyh0YXJnZXQpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2ldXG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzSW5saW5lU3dhcChzd2FwU3R5bGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFN0eWxlID09PSAnb3V0ZXJIVE1MJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvb2JWYWx1ZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG9vYkVsZW1lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGxldCBzZWxlY3RvciA9ICcjJyArIGdldFJhd0F0dHJpYnV0ZShvb2JFbGVtZW50LCAnaWQnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFN0eWxlICovXG4gICAgbGV0IHN3YXBTdHlsZSA9ICdvdXRlckhUTUwnXG4gICAgaWYgKG9vYlZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9IGVsc2UgaWYgKG9vYlZhbHVlLmluZGV4T2YoJzonKSA+IDApIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlLnN1YnN0cigwLCBvb2JWYWx1ZS5pbmRleE9mKCc6JykpXG4gICAgICBzZWxlY3RvciA9IG9vYlZhbHVlLnN1YnN0cihvb2JWYWx1ZS5pbmRleE9mKCc6JykgKyAxLCBvb2JWYWx1ZS5sZW5ndGgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHN3YXBTdHlsZSA9IG9vYlZhbHVlXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcilcbiAgICBpZiAodGFyZ2V0cykge1xuICAgICAgZm9yRWFjaChcbiAgICAgICAgdGFyZ2V0cyxcbiAgICAgICAgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgICAgbGV0IGZyYWdtZW50XG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudENsb25lID0gb29iRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSlcbiAgICAgICAgICBmcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQob29iRWxlbWVudENsb25lKVxuICAgICAgICAgIGlmICghaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSkge1xuICAgICAgICAgICAgZnJhZ21lbnQgPSBhc1BhcmVudE5vZGUob29iRWxlbWVudENsb25lKSAvLyBpZiB0aGlzIGlzIG5vdCBhbiBpbmxpbmUgc3dhcCwgd2UgdXNlIHRoZSBjb250ZW50IG9mIHRoZSBub2RlLCBub3QgdGhlIG5vZGUgaXRzZWxmXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmVmb3JlU3dhcERldGFpbHMgPSB7IHNob3VsZFN3YXA6IHRydWUsIHRhcmdldCwgZnJhZ21lbnQgfVxuICAgICAgICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6b29iQmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICAgICAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgICAgICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgICAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCB0YXJnZXQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14Om9vYkFmdGVyU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6b29iRXJyb3JOb1RhcmdldCcsIHsgY29udGVudDogb29iRWxlbWVudCB9KVxuICAgIH1cbiAgICByZXR1cm4gb29iVmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudCkge1xuICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ1toeC1wcmVzZXJ2ZV0sIFtkYXRhLWh4LXByZXNlcnZlXScpLCBmdW5jdGlvbihwcmVzZXJ2ZWRFbHQpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0QXR0cmlidXRlVmFsdWUocHJlc2VydmVkRWx0LCAnaWQnKVxuICAgICAgY29uc3Qgb2xkRWx0ID0gZ2V0RG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgIGlmIChvbGRFbHQgIT0gbnVsbCkge1xuICAgICAgICBwcmVzZXJ2ZWRFbHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQob2xkRWx0LCBwcmVzZXJ2ZWRFbHQpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJyksIGZ1bmN0aW9uKG5ld05vZGUpIHtcbiAgICAgIGNvbnN0IGlkID0gZ2V0UmF3QXR0cmlidXRlKG5ld05vZGUsICdpZCcpXG4gICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBub3JtYWxpemVkSWQgPSBpZC5yZXBsYWNlKFwiJ1wiLCBcIlxcXFwnXCIpXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRUYWcgPSBuZXdOb2RlLnRhZ05hbWUucmVwbGFjZSgnOicsICdcXFxcOicpXG4gICAgICAgIGNvbnN0IHBhcmVudEVsdCA9IGFzUGFyZW50Tm9kZShwYXJlbnROb2RlKVxuICAgICAgICBjb25zdCBvbGROb2RlID0gcGFyZW50RWx0ICYmIHBhcmVudEVsdC5xdWVyeVNlbGVjdG9yKG5vcm1hbGl6ZWRUYWcgKyBcIltpZD0nXCIgKyBub3JtYWxpemVkSWQgKyBcIiddXCIpXG4gICAgICAgIGlmIChvbGROb2RlICYmIG9sZE5vZGUgIT09IHBhcmVudEVsdCkge1xuICAgICAgICAgIGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBuZXdOb2RlLmNsb25lTm9kZSgpXG4gICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG9sZE5vZGUpXG4gICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY2xvbmVBdHRyaWJ1dGVzKG5ld05vZGUsIG5ld0F0dHJpYnV0ZXMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBjaGlsZFxuICAgKiBAcmV0dXJucyB7SHRteFNldHRsZVRhc2t9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlQWpheExvYWRUYXNrKGNoaWxkKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHByb2Nlc3NOb2RlKGFzRWxlbWVudChjaGlsZCkpXG4gICAgICBwcm9jZXNzRm9jdXMoYXNQYXJlbnROb2RlKGNoaWxkKSlcbiAgICAgIHRyaWdnZXJFdmVudChjaGlsZCwgJ2h0bXg6bG9hZCcpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gY2hpbGRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NGb2N1cyhjaGlsZCkge1xuICAgIGNvbnN0IGF1dG9mb2N1cyA9ICdbYXV0b2ZvY3VzXSdcbiAgICBjb25zdCBhdXRvRm9jdXNlZEVsdCA9IGFzSHRtbEVsZW1lbnQobWF0Y2hlcyhjaGlsZCwgYXV0b2ZvY3VzKSA/IGNoaWxkIDogY2hpbGQucXVlcnlTZWxlY3RvcihhdXRvZm9jdXMpKVxuICAgIGlmIChhdXRvRm9jdXNlZEVsdCAhPSBudWxsKSB7XG4gICAgICBhdXRvRm9jdXNlZEVsdC5mb2N1cygpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge05vZGV9IGluc2VydEJlZm9yZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydEJlZm9yZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBoYW5kbGVBdHRyaWJ1dGVzKHBhcmVudE5vZGUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIHdoaWxlIChmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gZnJhZ21lbnQuZmlyc3RDaGlsZFxuICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoYXNFbGVtZW50KGNoaWxkKSwgaHRteC5jb25maWcuYWRkZWRDbGFzcylcbiAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkLCBpbnNlcnRCZWZvcmUpXG4gICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJhc2VkIG9uIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2h5YW1hbW90by9mZDQzNTUwNWQyOWViZmEzZDk3MTZmZDJiZThkNDJmMCxcbiAgICogZGVyaXZlZCBmcm9tIEphdmEncyBzdHJpbmcgaGFzaGNvZGUgaW1wbGVtZW50YXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gaGFzaFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gc3RyaW5nSGFzaChzdHJpbmcsIGhhc2gpIHtcbiAgICBsZXQgY2hhciA9IDBcbiAgICB3aGlsZSAoY2hhciA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChjaGFyKyspIHwgMCAvLyBiaXR3aXNlIG9yIGVuc3VyZXMgd2UgaGF2ZSBhIDMyLWJpdCBpbnRcbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYXR0cmlidXRlSGFzaChlbHQpIHtcbiAgICBsZXQgaGFzaCA9IDBcbiAgICAvLyBJRSBmaXhcbiAgICBpZiAoZWx0LmF0dHJpYnV0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlID0gZWx0LmF0dHJpYnV0ZXNbaV1cbiAgICAgICAgaWYgKGF0dHJpYnV0ZS52YWx1ZSkgeyAvLyBvbmx5IGluY2x1ZGUgYXR0cmlidXRlcyB3LyBhY3R1YWwgdmFsdWVzIChlbXB0eSBpcyBzYW1lIGFzIG5vbi1leGlzdGVudClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUubmFtZSwgaGFzaClcbiAgICAgICAgICBoYXNoID0gc3RyaW5nSGFzaChhdHRyaWJ1dGUudmFsdWUsIGhhc2gpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhc2hcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE9uSGFuZGxlcnMoZWx0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaGFuZGxlckluZm8gPSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1tpXVxuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChlbHQsIGhhbmRsZXJJbmZvLmV2ZW50LCBoYW5kbGVySW5mby5saXN0ZW5lcilcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBpbnRlcm5hbERhdGEub25IYW5kbGVyc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGRlSW5pdE5vZGUoZWxlbWVudCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbGVtZW50KVxuICAgIGlmIChpbnRlcm5hbERhdGEudGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KGludGVybmFsRGF0YS50aW1lb3V0KVxuICAgIH1cbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MpIHtcbiAgICAgIGZvckVhY2goaW50ZXJuYWxEYXRhLmxpc3RlbmVySW5mb3MsIGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgaWYgKGluZm8ub24pIHtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVySW1wbChpbmZvLm9uLCBpbmZvLnRyaWdnZXIsIGluZm8ubGlzdGVuZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWxlbWVudClcbiAgICBmb3JFYWNoKE9iamVjdC5rZXlzKGludGVybmFsRGF0YSksIGZ1bmN0aW9uKGtleSkgeyBkZWxldGUgaW50ZXJuYWxEYXRhW2tleV0gfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuVXBFbGVtZW50KGVsZW1lbnQpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKVxuICAgIGRlSW5pdE5vZGUoZWxlbWVudClcbiAgICAvLyBAdHMtaWdub3JlIElFMTEgY29kZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICBpZiAoZWxlbWVudC5jaGlsZHJlbikgeyAvLyBJRVxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZm9yRWFjaChlbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgeyBjbGVhblVwRWxlbWVudChjaGlsZCkgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiB0YXJnZXQudGFnTmFtZSA9PT0gJ0JPRFknKSB7IC8vIHNwZWNpYWwgY2FzZSB0aGUgYm9keSB0byBpbm5lckhUTUwgYmVjYXVzZSBEb2N1bWVudEZyYWdtZW50cyBjYW4ndCBjb250YWluIGEgYm9keSBlbHQgdW5mb3J0dW5hdGVseVxuICAgICAgcmV0dXJuIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG4gICAgLyoqIEB0eXBlIHtOb2RlfSAqL1xuICAgIGxldCBuZXdFbHRcbiAgICBjb25zdCBlbHRCZWZvcmVOZXdDb250ZW50ID0gdGFyZ2V0LnByZXZpb3VzU2libGluZ1xuICAgIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChlbHRCZWZvcmVOZXdDb250ZW50ID09IG51bGwpIHtcbiAgICAgIG5ld0VsdCA9IHBhcmVudEVsdCh0YXJnZXQpLmZpcnN0Q2hpbGRcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3RWx0ID0gZWx0QmVmb3JlTmV3Q29udGVudC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBzZXR0bGVJbmZvLmVsdHMgPSBzZXR0bGVJbmZvLmVsdHMuZmlsdGVyKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGUgIT09IHRhcmdldCB9KVxuICAgIC8vIHNjYW4gdGhyb3VnaCBhbGwgbmV3bHkgYWRkZWQgY29udGVudCBhbmQgYWRkIGFsbCBlbGVtZW50cyB0byB0aGUgc2V0dGxlIGluZm8gc28gd2UgdHJpZ2dlclxuICAgIC8vIGV2ZW50cyBwcm9wZXJseSBvbiB0aGVtXG4gICAgd2hpbGUgKG5ld0VsdCAmJiBuZXdFbHQgIT09IHRhcmdldCkge1xuICAgICAgaWYgKG5ld0VsdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgICAgc2V0dGxlSW5mby5lbHRzLnB1c2gobmV3RWx0KVxuICAgICAgfVxuICAgICAgbmV3RWx0ID0gbmV3RWx0Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgdGFyZ2V0LnJlbW92ZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgdGFyZ2V0LmZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBudWxsLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQubmV4dFNpYmxpbmcsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqL1xuICBmdW5jdGlvbiBzd2FwRGVsZXRlKHRhcmdldCkge1xuICAgIGNsZWFuVXBFbGVtZW50KHRhcmdldClcbiAgICByZXR1cm4gcGFyZW50RWx0KHRhcmdldCkucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgY29uc3QgZmlyc3RDaGlsZCA9IHRhcmdldC5maXJzdENoaWxkXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCBmaXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgd2hpbGUgKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICB9XG4gICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkKVxuICAgICAgdGFyZ2V0LnJlbW92ZUNoaWxkKGZpcnN0Q2hpbGQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHN3aXRjaCAoc3dhcFN0eWxlKSB7XG4gICAgICBjYXNlICdub25lJzpcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdvdXRlckhUTUwnOlxuICAgICAgICBzd2FwT3V0ZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJiZWdpbic6XG4gICAgICAgIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlYmVnaW4nOlxuICAgICAgICBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmVlbmQnOlxuICAgICAgICBzd2FwQmVmb3JlRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYWZ0ZXJlbmQnOlxuICAgICAgICBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICBzd2FwRGVsZXRlKHRhcmdldClcbiAgICAgICAgcmV0dXJuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnMoZWx0KVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBleHQgPSBleHRlbnNpb25zW2ldXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZXh0LmhhbmRsZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5ld0VsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIGlmIGhhbmRsZVN3YXAgcmV0dXJucyBhbiBhcnJheSAobGlrZSkgb2YgZWxlbWVudHMsIHdlIGhhbmRsZSB0aGVtXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBuZXdFbGVtZW50c1tqXVxuICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3dhcFN0eWxlID09PSAnaW5uZXJIVE1MJykge1xuICAgICAgICAgIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzd2FwV2l0aFN0eWxlKGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsIGVsdCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICB2YXIgb29iRWx0cyA9IGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtc3dhcC1vb2JdLCBbZGF0YS1oeC1zd2FwLW9vYl0nKVxuICAgIGZvckVhY2gob29iRWx0cywgZnVuY3Rpb24ob29iRWxlbWVudCkge1xuICAgICAgaWYgKGh0bXguY29uZmlnLmFsbG93TmVzdGVkT29iU3dhcHMgfHwgb29iRWxlbWVudC5wYXJlbnRFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG9vYlZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUob29iRWxlbWVudCwgJ2h4LXN3YXAtb29iJylcbiAgICAgICAgaWYgKG9vYlZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnaHgtc3dhcC1vb2InKVxuICAgICAgICBvb2JFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1oeC1zd2FwLW9vYicpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gb29iRWx0cy5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBjb21wbGV0ZSBzd2FwcGluZyBwaXBlbGluZSwgaW5jbHVkaW5nOiBmb2N1cyBhbmQgc2VsZWN0aW9uIHByZXNlcnZhdGlvbixcbiAgICogdGl0bGUgdXBkYXRlcywgc2Nyb2xsLCBPT0Igc3dhcHBpbmcsIG5vcm1hbCBzd2FwcGluZyBhbmQgc2V0dGxpbmdcbiAgICogQHBhcmFtIHtzdHJpbmd8RWxlbWVudH0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKiBAcGFyYW0ge1N3YXBPcHRpb25zfSBbc3dhcE9wdGlvbnNdXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwKHRhcmdldCwgY29udGVudCwgc3dhcFNwZWMsIHN3YXBPcHRpb25zKSB7XG4gICAgaWYgKCFzd2FwT3B0aW9ucykge1xuICAgICAgc3dhcE9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIHRhcmdldCA9IHJlc29sdmVUYXJnZXQodGFyZ2V0KVxuXG4gICAgLy8gcHJlc2VydmUgZm9jdXMgYW5kIHNlbGVjdGlvblxuICAgIGNvbnN0IGFjdGl2ZUVsdCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRcbiAgICBsZXQgc2VsZWN0aW9uSW5mbyA9IHt9XG4gICAgdHJ5IHtcbiAgICAgIHNlbGVjdGlvbkluZm8gPSB7XG4gICAgICAgIGVsdDogYWN0aXZlRWx0LFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHN0YXJ0OiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uU3RhcnQgOiBudWxsLFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGVuZDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvbkVuZCA6IG51bGxcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBzYWZhcmkgaXNzdWUgLSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9wbGF5d3JpZ2h0L2lzc3Vlcy81ODk0XG4gICAgfVxuICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpXG5cbiAgICAvLyBGb3IgdGV4dCBjb250ZW50IHN3YXBzLCBkb24ndCBwYXJzZSB0aGUgcmVzcG9uc2UgYXMgSFRNTCwganVzdCBpbnNlcnQgaXRcbiAgICBpZiAoc3dhcFNwZWMuc3dhcFN0eWxlID09PSAndGV4dENvbnRlbnQnKSB7XG4gICAgICB0YXJnZXQudGV4dENvbnRlbnQgPSBjb250ZW50XG4gICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBmcmFnbWVudCBhbmQgcHJvY2VzcyBpdFxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY29udGVudClcblxuICAgICAgc2V0dGxlSW5mby50aXRsZSA9IGZyYWdtZW50LnRpdGxlXG5cbiAgICAgIC8vIHNlbGVjdC1vb2Igc3dhcHNcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3RPT0IpIHtcbiAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWVzID0gc3dhcE9wdGlvbnMuc2VsZWN0T09CLnNwbGl0KCcsJylcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvb2JTZWxlY3RWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlc1tpXS5zcGxpdCgnOicsIDIpXG4gICAgICAgICAgbGV0IGlkID0gb29iU2VsZWN0VmFsdWVbMF0udHJpbSgpXG4gICAgICAgICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgICAgICAgaWQgPSBpZC5zdWJzdHJpbmcoMSlcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBvb2JTZWxlY3RWYWx1ZVsxXSB8fCAndHJ1ZSdcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignIycgKyBpZClcbiAgICAgICAgICBpZiAob29iRWxlbWVudCkge1xuICAgICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIG9vYiBzd2Fwc1xuICAgICAgZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIGZvckVhY2goZmluZEFsbChmcmFnbWVudCwgJ3RlbXBsYXRlJyksIC8qKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlICovZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgICAgaWYgKGZpbmRBbmRTd2FwT29iRWxlbWVudHModGVtcGxhdGUuY29udGVudCwgc2V0dGxlSW5mbykpIHtcbiAgICAgICAgICAvLyBBdm9pZCBwb2xsdXRpbmcgdGhlIERPTSB3aXRoIGVtcHR5IHRlbXBsYXRlcyB0aGF0IHdlcmUgb25seSB1c2VkIHRvIGVuY2Fwc3VsYXRlIG9vYiBzd2FwXG4gICAgICAgICAgdGVtcGxhdGUucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgLy8gbm9ybWFsIHN3YXBcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5zZWxlY3QpIHtcbiAgICAgICAgY29uc3QgbmV3RnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc3dhcE9wdGlvbnMuc2VsZWN0KSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIG5ld0ZyYWdtZW50LmFwcGVuZENoaWxkKG5vZGUpXG4gICAgICAgIH0pXG4gICAgICAgIGZyYWdtZW50ID0gbmV3RnJhZ21lbnRcbiAgICAgIH1cbiAgICAgIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KVxuICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3BlYy5zd2FwU3R5bGUsIHN3YXBPcHRpb25zLmNvbnRleHRFbGVtZW50LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cblxuICAgIC8vIGFwcGx5IHNhdmVkIGZvY3VzIGFuZCBzZWxlY3Rpb24gaW5mb3JtYXRpb24gdG8gc3dhcHBlZCBjb250ZW50XG4gICAgaWYgKHNlbGVjdGlvbkluZm8uZWx0ICYmXG4gICAgICAhYm9keUNvbnRhaW5zKHNlbGVjdGlvbkluZm8uZWx0KSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSkge1xuICAgICAgY29uc3QgbmV3QWN0aXZlRWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZ2V0UmF3QXR0cmlidXRlKHNlbGVjdGlvbkluZm8uZWx0LCAnaWQnKSlcbiAgICAgIGNvbnN0IGZvY3VzT3B0aW9ucyA9IHsgcHJldmVudFNjcm9sbDogc3dhcFNwZWMuZm9jdXNTY3JvbGwgIT09IHVuZGVmaW5lZCA/ICFzd2FwU3BlYy5mb2N1c1Njcm9sbCA6ICFodG14LmNvbmZpZy5kZWZhdWx0Rm9jdXNTY3JvbGwgfVxuICAgICAgaWYgKG5ld0FjdGl2ZUVsdCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmIChzZWxlY3Rpb25JbmZvLnN0YXJ0ICYmIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uSW5mby5zdGFydCwgc2VsZWN0aW9uSW5mby5lbmQpXG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gdGhlIHNldFNlbGVjdGlvblJhbmdlIG1ldGhvZCBpcyBwcmVzZW50IG9uIGZpZWxkcyB0aGF0IGRvbid0IHN1cHBvcnQgaXQsIHNvIGp1c3QgbGV0IHRoaXMgZmFpbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBuZXdBY3RpdmVFbHQuZm9jdXMoZm9jdXNPcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG4gICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU3dhcCcsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICB9KVxuICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaykge1xuICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2soKVxuICAgIH1cblxuICAgIC8vIG1lcmdlIGluIG5ldyB0aXRsZSBhZnRlciBzd2FwIGJ1dCBiZWZvcmUgc2V0dGxlXG4gICAgaWYgKCFzd2FwU3BlYy5pZ25vcmVUaXRsZSkge1xuICAgICAgaGFuZGxlVGl0bGUoc2V0dGxlSW5mby50aXRsZSlcbiAgICB9XG5cbiAgICAvLyBzZXR0bGVcbiAgICBjb25zdCBkb1NldHRsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLnRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICAgIHRhc2suY2FsbCgpXG4gICAgICB9KVxuICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTZXR0bGUnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgICB9KVxuXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYW5jaG9yKSB7XG4gICAgICAgIGNvbnN0IGFuY2hvclRhcmdldCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KCcjJyArIHN3YXBPcHRpb25zLmFuY2hvcikpXG4gICAgICAgIGlmIChhbmNob3JUYXJnZXQpIHtcbiAgICAgICAgICBhbmNob3JUYXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6ICdhdXRvJyB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVNjcm9sbFN0YXRlKHNldHRsZUluZm8uZWx0cywgc3dhcFNwZWMpXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaykge1xuICAgICAgICBzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3dhcFNwZWMuc2V0dGxlRGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU2V0dGxlLCBzd2FwU3BlYy5zZXR0bGVEZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgZG9TZXR0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCBoZWFkZXIsIGVsdCkge1xuICAgIGNvbnN0IHRyaWdnZXJCb2R5ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKGhlYWRlcilcbiAgICBpZiAodHJpZ2dlckJvZHkuaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICBjb25zdCB0cmlnZ2VycyA9IHBhcnNlSlNPTih0cmlnZ2VyQm9keSlcbiAgICAgIGZvciAoY29uc3QgZXZlbnROYW1lIGluIHRyaWdnZXJzKSB7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpKSB7XG4gICAgICAgICAgbGV0IGRldGFpbCA9IHRyaWdnZXJzW2V2ZW50TmFtZV1cbiAgICAgICAgICBpZiAoaXNSYXdPYmplY3QoZGV0YWlsKSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWx0ID0gZGV0YWlsLnRhcmdldCAhPT0gdW5kZWZpbmVkID8gZGV0YWlsLnRhcmdldCA6IGVsdFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWwgPSB7IHZhbHVlOiBkZXRhaWwgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBldmVudE5hbWVzID0gdHJpZ2dlckJvZHkuc3BsaXQoJywnKVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZXNbaV0udHJpbSgpLCBbXSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBXSElURVNQQUNFID0gL1xccy9cbiAgY29uc3QgV0hJVEVTUEFDRV9PUl9DT01NQSA9IC9bXFxzLF0vXG4gIGNvbnN0IFNZTUJPTF9TVEFSVCA9IC9bXyRhLXpBLVpdL1xuICBjb25zdCBTWU1CT0xfQ09OVCA9IC9bXyRhLXpBLVowLTldL1xuICBjb25zdCBTVFJJTkdJU0hfU1RBUlQgPSBbJ1wiJywgXCInXCIsICcvJ11cbiAgY29uc3QgTk9UX1dISVRFU1BBQ0UgPSAvW15cXHNdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVCA9IC9beyhdL1xuICBjb25zdCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQgPSAvW30pXS9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiB0b2tlbml6ZVN0cmluZyhzdHIpIHtcbiAgICAvKiogQHR5cGUgc3RyaW5nW10gKi9cbiAgICBjb25zdCB0b2tlbnMgPSBbXVxuICAgIGxldCBwb3NpdGlvbiA9IDBcbiAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoKSB7XG4gICAgICBpZiAoU1lNQk9MX1NUQVJULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbikpKSB7XG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgd2hpbGUgKFNZTUJPTF9DT05ULmV4ZWMoc3RyLmNoYXJBdChwb3NpdGlvbiArIDEpKSkge1xuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIGlmIChTVFJJTkdJU0hfU1RBUlQuaW5kZXhPZihzdHIuY2hhckF0KHBvc2l0aW9uKSkgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0Q2hhciA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHZhciBzdGFydFBvc2l0aW9uID0gcG9zaXRpb25cbiAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB3aGlsZSAocG9zaXRpb24gPCBzdHIubGVuZ3RoICYmIHN0ci5jaGFyQXQocG9zaXRpb24pICE9PSBzdGFydENoYXIpIHtcbiAgICAgICAgICBpZiAoc3RyLmNoYXJBdChwb3NpdGlvbikgPT09ICdcXFxcJykge1xuICAgICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN5bWJvbCA9IHN0ci5jaGFyQXQocG9zaXRpb24pXG4gICAgICAgIHRva2Vucy5wdXNoKHN5bWJvbClcbiAgICAgIH1cbiAgICAgIHBvc2l0aW9uKytcbiAgICB9XG4gICAgcmV0dXJuIHRva2Vuc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b2tlblxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBsYXN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkge1xuICAgIHJldHVybiBTWU1CT0xfU1RBUlQuZXhlYyh0b2tlbi5jaGFyQXQoMCkpICYmXG4gICAgICB0b2tlbiAhPT0gJ3RydWUnICYmXG4gICAgICB0b2tlbiAhPT0gJ2ZhbHNlJyAmJlxuICAgICAgdG9rZW4gIT09ICd0aGlzJyAmJlxuICAgICAgdG9rZW4gIT09IHBhcmFtTmFtZSAmJlxuICAgICAgbGFzdCAhPT0gJy4nXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Q29uZGl0aW9uYWxGdW5jdGlvbnxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCBwYXJhbU5hbWUpIHtcbiAgICBpZiAodG9rZW5zWzBdID09PSAnWycpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICBsZXQgYnJhY2tldENvdW50ID0gMVxuICAgICAgbGV0IGNvbmRpdGlvbmFsU291cmNlID0gJyByZXR1cm4gKGZ1bmN0aW9uKCcgKyBwYXJhbU5hbWUgKyAnKXsgcmV0dXJuICgnXG4gICAgICBsZXQgbGFzdCA9IG51bGxcbiAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vuc1swXVxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBzaGlmdCBjYWxsLCBhbmQgdGhpbmtzIHdlJ3JlIGNvbXBhcmluZyB0aGUgc2FtZSB2YWx1ZSBoZXJlLCBpLmUuICdbJyB2cyAnXSdcbiAgICAgICAgaWYgKHRva2VuID09PSAnXScpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQtLVxuICAgICAgICAgIGlmIChicmFja2V0Q291bnQgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyAndHJ1ZSdcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKX0pJ1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uRnVuY3Rpb24gPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24oY29uZGl0aW9uYWxTb3VyY2UpKClcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0pXG4gICAgICAgICAgICAgIGNvbmRpdGlvbkZ1bmN0aW9uLnNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlXG4gICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25GdW5jdGlvblxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnN5bnRheDplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZTogY29uZGl0aW9uYWxTb3VyY2UgfSlcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdbJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudCsrXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSkge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcoKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpID8gKCcgKyBwYXJhbU5hbWUgKyAnLicgKyB0b2tlbiArICcpIDogKHdpbmRvdy4nICsgdG9rZW4gKyAnKSknXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArIHRva2VuXG4gICAgICAgIH1cbiAgICAgICAgbGFzdCA9IHRva2Vucy5zaGlmdCgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge1JlZ0V4cH0gbWF0Y2hcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVVbnRpbCh0b2tlbnMsIG1hdGNoKSB7XG4gICAgbGV0IHJlc3VsdCA9ICcnXG4gICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmICFtYXRjaC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHJlc3VsdCArPSB0b2tlbnMuc2hpZnQoKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0b2tlbnMubGVuZ3RoID4gMCAmJiBDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBDT01CSU5FRF9TRUxFQ1RPUl9FTkQpLnRyaW0oKVxuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgY29uc3QgSU5QVVRfU0VMRUNUT1IgPSAnaW5wdXQsIHRleHRhcmVhLCBzZWxlY3QnXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHBsaWNpdFRyaWdnZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIGZvciB0cmlnZ2VyIHNwZWNzXG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSkge1xuICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXSAqL1xuICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgY29uc3QgdG9rZW5zID0gdG9rZW5pemVTdHJpbmcoZXhwbGljaXRUcmlnZ2VyKVxuICAgIGRvIHtcbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IHRva2Vucy5sZW5ndGhcbiAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLylcbiAgICAgIGlmICh0cmlnZ2VyICE9PSAnJykge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2V2ZXJ5Jykge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCBldmVyeSA9IHsgdHJpZ2dlcjogJ2V2ZXJ5JyB9XG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgZXZlcnkucG9sbEludGVydmFsID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCAvWyxcXFtcXHNdLykpXG4gICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgZXZlcnkuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaChldmVyeSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgdHJpZ2dlclNwZWMgPSB7IHRyaWdnZXIgfVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXSAhPT0gJywnKSB7XG4gICAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2NoYW5nZWQnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNoYW5nZWQgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnb25jZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMub25jZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdjb25zdW1lJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jb25zdW1lID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2RlbGF5JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5kZWxheSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZnJvbScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgaWYgKENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgICAgICBpZiAoZnJvbV9hcmcgPT09ICdjbG9zZXN0JyB8fCBmcm9tX2FyZyA9PT0gJ2ZpbmQnIHx8IGZyb21fYXJnID09PSAnbmV4dCcgfHwgZnJvbV9hcmcgPT09ICdwcmV2aW91cycpIHtcbiAgICAgICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICAgICAgICAvLyBgbmV4dGAgYW5kIGBwcmV2aW91c2AgYWxsb3cgYSBzZWxlY3Rvci1sZXNzIHN5bnRheFxuICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbV9hcmcgKz0gJyAnICsgc2VsZWN0b3JcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZnJvbSA9IGZyb21fYXJnXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGFyZ2V0JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50YXJnZXQgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Rocm90dGxlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy50aHJvdHRsZSA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSkpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncXVldWUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnF1ZXVlID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdyb290JyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RocmVzaG9sZCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZVVudGlsKHRva2VucywgV0hJVEVTUEFDRV9PUl9DT01NQSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2godHJpZ2dlclNwZWMpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSBpbml0aWFsTGVuZ3RoKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyB0b2tlbjogdG9rZW5zLnNoaWZ0KCkgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgIH0gd2hpbGUgKHRva2Vuc1swXSA9PT0gJywnICYmIHRva2Vucy5zaGlmdCgpKVxuICAgIGlmIChjYWNoZSkge1xuICAgICAgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSA9IHRyaWdnZXJTcGVjc1xuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0VHJpZ2dlclNwZWNzKGVsdCkge1xuICAgIGNvbnN0IGV4cGxpY2l0VHJpZ2dlciA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRyaWdnZXInKVxuICAgIGxldCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGlmIChleHBsaWNpdFRyaWdnZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gaHRteC5jb25maWcudHJpZ2dlclNwZWNzQ2FjaGVcbiAgICAgIHRyaWdnZXJTcGVjcyA9IChjYWNoZSAmJiBjYWNoZVtleHBsaWNpdFRyaWdnZXJdKSB8fCBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpXG4gICAgfVxuXG4gICAgaWYgKHRyaWdnZXJTcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdHJpZ2dlclNwZWNzXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdzdWJtaXQnIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJidXR0b25cIl0sIGlucHV0W3R5cGU9XCJzdWJtaXRcIl0nKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCBJTlBVVF9TRUxFQ1RPUikpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2hhbmdlJyB9XVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gY2FuY2VsUG9sbGluZyhlbHQpIHtcbiAgICBnZXRJbnRlcm5hbERhdGEoZWx0KS5jYW5jZWxsZWQgPSB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gc3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIG5vZGVEYXRhLnRpbWVvdXQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKGJvZHlDb250YWlucyhlbHQpICYmIG5vZGVEYXRhLmNhbmNlbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQoc3BlYywgZWx0LCBtYWtlRXZlbnQoJ2h4OnBvbGw6dHJpZ2dlcicsIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlYzogc3BlYyxcbiAgICAgICAgICB0YXJnZXQ6IGVsdFxuICAgICAgICB9KSkpIHtcbiAgICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgICAgfVxuICAgICAgICBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpXG4gICAgICB9XG4gICAgfSwgc3BlYy5wb2xsSW50ZXJ2YWwpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MQW5jaG9yRWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNMb2NhbExpbmsoZWx0KSB7XG4gICAgcmV0dXJuIGxvY2F0aW9uLmhvc3RuYW1lID09PSBlbHQuaG9zdG5hbWUgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpICE9PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGVsdElzRGlzYWJsZWQoZWx0KSB7XG4gICAgcmV0dXJuIGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqL1xuICBmdW5jdGlvbiBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgaWYgKChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBpc0xvY2FsTGluayhlbHQpICYmIChlbHQudGFyZ2V0ID09PSAnJyB8fCBlbHQudGFyZ2V0ID09PSAnX3NlbGYnKSkgfHwgKGVsdC50YWdOYW1lID09PSAnRk9STScgJiYgU3RyaW5nKGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKSkudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpKSB7XG4gICAgICBub2RlRGF0YS5ib29zdGVkID0gdHJ1ZVxuICAgICAgbGV0IHZlcmIsIHBhdGhcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgIHZlcmIgPSAnZ2V0J1xuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmF3QXR0cmlidXRlID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpXG4gICAgICAgIHZlcmIgPSByYXdBdHRyaWJ1dGUgPyByYXdBdHRyaWJ1dGUudG9Mb3dlckNhc2UoKSA6ICdnZXQnXG4gICAgICAgIGlmICh2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgICB9XG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnYWN0aW9uJylcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG4gICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgfSwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCB0cnVlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZENhbmNlbChldnQsIG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChldnQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZXZ0LnR5cGUgPT09ICdjbGljaycpIHtcbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwic3VibWl0XCJdLCBidXR0b24nKSAmJiBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGVsdC5ocmVmICYmXG4gICAgICAgIChlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykgPT09ICcjJyB8fCBlbHQuZ2V0QXR0cmlidXRlKCdocmVmJykuaW5kZXhPZignIycpICE9PSAwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fE1vdXNlRXZlbnR8S2V5Ym9hcmRFdmVudHxUb3VjaEV2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSB7XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZXZ0LnR5cGUgPT09ICdjbGljaycgJiZcbiAgICAgIC8vIEB0cy1pZ25vcmUgdGhpcyB3aWxsIHJlc29sdmUgdG8gdW5kZWZpbmVkIGZvciBldmVudHMgdGhhdCBkb24ndCBkZWZpbmUgdGhvc2UgcHJvcGVydGllcywgd2hpY2ggaXMgZmluZVxuICAgICAgKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkge1xuICAgIGNvbnN0IGV2ZW50RmlsdGVyID0gdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXJcbiAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBldmVudEZpbHRlci5jYWxsKGVsdCwgZXZ0KSAhPT0gdHJ1ZVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBldmVudEZpbHRlci5zb3VyY2VcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpldmVudEZpbHRlcjplcnJvcicsIHsgZXJyb3I6IGUsIHNvdXJjZSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtleHBsaWNpdENhbmNlbF1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIGV4cGxpY2l0Q2FuY2VsKSB7XG4gICAgY29uc3QgZWxlbWVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIC8qKiBAdHlwZSB7KE5vZGV8V2luZG93KVtdfSAqL1xuICAgIGxldCBlbHRzVG9MaXN0ZW5PblxuICAgIGlmICh0cmlnZ2VyU3BlYy5mcm9tKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCB0cmlnZ2VyU3BlYy5mcm9tKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHRzVG9MaXN0ZW5PbiA9IFtlbHRdXG4gICAgfVxuICAgIC8vIHN0b3JlIHRoZSBpbml0aWFsIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMsIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXkgY2hhbmdlXG4gICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uLmZvckVhY2goZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgfSlcbiAgICB9XG4gICAgZm9yRWFjaChlbHRzVG9MaXN0ZW5PbiwgZnVuY3Rpb24oZWx0VG9MaXN0ZW5Pbikge1xuICAgICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGVsdFRvTGlzdGVuT24ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChpZ25vcmVCb29zdGVkQW5jaG9yQ3RybENsaWNrKGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHBsaWNpdENhbmNlbCB8fCBzaG91bGRDYW5jZWwoZXZ0LCBlbHQpKSB7XG4gICAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2dClcbiAgICAgICAgZXZlbnREYXRhLnRyaWdnZXJTcGVjID0gdHJpZ2dlclNwZWNcbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yID09IG51bGwpIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvciA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50RGF0YS5oYW5kbGVkRm9yLmluZGV4T2YoZWx0KSA8IDApIHtcbiAgICAgICAgICBldmVudERhdGEuaGFuZGxlZEZvci5wdXNoKGVsdClcbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY29uc3VtZSkge1xuICAgICAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50YXJnZXQgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVzKGFzRWxlbWVudChldnQudGFyZ2V0KSwgdHJpZ2dlclNwZWMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLm9uY2UpIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNoYW5nZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWx0VG9MaXN0ZW5Pbi52YWx1ZVxuICAgICAgICAgICAgaWYgKGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEuZGVsYXllZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGVsZW1lbnREYXRhLmRlbGF5ZWQpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocm90dGxlID4gMCkge1xuICAgICAgICAgICAgaWYgKCFlbGVtZW50RGF0YS50aHJvdHRsZSkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gbnVsbFxuICAgICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy50aHJvdHRsZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLmRlbGF5ID4gMCkge1xuICAgICAgICAgICAgZWxlbWVudERhdGEuZGVsYXllZCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChub2RlRGF0YS5saXN0ZW5lckluZm9zID09IG51bGwpIHtcbiAgICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcyA9IFtdXG4gICAgICB9XG4gICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zLnB1c2goe1xuICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyU3BlYy50cmlnZ2VyLFxuICAgICAgICBsaXN0ZW5lcjogZXZlbnRMaXN0ZW5lcixcbiAgICAgICAgb246IGVsdFRvTGlzdGVuT25cbiAgICAgIH0pXG4gICAgICBlbHRUb0xpc3Rlbk9uLmFkZEV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICB9KVxuICB9XG5cbiAgbGV0IHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2UgLy8gdXNlZCBieSBpbml0U2Nyb2xsSGFuZGxlclxuICBsZXQgc2Nyb2xsSGFuZGxlciA9IG51bGxcbiAgZnVuY3Rpb24gaW5pdFNjcm9sbEhhbmRsZXIoKSB7XG4gICAgaWYgKCFzY3JvbGxIYW5kbGVyKSB7XG4gICAgICBzY3JvbGxIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gdHJ1ZVxuICAgICAgfVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHNjcm9sbEhhbmRsZXIpXG4gICAgICBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvd0lzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZVxuICAgICAgICAgIGZvckVhY2goZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXIqPSdyZXZlYWxlZCddLFtkYXRhLWh4LXRyaWdnZXIqPSdyZXZlYWxlZCddXCIpLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICAgIG1heWJlUmV2ZWFsKGVsdClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9LCAyMDApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVJldmVhbChlbHQpIHtcbiAgICBpZiAoIWhhc0F0dHJpYnV0ZShlbHQsICdkYXRhLWh4LXJldmVhbGVkJykgJiYgaXNTY3JvbGxlZEludG9WaWV3KGVsdCkpIHtcbiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaHgtcmV2ZWFsZWQnLCAndHJ1ZScpXG4gICAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgICBpZiAobm9kZURhdGEuaW5pdEhhc2gpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIHRoZSBub2RlIGlzbid0IGluaXRpYWxpemVkLCB3YWl0IGZvciBpdCBiZWZvcmUgdHJpZ2dlcmluZyB0aGUgcmVxdWVzdFxuICAgICAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphZnRlclByb2Nlc3NOb2RlJywgZnVuY3Rpb24oKSB7IHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpIH0sIHsgb25jZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtudW1iZXJ9IGRlbGF5XG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSW1tZWRpYXRlbHkoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgZGVsYXkpIHtcbiAgICBjb25zdCBsb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIW5vZGVEYXRhLmxvYWRlZCkge1xuICAgICAgICBub2RlRGF0YS5sb2FkZWQgPSB0cnVlXG4gICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZGVsYXkgPiAwKSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGxvYWQsIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBsb2FkKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX0gdHJpZ2dlclNwZWNzXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGxldCBleHBsaWNpdEFjdGlvbiA9IGZhbHNlXG4gICAgZm9yRWFjaChWRVJCUywgZnVuY3Rpb24odmVyYikge1xuICAgICAgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC0nICsgdmVyYikpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LScgKyB2ZXJiKVxuICAgICAgICBleHBsaWNpdEFjdGlvbiA9IHRydWVcbiAgICAgICAgbm9kZURhdGEucGF0aCA9IHBhdGhcbiAgICAgICAgbm9kZURhdGEudmVyYiA9IHZlcmJcbiAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICAgICAgICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2dClcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIGV4cGxpY2l0QWN0aW9uXG4gIH1cblxuICAvKipcbiAgICogQGNhbGxiYWNrIFRyaWdnZXJIYW5kbGVyXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IFtldnRdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKi9cbiAgZnVuY3Rpb24gYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGhhbmRsZXIpIHtcbiAgICBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ3JldmVhbGVkJykge1xuICAgICAgaW5pdFNjcm9sbEhhbmRsZXIoKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICAgIG1heWJlUmV2ZWFsKGFzRWxlbWVudChlbHQpKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2ludGVyc2VjdCcpIHtcbiAgICAgIGNvbnN0IG9ic2VydmVyT3B0aW9ucyA9IHt9XG4gICAgICBpZiAodHJpZ2dlclNwZWMucm9vdCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMucm9vdCA9IHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0cmlnZ2VyU3BlYy5yb290KVxuICAgICAgfVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnRocmVzaG9sZCkge1xuICAgICAgICBvYnNlcnZlck9wdGlvbnMudGhyZXNob2xkID0gcGFyc2VGbG9hdCh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpXG4gICAgICB9XG4gICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbihlbnRyaWVzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cmllc1tpXVxuICAgICAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZykge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2ludGVyc2VjdCcpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgb2JzZXJ2ZXJPcHRpb25zKVxuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShhc0VsZW1lbnQoZWx0KSlcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdsb2FkJykge1xuICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIG1ha2VFdmVudCgnbG9hZCcsIHsgZWx0IH0pKSkge1xuICAgICAgICBsb2FkSW1tZWRpYXRlbHkoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnBvbGxJbnRlcnZhbCA+IDApIHtcbiAgICAgIG5vZGVEYXRhLnBvbGxpbmcgPSB0cnVlXG4gICAgICBwcm9jZXNzUG9sbGluZyhhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gbm9kZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFByb2Nlc3NIeE9uKG5vZGUpIHtcbiAgICBjb25zdCBlbHQgPSBhc0VsZW1lbnQobm9kZSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBlbHQuYXR0cmlidXRlc1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXR0cmlidXRlcy5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdLm5hbWVcbiAgICAgIGlmIChzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb246JykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb246JykgfHxcbiAgICAgICAgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uLScpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uLScpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBjb25zdCBIWF9PTl9RVUVSWSA9IG5ldyBYUGF0aEV2YWx1YXRvcigpXG4gICAgLmNyZWF0ZUV4cHJlc3Npb24oJy4vLypbQCpbIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbjpcIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb246XCIpIG9yJyArXG4gICAgICAnIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJoeC1vbi1cIikgb3Igc3RhcnRzLXdpdGgobmFtZSgpLCBcImRhdGEtaHgtb24tXCIpIF1dJylcblxuICBmdW5jdGlvbiBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cykge1xuICAgIGlmIChzaG91bGRQcm9jZXNzSHhPbihlbHQpKSB7XG4gICAgICBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChlbHQpKVxuICAgIH1cbiAgICBjb25zdCBpdGVyID0gSFhfT05fUVVFUlkuZXZhbHVhdGUoZWx0KVxuICAgIGxldCBub2RlID0gbnVsbFxuICAgIHdoaWxlIChub2RlID0gaXRlci5pdGVyYXRlTmV4dCgpKSBlbGVtZW50cy5wdXNoKGFzRWxlbWVudChub2RlKSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpIHtcbiAgICAvKiogQHR5cGUge0VsZW1lbnRbXX0gKi9cbiAgICBjb25zdCBlbGVtZW50cyA9IFtdXG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWx0LmNoaWxkTm9kZXMpIHtcbiAgICAgICAgcHJvY2Vzc0hYT25Sb290KGNoaWxkLCBlbGVtZW50cylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpXG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCkge1xuICAgIGlmIChlbHQucXVlcnlTZWxlY3RvckFsbCkge1xuICAgICAgY29uc3QgYm9vc3RlZFNlbGVjdG9yID0gJywgW2h4LWJvb3N0XSBhLCBbZGF0YS1oeC1ib29zdF0gYSwgYVtoeC1ib29zdF0sIGFbZGF0YS1oeC1ib29zdF0nXG5cbiAgICAgIGNvbnN0IGV4dGVuc2lvblNlbGVjdG9ycyA9IFtdXG4gICAgICBmb3IgKGNvbnN0IGUgaW4gZXh0ZW5zaW9ucykge1xuICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2VdXG4gICAgICAgIGlmIChleHRlbnNpb24uZ2V0U2VsZWN0b3JzKSB7XG4gICAgICAgICAgdmFyIHNlbGVjdG9ycyA9IGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMoKVxuICAgICAgICAgIGlmIChzZWxlY3RvcnMpIHtcbiAgICAgICAgICAgIGV4dGVuc2lvblNlbGVjdG9ycy5wdXNoKHNlbGVjdG9ycylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzdWx0cyA9IGVsdC5xdWVyeVNlbGVjdG9yQWxsKFZFUkJfU0VMRUNUT1IgKyBib29zdGVkU2VsZWN0b3IgKyBcIiwgZm9ybSwgW3R5cGU9J3N1Ym1pdCddLFwiICtcbiAgICAgICAgJyBbaHgtZXh0XSwgW2RhdGEtaHgtZXh0XSwgW2h4LXRyaWdnZXJdLCBbZGF0YS1oeC10cmlnZ2VyXScgKyBleHRlbnNpb25TZWxlY3RvcnMuZmxhdCgpLm1hcChzID0+ICcsICcgKyBzKS5qb2luKCcnKSlcblxuICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICogc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gKi8gKGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIikpXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBlbHRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dClcbiAgICBpZiAoaW50ZXJuYWxEYXRhKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UmVsYXRlZEZvcm1EYXRhKGV2dCkge1xuICAgIGNvbnN0IGVsdCA9IGNsb3Nlc3QoYXNFbGVtZW50KGV2dC50YXJnZXQpLCBcImJ1dHRvbiwgaW5wdXRbdHlwZT0nc3VibWl0J11cIilcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IGZvcm0gPSByZXNvbHZlVGFyZ2V0KCcjJyArIGdldFJhd0F0dHJpYnV0ZShlbHQsICdmb3JtJyksIGVsdC5nZXRSb290Tm9kZSgpKSB8fCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKVxuICAgIGlmICghZm9ybSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZm9ybSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXRCdXR0b25UcmFja2luZyhlbHQpIHtcbiAgICAvLyBuZWVkIHRvIGhhbmRsZSBib3RoIGNsaWNrIGFuZCBmb2N1cyBpbjpcbiAgICAvLyAgIGZvY3VzaW4gLSBpbiBjYXNlIHNvbWVvbmUgdGFicyBpbiB0byBhIGJ1dHRvbiBhbmQgaGl0cyB0aGUgc3BhY2UgYmFyXG4gICAgLy8gICBjbGljayAtIG9uIE9TWCBidXR0b25zIGRvIG5vdCBmb2N1cyBvbiBjbGljayBzZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzI0XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcbiAgICovXG4gIGZ1bmN0aW9uIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIGNvZGUpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG5vZGVEYXRhLm9uSGFuZGxlcnMpKSB7XG4gICAgICBub2RlRGF0YS5vbkhhbmRsZXJzID0gW11cbiAgICB9XG4gICAgbGV0IGZ1bmNcbiAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgIGNvbnN0IGxpc3RlbmVyID0gZnVuY3Rpb24oZSkge1xuICAgICAgbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWZ1bmMpIHtcbiAgICAgICAgICBmdW5jID0gbmV3IEZ1bmN0aW9uKCdldmVudCcsIGNvZGUpXG4gICAgICAgIH1cbiAgICAgICAgZnVuYy5jYWxsKGVsdCwgZSlcbiAgICAgIH0pXG4gICAgfVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXIpXG4gICAgbm9kZURhdGEub25IYW5kbGVycy5wdXNoKHsgZXZlbnQ6IGV2ZW50TmFtZSwgbGlzdGVuZXIgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0h4T25XaWxkY2FyZChlbHQpIHtcbiAgICAvLyB3aXBlIGFueSBwcmV2aW91cyBvbiBoYW5kbGVycyBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgcHJlY2VkZW5jZVxuICAgIGRlSW5pdE9uSGFuZGxlcnMoZWx0KVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbmFtZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLm5hbWVcbiAgICAgIGNvbnN0IHZhbHVlID0gZWx0LmF0dHJpYnV0ZXNbaV0udmFsdWVcbiAgICAgIGlmIChzdGFydHNXaXRoKG5hbWUsICdoeC1vbicpIHx8IHN0YXJ0c1dpdGgobmFtZSwgJ2RhdGEtaHgtb24nKSkge1xuICAgICAgICBjb25zdCBhZnRlck9uUG9zaXRpb24gPSBuYW1lLmluZGV4T2YoJy1vbicpICsgM1xuICAgICAgICBjb25zdCBuZXh0Q2hhciA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uLCBhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICBpZiAobmV4dENoYXIgPT09ICctJyB8fCBuZXh0Q2hhciA9PT0gJzonKSB7XG4gICAgICAgICAgbGV0IGV2ZW50TmFtZSA9IG5hbWUuc2xpY2UoYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgICAvLyBpZiB0aGUgZXZlbnROYW1lIHN0YXJ0cyB3aXRoIGEgY29sb24gb3IgZGFzaCwgcHJlcGVuZCBcImh0bXhcIiBmb3Igc2hvcnRoYW5kIHN1cHBvcnRcbiAgICAgICAgICBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICc6JykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14JyArIGV2ZW50TmFtZVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICctJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoMSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnaHRteC0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSg1KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGFkZEh4T25FdmVudEhhbmRsZXIoZWx0LCBldmVudE5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGluaXROb2RlKGVsdCkge1xuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAobm9kZURhdGEuaW5pdEhhc2ggIT09IGF0dHJpYnV0ZUhhc2goZWx0KSkge1xuICAgICAgLy8gY2xlYW4gdXAgYW55IHByZXZpb3VzbHkgcHJvY2Vzc2VkIGluZm9cbiAgICAgIGRlSW5pdE5vZGUoZWx0KVxuXG4gICAgICBub2RlRGF0YS5pbml0SGFzaCA9IGF0dHJpYnV0ZUhhc2goZWx0KVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScpXG5cbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgaWYgKGVsdC52YWx1ZSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG5vZGVEYXRhLmxhc3RWYWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBnZXRUcmlnZ2VyU3BlY3MoZWx0KVxuICAgICAgY29uc3QgaGFzRXhwbGljaXRIdHRwQWN0aW9uID0gcHJvY2Vzc1ZlcmJzKGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcblxuICAgICAgaWYgKCFoYXNFeHBsaWNpdEh0dHBBY3Rpb24pIHtcbiAgICAgICAgaWYgKGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1ib29zdCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBib29zdEVsZW1lbnQoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuICAgICAgICB9IGVsc2UgaWYgKGhhc0F0dHJpYnV0ZShlbHQsICdoeC10cmlnZ2VyJykpIHtcbiAgICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgICAgLy8gRm9yIFwibmFrZWRcIiB0cmlnZ2VycywgZG9uJ3QgZG8gYW55dGhpbmcgYXQgYWxsXG4gICAgICAgICAgICBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgICAgLy8gc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9idXR0b25cbiAgICAgIGlmIChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nIHx8IChnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JyAmJiBoYXNBdHRyaWJ1dGUoZWx0LCAnZm9ybScpKSkge1xuICAgICAgICBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclByb2Nlc3NOb2RlJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIG5ldyBjb250ZW50LCBlbmFibGluZyBodG14IGJlaGF2aW9yLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgY29udGVudCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBET00gb3V0c2lkZSBvZiB0aGUgbm9ybWFsIGh0bXggcmVxdWVzdCBjeWNsZSBidXQgc3RpbGwgd2FudCBodG14IGF0dHJpYnV0ZXMgdG8gd29yay5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcHJvY2Vzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgZWxlbWVudCB0byBwcm9jZXNzXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzTm9kZShlbHQpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpbml0Tm9kZShlbHQpXG4gICAgZm9yRWFjaChmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSwgZnVuY3Rpb24oY2hpbGQpIHsgaW5pdE5vZGUoY2hpbGQpIH0pXG4gICAgZm9yRWFjaChmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSwgcHJvY2Vzc0h4T25XaWxkY2FyZClcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV2ZW50L0xvZyBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cikge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnl9IGRldGFpbFxuICAgKiBAcmV0dXJucyB7Q3VzdG9tRXZlbnR9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgLy8gVGhpcyBicmVha3MgZXhwZWN0ZWQgZW5jYXBzdWxhdGlvbiBidXQgbmVlZHMgdG8gYmUgaGVyZSB1bnRpbCBkZWNpZGVkIG90aGVyd2lzZSBieSBjb3JlIGRldnNcbiAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBldnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsXG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXJyb3JFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZXZlbnROYW1lIH0sIGRldGFpbCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpIHtcbiAgICByZXR1cm4gZXZlbnROYW1lID09PSAnaHRteDphZnRlclByb2Nlc3NOb2RlJ1xuICB9XG5cbiAgLyoqXG4gICAqIGB3aXRoRXh0ZW5zaW9uc2AgbG9jYXRlcyBhbGwgYWN0aXZlIGV4dGVuc2lvbnMgZm9yIGEgcHJvdmlkZWQgZWxlbWVudCwgdGhlblxuICAgKiBleGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdXNpbmcgZWFjaCBvZiB0aGUgYWN0aXZlIGV4dGVuc2lvbnMuICBJdCBzaG91bGRcbiAgICogYmUgY2FsbGVkIGludGVybmFsbHkgYXQgZXZlcnkgZXh0ZW5kYWJsZSBleGVjdXRpb24gcG9pbnQgaW4gaHRteC5cbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHsoZXh0ZW5zaW9uOkh0bXhFeHRlbnNpb24pID0+IHZvaWR9IHRvRG9cbiAgICogQHJldHVybnMgdm9pZFxuICAgKi9cbiAgZnVuY3Rpb24gd2l0aEV4dGVuc2lvbnMoZWx0LCB0b0RvKSB7XG4gICAgZm9yRWFjaChnZXRFeHRlbnNpb25zKGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdG9EbyhleHRlbnNpb24pXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ0Vycm9yKG1zZykge1xuICAgIGlmIChjb25zb2xlLmVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1zZylcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUubG9nKSB7XG4gICAgICBjb25zb2xlLmxvZygnRVJST1I6ICcsIG1zZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgYSBnaXZlbiBldmVudCBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RyaWdnZXJcbiAgICpcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIHRoZSBuYW1lIG9mIHRoZSBldmVudCB0byB0cmlnZ2VyXG4gICAqIEBwYXJhbSB7YW55PX0gZGV0YWlsIGRldGFpbHMgZm9yIHRoZSBldmVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRldGFpbCA9PSBudWxsKSB7XG4gICAgICBkZXRhaWwgPSB7fVxuICAgIH1cbiAgICBkZXRhaWwuZWx0ID0gZWx0XG4gICAgY29uc3QgZXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgaWYgKGh0bXgubG9nZ2VyICYmICFpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSkge1xuICAgICAgaHRteC5sb2dnZXIoZWx0LCBldmVudE5hbWUsIGRldGFpbClcbiAgICB9XG4gICAgaWYgKGRldGFpbC5lcnJvcikge1xuICAgICAgbG9nRXJyb3IoZGV0YWlsLmVycm9yKVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6ZXJyb3InLCB7IGVycm9ySW5mbzogZGV0YWlsIH0pXG4gICAgfVxuICAgIGxldCBldmVudFJlc3VsdCA9IGVsdC5kaXNwYXRjaEV2ZW50KGV2ZW50KVxuICAgIGNvbnN0IGtlYmFiTmFtZSA9IGtlYmFiRXZlbnROYW1lKGV2ZW50TmFtZSlcbiAgICBpZiAoZXZlbnRSZXN1bHQgJiYga2ViYWJOYW1lICE9PSBldmVudE5hbWUpIHtcbiAgICAgIGNvbnN0IGtlYmFiZWRFdmVudCA9IG1ha2VFdmVudChrZWJhYk5hbWUsIGV2ZW50LmRldGFpbClcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgZWx0LmRpc3BhdGNoRXZlbnQoa2ViYWJlZEV2ZW50KVxuICAgIH1cbiAgICB3aXRoRXh0ZW5zaW9ucyhhc0VsZW1lbnQoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIChleHRlbnNpb24ub25FdmVudChldmVudE5hbWUsIGV2ZW50KSAhPT0gZmFsc2UgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgfSlcbiAgICByZXR1cm4gZXZlbnRSZXN1bHRcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEhpc3RvcnkgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBsZXQgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAvKipcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRIaXN0b3J5RWxlbWVudCgpIHtcbiAgICBjb25zdCBoaXN0b3J5RWx0ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpXG4gICAgcmV0dXJuIGhpc3RvcnlFbHQgfHwgZ2V0RG9jdW1lbnQoKS5ib2R5XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHJvb3RFbHRcbiAgICovXG4gIGZ1bmN0aW9uIHNhdmVUb0hpc3RvcnlDYWNoZSh1cmwsIHJvb3RFbHQpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBnZXQgc3RhdGUgdG8gc2F2ZVxuICAgIGNvbnN0IGlubmVySFRNTCA9IGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShyb290RWx0KVxuICAgIGNvbnN0IHRpdGxlID0gZ2V0RG9jdW1lbnQoKS50aXRsZVxuICAgIGNvbnN0IHNjcm9sbCA9IHdpbmRvdy5zY3JvbGxZXG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSA8PSAwKSB7XG4gICAgICAvLyBtYWtlIHN1cmUgdGhhdCBhbiBldmVudHVhbGx5IGFscmVhZHkgZXhpc3RpbmcgY2FjaGUgaXMgcHVyZ2VkXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICBoaXN0b3J5Q2FjaGUuc3BsaWNlKGksIDEpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIEh0bXhIaXN0b3J5SXRlbSAqL1xuICAgIGNvbnN0IG5ld0hpc3RvcnlJdGVtID0geyB1cmwsIGNvbnRlbnQ6IGlubmVySFRNTCwgdGl0bGUsIHNjcm9sbCB9XG5cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5SXRlbUNyZWF0ZWQnLCB7IGl0ZW06IG5ld0hpc3RvcnlJdGVtLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG5cbiAgICBoaXN0b3J5Q2FjaGUucHVzaChuZXdIaXN0b3J5SXRlbSlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUpIHtcbiAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpXG4gICAgfVxuXG4gICAgLy8ga2VlcCB0cnlpbmcgdG8gc2F2ZSB0aGUgY2FjaGUgdW50aWwgaXQgc3VjY2VlZHMgb3IgaXMgZW1wdHlcbiAgICB3aGlsZSAoaGlzdG9yeUNhY2hlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnLCBKU09OLnN0cmluZ2lmeShoaXN0b3J5Q2FjaGUpKVxuICAgICAgICBicmVha1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZUVycm9yJywgeyBjYXVzZTogZSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuICAgICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKSAvLyBzaHJpbmsgdGhlIGNhY2hlIGFuZCByZXRyeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeUl0ZW1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHVybFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudFxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdGl0bGVcbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IHNjcm9sbFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICAgKiBAcmV0dXJucyB7SHRteEhpc3RvcnlJdGVtfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDYWNoZWRIaXN0b3J5KHVybCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIHJldHVybiBoaXN0b3J5Q2FjaGVbaV1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KGVsdCkge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGh0bXguY29uZmlnLnJlcXVlc3RDbGFzc1xuICAgIGNvbnN0IGNsb25lID0gLyoqIEB0eXBlIEVsZW1lbnQgKi8gKGVsdC5jbG9uZU5vZGUodHJ1ZSkpXG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnLicgKyBjbGFzc05hbWUpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhc3NOYW1lKVxuICAgIH0pXG4gICAgLy8gcmVtb3ZlIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgZm9yIGFueSBlbGVtZW50IGRpc2FibGVkIGR1ZSB0byBhbiBodG14IHJlcXVlc3RcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICdbZGF0YS1kaXNhYmxlZC1ieS1odG14XScpLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgfSlcbiAgICByZXR1cm4gY2xvbmUuaW5uZXJIVE1MXG4gIH1cblxuICBmdW5jdGlvbiBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKSB7XG4gICAgY29uc3QgZWx0ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgIGNvbnN0IHBhdGggPSBjdXJyZW50UGF0aEZvckhpc3RvcnkgfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcblxuICAgIC8vIEFsbG93IGhpc3Rvcnkgc25hcHNob3QgZmVhdHVyZSB0byBiZSBkaXNhYmxlZCB3aGVyZSBoeC1oaXN0b3J5PVwiZmFsc2VcIlxuICAgIC8vIGlzIHByZXNlbnQgKmFueXdoZXJlKiBpbiB0aGUgY3VycmVudCBkb2N1bWVudCB3ZSdyZSBhYm91dCB0byBzYXZlLFxuICAgIC8vIHNvIHdlIGNhbiBwcmV2ZW50IHByaXZpbGVnZWQgZGF0YSBlbnRlcmluZyB0aGUgY2FjaGUuXG4gICAgLy8gVGhlIHBhZ2Ugd2lsbCBzdGlsbCBiZSByZWFjaGFibGUgYXMgYSBoaXN0b3J5IGVudHJ5LCBidXQgaHRteCB3aWxsIGZldGNoIGl0XG4gICAgLy8gbGl2ZSBmcm9tIHRoZSBzZXJ2ZXIgb25wb3BzdGF0ZSByYXRoZXIgdGhhbiBsb29rIGluIHRoZSBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgICBsZXQgZGlzYWJsZUhpc3RvcnlDYWNoZVxuICAgIHRyeSB7XG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCIgaV0nKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJRTExOiBpbnNlbnNpdGl2ZSBtb2RpZmllciBub3Qgc3VwcG9ydGVkIHNvIGZhbGxiYWNrIHRvIGNhc2Ugc2Vuc2l0aXZlIHNlbGVjdG9yXG4gICAgICBkaXNhYmxlSGlzdG9yeUNhY2hlID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeT1cImZhbHNlXCJdLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiXScpXG4gICAgfVxuICAgIGlmICghZGlzYWJsZUhpc3RvcnlDYWNoZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVNhdmUnLCB7IHBhdGgsIGhpc3RvcnlFbHQ6IGVsdCB9KVxuICAgICAgc2F2ZVRvSGlzdG9yeUNhY2hlKHBhdGgsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCBnZXREb2N1bWVudCgpLnRpdGxlLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcHVzaFVybEludG9IaXN0b3J5KHBhdGgpIHtcbiAgLy8gcmVtb3ZlIHRoZSBjYWNoZSBidXN0ZXIgcGFyYW1ldGVyLCBpZiBhbnlcbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSkge1xuICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvb3JnXFwuaHRteFxcLmNhY2hlLWJ1c3Rlcj1bXiZdKiY/LywgJycpXG4gICAgICBpZiAoZW5kc1dpdGgocGF0aCwgJyYnKSB8fCBlbmRzV2l0aChwYXRoLCAnPycpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIC0xKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIHtcbiAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICB9XG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlVXJsSW5IaXN0b3J5KHBhdGgpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaGlzdG9yeUVuYWJsZWQpIGhpc3RvcnkucmVwbGFjZVN0YXRlKHsgaHRteDogdHJ1ZSB9LCAnJywgcGF0aClcbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICAgKi9cbiAgZnVuY3Rpb24gc2V0dGxlSW1tZWRpYXRlbHkodGFza3MpIHtcbiAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7XG4gICAgICB0YXNrLmNhbGwodW5kZWZpbmVkKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgY29uc3QgZGV0YWlscyA9IHsgcGF0aCwgeGhyOiByZXF1ZXN0IH1cbiAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzJywgZGV0YWlscylcbiAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHBhdGgsIHRydWUpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1DdXJyZW50LVVSTCcsIGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZilcbiAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZCcsIGRldGFpbHMpXG4gICAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KHRoaXMucmVzcG9uc2UpXG4gICAgICAgIC8qKiBAdHlwZSBQYXJlbnROb2RlICovXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCdbaHgtaGlzdG9yeS1lbHRdLFtkYXRhLWh4LWhpc3RvcnktZWx0XScpIHx8IGZyYWdtZW50XG4gICAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuXG4gICAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGNvbnRlbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGNhY2hlTWlzczogdHJ1ZSwgc2VydmVyUmVzcG9uc2U6IHRoaXMucmVzcG9uc2UgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWRFcnJvcicsIGRldGFpbHMpXG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Quc2VuZCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXRoXVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzdG9yZUhpc3RvcnkocGF0aCkge1xuICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgcGF0aCA9IHBhdGggfHwgbG9jYXRpb24ucGF0aG5hbWUgKyBsb2NhdGlvbi5zZWFyY2hcbiAgICBjb25zdCBjYWNoZWQgPSBnZXRDYWNoZWRIaXN0b3J5KHBhdGgpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQoY2FjaGVkLmNvbnRlbnQpXG4gICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgIGhhbmRsZVRpdGxlKGZyYWdtZW50LnRpdGxlKVxuICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIGNhY2hlZC5zY3JvbGwpXG4gICAgICB9LCAwKSAvLyBuZXh0ICd0aWNrJywgc28gYnJvd3NlciBoYXMgdGltZSB0byByZW5kZXIgbGF5b3V0XG4gICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgaXRlbTogY2FjaGVkIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5yZWZyZXNoT25IaXN0b3J5TWlzcykge1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBvcHRpb25hbCBwYXJhbWV0ZXIgaW4gcmVsb2FkKCkgZnVuY3Rpb24gdGhyb3dzIGVycm9yXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU1VucmVzb2x2ZWRSZWZlcmVuY2VcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCh0cnVlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpIHtcbiAgICBsZXQgaW5kaWNhdG9ycyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluZGljYXRvcicpKVxuICAgIGlmIChpbmRpY2F0b3JzID09IG51bGwpIHtcbiAgICAgIGluZGljYXRvcnMgPSBbZWx0XVxuICAgIH1cbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBpYy5jbGFzc0xpc3QuYWRkLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgfSlcbiAgICByZXR1cm4gaW5kaWNhdG9yc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBkaXNhYmxlRWxlbWVudHMoZWx0KSB7XG4gICAgbGV0IGRpc2FibGVkRWx0cyA9IC8qKiBAdHlwZSBFbGVtZW50W10gKi8gKGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWRpc2FibGVkLWVsdCcpKVxuICAgIGlmIChkaXNhYmxlZEVsdHMgPT0gbnVsbCkge1xuICAgICAgZGlzYWJsZWRFbHRzID0gW11cbiAgICB9XG4gICAgZm9yRWFjaChkaXNhYmxlZEVsdHMsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJycpXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnLCAnJylcbiAgICB9KVxuICAgIHJldHVybiBkaXNhYmxlZEVsdHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gaW5kaWNhdG9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gZGlzYWJsZWRcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVkKSB7XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgaWMuY2xhc3NMaXN0LnJlbW92ZS5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChkaXNhYmxlZCwgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApIC0gMVxuICAgICAgaWYgKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPT09IDApIHtcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWRpc2FibGVkLWJ5LWh0bXgnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbnB1dCBWYWx1ZSBQcm9jZXNzaW5nXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2Nlc3NlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgbm9kZSA9IHByb2Nlc3NlZFtpXVxuICAgICAgaWYgKG5vZGUuaXNTYW1lTm9kZShlbHQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkSW5jbHVkZShlbGVtZW50KSB7XG4gICAgLy8gQ2FzdCB0byB0cmljayB0c2MsIHVuZGVmaW5lZCB2YWx1ZXMgd2lsbCB3b3JrIGZpbmUgaGVyZVxuICAgIGNvbnN0IGVsdCA9IC8qKiBAdHlwZSB7SFRNTElucHV0RWxlbWVudH0gKi8gKGVsZW1lbnQpXG4gICAgaWYgKGVsdC5uYW1lID09PSAnJyB8fCBlbHQubmFtZSA9PSBudWxsIHx8IGVsdC5kaXNhYmxlZCB8fCBjbG9zZXN0KGVsdCwgJ2ZpZWxkc2V0W2Rpc2FibGVkXScpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgLy8gaWdub3JlIFwic3VibWl0dGVyXCIgdHlwZXMgKHNlZSBqUXVlcnkgc3JjL3NlcmlhbGl6ZS5qcylcbiAgICBpZiAoZWx0LnR5cGUgPT09ICdidXR0b24nIHx8IGVsdC50eXBlID09PSAnc3VibWl0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ltYWdlJyB8fCBlbHQudGFnTmFtZSA9PT0gJ3Jlc2V0JyB8fCBlbHQudGFnTmFtZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGVsdC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsdC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZXR1cm4gZWx0LmNoZWNrZWRcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheXxGb3JtRGF0YUVudHJ5VmFsdWV9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpIHtcbiAgICBpZiAobmFtZSAhPSBudWxsICYmIHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGxldCB2YWx1ZXMgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdmFsdWUuaW5kZXhPZih2KSA8IDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKHYgPT4gdiAhPT0gdmFsdWUpXG4gICAgICB9XG4gICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgIGZvckVhY2godmFsdWVzLCB2ID0+IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudHxIVE1MU2VsZWN0RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbGlkYXRlXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpIHtcbiAgICBpZiAoZWx0ID09IG51bGwgfHwgaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NlZC5wdXNoKGVsdClcbiAgICB9XG4gICAgaWYgKHNob3VsZEluY2x1ZGUoZWx0KSkge1xuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJylcbiAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgbGV0IHZhbHVlID0gZWx0LnZhbHVlXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQgJiYgZWx0Lm11bHRpcGxlKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uOmNoZWNrZWQnKSkubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuICgvKiogQHR5cGUgSFRNTE9wdGlvbkVsZW1lbnQgKi8oZSkpLnZhbHVlIH0pXG4gICAgICB9XG4gICAgICAvLyBpbmNsdWRlIGZpbGUgaW5wdXRzXG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBlbHQuZmlsZXMpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5maWxlcylcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGVsdC5lbGVtZW50cywgZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZC5pbmRleE9mKGlucHV0KSA+PSAwKSB7XG4gICAgICAgICAgLy8gVGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkIGFuZCBhZGRlZCB0byB0aGUgdmFsdWVzLCBidXQgdGhlIEZvcm1EYXRhIHRoYXQgd2lsbCBiZVxuICAgICAgICAgIC8vICBjb25zdHJ1Y3RlZCByaWdodCBhZnRlciBvbiB0aGUgZm9ybSwgd2lsbCBpbmNsdWRlIGl0IG9uY2UgYWdhaW4uIFNvIHJlbW92ZSB0aGF0IGlucHV0J3MgdmFsdWVcbiAgICAgICAgICAvLyAgbm93IHRvIGF2b2lkIGR1cGxpY2F0ZXNcbiAgICAgICAgICByZW1vdmVWYWx1ZUZyb21Gb3JtRGF0YShpbnB1dC5uYW1lLCBpbnB1dC52YWx1ZSwgZm9ybURhdGEpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvY2Vzc2VkLnB1c2goaW5wdXQpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgICAgdmFsaWRhdGVFbGVtZW50KGlucHV0LCBlcnJvcnMpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBuZXcgRm9ybURhdGEoZWx0KS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUgJiYgdmFsdWUubmFtZSA9PT0gJycpIHtcbiAgICAgICAgICByZXR1cm4gLy8gaWdub3JlIG5vLW5hbWUgZmlsZXNcbiAgICAgICAgfVxuICAgICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICovXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycykge1xuICAgIGNvbnN0IGVsZW1lbnQgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50ICYgRWxlbWVudEludGVybmFsc30gKi8gKGVsdClcbiAgICBpZiAoZWxlbWVudC53aWxsVmFsaWRhdGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOnZhbGlkYXRlJylcbiAgICAgIGlmICghZWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBlbHQ6IGVsZW1lbnQsIG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDp2YWxpZGF0aW9uOmZhaWxlZCcsIHsgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBvbmUgRm9ybURhdGEgd2l0aCB0aG9zZSBmcm9tIGFub3RoZXIuXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IHJlY2VpdmVyIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBkb25vciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIHByb3ZpZGUgdGhlIG92ZXJyaWRpbmcgdmFsdWVzXG4gICAqIEByZXR1cm5zIHtGb3JtRGF0YX0gdGhlIHtAbGlua2NvZGUgcmVjZWl2ZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBvdmVycmlkZUZvcm1EYXRhKHJlY2VpdmVyLCBkb25vcikge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGRvbm9yLmtleXMoKSkge1xuICAgICAgcmVjZWl2ZXIuZGVsZXRlKGtleSlcbiAgICB9XG4gICAgZG9ub3IuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZWNlaXZlci5hcHBlbmQoa2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZWNlaXZlclxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEByZXR1cm5zIHt7ZXJyb3JzOiBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdLCBmb3JtRGF0YTogRm9ybURhdGEsIHZhbHVlczogT2JqZWN0fX1cbiAqL1xuICBmdW5jdGlvbiBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpIHtcbiAgICAvKiogQHR5cGUgRWxlbWVudFtdICovXG4gICAgY29uc3QgcHJvY2Vzc2VkID0gW11cbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgY29uc3QgcHJpb3JpdHlGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgLyoqIEB0eXBlIEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10gKi9cbiAgICBjb25zdCBlcnJvcnMgPSBbXVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCAmJiAhYm9keUNvbnRhaW5zKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG5cbiAgICAvLyBvbmx5IHZhbGlkYXRlIHdoZW4gZm9ybSBpcyBkaXJlY3RseSBzdWJtaXR0ZWQgYW5kIG5vdmFsaWRhdGUgb3IgZm9ybW5vdmFsaWRhdGUgYXJlIG5vdCBzZXRcbiAgICAvLyBvciBpZiB0aGUgZWxlbWVudCBoYXMgYW4gZXhwbGljaXQgaHgtdmFsaWRhdGU9XCJ0cnVlXCIgb24gaXRcbiAgICBsZXQgdmFsaWRhdGUgPSAoZWx0IGluc3RhbmNlb2YgSFRNTEZvcm1FbGVtZW50ICYmIGVsdC5ub1ZhbGlkYXRlICE9PSB0cnVlKSB8fCBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC12YWxpZGF0ZScpID09PSAndHJ1ZSdcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSB7XG4gICAgICB2YWxpZGF0ZSA9IHZhbGlkYXRlICYmIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZC5mb3JtTm9WYWxpZGF0ZSAhPT0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIGZvciBhIG5vbi1HRVQgaW5jbHVkZSB0aGUgY2xvc2VzdCBmb3JtXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIHByaW9yaXR5Rm9ybURhdGEsIGVycm9ycywgY2xvc2VzdChlbHQsICdmb3JtJyksIHZhbGlkYXRlKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKVxuXG4gICAgLy8gaWYgYSBidXR0b24gb3Igc3VibWl0IHdhcyBjbGlja2VkIGxhc3QsIGluY2x1ZGUgaXRzIHZhbHVlXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCBlbHQudGFnTmFtZSA9PT0gJ0JVVFRPTicgfHxcbiAgICAoZWx0LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcpKSB7XG4gICAgICBjb25zdCBidXR0b24gPSBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgKC8qKiBAdHlwZSBIVE1MSW5wdXRFbGVtZW50fEhUTUxCdXR0b25FbGVtZW50ICovKGVsdCkpXG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGJ1dHRvbiwgJ25hbWUnKVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIGJ1dHRvbi52YWx1ZSwgcHJpb3JpdHlGb3JtRGF0YSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIGFueSBleHBsaWNpdCBpbmNsdWRlc1xuICAgIGNvbnN0IGluY2x1ZGVzID0gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5jbHVkZScpXG4gICAgZm9yRWFjaChpbmNsdWRlcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBhc0VsZW1lbnQobm9kZSksIHZhbGlkYXRlKVxuICAgICAgLy8gaWYgYSBub24tZm9ybSBpcyBpbmNsdWRlZCwgaW5jbHVkZSBhbnkgaW5wdXQgdmFsdWVzIHdpdGhpbiBpdFxuICAgICAgaWYgKCFtYXRjaGVzKG5vZGUsICdmb3JtJykpIHtcbiAgICAgICAgZm9yRWFjaChhc1BhcmVudE5vZGUobm9kZSkucXVlcnlTZWxlY3RvckFsbChJTlBVVF9TRUxFQ1RPUiksIGZ1bmN0aW9uKGRlc2NlbmRhbnQpIHtcbiAgICAgICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGRlc2NlbmRhbnQsIHZhbGlkYXRlKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyB2YWx1ZXMgZnJvbSBhIDxmb3JtPiB0YWtlIHByZWNlZGVuY2UsIG92ZXJyaWRpbmcgdGhlIHJlZ3VsYXIgdmFsdWVzXG4gICAgb3ZlcnJpZGVGb3JtRGF0YShmb3JtRGF0YSwgcHJpb3JpdHlGb3JtRGF0YSlcblxuICAgIHJldHVybiB7IGVycm9ycywgZm9ybURhdGEsIHZhbHVlczogZm9ybURhdGFQcm94eShmb3JtRGF0YSkgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXR1cm5TdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHthbnl9IHJlYWxWYWx1ZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBuYW1lLCByZWFsVmFsdWUpIHtcbiAgICBpZiAocmV0dXJuU3RyICE9PSAnJykge1xuICAgICAgcmV0dXJuU3RyICs9ICcmJ1xuICAgIH1cbiAgICBpZiAoU3RyaW5nKHJlYWxWYWx1ZSkgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgICByZWFsVmFsdWUgPSBKU09OLnN0cmluZ2lmeShyZWFsVmFsdWUpXG4gICAgfVxuICAgIGNvbnN0IHMgPSBlbmNvZGVVUklDb21wb25lbnQocmVhbFZhbHVlKVxuICAgIHJldHVyblN0ciArPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSkgKyAnPScgKyBzXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF8T2JqZWN0fSB2YWx1ZXNcbiAgICogQHJldHVybnMgc3RyaW5nXG4gICAqL1xuICBmdW5jdGlvbiB1cmxFbmNvZGUodmFsdWVzKSB7XG4gICAgdmFsdWVzID0gZm9ybURhdGFGcm9tT2JqZWN0KHZhbHVlcylcbiAgICBsZXQgcmV0dXJuU3RyID0gJydcbiAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG4gICAgICByZXR1cm5TdHIgPSBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBamF4XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9tcHRcbiAqIEByZXR1cm5zIHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHQpIHtcbiAgICAvKiogQHR5cGUgSHRteEhlYWRlclNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgJ0hYLVJlcXVlc3QnOiAndHJ1ZScsXG4gICAgICAnSFgtVHJpZ2dlcic6IGdldFJhd0F0dHJpYnV0ZShlbHQsICdpZCcpLFxuICAgICAgJ0hYLVRyaWdnZXItTmFtZSc6IGdldFJhd0F0dHJpYnV0ZShlbHQsICduYW1lJyksXG4gICAgICAnSFgtVGFyZ2V0JzogZ2V0QXR0cmlidXRlVmFsdWUodGFyZ2V0LCAnaWQnKSxcbiAgICAgICdIWC1DdXJyZW50LVVSTCc6IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cbiAgICBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LWhlYWRlcnMnLCBmYWxzZSwgaGVhZGVycylcbiAgICBpZiAocHJvbXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLVByb21wdCddID0gcHJvbXB0XG4gICAgfVxuICAgIGlmIChnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Cb29zdGVkJ10gPSAndHJ1ZSdcbiAgICB9XG4gICAgcmV0dXJuIGhlYWRlcnNcbiAgfVxuXG4gIC8qKlxuICogZmlsdGVyVmFsdWVzIHRha2VzIGFuIG9iamVjdCBjb250YWluaW5nIGZvcm0gaW5wdXQgdmFsdWVzXG4gKiBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3QgdGhhdCBvbmx5IGNvbnRhaW5zIGtleXMgdGhhdCBhcmVcbiAqIHNwZWNpZmllZCBieSB0aGUgY2xvc2VzdCBcImh4LXBhcmFtc1wiIGF0dHJpYnV0ZVxuICogQHBhcmFtIHtGb3JtRGF0YX0gaW5wdXRWYWx1ZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZmlsdGVyVmFsdWVzKGlucHV0VmFsdWVzLCBlbHQpIHtcbiAgICBjb25zdCBwYXJhbXNWYWx1ZSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wYXJhbXMnKVxuICAgIGlmIChwYXJhbXNWYWx1ZSkge1xuICAgICAgaWYgKHBhcmFtc1ZhbHVlID09PSAnbm9uZScpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlID09PSAnKicpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2UgaWYgKHBhcmFtc1ZhbHVlLmluZGV4T2YoJ25vdCAnKSA9PT0gMCkge1xuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnN1YnN0cig0KS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaW5wdXRWYWx1ZXMuZGVsZXRlKG5hbWUpXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gbmV3IEZvcm1EYXRhKClcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zcGxpdCgnLCcpLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpXG4gICAgICAgICAgaWYgKGlucHV0VmFsdWVzLmhhcyhuYW1lKSkge1xuICAgICAgICAgICAgaW5wdXRWYWx1ZXMuZ2V0QWxsKG5hbWUpLmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsgbmV3VmFsdWVzLmFwcGVuZChuYW1lLCB2YWx1ZSkgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBuZXdWYWx1ZXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0FuY2hvckxpbmsoZWx0KSB7XG4gICAgcmV0dXJuICEhZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSA+PSAwXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IFtzd2FwSW5mb092ZXJyaWRlXVxuICogQHJldHVybnMge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn1cbiAqL1xuICBmdW5jdGlvbiBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBJbmZvT3ZlcnJpZGUpIHtcbiAgICBjb25zdCBzd2FwSW5mbyA9IHN3YXBJbmZvT3ZlcnJpZGUgfHwgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN3YXAnKVxuICAgIC8qKiBAdHlwZSBIdG14U3dhcFNwZWNpZmljYXRpb24gKi9cbiAgICBjb25zdCBzd2FwU3BlYyA9IHtcbiAgICAgIHN3YXBTdHlsZTogZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCA/ICdpbm5lckhUTUwnIDogaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSxcbiAgICAgIHN3YXBEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFN3YXBEZWxheSxcbiAgICAgIHNldHRsZURlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U2V0dGxlRGVsYXlcbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLnNjcm9sbEludG9WaWV3T25Cb29zdCAmJiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmICFpc0FuY2hvckxpbmsoZWx0KSkge1xuICAgICAgc3dhcFNwZWMuc2hvdyA9ICd0b3AnXG4gICAgfVxuICAgIGlmIChzd2FwSW5mbykge1xuICAgICAgY29uc3Qgc3BsaXQgPSBzcGxpdE9uV2hpdGVzcGFjZShzd2FwSW5mbylcbiAgICAgIGlmIChzcGxpdC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwbGl0W2ldXG4gICAgICAgICAgaWYgKHZhbHVlLmluZGV4T2YoJ3N3YXA6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDUpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2V0dGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zZXR0bGVEZWxheSA9IHBhcnNlSW50ZXJ2YWwodmFsdWUuc3Vic3RyKDcpKVxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZigndHJhbnNpdGlvbjonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMudHJhbnNpdGlvbiA9IHZhbHVlLnN1YnN0cigxMSkgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignaWdub3JlVGl0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gdmFsdWUuc3Vic3RyKDEyKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNwZWMgPSB2YWx1ZS5zdWJzdHIoNylcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzY3JvbGxTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsID0gc2Nyb2xsVmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGxUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2hvdzonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2hvd1NwZWMgPSB2YWx1ZS5zdWJzdHIoNSlcbiAgICAgICAgICAgIHZhciBzcGxpdFNwZWMgPSBzaG93U3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzaG93VmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93ID0gc2hvd1ZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvd1RhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdmb2N1cy1zY3JvbGw6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGZvY3VzU2Nyb2xsVmFsID0gdmFsdWUuc3Vic3RyKCdmb2N1cy1zY3JvbGw6Jy5sZW5ndGgpXG4gICAgICAgICAgICBzd2FwU3BlYy5mb2N1c1Njcm9sbCA9IGZvY3VzU2Nyb2xsVmFsID09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwU3R5bGUgPSB2YWx1ZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dFcnJvcignVW5rbm93biBtb2RpZmllciBpbiBoeC1zd2FwOiAnICsgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3BlY1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB1c2VzRm9ybURhdGEoZWx0KSB7XG4gICAgcmV0dXJuIGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1lbmNvZGluZycpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScgfHxcbiAgICAobWF0Y2hlcyhlbHQsICdmb3JtJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2VuY3R5cGUnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmaWx0ZXJlZFBhcmFtZXRlcnNcbiAgICogQHJldHVybnMgeyp8c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZFBhcmFtZXRlcnMpIHtcbiAgICBsZXQgZW5jb2RlZFBhcmFtZXRlcnMgPSBudWxsXG4gICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyA9PSBudWxsKSB7XG4gICAgICAgIGVuY29kZWRQYXJhbWV0ZXJzID0gZXh0ZW5zaW9uLmVuY29kZVBhcmFtZXRlcnMoeGhyLCBmaWx0ZXJlZFBhcmFtZXRlcnMsIGVsdClcbiAgICAgIH1cbiAgICB9KVxuICAgIGlmIChlbmNvZGVkUGFyYW1ldGVycyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW5jb2RlZFBhcmFtZXRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICAgIC8vIEZvcmNlIGNvbnZlcnNpb24gdG8gYW4gYWN0dWFsIEZvcm1EYXRhIG9iamVjdCBpbiBjYXNlIGZpbHRlcmVkUGFyYW1ldGVycyBpcyBhIGZvcm1EYXRhUHJveHlcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2lzc3Vlcy8yMzE3XG4gICAgICAgIHJldHVybiBvdmVycmlkZUZvcm1EYXRhKG5ldyBGb3JtRGF0YSgpLCBmb3JtRGF0YUZyb21PYmplY3QoZmlsdGVyZWRQYXJhbWV0ZXJzKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxFbmNvZGUoZmlsdGVyZWRQYXJhbWV0ZXJzKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcmV0dXJucyB7SHRteFNldHRsZUluZm99XG4gKi9cbiAgZnVuY3Rpb24gbWFrZVNldHRsZUluZm8odGFyZ2V0KSB7XG4gICAgcmV0dXJuIHsgdGFza3M6IFtdLCBlbHRzOiBbdGFyZ2V0XSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqL1xuICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxTdGF0ZShjb250ZW50LCBzd2FwU3BlYykge1xuICAgIGNvbnN0IGZpcnN0ID0gY29udGVudFswXVxuICAgIGNvbnN0IGxhc3QgPSBjb250ZW50W2NvbnRlbnQubGVuZ3RoIC0gMV1cbiAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbFRhcmdldCkge1xuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gMFxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICB0YXJnZXQuc2Nyb2xsVG9wID0gdGFyZ2V0LnNjcm9sbEhlaWdodFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3dhcFNwZWMuc2hvdykge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0KSB7XG4gICAgICAgIGxldCB0YXJnZXRTdHIgPSBzd2FwU3BlYy5zaG93VGFyZ2V0XG4gICAgICAgIGlmIChzd2FwU3BlYy5zaG93VGFyZ2V0ID09PSAnd2luZG93Jykge1xuICAgICAgICAgIHRhcmdldFN0ciA9ICdib2R5J1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCB0YXJnZXRTdHIpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICd0b3AnICYmIChmaXJzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBmaXJzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ3N0YXJ0JywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ2JvdHRvbScgJiYgKGxhc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgbGFzdFxuICAgICAgICAvLyBAdHMtaWdub3JlIEZvciBzb21lIHJlYXNvbiB0c2MgZG9lc24ndCByZWNvZ25pemUgXCJpbnN0YW50XCIgYXMgYSB2YWxpZCBvcHRpb24gZm9yIG5vd1xuICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ2VuZCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBldmFsQXNEZWZhdWx0XG4gKiBAcGFyYW0ge09iamVjdD19IHZhbHVlc1xuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuICBmdW5jdGlvbiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKSB7XG4gICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7XG4gICAgICB2YWx1ZXMgPSB7fVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB2YWx1ZXNcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpXG4gICAgaWYgKGF0dHJpYnV0ZVZhbHVlKSB7XG4gICAgICBsZXQgc3RyID0gYXR0cmlidXRlVmFsdWUudHJpbSgpXG4gICAgICBsZXQgZXZhbHVhdGVWYWx1ZSA9IGV2YWxBc0RlZmF1bHRcbiAgICAgIGlmIChzdHIgPT09ICd1bnNldCcpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignamF2YXNjcmlwdDonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDExKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfSBlbHNlIGlmIChzdHIuaW5kZXhPZignanM6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigzKVxuICAgICAgICBldmFsdWF0ZVZhbHVlID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCd7JykgIT09IDApIHtcbiAgICAgICAgc3RyID0gJ3snICsgc3RyICsgJ30nXG4gICAgICB9XG4gICAgICBsZXQgdmFyc1ZhbHVlc1xuICAgICAgaWYgKGV2YWx1YXRlVmFsdWUpIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkgeyByZXR1cm4gRnVuY3Rpb24oJ3JldHVybiAoJyArIHN0ciArICcpJykoKSB9LCB7fSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBwYXJzZUpTT04oc3RyKVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFyc1ZhbHVlcykge1xuICAgICAgICBpZiAodmFyc1ZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgaWYgKHZhbHVlc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhbHVlc1trZXldID0gdmFyc1ZhbHVlc1trZXldXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7KCkgPT4gYW55fSB0b0V2YWxcbiAgICogQHBhcmFtIHthbnk9fSBkZWZhdWx0VmFsXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUV2YWwoZWx0LCB0b0V2YWwsIGRlZmF1bHRWYWwpIHtcbiAgICBpZiAoaHRteC5jb25maWcuYWxsb3dFdmFsKSB7XG4gICAgICByZXR1cm4gdG9FdmFsKClcbiAgICB9IGVsc2Uge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpldmFsRGlzYWxsb3dlZEVycm9yJylcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFycycsIHRydWUsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHsqP30gZXhwcmVzc2lvblZhcnNcbiAqIEByZXR1cm5zXG4gKi9cbiAgZnVuY3Rpb24gZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQsIGV4cHJlc3Npb25WYXJzKSB7XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtdmFscycsIGZhbHNlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uVmFycyhlbHQpIHtcbiAgICByZXR1cm4gbWVyZ2VPYmplY3RzKGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0KSwgZ2V0SFhWYWxzRm9yRWxlbWVudChlbHQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGhlYWRlclZhbHVlXG4gICAqL1xuICBmdW5jdGlvbiBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpIHtcbiAgICBpZiAoaGVhZGVyVmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbiBhbiBleGNlcHRpb24sIHRyeSB0byBzZXQgdGhlIGhlYWRlciBVUkkgZW5jb2RlZCBpbnN0ZWFkXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgZW5jb2RlVVJJQ29tcG9uZW50KGhlYWRlclZhbHVlKSlcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyICsgJy1VUkktQXV0b0VuY29kZWQnLCAndHJ1ZScpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocikge1xuICAvLyBOQjogSUUxMSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc3R1ZmZcbiAgICBpZiAoeGhyLnJlc3BvbnNlVVJMICYmIHR5cGVvZiAoVVJMKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoeGhyLnJlc3BvbnNlVVJMKVxuICAgICAgICByZXR1cm4gdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaFxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJhZFJlc3BvbnNlVXJsJywgeyB1cmw6IHhoci5yZXNwb25zZVVSTCB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtSZWdFeHB9IHJlZ2V4cFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGFzSGVhZGVyKHhociwgcmVnZXhwKSB7XG4gICAgcmV0dXJuIHJlZ2V4cC50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJc3N1ZXMgYW4gaHRteC1zdHlsZSBBSkFYIHJlcXVlc3RcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jYWpheFxuICAgKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIHRoZSBVUkwgcGF0aCB0byBtYWtlIHRoZSBBSkFYXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd8SHRteEFqYXhIZWxwZXJDb250ZXh0fSBjb250ZXh0IHRoZSBlbGVtZW50IHRvIHRhcmdldCAoZGVmYXVsdHMgdG8gdGhlICoqYm9keSoqKSB8IGEgc2VsZWN0b3IgZm9yIHRoZSB0YXJnZXQgfCBhIGNvbnRleHQgb2JqZWN0IHRoYXQgY29udGFpbnMgYW55IG9mIHRoZSBmb2xsb3dpbmdcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gUHJvbWlzZSB0aGF0IHJlc29sdmVzIGltbWVkaWF0ZWx5IGlmIG5vIHJlcXVlc3QgaXMgc2VudCwgb3Igd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZVxuICAgKi9cbiAgZnVuY3Rpb24gYWpheEhlbHBlcih2ZXJiLCBwYXRoLCBjb250ZXh0KSB7XG4gICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8odmVyYi50b0xvd2VyQ2FzZSgpKSlcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IHR5cGVvZiBjb250ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dCksXG4gICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgcmVzb2x2ZVRhcmdldChjb250ZXh0LnNvdXJjZSksIGNvbnRleHQuZXZlbnQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgaGFuZGxlcjogY29udGV4dC5oYW5kbGVyLFxuICAgICAgICAgICAgaGVhZGVyczogY29udGV4dC5oZWFkZXJzLFxuICAgICAgICAgICAgdmFsdWVzOiBjb250ZXh0LnZhbHVlcyxcbiAgICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQudGFyZ2V0KSxcbiAgICAgICAgICAgIHN3YXBPdmVycmlkZTogY29udGV4dC5zd2FwLFxuICAgICAgICAgICAgc2VsZWN0OiBjb250ZXh0LnNlbGVjdCxcbiAgICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBudWxsLCBudWxsLCB7XG4gICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm4ge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGhpZXJhcmNoeUZvckVsdChlbHQpIHtcbiAgICBjb25zdCBhcnIgPSBbXVxuICAgIHdoaWxlIChlbHQpIHtcbiAgICAgIGFyci5wdXNoKGVsdClcbiAgICAgIGVsdCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgfVxuICAgIHJldHVybiBhcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB2ZXJpZnlQYXRoKGVsdCwgcGF0aCwgcmVxdWVzdENvbmZpZykge1xuICAgIGxldCBzYW1lSG9zdFxuICAgIGxldCB1cmxcbiAgICBpZiAodHlwZW9mIFVSTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdXJsID0gbmV3IFVSTChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKVxuICAgICAgY29uc3Qgb3JpZ2luID0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luXG4gICAgICBzYW1lSG9zdCA9IG9yaWdpbiA9PT0gdXJsLm9yaWdpblxuICAgIH0gZWxzZSB7XG4gICAgLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgVVJMXG4gICAgICB1cmwgPSBwYXRoXG4gICAgICBzYW1lSG9zdCA9IHN0YXJ0c1dpdGgocGF0aCwgZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5zZWxmUmVxdWVzdHNPbmx5KSB7XG4gICAgICBpZiAoIXNhbWVIb3N0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGVVcmwnLCBtZXJnZU9iamVjdHMoeyB1cmwsIHNhbWVIb3N0IH0sIHJlcXVlc3RDb25maWcpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZvcm1EYXRhfSBvYmpcbiAgICogQHJldHVybiB7Rm9ybURhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUZyb21PYmplY3Qob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIEZvcm1EYXRhKSByZXR1cm4gb2JqXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0uZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9ialtrZXldLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQoa2V5LCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcgJiYgIShvYmpba2V5XSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgSlNPTi5zdHJpbmdpZnkob2JqW2tleV0pKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIG9ialtrZXldKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmb3JtRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5XG4gICAqIEByZXR1cm5zIHtBcnJheX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhQXJyYXlQcm94eShmb3JtRGF0YSwgbmFtZSwgYXJyYXkpIHtcbiAgICAvLyBtdXRhdGluZyB0aGUgYXJyYXkgc2hvdWxkIG11dGF0ZSB0aGUgdW5kZXJseWluZyBmb3JtIGRhdGFcbiAgICByZXR1cm4gbmV3IFByb3h5KGFycmF5LCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIGlmIChrZXkgPT09ICdsZW5ndGgnKSByZXR1cm4gdGFyZ2V0Lmxlbmd0aFxuICAgICAgICBpZiAoa2V5ID09PSAncHVzaCcpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIHRhcmdldC5wdXNoKHZhbHVlKVxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGFyZ2V0W2tleV0uYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpXG4gICAgICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRhcmdldFtrZXldICYmIHRhcmdldFtrZXldLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIGluZGV4LCB2YWx1ZSkge1xuICAgICAgICB0YXJnZXRbaW5kZXhdID0gdmFsdWVcbiAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFQcm94eShmb3JtRGF0YSkge1xuICAgIHJldHVybiBuZXcgUHJveHkoZm9ybURhdGEsIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgICAvLyBGb3J3YXJkIHN5bWJvbCBjYWxscyB0byB0aGUgRm9ybURhdGEgaXRzZWxmIGRpcmVjdGx5XG4gICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgbmFtZSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSA9PT0gJ3RvSlNPTicpIHtcbiAgICAgICAgICAvLyBTdXBwb3J0IEpTT04uc3RyaW5naWZ5IGNhbGwgb24gcHJveHlcbiAgICAgICAgICByZXR1cm4gKCkgPT4gT2JqZWN0LmZyb21FbnRyaWVzKGZvcm1EYXRhKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgIC8vIFdyYXAgaW4gZnVuY3Rpb24gd2l0aCBhcHBseSB0byBjb3JyZWN0bHkgYmluZCB0aGUgRm9ybURhdGEgY29udGV4dCwgYXMgYSBkaXJlY3QgY2FsbCB3b3VsZCByZXN1bHQgaW4gYW4gaWxsZWdhbCBpbnZvY2F0aW9uIGVycm9yXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhW25hbWVdLmFwcGx5KGZvcm1EYXRhLCBhcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXRbbmFtZV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXJyYXkgPSBmb3JtRGF0YS5nZXRBbGwobmFtZSlcbiAgICAgICAgLy8gVGhvc2UgMiB1bmRlZmluZWQgJiBzaW5nbGUgdmFsdWUgcmV0dXJucyBhcmUgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkgYXMgd2Ugd2VyZW4ndCB1c2luZyBGb3JtRGF0YSBiZWZvcmVcbiAgICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgfSBlbHNlIGlmIChhcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gYXJyYXlbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZm9ybURhdGFBcnJheVByb3h5KHRhcmdldCwgbmFtZSwgYXJyYXkpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IHRhcmdldC5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICEodmFsdWUgaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24odGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH0sXG4gICAgICAvLyBTdXBwb3J0IE9iamVjdC5hc3NpZ24gY2FsbCBmcm9tIHByb3h5XG4gICAgICBvd25LZXlzOiBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3Qub3duS2V5cyhPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSlcbiAgICAgIH0sXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKHRhcmdldCwgcHJvcCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCksIHByb3ApXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gICAqIEBwYXJhbSB7SHRteEFqYXhFdGN9IFtldGNdXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbmZpcm1lZF1cbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCBjb25maXJtZWQpIHtcbiAgICBsZXQgcmVzb2x2ZSA9IG51bGxcbiAgICBsZXQgcmVqZWN0ID0gbnVsbFxuICAgIGV0YyA9IGV0YyAhPSBudWxsID8gZXRjIDoge31cbiAgICBpZiAoZXRjLnJldHVyblByb21pc2UgJiYgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICByZWplY3QgPSBfcmVqZWN0XG4gICAgICB9KVxuICAgIH1cbiAgICBpZiAoZWx0ID09IG51bGwpIHtcbiAgICAgIGVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIH1cbiAgICBjb25zdCByZXNwb25zZUhhbmRsZXIgPSBldGMuaGFuZGxlciB8fCBoYW5kbGVBamF4UmVzcG9uc2VcbiAgICBjb25zdCBzZWxlY3QgPSBldGMuc2VsZWN0IHx8IG51bGxcblxuICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAvLyBkbyBub3QgaXNzdWUgcmVxdWVzdHMgZm9yIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IGV0Yy50YXJnZXRPdmVycmlkZSB8fCBhc0VsZW1lbnQoZ2V0VGFyZ2V0KGVsdCkpXG4gICAgaWYgKHRhcmdldCA9PSBudWxsIHx8IHRhcmdldCA9PSBEVU1NWV9FTFQpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGFyZ2V0RXJyb3InLCB7IHRhcmdldDogZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JykgfSlcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGxldCBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBjb25zdCBzdWJtaXR0ZXIgPSBlbHREYXRhLmxhc3RCdXR0b25DbGlja2VkXG5cbiAgICBpZiAoc3VibWl0dGVyKSB7XG4gICAgICBjb25zdCBidXR0b25QYXRoID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1hY3Rpb24nKVxuICAgICAgaWYgKGJ1dHRvblBhdGggIT0gbnVsbCkge1xuICAgICAgICBwYXRoID0gYnV0dG9uUGF0aFxuICAgICAgfVxuXG4gICAgICBjb25zdCBidXR0b25WZXJiID0gZ2V0UmF3QXR0cmlidXRlKHN1Ym1pdHRlciwgJ2Zvcm1tZXRob2QnKVxuICAgICAgaWYgKGJ1dHRvblZlcmIgIT0gbnVsbCkge1xuICAgICAgLy8gaWdub3JlIGJ1dHRvbnMgd2l0aCBmb3JtbWV0aG9kPVwiZGlhbG9nXCJcbiAgICAgICAgaWYgKGJ1dHRvblZlcmIudG9Mb3dlckNhc2UoKSAhPT0gJ2RpYWxvZycpIHtcbiAgICAgICAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyhidXR0b25WZXJiKSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbmZpcm1RdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1jb25maXJtJylcbiAgICAvLyBhbGxvdyBldmVudC1iYXNlZCBjb25maXJtYXRpb24gdy8gYSBjYWxsYmFja1xuICAgIGlmIChjb25maXJtZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgaXNzdWVSZXF1ZXN0ID0gZnVuY3Rpb24oc2tpcENvbmZpcm1hdGlvbikge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsICEhc2tpcENvbmZpcm1hdGlvbilcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmZpcm1EZXRhaWxzID0geyB0YXJnZXQsIGVsdCwgcGF0aCwgdmVyYiwgdHJpZ2dlcmluZ0V2ZW50OiBldmVudCwgZXRjLCBpc3N1ZVJlcXVlc3QsIHF1ZXN0aW9uOiBjb25maXJtUXVlc3Rpb24gfVxuICAgICAgaWYgKHRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpcm0nLCBjb25maXJtRGV0YWlscykgPT09IGZhbHNlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBzeW5jRWx0ID0gZWx0XG4gICAgbGV0IHN5bmNTdHJhdGVneSA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zeW5jJylcbiAgICBsZXQgcXVldWVTdHJhdGVneSA9IG51bGxcbiAgICBsZXQgYWJvcnRhYmxlID0gZmFsc2VcbiAgICBpZiAoc3luY1N0cmF0ZWd5KSB7XG4gICAgICBjb25zdCBzeW5jU3RyaW5ncyA9IHN5bmNTdHJhdGVneS5zcGxpdCgnOicpXG4gICAgICBjb25zdCBzZWxlY3RvciA9IHN5bmNTdHJpbmdzWzBdLnRyaW0oKVxuICAgICAgaWYgKHNlbGVjdG9yID09PSAndGhpcycpIHtcbiAgICAgICAgc3luY0VsdCA9IGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC1zeW5jJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN5bmNFbHQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHNlbGVjdG9yKSlcbiAgICAgIH1cbiAgICAgIC8vIGRlZmF1bHQgdG8gdGhlIGRyb3Agc3RyYXRlZ3lcbiAgICAgIHN5bmNTdHJhdGVneSA9IChzeW5jU3RyaW5nc1sxXSB8fCAnZHJvcCcpLnRyaW0oKVxuICAgICAgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShzeW5jRWx0KVxuICAgICAgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Ryb3AnICYmIGVsdERhdGEueGhyICYmIGVsdERhdGEuYWJvcnRhYmxlICE9PSB0cnVlKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdhYm9ydCcpIHtcbiAgICAgICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhYm9ydGFibGUgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAncmVwbGFjZScpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5LmluZGV4T2YoJ3F1ZXVlJykgPT09IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVTdHJBcnJheSA9IHN5bmNTdHJhdGVneS5zcGxpdCgnICcpXG4gICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAocXVldWVTdHJBcnJheVsxXSB8fCAnbGFzdCcpLnRyaW0oKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgaWYgKGVsdERhdGEuYWJvcnRhYmxlKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZlbnQpXG4gICAgICAgICAgICBpZiAoZXZlbnREYXRhICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyAmJiBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWUpIHtcbiAgICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9IGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PSBudWxsKSB7XG4gICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gJ2xhc3QnXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID09IG51bGwpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2ZpcnN0JyAmJiBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdsYXN0Jykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXSAvLyBkdW1wIGV4aXN0aW5nIHF1ZXVlXG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGVsdERhdGEueGhyID0geGhyXG4gICAgZWx0RGF0YS5hYm9ydGFibGUgPSBhYm9ydGFibGVcbiAgICBjb25zdCBlbmRSZXF1ZXN0TG9jayA9IGZ1bmN0aW9uKCkge1xuICAgICAgZWx0RGF0YS54aHIgPSBudWxsXG4gICAgICBlbHREYXRhLmFib3J0YWJsZSA9IGZhbHNlXG4gICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyAhPSBudWxsICYmXG4gICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcXVldWVkUmVxdWVzdCA9IGVsdERhdGEucXVldWVkUmVxdWVzdHMuc2hpZnQoKVxuICAgICAgICBxdWV1ZWRSZXF1ZXN0KClcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvbXB0UXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHJvbXB0JylcbiAgICBpZiAocHJvbXB0UXVlc3Rpb24pIHtcbiAgICAgIHZhciBwcm9tcHRSZXNwb25zZSA9IHByb21wdChwcm9tcHRRdWVzdGlvbilcbiAgICAgIC8vIHByb21wdCByZXR1cm5zIG51bGwgaWYgY2FuY2VsbGVkIGFuZCBlbXB0eSBzdHJpbmcgaWYgYWNjZXB0ZWQgd2l0aCBubyBlbnRyeVxuICAgICAgaWYgKHByb21wdFJlc3BvbnNlID09PSBudWxsIHx8XG4gICAgICAhdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cHJvbXB0JywgeyBwcm9tcHQ6IHByb21wdFJlc3BvbnNlLCB0YXJnZXQgfSkpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29uZmlybVF1ZXN0aW9uICYmICFjb25maXJtZWQpIHtcbiAgICAgIGlmICghY29uZmlybShjb25maXJtUXVlc3Rpb24pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGhlYWRlcnMgPSBnZXRIZWFkZXJzKGVsdCwgdGFyZ2V0LCBwcm9tcHRSZXNwb25zZSlcblxuICAgIGlmICh2ZXJiICE9PSAnZ2V0JyAmJiAhdXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCdcbiAgICB9XG5cbiAgICBpZiAoZXRjLmhlYWRlcnMpIHtcbiAgICAgIGhlYWRlcnMgPSBtZXJnZU9iamVjdHMoaGVhZGVycywgZXRjLmhlYWRlcnMpXG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHZlcmIpXG4gICAgbGV0IGVycm9ycyA9IHJlc3VsdHMuZXJyb3JzXG4gICAgY29uc3QgcmF3Rm9ybURhdGEgPSByZXN1bHRzLmZvcm1EYXRhXG4gICAgaWYgKGV0Yy52YWx1ZXMpIHtcbiAgICAgIG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGZvcm1EYXRhRnJvbU9iamVjdChldGMudmFsdWVzKSlcbiAgICB9XG4gICAgY29uc3QgZXhwcmVzc2lvblZhcnMgPSBmb3JtRGF0YUZyb21PYmplY3QoZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSlcbiAgICBjb25zdCBhbGxGb3JtRGF0YSA9IG92ZXJyaWRlRm9ybURhdGEocmF3Rm9ybURhdGEsIGV4cHJlc3Npb25WYXJzKVxuICAgIGxldCBmaWx0ZXJlZEZvcm1EYXRhID0gZmlsdGVyVmFsdWVzKGFsbEZvcm1EYXRhLCBlbHQpXG5cbiAgICBpZiAoaHRteC5jb25maWcuZ2V0Q2FjaGVCdXN0ZXJQYXJhbSAmJiB2ZXJiID09PSAnZ2V0Jykge1xuICAgICAgZmlsdGVyZWRGb3JtRGF0YS5zZXQoJ29yZy5odG14LmNhY2hlLWJ1c3RlcicsIGdldFJhd0F0dHJpYnV0ZSh0YXJnZXQsICdpZCcpIHx8ICd0cnVlJylcbiAgICB9XG5cbiAgICAvLyBiZWhhdmlvciBvZiBhbmNob3JzIHcvIGVtcHR5IGhyZWYgaXMgdG8gdXNlIHRoZSBjdXJyZW50IFVSTFxuICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aCA9PT0gJycpIHtcbiAgICAgIHBhdGggPSBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICAgICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtub0hlYWRlcnNdXG4gICAgICovXG4gICAgY29uc3QgcmVxdWVzdEF0dHJWYWx1ZXMgPSBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXJlcXVlc3QnKVxuXG4gICAgY29uc3QgZWx0SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHVzZVVybFBhcmFtcyA9IGh0bXguY29uZmlnLm1ldGhvZHNUaGF0VXNlVXJsUGFyYW1zLmluZGV4T2YodmVyYikgPj0gMFxuXG4gICAgLyoqIEB0eXBlIEh0bXhSZXF1ZXN0Q29uZmlnICovXG4gICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHtcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHVzZVVybFBhcmFtcyxcbiAgICAgIGZvcm1EYXRhOiBmaWx0ZXJlZEZvcm1EYXRhLFxuICAgICAgcGFyYW1ldGVyczogZm9ybURhdGFQcm94eShmaWx0ZXJlZEZvcm1EYXRhKSxcbiAgICAgIHVuZmlsdGVyZWRGb3JtRGF0YTogYWxsRm9ybURhdGEsXG4gICAgICB1bmZpbHRlcmVkUGFyYW1ldGVyczogZm9ybURhdGFQcm94eShhbGxGb3JtRGF0YSksXG4gICAgICBoZWFkZXJzLFxuICAgICAgdGFyZ2V0LFxuICAgICAgdmVyYixcbiAgICAgIGVycm9ycyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogZXRjLmNyZWRlbnRpYWxzIHx8IHJlcXVlc3RBdHRyVmFsdWVzLmNyZWRlbnRpYWxzIHx8IGh0bXguY29uZmlnLndpdGhDcmVkZW50aWFscyxcbiAgICAgIHRpbWVvdXQ6IGV0Yy50aW1lb3V0IHx8IHJlcXVlc3RBdHRyVmFsdWVzLnRpbWVvdXQgfHwgaHRteC5jb25maWcudGltZW91dCxcbiAgICAgIHBhdGgsXG4gICAgICB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50XG4gICAgfVxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maWdSZXF1ZXN0JywgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICAvLyBjb3B5IG91dCBpbiBjYXNlIHRoZSBvYmplY3Qgd2FzIG92ZXJ3cml0dGVuXG4gICAgcGF0aCA9IHJlcXVlc3RDb25maWcucGF0aFxuICAgIHZlcmIgPSByZXF1ZXN0Q29uZmlnLnZlcmJcbiAgICBoZWFkZXJzID0gcmVxdWVzdENvbmZpZy5oZWFkZXJzXG4gICAgZmlsdGVyZWRGb3JtRGF0YSA9IGZvcm1EYXRhRnJvbU9iamVjdChyZXF1ZXN0Q29uZmlnLnBhcmFtZXRlcnMpXG4gICAgZXJyb3JzID0gcmVxdWVzdENvbmZpZy5lcnJvcnNcbiAgICB1c2VVcmxQYXJhbXMgPSByZXF1ZXN0Q29uZmlnLnVzZVVybFBhcmFtc1xuXG4gICAgaWYgKGVycm9ycyAmJiBlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dmFsaWRhdGlvbjpoYWx0ZWQnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIGNvbnN0IHNwbGl0UGF0aCA9IHBhdGguc3BsaXQoJyMnKVxuICAgIGNvbnN0IHBhdGhOb0FuY2hvciA9IHNwbGl0UGF0aFswXVxuICAgIGNvbnN0IGFuY2hvciA9IHNwbGl0UGF0aFsxXVxuXG4gICAgbGV0IGZpbmFsUGF0aCA9IHBhdGhcbiAgICBpZiAodXNlVXJsUGFyYW1zKSB7XG4gICAgICBmaW5hbFBhdGggPSBwYXRoTm9BbmNob3JcbiAgICAgIGNvbnN0IGhhc1ZhbHVlcyA9ICFmaWx0ZXJlZEZvcm1EYXRhLmtleXMoKS5uZXh0KCkuZG9uZVxuICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICBpZiAoZmluYWxQYXRoLmluZGV4T2YoJz8nKSA8IDApIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJz8nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcmJ1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsUGF0aCArPSB1cmxFbmNvZGUoZmlsdGVyZWRGb3JtRGF0YSlcbiAgICAgICAgaWYgKGFuY2hvcikge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnIycgKyBhbmNob3JcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdmVyaWZ5UGF0aChlbHQsIGZpbmFsUGF0aCwgcmVxdWVzdENvbmZpZykpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6aW52YWxpZFBhdGgnLCByZXF1ZXN0Q29uZmlnKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgeGhyLm9wZW4odmVyYi50b1VwcGVyQ2FzZSgpLCBmaW5hbFBhdGgsIHRydWUpXG4gICAgeGhyLm92ZXJyaWRlTWltZVR5cGUoJ3RleHQvaHRtbCcpXG4gICAgeGhyLndpdGhDcmVkZW50aWFscyA9IHJlcXVlc3RDb25maWcud2l0aENyZWRlbnRpYWxzXG4gICAgeGhyLnRpbWVvdXQgPSByZXF1ZXN0Q29uZmlnLnRpbWVvdXRcblxuICAgIC8vIHJlcXVlc3QgaGVhZGVyc1xuICAgIGlmIChyZXF1ZXN0QXR0clZhbHVlcy5ub0hlYWRlcnMpIHtcbiAgICAvLyBpZ25vcmUgYWxsIGhlYWRlcnNcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBoZWFkZXIgaW4gaGVhZGVycykge1xuICAgICAgICBpZiAoaGVhZGVycy5oYXNPd25Qcm9wZXJ0eShoZWFkZXIpKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlcl1cbiAgICAgICAgICBzYWZlbHlTZXRIZWFkZXJWYWx1ZSh4aHIsIGhlYWRlciwgaGVhZGVyVmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUge0h0bXhSZXNwb25zZUluZm99ICovXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvID0ge1xuICAgICAgeGhyLFxuICAgICAgdGFyZ2V0LFxuICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgIGV0YyxcbiAgICAgIGJvb3N0ZWQ6IGVsdElzQm9vc3RlZCxcbiAgICAgIHNlbGVjdCxcbiAgICAgIHBhdGhJbmZvOiB7XG4gICAgICAgIHJlcXVlc3RQYXRoOiBwYXRoLFxuICAgICAgICBmaW5hbFJlcXVlc3RQYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgIHJlc3BvbnNlUGF0aDogbnVsbCxcbiAgICAgICAgYW5jaG9yXG4gICAgICB9XG4gICAgfVxuXG4gICAgeGhyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGllcmFyY2h5ID0gaGllcmFyY2h5Rm9yRWx0KGVsdClcbiAgICAgICAgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aCA9IGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKVxuICAgICAgICByZXNwb25zZUhhbmRsZXIoZWx0LCByZXNwb25zZUluZm8pXG4gICAgICAgIGlmIChyZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgIT09IHRydWUpIHtcbiAgICAgICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAvLyBpZiB0aGUgYm9keSBubyBsb25nZXIgY29udGFpbnMgdGhlIGVsZW1lbnQsIHRyaWdnZXIgdGhlIGV2ZW50IG9uIHRoZSBjbG9zZXN0IHBhcmVudFxuICAgICAgICAvLyByZW1haW5pbmcgaW4gdGhlIERPTVxuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgbGV0IHNlY29uZGFyeVRyaWdnZXJFbHQgPSBudWxsXG4gICAgICAgICAgd2hpbGUgKGhpZXJhcmNoeS5sZW5ndGggPiAwICYmIHNlY29uZGFyeVRyaWdnZXJFbHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3QgcGFyZW50RWx0SW5IaWVyYXJjaHkgPSBoaWVyYXJjaHkuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKGJvZHlDb250YWlucyhwYXJlbnRFbHRJbkhpZXJhcmNoeSkpIHtcbiAgICAgICAgICAgICAgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IHBhcmVudEVsdEluSGllcmFyY2h5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzZWNvbmRhcnlUcmlnZ2VyRWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyT25Mb2FkJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14Om9uTG9hZEVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgdGhyb3cgZVxuICAgICAgfVxuICAgIH1cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9uYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRBYm9ydCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbnRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRpbWVvdXQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVJlcXVlc3QnLCByZXNwb25zZUluZm8pKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuICAgIHZhciBpbmRpY2F0b3JzID0gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KVxuICAgIHZhciBkaXNhYmxlRWx0cyA9IGRpc2FibGVFbGVtZW50cyhlbHQpXG5cbiAgICBmb3JFYWNoKFsnbG9hZHN0YXJ0JywgJ2xvYWRlbmQnLCAncHJvZ3Jlc3MnLCAnYWJvcnQnXSwgZnVuY3Rpb24oZXZlbnROYW1lKSB7XG4gICAgICBmb3JFYWNoKFt4aHIsIHhoci51cGxvYWRdLCBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnhocjonICsgZXZlbnROYW1lLCB7XG4gICAgICAgICAgICBsZW5ndGhDb21wdXRhYmxlOiBldmVudC5sZW5ndGhDb21wdXRhYmxlLFxuICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsXG4gICAgICAgICAgICB0b3RhbDogZXZlbnQudG90YWxcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVNlbmQnLCByZXNwb25zZUluZm8pXG4gICAgY29uc3QgcGFyYW1zID0gdXNlVXJsUGFyYW1zID8gbnVsbCA6IGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkRm9ybURhdGEpXG4gICAgeGhyLnNlbmQocGFyYW1zKVxuICAgIHJldHVybiBwcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlVcGRhdGVcbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3R5cGVdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFtwYXRoXVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICogQHJldHVybiB7SHRteEhpc3RvcnlVcGRhdGV9XG4gICAqL1xuICBmdW5jdGlvbiBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBGaXJzdCBjb25zdWx0IHJlc3BvbnNlIGhlYWRlcnNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgbGV0IHBhdGhGcm9tSGVhZGVycyA9IG51bGxcbiAgICBsZXQgdHlwZUZyb21IZWFkZXJzID0gbnVsbFxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUHVzaC1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVwbGFjZS1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlcGxhY2UtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdyZXBsYWNlJ1xuICAgIH1cblxuICAgIC8vIGlmIHRoZXJlIHdhcyBhIHJlc3BvbnNlIGhlYWRlciwgdGhhdCBoYXMgcHJpb3JpdHlcbiAgICBpZiAocGF0aEZyb21IZWFkZXJzKSB7XG4gICAgICBpZiAocGF0aEZyb21IZWFkZXJzID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiB0eXBlRnJvbUhlYWRlcnMsXG4gICAgICAgICAgcGF0aDogcGF0aEZyb21IZWFkZXJzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gTmV4dCByZXNvbHZlIHZpYSBET00gdmFsdWVzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGNvbnN0IHJlcXVlc3RQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmZpbmFsUmVxdWVzdFBhdGhcbiAgICBjb25zdCByZXNwb25zZVBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoXG5cbiAgICBjb25zdCBwdXNoVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXB1c2gtdXJsJylcbiAgICBjb25zdCByZXBsYWNlVXJsID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXJlcGxhY2UtdXJsJylcbiAgICBjb25zdCBlbGVtZW50SXNCb29zdGVkID0gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZFxuXG4gICAgbGV0IHNhdmVUeXBlID0gbnVsbFxuICAgIGxldCBwYXRoID0gbnVsbFxuXG4gICAgaWYgKHB1c2hVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcHVzaFVybFxuICAgIH0gZWxzZSBpZiAocmVwbGFjZVVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncmVwbGFjZSdcbiAgICAgIHBhdGggPSByZXBsYWNlVXJsXG4gICAgfSBlbHNlIGlmIChlbGVtZW50SXNCb29zdGVkKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICB9XG5cbiAgICBpZiAocGF0aCkge1xuICAgIC8vIGZhbHNlIGluZGljYXRlcyBubyBwdXNoLCByZXR1cm4gZW1wdHkgb2JqZWN0XG4gICAgICBpZiAocGF0aCA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH1cblxuICAgICAgLy8gdHJ1ZSBpbmRpY2F0ZXMgd2Ugd2FudCB0byBmb2xsb3cgd2hlcmV2ZXIgdGhlIHNlcnZlciBlbmRlZCB1cCBzZW5kaW5nIHVzXG4gICAgICBpZiAocGF0aCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgICB9XG5cbiAgICAgIC8vIHJlc3RvcmUgYW55IGFuY2hvciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RcbiAgICAgIGlmIChyZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yICYmIHBhdGguaW5kZXhPZignIycpID09PSAtMSkge1xuICAgICAgICBwYXRoID0gcGF0aCArICcjJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3JcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogc2F2ZVR5cGUsXG4gICAgICAgIHBhdGhcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9IHJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXR1c1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0NvbmZpZywgc3RhdHVzKSB7XG4gICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocmVzcG9uc2VIYW5kbGluZ0NvbmZpZy5jb2RlKVxuICAgIHJldHVybiByZWdFeHAudGVzdChzdGF0dXMudG9TdHJpbmcoMTApKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcmV0dXJuIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ31cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZy5sZW5ndGg7IGkrKykge1xuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnICovXG4gICAgICB2YXIgcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQgPSBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nW2ldXG4gICAgICBpZiAoY29kZU1hdGNoZXMocmVzcG9uc2VIYW5kbGluZ0VsZW1lbnQsIHhoci5zdGF0dXMpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZUhhbmRsaW5nRWxlbWVudFxuICAgICAgfVxuICAgIH1cbiAgICAvLyBubyBtYXRjaGVzLCByZXR1cm4gbm8gc3dhcFxuICAgIHJldHVybiB7XG4gICAgICBzd2FwOiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGVcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVRpdGxlKHRpdGxlKSB7XG4gICAgaWYgKHRpdGxlKSB7XG4gICAgICBjb25zdCB0aXRsZUVsdCA9IGZpbmQoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsdCkge1xuICAgICAgICB0aXRsZUVsdC5pbm5lckhUTUwgPSB0aXRsZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmRvY3VtZW50LnRpdGxlID0gdGl0bGVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUFqYXhSZXNwb25zZShlbHQsIHJlc3BvbnNlSW5mbykge1xuICAgIGNvbnN0IHhociA9IHJlc3BvbnNlSW5mby54aHJcbiAgICBsZXQgdGFyZ2V0ID0gcmVzcG9uc2VJbmZvLnRhcmdldFxuICAgIGNvbnN0IGV0YyA9IHJlc3BvbnNlSW5mby5ldGNcbiAgICBjb25zdCByZXNwb25zZUluZm9TZWxlY3QgPSByZXNwb25zZUluZm8uc2VsZWN0XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZU9uTG9hZCcsIHJlc3BvbnNlSW5mbykpIHJldHVyblxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyOi9pKSkge1xuICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyJywgZWx0KVxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtTG9jYXRpb246L2kpKSB7XG4gICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgbGV0IHJlZGlyZWN0UGF0aCA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtTG9jYXRpb24nKVxuICAgICAgLyoqIEB0eXBlIHtIdG14QWpheEhlbHBlckNvbnRleHQme3BhdGg6c3RyaW5nfX0gKi9cbiAgICAgIHZhciByZWRpcmVjdFN3YXBTcGVjXG4gICAgICBpZiAocmVkaXJlY3RQYXRoLmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgICByZWRpcmVjdFN3YXBTcGVjID0gcGFyc2VKU09OKHJlZGlyZWN0UGF0aClcbiAgICAgICAgLy8gd2hhdCdzIHRoZSBiZXN0IHdheSB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgdXNlciBkaWRuJ3QgaW5jbHVkZSB0aGlzXG4gICAgICAgIHJlZGlyZWN0UGF0aCA9IHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgICBkZWxldGUgcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICB9XG4gICAgICBhamF4SGVscGVyKCdnZXQnLCByZWRpcmVjdFBhdGgsIHJlZGlyZWN0U3dhcFNwZWMpLnRoZW4oZnVuY3Rpb24oKSB7XG4gICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShyZWRpcmVjdFBhdGgpXG4gICAgICB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkUmVmcmVzaCA9IGhhc0hlYWRlcih4aHIsIC9IWC1SZWZyZXNoOi9pKSAmJiB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZnJlc2gnKSA9PT0gJ3RydWUnXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlZGlyZWN0Oi9pKSkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24uaHJlZiA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVkaXJlY3QnKVxuICAgICAgc2hvdWxkUmVmcmVzaCAmJiBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFJlZnJlc2gpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGlzdG9yeVVwZGF0ZSA9IGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGluZyA9IHJlc29sdmVSZXNwb25zZUhhbmRsaW5nKHhocilcbiAgICBjb25zdCBzaG91bGRTd2FwID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwXG4gICAgbGV0IGlzRXJyb3IgPSAhIXJlc3BvbnNlSGFuZGxpbmcuZXJyb3JcbiAgICBsZXQgaWdub3JlVGl0bGUgPSBodG14LmNvbmZpZy5pZ25vcmVUaXRsZSB8fCByZXNwb25zZUhhbmRsaW5nLmlnbm9yZVRpdGxlXG4gICAgbGV0IHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zZWxlY3RcbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy50YXJnZXQpIHtcbiAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSlcbiAgICB9XG4gICAgdmFyIHN3YXBPdmVycmlkZSA9IGV0Yy5zd2FwT3ZlcnJpZGVcbiAgICBpZiAoc3dhcE92ZXJyaWRlID09IG51bGwgJiYgcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGUpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlXG4gICAgfVxuXG4gICAgLy8gcmVzcG9uc2UgaGVhZGVycyBvdmVycmlkZSByZXNwb25zZSBoYW5kbGluZyBjb25maWdcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJldGFyZ2V0Oi9pKSkge1xuICAgICAgaWYgKHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBlbHRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChlbHQsIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmV0YXJnZXQnKSkpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgIH1cblxuICAgIHZhciBzZXJ2ZXJSZXNwb25zZSA9IHhoci5yZXNwb25zZVxuICAgIC8qKiBAdHlwZSBIdG14QmVmb3JlU3dhcERldGFpbHMgKi9cbiAgICB2YXIgYmVmb3JlU3dhcERldGFpbHMgPSBtZXJnZU9iamVjdHMoe1xuICAgICAgc2hvdWxkU3dhcCxcbiAgICAgIHNlcnZlclJlc3BvbnNlLFxuICAgICAgaXNFcnJvcixcbiAgICAgIGlnbm9yZVRpdGxlLFxuICAgICAgc2VsZWN0T3ZlcnJpZGVcbiAgICB9LCByZXNwb25zZUluZm8pXG5cbiAgICBpZiAocmVzcG9uc2VIYW5kbGluZy5ldmVudCAmJiAhdHJpZ2dlckV2ZW50KHRhcmdldCwgcmVzcG9uc2VIYW5kbGluZy5ldmVudCwgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KHRhcmdldCwgJ2h0bXg6YmVmb3JlU3dhcCcsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICB0YXJnZXQgPSBiZWZvcmVTd2FwRGV0YWlscy50YXJnZXQgLy8gYWxsb3cgcmUtdGFyZ2V0aW5nXG4gICAgc2VydmVyUmVzcG9uc2UgPSBiZWZvcmVTd2FwRGV0YWlscy5zZXJ2ZXJSZXNwb25zZSAvLyBhbGxvdyB1cGRhdGluZyBjb250ZW50XG4gICAgaXNFcnJvciA9IGJlZm9yZVN3YXBEZXRhaWxzLmlzRXJyb3IgLy8gYWxsb3cgdXBkYXRpbmcgZXJyb3JcbiAgICBpZ25vcmVUaXRsZSA9IGJlZm9yZVN3YXBEZXRhaWxzLmlnbm9yZVRpdGxlIC8vIGFsbG93IHVwZGF0aW5nIGlnbm9yaW5nIHRpdGxlXG4gICAgc2VsZWN0T3ZlcnJpZGUgPSBiZWZvcmVTd2FwRGV0YWlscy5zZWxlY3RPdmVycmlkZSAvLyBhbGxvdyB1cGRhdGluZyBzZWxlY3Qgb3ZlcnJpZGVcblxuICAgIHJlc3BvbnNlSW5mby50YXJnZXQgPSB0YXJnZXQgLy8gTWFrZSB1cGRhdGVkIHRhcmdldCBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLmZhaWxlZCA9IGlzRXJyb3IgLy8gTWFrZSBmYWlsZWQgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5zdWNjZXNzZnVsID0gIWlzRXJyb3IgLy8gTWFrZSBzdWNjZXNzZnVsIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcblxuICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICBpZiAoeGhyLnN0YXR1cyA9PT0gMjg2KSB7XG4gICAgICAgIGNhbmNlbFBvbGxpbmcoZWx0KVxuICAgICAgfVxuXG4gICAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgICBzZXJ2ZXJSZXNwb25zZSA9IGV4dGVuc2lvbi50cmFuc2Zvcm1SZXNwb25zZShzZXJ2ZXJSZXNwb25zZSwgeGhyLCBlbHQpXG4gICAgICB9KVxuXG4gICAgICAvLyBTYXZlIGN1cnJlbnQgcGFnZSBpZiB0aGVyZSB3aWxsIGJlIGEgaGlzdG9yeSB1cGRhdGVcbiAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICAgIH1cbiAgICAgIHZhciBzd2FwU3BlYyA9IGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcE92ZXJyaWRlKVxuXG4gICAgICBpZiAoIXN3YXBTcGVjLmhhc093blByb3BlcnR5KCdpZ25vcmVUaXRsZScpKSB7XG4gICAgICAgIHN3YXBTcGVjLmlnbm9yZVRpdGxlID0gaWdub3JlVGl0bGVcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcblxuICAgICAgLy8gb3B0aW9uYWwgdHJhbnNpdGlvbiBBUEkgcHJvbWlzZSBjYWxsYmFja3NcbiAgICAgIGxldCBzZXR0bGVSZXNvbHZlID0gbnVsbFxuICAgICAgbGV0IHNldHRsZVJlamVjdCA9IG51bGxcblxuICAgICAgaWYgKHJlc3BvbnNlSW5mb1NlbGVjdCkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSW5mb1NlbGVjdFxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc2VsZWN0Oi9pKSkge1xuICAgICAgICBzZWxlY3RPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzZWxlY3QnKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzZWxlY3RPT0IgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0LW9vYicpXG4gICAgICBjb25zdCBzZWxlY3QgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc2VsZWN0JylcblxuICAgICAgbGV0IGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGlmIHdlIG5lZWQgdG8gc2F2ZSBoaXN0b3J5LCBkbyBzbywgYmVmb3JlIHN3YXBwaW5nIHNvIHRoYXQgcmVsYXRpdmUgcmVzb3VyY2VzIGhhdmUgdGhlIGNvcnJlY3QgYmFzZSBVUkxcbiAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5VXBkYXRlJywgbWVyZ2VPYmplY3RzKHsgaGlzdG9yeTogaGlzdG9yeVVwZGF0ZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgICAgIHB1c2hVcmxJbnRvSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnB1c2hlZEludG9IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcGxhY2VVcmxJbkhpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpyZXBsYWNlZEluSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3dhcCh0YXJnZXQsIHNlcnZlclJlc3BvbnNlLCBzd2FwU3BlYywge1xuICAgICAgICAgICAgc2VsZWN0OiBzZWxlY3RPdmVycmlkZSB8fCBzZWxlY3QsXG4gICAgICAgICAgICBzZWxlY3RPT0IsXG4gICAgICAgICAgICBldmVudEluZm86IHJlc3BvbnNlSW5mbyxcbiAgICAgICAgICAgIGFuY2hvcjogcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvcixcbiAgICAgICAgICAgIGNvbnRleHRFbGVtZW50OiBlbHQsXG4gICAgICAgICAgICBhZnRlclN3YXBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1Td2FwOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1Td2FwJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhZnRlclNldHRsZUNhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVNldHRsZTovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlJywgZmluYWxFbHQpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlc29sdmUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c3dhcEVycm9yJywgcmVzcG9uc2VJbmZvKVxuICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZWplY3QpXG4gICAgICAgICAgdGhyb3cgZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaG91bGRUcmFuc2l0aW9uID0gaHRteC5jb25maWcuZ2xvYmFsVmlld1RyYW5zaXRpb25zXG4gICAgICBpZiAoc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ3RyYW5zaXRpb24nKSkge1xuICAgICAgICBzaG91bGRUcmFuc2l0aW9uID0gc3dhcFNwZWMudHJhbnNpdGlvblxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkVHJhbnNpdGlvbiAmJlxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVUcmFuc2l0aW9uJywgcmVzcG9uc2VJbmZvKSAmJlxuICAgICAgICAgICAgICB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbikge1xuICAgICAgICBjb25zdCBzZXR0bGVQcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgICBzZXR0bGVSZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgICBzZXR0bGVSZWplY3QgPSBfcmVqZWN0XG4gICAgICAgIH0pXG4gICAgICAgIC8vIHdyYXAgdGhlIG9yaWdpbmFsIGRvU3dhcCgpIGluIGEgY2FsbCB0byBzdGFydFZpZXdUcmFuc2l0aW9uKClcbiAgICAgICAgY29uc3QgaW5uZXJEb1N3YXAgPSBkb1N3YXBcbiAgICAgICAgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZSBleHBlcmltZW50YWwgZmVhdHVyZSBhdG1cbiAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaW5uZXJEb1N3YXAoKVxuICAgICAgICAgICAgcmV0dXJuIHNldHRsZVByb21pc2VcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzd2FwU3BlYy5zd2FwRGVsYXkgPiAwKSB7XG4gICAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9Td2FwLCBzd2FwU3BlYy5zd2FwRGVsYXkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb1N3YXAoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNFcnJvcikge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpyZXNwb25zZUVycm9yJywgbWVyZ2VPYmplY3RzKHsgZXJyb3I6ICdSZXNwb25zZSBTdGF0dXMgRXJyb3IgQ29kZSAnICsgeGhyLnN0YXR1cyArICcgZnJvbSAnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlcXVlc3RQYXRoIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXh0ZW5zaW9ucyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogQHR5cGUge09iamVjdDxzdHJpbmcsIEh0bXhFeHRlbnNpb24+fSAqL1xuICBjb25zdCBleHRlbnNpb25zID0ge31cblxuICAvKipcbiAgICogZXh0ZW5zaW9uQmFzZSBkZWZpbmVzIHRoZSBkZWZhdWx0IGZ1bmN0aW9ucyBmb3IgYWxsIGV4dGVuc2lvbnMuXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9ufVxuICAgKi9cbiAgZnVuY3Rpb24gZXh0ZW5zaW9uQmFzZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW5pdDogZnVuY3Rpb24oYXBpKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBnZXRTZWxlY3RvcnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgb25FdmVudDogZnVuY3Rpb24obmFtZSwgZXZ0KSB7IHJldHVybiB0cnVlIH0sXG4gICAgICB0cmFuc2Zvcm1SZXNwb25zZTogZnVuY3Rpb24odGV4dCwgeGhyLCBlbHQpIHsgcmV0dXJuIHRleHQgfSxcbiAgICAgIGlzSW5saW5lU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgaGFuZGxlU3dhcDogZnVuY3Rpb24oc3dhcFN0eWxlLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7IHJldHVybiBmYWxzZSB9LFxuICAgICAgZW5jb2RlUGFyYW1ldGVyczogZnVuY3Rpb24oeGhyLCBwYXJhbWV0ZXJzLCBlbHQpIHsgcmV0dXJuIG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBkZWZpbmVFeHRlbnNpb24gaW5pdGlhbGl6ZXMgdGhlIGV4dGVuc2lvbiBhbmQgYWRkcyBpdCB0byB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNkZWZpbmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGV4dGVuc2lvbiBuYW1lXG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbn0gZXh0ZW5zaW9uIHRoZSBleHRlbnNpb24gZGVmaW5pdGlvblxuICAgKi9cbiAgZnVuY3Rpb24gZGVmaW5lRXh0ZW5zaW9uKG5hbWUsIGV4dGVuc2lvbikge1xuICAgIGlmIChleHRlbnNpb24uaW5pdCkge1xuICAgICAgZXh0ZW5zaW9uLmluaXQoaW50ZXJuYWxBUEkpXG4gICAgfVxuICAgIGV4dGVuc2lvbnNbbmFtZV0gPSBtZXJnZU9iamVjdHMoZXh0ZW5zaW9uQmFzZSgpLCBleHRlbnNpb24pXG4gIH1cblxuICAvKipcbiAgICogcmVtb3ZlRXh0ZW5zaW9uIHJlbW92ZXMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jcmVtb3ZlRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFeHRlbnNpb24obmFtZSkge1xuICAgIGRlbGV0ZSBleHRlbnNpb25zW25hbWVdXG4gIH1cblxuICAvKipcbiAgICogZ2V0RXh0ZW5zaW9ucyBzZWFyY2hlcyB1cCB0aGUgRE9NIHRyZWUgdG8gcmV0dXJuIGFsbCBleHRlbnNpb25zIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEV4dGVuc2lvbltdPX0gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAqIEBwYXJhbSB7c3RyaW5nW109fSBleHRlbnNpb25zVG9JZ25vcmVcbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEV4dGVuc2lvbnMoZWx0LCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSkge1xuICAgIGlmIChleHRlbnNpb25zVG9SZXR1cm4gPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9SZXR1cm4gPSBbXVxuICAgIH1cbiAgICBpZiAoZWx0ID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGV4dGVuc2lvbnNUb1JldHVyblxuICAgIH1cbiAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlID0gW11cbiAgICB9XG4gICAgY29uc3QgZXh0ZW5zaW9uc0ZvckVsZW1lbnQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1leHQnKVxuICAgIGlmIChleHRlbnNpb25zRm9yRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChleHRlbnNpb25zRm9yRWxlbWVudC5zcGxpdCgnLCcpLCBmdW5jdGlvbihleHRlbnNpb25OYW1lKSB7XG4gICAgICAgIGV4dGVuc2lvbk5hbWUgPSBleHRlbnNpb25OYW1lLnJlcGxhY2UoLyAvZywgJycpXG4gICAgICAgIGlmIChleHRlbnNpb25OYW1lLnNsaWNlKDAsIDcpID09ICdpZ25vcmU6Jykge1xuICAgICAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZS5wdXNoKGV4dGVuc2lvbk5hbWUuc2xpY2UoNykpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZS5pbmRleE9mKGV4dGVuc2lvbk5hbWUpIDwgMCkge1xuICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZXh0ZW5zaW9uTmFtZV1cbiAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmIGV4dGVuc2lvbnNUb1JldHVybi5pbmRleE9mKGV4dGVuc2lvbikgPCAwKSB7XG4gICAgICAgICAgICBleHRlbnNpb25zVG9SZXR1cm4ucHVzaChleHRlbnNpb24pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gZ2V0RXh0ZW5zaW9ucyhhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBleHRlbnNpb25zVG9SZXR1cm4sIGV4dGVuc2lvbnNUb0lnbm9yZSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEluaXRpYWxpemF0aW9uXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIHZhciBpc1JlYWR5ID0gZmFsc2VcbiAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZnVuY3Rpb24oKSB7XG4gICAgaXNSZWFkeSA9IHRydWVcbiAgfSlcblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGZ1bmN0aW9uIG5vdyBpZiBET01Db250ZW50TG9hZGVkIGhhcyBmaXJlZCwgb3RoZXJ3aXNlIGxpc3RlbiBmb3IgaXQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gdXNlcyBpc1JlYWR5IGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVsaWFibGUgd2F5IHRvIGFzayB0aGUgYnJvd3NlciB3aGV0aGVyXG4gICAqIHRoZSBET01Db250ZW50TG9hZGVkIGV2ZW50IGhhcyBhbHJlYWR5IGJlZW4gZmlyZWQ7IHRoZXJlJ3MgYSBnYXAgYmV0d2VlbiBET01Db250ZW50TG9hZGVkXG4gICAqIGZpcmluZyBhbmQgcmVhZHlzdGF0ZT1jb21wbGV0ZS5cbiAgICovXG4gIGZ1bmN0aW9uIHJlYWR5KGZuKSB7XG4gICAgLy8gQ2hlY2tpbmcgcmVhZHlTdGF0ZSBoZXJlIGlzIGEgZmFpbHNhZmUgaW4gY2FzZSB0aGUgaHRteCBzY3JpcHQgdGFnIGVudGVyZWQgdGhlIERPTSBieVxuICAgIC8vIHNvbWUgbWVhbnMgb3RoZXIgdGhhbiB0aGUgaW5pdGlhbCBwYWdlIGxvYWQuXG4gICAgaWYgKGlzUmVhZHkgfHwgZ2V0RG9jdW1lbnQoKS5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gICAgICBmbigpXG4gICAgfSBlbHNlIHtcbiAgICAgIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZuKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGluc2VydEluZGljYXRvclN0eWxlcygpIHtcbiAgICBpZiAoaHRteC5jb25maWcuaW5jbHVkZUluZGljYXRvclN0eWxlcyAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG5vbmNlQXR0cmlidXRlID0gaHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZSA/IGAgbm9uY2U9XCIke2h0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2V9XCJgIDogJydcbiAgICAgIGdldERvY3VtZW50KCkuaGVhZC5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsXG4gICAgICAgICc8c3R5bGUnICsgbm9uY2VBdHRyaWJ1dGUgKyAnPlxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjB9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJyAuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcucmVxdWVzdENsYXNzICsgJy4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgPC9zdHlsZT4nKVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE1ldGFDb25maWcoKSB7XG4gICAgLyoqIEB0eXBlIEhUTUxNZXRhRWxlbWVudCAqL1xuICAgIGNvbnN0IGVsZW1lbnQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImh0bXgtY29uZmlnXCJdJylcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgcmV0dXJuIHBhcnNlSlNPTihlbGVtZW50LmNvbnRlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VNZXRhQ29uZmlnKCkge1xuICAgIGNvbnN0IG1ldGFDb25maWcgPSBnZXRNZXRhQ29uZmlnKClcbiAgICBpZiAobWV0YUNvbmZpZykge1xuICAgICAgaHRteC5jb25maWcgPSBtZXJnZU9iamVjdHMoaHRteC5jb25maWcsIG1ldGFDb25maWcpXG4gICAgfVxuICB9XG5cbiAgLy8gaW5pdGlhbGl6ZSB0aGUgZG9jdW1lbnRcbiAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgbWVyZ2VNZXRhQ29uZmlnKClcbiAgICBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKVxuICAgIGxldCBib2R5ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgcHJvY2Vzc05vZGUoYm9keSlcbiAgICBjb25zdCByZXN0b3JlZEVsdHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICBcIltoeC10cmlnZ2VyPSdyZXN0b3JlZCddLFtkYXRhLWh4LXRyaWdnZXI9J3Jlc3RvcmVkJ11cIlxuICAgIClcbiAgICBib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWJvcnQnLCBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXRcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YSh0YXJnZXQpXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhICYmIGludGVybmFsRGF0YS54aHIpIHtcbiAgICAgICAgaW50ZXJuYWxEYXRhLnhoci5hYm9ydCgpXG4gICAgICB9XG4gICAgfSlcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIGNvbnN0IG9yaWdpbmFsUG9wc3RhdGUgPSB3aW5kb3cub25wb3BzdGF0ZSA/IHdpbmRvdy5vbnBvcHN0YXRlLmJpbmQod2luZG93KSA6IG51bGxcbiAgICAvKiogQHR5cGUgeyhldjogUG9wU3RhdGVFdmVudCkgPT4gYW55fSAqL1xuICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5zdGF0ZSAmJiBldmVudC5zdGF0ZS5odG14KSB7XG4gICAgICAgIHJlc3RvcmVIaXN0b3J5KClcbiAgICAgICAgZm9yRWFjaChyZXN0b3JlZEVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnJlc3RvcmVkJywge1xuICAgICAgICAgICAgZG9jdW1lbnQ6IGdldERvY3VtZW50KCksXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnRcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9yaWdpbmFsUG9wc3RhdGUpIHtcbiAgICAgICAgICBvcmlnaW5hbFBvcHN0YXRlKGV2ZW50KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoYm9keSwgJ2h0bXg6bG9hZCcsIHt9KSAvLyBnaXZlIHJlYWR5IGhhbmRsZXJzIGEgY2hhbmNlIHRvIGxvYWQgdXAgYmVmb3JlIGZpcmluZyB0aGlzIGV2ZW50XG4gICAgICBib2R5ID0gbnVsbCAvLyBraWxsIHJlZmVyZW5jZSBmb3IgZ2NcbiAgICB9LCAwKVxuICB9KVxuXG4gIHJldHVybiBodG14XG59KSgpXG5cbi8qKiBAdHlwZWRlZiB7J2dldCd8J2hlYWQnfCdwb3N0J3wncHV0J3wnZGVsZXRlJ3wnY29ubmVjdCd8J29wdGlvbnMnfCd0cmFjZSd8J3BhdGNoJ30gSHR0cFZlcmIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTd2FwT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdE9PQl1cbiAqIEBwcm9wZXJ0eSB7Kn0gW2V2ZW50SW5mb11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYW5jaG9yXVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbY29udGV4dEVsZW1lbnRdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU3dhcENhbGxiYWNrXVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclNldHRsZUNhbGxiYWNrXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHN3YXBDYWxsYmFja1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeydpbm5lckhUTUwnIHwgJ291dGVySFRNTCcgfCAnYmVmb3JlYmVnaW4nIHwgJ2FmdGVyYmVnaW4nIHwgJ2JlZm9yZWVuZCcgfCAnYWZ0ZXJlbmQnIHwgJ2RlbGV0ZScgfCAnbm9uZScgfCBzdHJpbmd9IEh0bXhTd2FwU3R5bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEh0bXhTd2FwU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzd2FwRGVsYXlcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzZXR0bGVEZWxheVxuICogQHByb3BlcnR5IHtib29sZWFufSBbdHJhbnNpdGlvbl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtoZWFkXVxuICogQHByb3BlcnR5IHsndG9wJyB8ICdib3R0b20nfSBbc2Nyb2xsXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY3JvbGxUYXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3ddXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Nob3dUYXJnZXRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmb2N1c1Njcm9sbF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKHRoaXM6Tm9kZSwgZXZ0OkV2ZW50KSA9PiBib29sZWFuKSAmIHtzb3VyY2U6IHN0cmluZ319IENvbmRpdGlvbmFsRnVuY3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9sbEludGVydmFsXVxuICogQHByb3BlcnR5IHtDb25kaXRpb25hbEZ1bmN0aW9ufSBbZXZlbnRGaWx0ZXJdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjaGFuZ2VkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbb25jZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnN1bWVdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9tXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Rocm90dGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtxdWV1ZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9vdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGhyZXNob2xkXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tlbHQ6IEVsZW1lbnQsIG1lc3NhZ2U6IHN0cmluZywgdmFsaWRpdHk6IFZhbGlkaXR5U3RhdGV9fSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gSFgtUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlclxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVHJpZ2dlci1OYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UYXJnZXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBIWC1DdXJyZW50LVVSTFxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtIWC1Qcm9tcHRdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUJvb3N0ZWRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0NvbnRlbnQtVHlwZV1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtSGlzdG9yeS1SZXN0b3JlLVJlcXVlc3RdXG4gKi9cblxuLyoqIEB0eXBlZGVmIEh0bXhBamF4SGVscGVyQ29udGV4dFxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3NvdXJjZV1cbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IFtldmVudF1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdXNlVXJsUGFyYW1zXG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHBhcmFtZXRlcnMgZm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IHVuZmlsdGVyZWRGb3JtRGF0YVxuICogQHByb3BlcnR5IHtPYmplY3R9IHVuZmlsdGVyZWRQYXJhbWV0ZXJzIHVuZmlsdGVyZWRGb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtIdG14SGVhZGVyU3BlY2lmaWNhdGlvbn0gaGVhZGVyc1xuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHR0cFZlcmJ9IHZlcmJcbiAqIEBwcm9wZXJ0eSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHdpdGhDcmVkZW50aWFsc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoXG4gKiBAcHJvcGVydHkge0V2ZW50fSB0cmlnZ2VyaW5nRXZlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUluZm9cbiAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICogQHByb3BlcnR5IHtFbGVtZW50fSB0YXJnZXRcbiAqIEBwcm9wZXJ0eSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhFdGN9IGV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc2VsZWN0XG4gKiBAcHJvcGVydHkge3tyZXF1ZXN0UGF0aDogc3RyaW5nLCBmaW5hbFJlcXVlc3RQYXRoOiBzdHJpbmcsIHJlc3BvbnNlUGF0aDogc3RyaW5nfG51bGwsIGFuY2hvcjogc3RyaW5nfX0gcGF0aEluZm9cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZhaWxlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3N1Y2Nlc3NmdWxdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtrZWVwSW5kaWNhdG9yc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhBamF4RXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXR1cm5Qcm9taXNlXVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFt0YXJnZXRPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2RlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBzd2FwXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlcnJvcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2lnbm9yZVRpdGxlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtldmVudF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIdG14UmVzcG9uc2VJbmZvICYge3Nob3VsZFN3YXA6IGJvb2xlYW4sIHNlcnZlclJlc3BvbnNlOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4sIGlnbm9yZVRpdGxlOiBib29sZWFuLCBzZWxlY3RPdmVycmlkZTpzdHJpbmd9fSBIdG14QmVmb3JlU3dhcERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIdG14QWpheEhhbmRsZXJcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygoKSA9PiB2b2lkKX0gSHRteFNldHRsZVRhc2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhTZXR0bGVJbmZvXG4gKiBAcHJvcGVydHkge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gKiBAcHJvcGVydHkge0VsZW1lbnRbXX0gZWx0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aXRsZV1cbiAqL1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgtZXh0ZW5zaW9ucy9ibG9iL21haW4vUkVBRE1FLm1kXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14RXh0ZW5zaW9uXG4gKiBAcHJvcGVydHkgeyhhcGk6IGFueSkgPT4gdm9pZH0gaW5pdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCBldmVudDogRXZlbnR8Q3VzdG9tRXZlbnQpID0+IGJvb2xlYW59IG9uRXZlbnRcbiAqIEBwcm9wZXJ0eSB7KHRleHQ6IHN0cmluZywgeGhyOiBYTUxIdHRwUmVxdWVzdCwgZWx0OiBFbGVtZW50KSA9PiBzdHJpbmd9IHRyYW5zZm9ybVJlc3BvbnNlXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUpID0+IGJvb2xlYW59IGlzSW5saW5lU3dhcFxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlLCB0YXJnZXQ6IE5vZGUsIGZyYWdtZW50OiBOb2RlLCBzZXR0bGVJbmZvOiBIdG14U2V0dGxlSW5mbykgPT4gYm9vbGVhbnxOb2RlW119IGhhbmRsZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHhocjogWE1MSHR0cFJlcXVlc3QsIHBhcmFtZXRlcnM6IEZvcm1EYXRhLCBlbHQ6IE5vZGUpID0+ICp8c3RyaW5nfG51bGx9IGVuY29kZVBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW118bnVsbH0gZ2V0U2VsZWN0b3JzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGh0bXhcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBkZXBlbmRzT24ocGF0aFNwZWM6IGFueSwgdXJsOiBzdHJpbmcpIHtcbiAgaWYgKHBhdGhTcGVjID09PSBcImlnbm9yZVwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGRlcGVuZGVuY3lQYXRoID0gcGF0aFNwZWMuc3BsaXQoXCIvXCIpO1xuICBjb25zdCB1cmxQYXRoID0gdXJsLnNwbGl0KFwiL1wiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cmxQYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVwZW5kZW5jeUVsZW1lbnQgPSBkZXBlbmRlbmN5UGF0aC5zaGlmdCgpO1xuICAgIGNvbnN0IHBhdGhFbGVtZW50ID0gdXJsUGF0aFtpXTtcbiAgICBpZiAoZGVwZW5kZW5jeUVsZW1lbnQgIT09IHBhdGhFbGVtZW50ICYmIGRlcGVuZGVuY3lFbGVtZW50ICE9PSBcIipcIikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChkZXBlbmRlbmN5UGF0aC5sZW5ndGggPT09IDEgJiYgZGVwZW5kZW5jeVBhdGhbMF0gPT09IFwiXCIpXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiByZWZyZXNoUGF0aChwYXRoOiBzdHJpbmcpIHtcbiAgY29uc3QgZWx0c1dpdGhEZXBzID0gaHRteC5maW5kQWxsKFwiW3BhdGgtZGVwc11cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0c1dpdGhEZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZWx0ID0gZWx0c1dpdGhEZXBzW2ldO1xuICAgIGlmIChkZXBlbmRzT24oZWx0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSwgcGF0aCkpIHtcbiAgICAgIGh0bXgudHJpZ2dlcihlbHQsIFwicGF0aC1kZXBzXCIsIG51bGwpO1xuICAgIH1cbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInBhdGgtZGVwc1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmJlZm9yZU9uTG9hZFwiKSB7XG4gICAgICBjb25zdCBjb25maWcgPSBldnQuZGV0YWlsLnJlcXVlc3RDb25maWc7XG4gICAgICAvLyBtdXRhdGluZyBjYWxsXG4gICAgICBpZiAoXG4gICAgICAgIGNvbmZpZyAmJlxuICAgICAgICBjb25maWcudmVyYiAhPT0gXCJnZXRcIiAmJlxuICAgICAgICBldnQudGFyZ2V0ICE9IG51bGwgJiZcbiAgICAgICAgZXZ0LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiZcbiAgICAgICAgZXZ0LnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIikgIT09IFwiaWdub3JlXCJcbiAgICAgICkge1xuICAgICAgICByZWZyZXNoUGF0aChjb25maWcucGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbn1cblxuY29uc3QgaWdub3JlZEV2ZW50cyA9IFsnaHRteDpiZWZvcmVQcm9jZXNzTm9kZScsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCAnaHRteDpiZWZvcmVTd2FwJywgJ2h0bXg6YWZ0ZXJTd2FwJywgJ2h0bXg6YmVmb3JlT25Mb2FkJywgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCAnaHRteDpjb25maWdSZXF1ZXN0JywgJ2h0bXg6Y29uZmlnUmVzcG9uc2UnLCAnaHRteDpyZXNwb25zZUVycm9yJ107XG5cbmZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWU6IHN0cmluZywgZGV0YWlsOiBhbnkpIHtcbiAgICBsZXQgZXZ0XG4gICAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiB0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChldmVudE5hbWUsIHsgYnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgICBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgICBldnQuaW5pdEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgdHJ1ZSwgdHJ1ZSwgZGV0YWlsKVxuICAgIH1cbiAgICByZXR1cm4gZXZ0XG59XG5cbmZ1bmN0aW9uIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQ6IEhUTUxFbGVtZW50LCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDdXN0b21FdmVudCwgdHJpZ2dlcmVkOiBTZXQ8SFRNTEVsZW1lbnQ+KSB7XG4gICAgaWYoaWdub3JlZEV2ZW50cy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2hpbGRyZW4pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0YXJnZXQuY2hpbGRyZW4pLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtlaGFiID0ga2ViYWJFdmVudE5hbWUobmFtZSk7XG4gICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZWhhYi5yZXBsYWNlKFwiaHRteDpcIiwgXCJoeC1vbjo6XCIpXG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJlZC5oYXMoZSBhcyBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBpZihlLmhhc0F0dHJpYnV0ZShldmVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5ldmVudC5kZXRhaWwsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIG5ld0V2ZW50LmRldGFpbC5tZXRhID0gJ3RyaWdnZXItY2hpbGRyZW4nXG4gICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8vIEB0cy1pZ25vcmVcbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5pbXBvcnQge2FkZFdzRXZlbnRIYW5kbGVyc30gZnJvbSBcIi4vd3MtZXZlbnQtaGFuZGxlclwiO1xuXG5sZXQgYXBpIDogYW55ID0gbnVsbDtcbmxldCBwcm9jZXNzZWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuZXhwb3J0IGxldCB3czogV2ViU29ja2V0IHwgbnVsbCA9IG51bGw7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwid3NcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1t3cy1jb25uZWN0XScpO1xuICAgICAgICAgICAgZm9yIChsZXQgZWxlbWVudCBvZiBBcnJheS5mcm9tKGVsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwid3MtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdFdzKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gZXhwb25lbnRpYWxCYWNrb2ZmKGF0dGVtcHQ6IG51bWJlciwgYmFzZURlbGF5ID0gMTAwLCBtYXhEZWxheSA9IDEwMDAwKSB7XG4gICAgLy8gRXhwb25lbnRpYWwgYmFja29mZjogYmFzZURlbGF5ICogKDIgXiBhdHRlbXB0KSB3aXRoIGppdHRlclxuICAgIGNvbnN0IGppdHRlciA9IE1hdGgucmFuZG9tKCk7IC8vIEFkZGluZyByYW5kb21uZXNzIHRvIHByZXZlbnQgY29sbGlzaW9uc1xuICAgIHJldHVybiBNYXRoLm1pbihiYXNlRGVsYXkgKiBNYXRoLnBvdygyLCBhdHRlbXB0KSAqIGppdHRlciwgbWF4RGVsYXkpO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0V3MoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZywgYXR0ZW1wdDogbnVtYmVyID0gMCkge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmKCF1cmwuc3RhcnRzV2l0aCgnd3M6Ly8nKSAmJiAhdXJsLnN0YXJ0c1dpdGgoJ3dzczovLycpKSB7XG4gICAgICAgIGNvbnN0IGlzU2VjdXJlID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6J1xuICAgICAgICB1cmwgPSAoaXNTZWN1cmUgPyAnd3NzOi8vJyA6ICd3czovLycpICsgd2luZG93LmxvY2F0aW9uLmhvc3QgKyB1cmxcbiAgICB9XG4gICAgY29uc29sZS5pbmZvKCdjb25uZWN0aW5nIHRvIHdzJywgdXJsKVxuICAgIHdzID0gbmV3IFdlYlNvY2tldCh1cmwpO1xuXG4gICAgd3MuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c0Nsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgY29uc3QgZGVsYXkgPSBleHBvbmVudGlhbEJhY2tvZmYoYXR0ZW1wdCk7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgd3MgY2xvc2VkLCByZWNvbm5lY3RpbmcgaW4gJHtkZWxheX1tc2ApXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29ubmVjdFdzKGVsZSwgdXJsLCBhdHRlbXB0ICsgMSlcbiAgICAgICAgfSwgZGVsYXkpXG4gICAgfSlcblxuICAgIHdzLmFkZEV2ZW50TGlzdGVuZXIoXCJvcGVuXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c09wZW5cIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzRXJyb3JcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICB3cy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBjb25zb2xlLmRlYnVnKCd3cyBtZXNzYWdlOicsIGV2ZW50LmRhdGEpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OndzQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDp3c0FmdGVyTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIHJldHVybiB3c1xufVxuIiwiaW1wb3J0IHt3c30gZnJvbSBcIi4vd3NcIjtcblxud2luZG93Lm9ubG9hZCA9IGFkZFdzRXZlbnRIYW5kbGVycztcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFdzRXZlbnRIYW5kbGVycygpIHtcbiAgICBjb25zb2xlLmxvZygnYWRkIHdzIGV2ZW50IGhhbmRsZXJzJylcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKHJlZ2lzdGVyKVxuICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pXG5cbiAgICBsZXQgYWRkZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZ1bmN0aW9uIHJlZ2lzdGVyKCkge1xuICAgICAgICBsZXQgaWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1oYW5kbGVyLWlkXVwiKS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtaGFuZGxlci1pZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWhhbmRsZXItZXZlbnRcIik7XG5cbiAgICAgICAgICAgIGlmKGlkID09IG51bGwgfHwgZXZlbnQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWRzLmFkZChpZCk7XG4gICAgICAgICAgICBpZiAoYWRkZWQuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZGVkLmFkZChpZCk7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3NlbmRpbmcgZXZlbnQnLCBpZCwgZXZlbnQsIHdzKVxuICAgICAgICAgICAgICAgIGlmKHdzICE9IG51bGwgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgICAgICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7aWQsIGV2ZW50fSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICBmb3IgKGxldCBpZCBvZiBhZGRlZCkge1xuICAgICAgICAgICAgaWYgKCFpZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgICAgIGFkZGVkLmRlbGV0ZShpZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ3NpemUnLCBhZGRlZC5zaXplKVxuICAgIH1cblxuICAgIHJlZ2lzdGVyKClcbn1cblxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3BhdGhkZXBzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3RyaWdnZXItY2hpbGRyZW5cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvZGVidWdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcmVzcG9uc2UtdGFyZ2V0c1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9tdXRhdGlvbi1lcnJvclwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkXCJcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvaHRtZ29cIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvd3NcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy93cy1ldmVudC1oYW5kbGVyXCJcblxuLy8gQHRzLWlnbm9yZVxud2luZG93Lmh0bXggPSBodG14O1xuXG5mdW5jdGlvbiB3YXRjaFVybChjYWxsYmFjazogKG9sZFVybDogc3RyaW5nLCBuZXdVcmw6IHN0cmluZykgPT4gdm9pZCkge1xuICBsZXQgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmICE9PSBsYXN0VXJsKSB7XG4gICAgICBjYWxsYmFjayhsYXN0VXJsLCB3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgfVxuICB9LCAxMDApO1xufVxuXG53YXRjaFVybCgoXywgbmV3VXJsKSA9PiB7XG4gIG9uVXJsQ2hhbmdlKG5ld1VybCk7XG59KTtcblxuZnVuY3Rpb24gb25VcmxDaGFuZ2UobmV3VXJsOiBzdHJpbmcpIHtcbiAgbGV0IHVybCA9IG5ldyBVUkwobmV3VXJsKTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LXRyaWdnZXJdXCIpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtdHJpZ2dlclwiKTtcbiAgICBpZiAoIXRyaWdnZXJzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHNwbGl0ID0gdHJpZ2dlcnMuc3BsaXQoXCIsIFwiKTtcbiAgICBpZiAoc3BsaXQuZmluZCgocykgPT4gcyA9PT0gXCJ1cmxcIikpIHtcbiAgICAgIGh0bXguc3dhcChlbGVtZW50LCBcInVybFwiLCB7XG4gICAgICAgIHN3YXBTdHlsZTogXCJvdXRlckhUTUxcIixcbiAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZXNdIG9mIHVybC5zZWFyY2hQYXJhbXMpIHtcbiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IFwicXM6XCIgKyBrZXk7XG4gICAgICAgIGlmICh0cmlnZ2Vycy5pbmNsdWRlcyhldmVudE5hbWUpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJ0cmlnZ2VyaW5nXCIsIGV2ZW50TmFtZSk7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIGV2ZW50TmFtZSwgbnVsbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtbWF0Y2gtcXBdXCIpLmZvckVhY2goKGVsKSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID0gZmFsc2U7XG4gICAgZm9yIChsZXQgbmFtZSBvZiBlbC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7XG4gICAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIikpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gbmFtZS5yZXBsYWNlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiwgXCJcIik7XG4gICAgICAgIGxldCB2YWx1ZSA9IHVybC5zZWFyY2hQYXJhbXMuZ2V0KG1hdGNoKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgaHRteC5zd2FwKGVsLCBlbC5nZXRBdHRyaWJ1dGUobmFtZSkgPz8gXCJcIiwge1xuICAgICAgICAgICAgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLFxuICAgICAgICAgICAgc3dhcERlbGF5OiAwLFxuICAgICAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzTWF0Y2gpIHtcbiAgICAgIGxldCBkZWZhdWx0S2V5ID0gZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtZGVmYXVsdFwiKTtcbiAgICAgIGlmIChkZWZhdWx0S2V5KSB7XG4gICAgICAgIGh0bXguc3dhcChcbiAgICAgICAgICBlbCxcbiAgICAgICAgICBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiICsgZGVmYXVsdEtleSkgPz8gXCJcIixcbiAgICAgICAgICB7IHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIiwgc3dhcERlbGF5OiAwLCBzZXR0bGVEZWxheTogMCB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG4iXX0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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cUJBQXFCLENBQ2xEc1YsQ0FBQUEsQ0FBQUEsRUFDRjFDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCc1YsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmJlZm9yZVN3YXAnLCAnaHRteDphZnRlclN3YXAnLCAnaHRteDpiZWZvcmVPbkxvYWQnLCAnaHRteDphZnRlck9uTG9hZCcsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gQHRzLWlnbm9yZVxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJzc2VcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzc2UtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNzZS1jb25uZWN0XCIpITtcbiAgICAgICAgICAgICAgICBpZih1cmwgJiYgIXByb2Nlc3NlZC5oYXModXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0RXZlbnRTb3VyY2UoZWxlbWVudCwgdXJsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYWRkKHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuXG5mdW5jdGlvbiBjb25uZWN0RXZlbnRTb3VyY2UoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnQ29ubmVjdGluZyB0byBFdmVudFNvdXJjZScsIHVybClcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIGV2ZW50U291cmNlLm9ub3BlbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhlbGUpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index b2feebb2..29cb7091 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -6,8 +6,7 @@ import "./htmxextensions/response-targets"; import "./htmxextensions/mutation-error"; import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; -import "./htmxextensions/ws" -import "./htmxextensions/ws-event-handler" +import "./htmxextensions/sse" // @ts-ignore window.htmx = htmx; diff --git a/framework/assets/js/htmxextensions/sse.ts b/framework/assets/js/htmxextensions/sse.ts new file mode 100644 index 00000000..b4b7a19e --- /dev/null +++ b/framework/assets/js/htmxextensions/sse.ts @@ -0,0 +1,72 @@ +import htmx from 'htmx.org' +import {removeAssociatedScripts} from "./htmgo"; + +let api : any = null; +let processed = new Set() + +htmx.defineExtension("sse", { + init: function (apiRef) { + api = apiRef; + }, + // @ts-ignore + onEvent: function (name, evt) { + const target = evt.target; + if(!(target instanceof HTMLElement)) { + return + } + + if(name === 'htmx:beforeCleanupElement') { + removeAssociatedScripts(target); + } + + if(name === 'htmx:beforeProcessNode') { + const elements = document.querySelectorAll('[sse-connect]'); + for (let element of Array.from(elements)) { + const url = element.getAttribute("sse-connect")!; + if(url && !processed.has(url)) { + connectEventSource(element, url) + processed.add(url) + } + } + } + } +}) + +function connectEventSource(ele: Element, url: string) { + if(!url) { + return + } + console.info('Connecting to EventSource', url) + const eventSource = new EventSource(url); + + eventSource.addEventListener("close", function(event) { + htmx.trigger(ele, "htmx:sseClose", {event: event}); + }) + + eventSource.onopen = function(event) { + htmx.trigger(ele, "htmx:sseOpen", {event: event}); + } + + eventSource.onerror = function(event) { + htmx.trigger(ele, "htmx:sseError", {event: event}); + if (eventSource.readyState == EventSource.CLOSED) { + htmx.trigger(ele, "htmx:sseClose", {event: event}); + } + } + + eventSource.onmessage = function(event) { + const settleInfo = api.makeSettleInfo(ele); + htmx.trigger(ele, "htmx:sseBeforeMessage", {event: event}); + const response = event.data + const fragment = api.makeFragment(response) as DocumentFragment; + const children = Array.from(fragment.children); + for (let child of children) { + api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, settleInfo); + // support htmgo eval__ scripts + if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { + document.body.appendChild(child); + } + } + htmx.trigger(ele, "htmx:sseAfterMessage", {event: event}); + } +} diff --git a/framework/assets/js/htmxextensions/ws-event-handler.ts b/framework/assets/js/htmxextensions/ws-event-handler.ts deleted file mode 100644 index 29cd4e36..00000000 --- a/framework/assets/js/htmxextensions/ws-event-handler.ts +++ /dev/null @@ -1,44 +0,0 @@ -import {ws} from "./ws"; - -window.onload = addWsEventHandlers; - -export function addWsEventHandlers() { - console.log('add ws event handlers') - const observer = new MutationObserver(register) - observer.observe(document.body, {childList: true, subtree: true}) - - let added = new Set(); - - function register() { - let ids = new Set(); - document.querySelectorAll("[data-handler-id]").forEach(element => { - const id = element.getAttribute("data-handler-id"); - const event = element.getAttribute("data-handler-event"); - - if(id == null || event == null) { - return; - } - - ids.add(id); - if (added.has(id)) { - return; - } - added.add(id); - element.addEventListener(event, (e) => { - console.log('sending event', id, event, ws) - if(ws != null && ws.readyState === WebSocket.OPEN) { - ws.send(JSON.stringify({id, event})); - } - }); - }) - for (let id of added) { - if (!ids.has(id)) { - added.delete(id); - } - } - console.log('size', added.size) - } - - register() -} - diff --git a/framework/assets/js/htmxextensions/ws.ts b/framework/assets/js/htmxextensions/ws.ts deleted file mode 100644 index 4c35837f..00000000 --- a/framework/assets/js/htmxextensions/ws.ts +++ /dev/null @@ -1,89 +0,0 @@ -import htmx from 'htmx.org' -import {removeAssociatedScripts} from "./htmgo"; -import {addWsEventHandlers} from "./ws-event-handler"; - -let api : any = null; -let processed = new Set() -export let ws: WebSocket | null = null; - -htmx.defineExtension("ws", { - init: function (apiRef) { - api = apiRef; - }, - // @ts-ignore - onEvent: function (name, evt) { - const target = evt.target; - if(!(target instanceof HTMLElement)) { - return - } - - if(name === 'htmx:beforeCleanupElement') { - removeAssociatedScripts(target); - } - - if(name === 'htmx:beforeProcessNode') { - const elements = document.querySelectorAll('[ws-connect]'); - for (let element of Array.from(elements)) { - const url = element.getAttribute("ws-connect")!; - if(url && !processed.has(url)) { - connectWs(element, url) - processed.add(url) - } - } - } - } -}) - -function exponentialBackoff(attempt: number, baseDelay = 100, maxDelay = 10000) { - // Exponential backoff: baseDelay * (2 ^ attempt) with jitter - const jitter = Math.random(); // Adding randomness to prevent collisions - return Math.min(baseDelay * Math.pow(2, attempt) * jitter, maxDelay); -} - -function connectWs(ele: Element, url: string, attempt: number = 0) { - if(!url) { - return - } - if(!url.startsWith('ws://') && !url.startsWith('wss://')) { - const isSecure = window.location.protocol === 'https:' - url = (isSecure ? 'wss://' : 'ws://') + window.location.host + url - } - console.info('connecting to ws', url) - ws = new WebSocket(url); - - ws.addEventListener("close", function(event) { - htmx.trigger(ele, "htmx:wsClose", {event: event}); - const delay = exponentialBackoff(attempt); - console.info(`ws closed, reconnecting in ${delay}ms`) - setTimeout(() => { - connectWs(ele, url, attempt + 1) - }, delay) - }) - - ws.addEventListener("open", function(event) { - htmx.trigger(ele, "htmx:wsOpen", {event: event}); - }) - - ws.addEventListener("error", function(event) { - htmx.trigger(ele, "htmx:wsError", {event: event}); - }) - - ws.addEventListener("message", function(event) { - console.debug('ws message:', event.data) - const settleInfo = api.makeSettleInfo(ele); - htmx.trigger(ele, "htmx:wsBeforeMessage", {event: event}); - const response = event.data - const fragment = api.makeFragment(response) as DocumentFragment; - const children = Array.from(fragment.children); - for (let child of children) { - api.oobSwap(api.getAttributeValue(child, 'hx-swap-oob') || 'true', child, settleInfo); - // support htmgo eval__ scripts - if(child.tagName === 'SCRIPT' && child.id.startsWith("__eval")) { - document.body.appendChild(child); - } - } - htmx.trigger(ele, "htmx:wsAfterMessage", {event: event}); - }) - - return ws -} diff --git a/framework/assets/js/util/dom.ts b/framework/assets/js/util/dom.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/framework/h/extensions.go b/framework/h/extensions.go index 52cbe129..8eda90d4 100644 --- a/framework/h/extensions.go +++ b/framework/h/extensions.go @@ -3,7 +3,7 @@ package h import "strings" func BaseExtensions() string { - extensions := []string{"path-deps", "response-targets", "mutation-error", "htmgo", "sse", "ws"} + extensions := []string{"path-deps", "response-targets", "mutation-error", "htmgo", "sse"} if IsDevelopment() { extensions = append(extensions, "livereload") } diff --git a/framework/h/header.go b/framework/h/header.go index ed13f9a0..aba7c0af 100644 --- a/framework/h/header.go +++ b/framework/h/header.go @@ -16,7 +16,7 @@ func PushUrlHeader(url string) *Headers { } func PushQsHeader(ctx *RequestContext, qs *Qs) *Headers { - parsed, err := url.Parse(ctx.CurrentBrowserUrl) + parsed, err := url.Parse(ctx.currentBrowserUrl) if err != nil { return NewHeaders() } diff --git a/framework/h/qs.go b/framework/h/qs.go index a7cfb3ed..75fad83b 100644 --- a/framework/h/qs.go +++ b/framework/h/qs.go @@ -51,7 +51,7 @@ func (q *Qs) ToString() string { func GetQueryParam(ctx *RequestContext, key string) string { value, ok := ctx.Request.URL.Query()[key] if value == nil || !ok { - current := ctx.CurrentBrowserUrl + current := ctx.currentBrowserUrl if current != "" { u, err := url.Parse(current) if err == nil { diff --git a/framework/h/tag.go b/framework/h/tag.go index 55c3dd10..23fd3b4c 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -2,7 +2,6 @@ package h import ( "fmt" - "github.com/maddalax/htmgo/framework/internal/util" "strconv" ) @@ -154,10 +153,6 @@ func Div(children ...Ren) *Element { return Tag("div", children...) } -func GenId() string { - return util.RandSeq(6) -} - func Article(children ...Ren) *Element { return Tag("article", children...) } From 298f4dcd610bc1c53d160feea494de0d29f20bfb Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 9 Oct 2024 10:31:34 -0500 Subject: [PATCH 030/145] revert --- framework/h/app.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/h/app.go b/framework/h/app.go index f18e3850..f32c5606 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -20,7 +20,7 @@ type RequestContext struct { Response http.ResponseWriter locator *service.Locator isBoosted bool - CurrentBrowserUrl string + currentBrowserUrl string hxPromptResponse string isHxRequest bool hxTargetId string @@ -74,7 +74,7 @@ func (c *RequestContext) HxTriggerId() string { } func (c *RequestContext) HxCurrentBrowserUrl() string { - return c.CurrentBrowserUrl + return c.currentBrowserUrl } func (c *RequestContext) Set(key string, value interface{}) { @@ -119,7 +119,7 @@ const RequestContextKey = "htmgo.request.context" func populateHxFields(cc *RequestContext) { cc.isBoosted = cc.Request.Header.Get(hx.BoostedHeader) == "true" - cc.CurrentBrowserUrl = cc.Request.Header.Get(hx.CurrentUrlHeader) + cc.currentBrowserUrl = cc.Request.Header.Get(hx.CurrentUrlHeader) cc.hxPromptResponse = cc.Request.Header.Get(hx.PromptResponseHeader) cc.isHxRequest = cc.Request.Header.Get(hx.RequestHeader) == "true" cc.hxTargetId = cc.Request.Header.Get(hx.TargetIdHeader) From cb9bb23e2d1b5c2029a00eb46b81ef62a47ce2f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 9 Oct 2024 15:37:57 +0000 Subject: [PATCH 031/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 4fcff5cc..2a60e714 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 + github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 17827857..6ce031dd 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 5ed37d7a..01cec07e 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 + github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index e292b38b..4bee9246 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 66ed73cd..1e1d0c57 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 +require github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index f1e7c3d9..dd658d10 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index a96a60bf..65a7f7ec 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 + github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 98035903..da9b5b42 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 50706b46..5a5d1993 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 +require github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index f1e7c3d9..dd658d10 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107 h1:9dGhXM+1NefO9/FeEf5v5NsfVd3SBwh+ieXKzNvkrZ4= -github.com/maddalax/htmgo/framework v0.0.0-20241007175724-1014f6c96107/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 3fb719bf157d97f93680737a3553384b64ac9385 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 08:35:04 -0500 Subject: [PATCH 032/145] removing sorting --- htmgo-site/internal/dirwalk/walk.go | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/htmgo-site/internal/dirwalk/walk.go b/htmgo-site/internal/dirwalk/walk.go index 59df766c..1c52090b 100644 --- a/htmgo-site/internal/dirwalk/walk.go +++ b/htmgo-site/internal/dirwalk/walk.go @@ -4,8 +4,6 @@ import ( "github.com/maddalax/htmgo/framework/h" "io/fs" "os" - "slices" - "strconv" "strings" ) @@ -36,22 +34,5 @@ func WalkPages(dir string, system fs.FS) []*Page { return nil }) - var getRouteOrder = func(page *Page) int { - fileName := page.Parts[len(page.Parts)-1] - if len(fileName) > 1 && fileName[1] == '_' { - num, err := strconv.ParseInt(fileName[0:1], 10, 64) - if err != nil { - return 0 - } - page.Parts[len(page.Parts)-1] = fileName[2:] - return int(num) - } - return 0 - } - - slices.SortFunc(pages, func(a *Page, b *Page) int { - return getRouteOrder(a) - getRouteOrder(b) - }) - return pages } From 1c3065e43269c8a931c2b89688ff254849d63acc Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 09:07:03 -0500 Subject: [PATCH 033/145] add info about the extensions --- .../md/docs/7_htmx_extensions/1_overview.md | 20 ++++++++++++++++ .../7_htmx_extensions/2_trigger_children.md | 13 ++++++++++ .../7_htmx_extensions/3_mutation_error.md | 24 +++++++++++++++++++ htmgo-site/md/index.md | 2 +- htmgo-site/pages/docs.go | 2 +- 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 htmgo-site/md/docs/7_htmx_extensions/1_overview.md create mode 100644 htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md create mode 100644 htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md diff --git a/htmgo-site/md/docs/7_htmx_extensions/1_overview.md b/htmgo-site/md/docs/7_htmx_extensions/1_overview.md new file mode 100644 index 00000000..d8ecacc6 --- /dev/null +++ b/htmgo-site/md/docs/7_htmx_extensions/1_overview.md @@ -0,0 +1,20 @@ +### HTMX Extensions + +htmgo provides a few extra htmx extensions to make common tasks easier. +Some of these extensions are optional, and some of these are required for htmgo to work correctly. + +The following extensions are provided by htmgo: +- [Trigger Children](#htmx-extensions-trigger-children) +- [Mutation Error](#htmx-extensions-mutation-error) +- [SSE](#pushing-data-server-sent-events) +- [Path Deps](https://github.com/bigskysoftware/htmx-extensions/blob/main/src/path-deps/README.md) + +Default extensions should be included in your project by adding the following attribute to your html tag. +```go +h.Html( + h.HxExtension(h.BaseExtensions()) +) +``` + +**Important**: h.BaseExtensions will add the the 'htmgo' extension, which is a required extension for inline scripts to work properly, please always include it in your project. + diff --git a/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md b/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md new file mode 100644 index 00000000..9b67eeba --- /dev/null +++ b/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md @@ -0,0 +1,13 @@ +### HTMX Extensions - Trigger Children + +The `trigger-children` extension allows you to trigger an event on all children and siblings of an element. + +This is useful for things such as: +1. Letting a child element (such as a button) inside a form know the form was submitted + +
+ +**Example:** https://github.com/maddalax/htmgo/blob/master/htmgo-site/pages/form.go#L17 + +In this example: The trigger-children extension will trigger **hx-before-request** and **hx-after-request** +on all children of the form when the form is submitted, and the button reacts to that by showing a loading state. diff --git a/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md b/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md new file mode 100644 index 00000000..4cd5e0d3 --- /dev/null +++ b/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md @@ -0,0 +1,24 @@ +### HTMX Extensions - Mutation Error + +The `mutation-error` extension allows you to trigger an event when a request returns a >= 400 status code. + +This is useful for things such as: +1. Letting a child element (such as a button) inside a form know there was an error. + +
+ +**Example:** +```go +h.Form( + h.HxTriggerChildren(), + h.HxMutationError( + js.Alert("An error occurred"), + ), + h.Button( + h.Type("submit"), + h.Text("Submit"), + ), +) +``` + +It can also be used on children elements that do not make an xhr request, if you combine it with the `hx-trigger-children` extension. diff --git a/htmgo-site/md/index.md b/htmgo-site/md/index.md index b967f01b..3e9ca0cf 100644 --- a/htmgo-site/md/index.md +++ b/htmgo-site/md/index.md @@ -23,4 +23,4 @@ func IndexPage(ctx *h.RequestContext) *h.Page { 3. automatic page and partial registration based on file path 4. built in tailwindcss support, no need to configure anything by default 5. plugin architecture to include optional plugins to streamline development, such as http://entgo.io -6. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/b610aefa36e648b98a13823a6f8d87566120cfcc/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks +6. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/master/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index 6f551737..1e09152f 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -15,7 +15,7 @@ func DocsPage(ctx *h.RequestContext) *h.Page { return h.NewPage(base.RootPage( ctx, h.Div( - h.Class("flex flex-col md:flex-row gap-6 justify-center overflow-x-hidden"), + h.Class("flex flex-col md:flex-row gap-6 justify-center overflow-x-hidden md:overflow-x-visible"), h.Aside( h.Class("md:h-screen md:sticky md:top-0 md:w-42"), // Applied sticky positioning here partials.DocSidebar(pages), From 064fea3a00101fac9a5eb967dd675a01bfd5e8dc Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 09:13:27 -0500 Subject: [PATCH 034/145] add note about combining ext --- htmgo-site/md/docs/7_htmx_extensions/1_overview.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/htmgo-site/md/docs/7_htmx_extensions/1_overview.md b/htmgo-site/md/docs/7_htmx_extensions/1_overview.md index d8ecacc6..bc3faaea 100644 --- a/htmgo-site/md/docs/7_htmx_extensions/1_overview.md +++ b/htmgo-site/md/docs/7_htmx_extensions/1_overview.md @@ -16,5 +16,19 @@ h.Html( ) ``` +If you need to combine multiple extensions, you can use: + +```go +h.HxExtensions(h.BaseExtensions(), "my-extension"), +``` +or +```go +h.JoinExtensions( + h.HxExtension("sse"), + h.HxExtension("my-extension"), +), +``` + + **Important**: h.BaseExtensions will add the the 'htmgo' extension, which is a required extension for inline scripts to work properly, please always include it in your project. From b8dbcd4262f4493f3f2246dc41d92fc3bb7ada22 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 09:24:50 -0500 Subject: [PATCH 035/145] add favicon / public folder to template and htmgo-site --- htmgo-site/assets/public/apple-touch-icon.png | Bin 0 -> 3429 bytes htmgo-site/assets/public/favicon.ico | Bin 0 -> 5238 bytes htmgo-site/assets/public/icon-192-maskable.png | Bin 0 -> 3732 bytes htmgo-site/assets/public/icon-192.png | Bin 0 -> 7032 bytes htmgo-site/assets/public/icon-512-maskable.png | Bin 0 -> 14025 bytes htmgo-site/assets/public/icon-512.png | Bin 0 -> 23888 bytes htmgo-site/pages/base/root.go | 2 ++ .../starter/assets/public/apple-touch-icon.png | Bin 0 -> 3429 bytes templates/starter/assets/public/favicon.ico | Bin 0 -> 5238 bytes .../starter/assets/public/icon-192-maskable.png | Bin 0 -> 3732 bytes templates/starter/assets/public/icon-192.png | Bin 0 -> 7032 bytes .../starter/assets/public/icon-512-maskable.png | Bin 0 -> 14025 bytes templates/starter/assets/public/icon-512.png | Bin 0 -> 23888 bytes templates/starter/pages/root.go | 11 +++++++++++ 14 files changed, 13 insertions(+) create mode 100644 htmgo-site/assets/public/apple-touch-icon.png create mode 100644 htmgo-site/assets/public/favicon.ico create mode 100644 htmgo-site/assets/public/icon-192-maskable.png create mode 100644 htmgo-site/assets/public/icon-192.png create mode 100644 htmgo-site/assets/public/icon-512-maskable.png create mode 100644 htmgo-site/assets/public/icon-512.png create mode 100644 templates/starter/assets/public/apple-touch-icon.png create mode 100644 templates/starter/assets/public/favicon.ico create mode 100644 templates/starter/assets/public/icon-192-maskable.png create mode 100644 templates/starter/assets/public/icon-192.png create mode 100644 templates/starter/assets/public/icon-512-maskable.png create mode 100644 templates/starter/assets/public/icon-512.png diff --git a/htmgo-site/assets/public/apple-touch-icon.png b/htmgo-site/assets/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d10e9fe56b9576167656a1270d4ab42bec72d659 GIT binary patch literal 3429 zcmeHK*H_cc7X5`#1VIp#UPMI!siJggL5e_t5ITt9M==NyK}w{GfE3|Fnv_VSNEhiK zB%*+H2)!E=A)$m8di~1uHi7E0F!3@00KlTJrwyZW z^&gy}r^Y+I^f##l@`mYZ0U!JL7paA|vz5M!kr5zH&CdX!s7CDY>ns9#*8O`|jMO~iuFIcM`+$DqYyYbERdYs=} zG@Cn2HOG@*am(sCU8YU4lC`n<5GSkiFgm4DCN(<0;*+7cW;6U2dl#+g)$>=`9yCDe z*SxKFdIVPOFVxtohIP8BWJYOV{o+!MCNMy1CZ{@Ue;$H_nO?k1t=WRfOd7$4& z#`VAe$hoRtbV&OP0A7m5vC5j-@BdEyX(8AxEm+*6uhX!=m@5JE9(-Wtf)W?GE@EnD z$6r%hWBQQdTwMAwAFCTbv>M)?rJNrg>6o1SRxkfb)IdijJL?yJqGdL20SuyT9-2+b@-uyScj;)b8vom%KhA>}tfmHQT^{z4g$k z2pn&Fp&(9x+>CYZ54OR2-7trb)RS|t$JaK(Gt}O{yr;vQ+xqe)<}fW@BBw#_+R(|v z0+K^!*CS$B%kV^ibJ|8*%i>R^Y}U`}$iQR5@*vQ z&^j@LY^&2C66f)(3j|1mHIHz6lO^nOP|&E)2FX&eY>%iSEEMIpl9_bZSSm|bb%n7Y z`3Fop{OsXCj!1XWY^2&x{;rOoAV!~5MLG48W`0*g-snQ3Y=0HBs)Htq z`-qlwr@c3Crk9t#;P#gdFmwC&WWGft>;-v^j)`TV!us?B~V9 zXUwLcQN)SU&E3hRH>bG!E_d(R9j+Eg<7kzWf%2Iq`+&L!s+1Q|OLwnjqqE1jS4CCa zDuhEVm_3cKebz9w=d#bHJz^x;%}0l$r?hQT$c}onn2TbhIJ|Qz;+(s0iPX#YkxqW4 zx50SRb7g(glmqe!KSLA;J0K8`5?(3sX5jC)z>ug`zP-gXrEEVfUTibjn(H8nqB_hS z?6+Fzpp_1?rTcaDHa&jwO+;OIA9qFp*<_1qL?~2*$IM5s(br~yM)u=SYaaj*n13K2 zy9F+u?`q^SFLP{X0!X6X`0>18`^f0Ic?(LBv5Gb`{zotCF^Tg(18 zX6nHn)!(yu3E~mN(rmVb5V}SI^LfSKN)TR9+tzhl_EQM1BeK}ft7F%;|3>C7&Hg4N zyT)@iu%K@tr<%bjiI0*@8QuVYcEC}peid!c_TMh9MP>+u?p$(;f@TdsTN+6f`?p;7 z@Rqq*+)dz$Y^bFmnRaeUF8pzdKzL z^7@`_FoIU&IX9VuDEi?bT>0r8|%N1B$=Y?cL?Qn%X3kE|=ul z(d+9`@j2cMT%Pmrvf0wel$qSnFkzQnV!PaZPS%A@;dHUBSRthC?eb1zi|d3>Vj$W~ z=n0H+)bw}>on=^7RtC-ZG{hxdgsVtg;>*a=CWpmH9Km>IWEV!8#TR$e2zHR#tA4FK zHoPut3hNNU_OI>sBPC1g{CPIlElWvMz#%+g>9v3q6LtVQWpQQuomO9V0VSp(X88vb zzRWukPDA2mywGwKi3??Pn`BKw zjz+`+UDUiQV6JIz>*(-;k)qbBK)1qb_vSHW0@XD>aI47Y!tGn~rd3vSzj;{ivlyPQ zOWZVA+xH!WZ&>;=Tkr09e#t&MNpYu)-c%V{0#!$yfBwWb9h{$emRbJGsSKnvWj$#& zQFJZ#u;NB>@fEMax61V2@q!WI1*6|*P*vBf#4g6}8YE!-E?v$jM`2kBicIAq$ziD$?)9^k02kLY4T}&>8nja#e}QpOd3` z*4(QfhVVZ+UeJu#Dr=|`wYLM7`fPlN%B+dTSy+uPsQG7=`=$Kjet@=LmhZUQwqkEeVZBB1ZepQx>oC%NWF zdmo=0@^$&na^HaJYV3|C9v`Sr*q-{Y?$I=W&1L4|UO1qU$)n&eX$oiEt|!5$e%Bc{#~f{N391h{sB|aM6Cb- literal 0 HcmV?d00001 diff --git a/htmgo-site/assets/public/favicon.ico b/htmgo-site/assets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..040cccf58ea179321b86f78b5f0a0817f1ec773a GIT binary patch literal 5238 zcmc&%TTc^F5MGTxz&GO?PsX3&laKxa5?VDrsPP_Skg8Epp+!_s6a+*B?}`GJic-7) zB8Vu0f{KVn1m!020|D?VOqU=FFKnXI9e|XbZK)i!~ZGZTTWi zTSj9-g8rZQtBALpc=W0fo8j(S%O?&OATMu&mKe zdP>qtnj0j7LmFfqw!yZd)Rh>62A?G_s?o4sOTFvGNAbC*3$0Is$VuPwznqMf;^%m` zBKz=0LHWmb;c{Ub?%pm!S4T6d$_kX69w!-R#Sd0pLiv>(lwHh1XL}Qx>Z;K4v6xbM9Jy;a*q_>sNeIh9UtF!AnVWu+_|1-rZ4yRAAQDaYk4Tv{GzEA4G+rkyzxG& z%g-x09iR2t2gPUnrpJEN_)C$Oxf8h=J5Y0{1eMovQJA$`$r=3T7$`o=T`lsd|He6! zcaf7Oe5d*%pJUaRwLtpO?`2~<^a>m*ML<#bnL!)#Fjqw{qI90=JUF4i7m%~ zaW5kKJ?njzwjGY{M41bEt~u13D?gK}8DHP`xybWq{SPrV*XV3>?qu2~_-~v=T}>I? zB}F*x+vdm@!`b3U-po(Fmk0WK0Zb7^o^UvX(zB_yHr2T{i!&y3|2hQy7g2RHAEkMz zXsEr7$%%3Ff9b)A)b(~g=x3^RPMxOpH9o4ulZO?`7T>#kf6Kn5_{@Is|IMqXs1M%4 zub*QW9_$zQv{}p)Z~8n}w$+>-lXKY~j0}Gh_T=3A&Q?rKg;8)K8SG#GmyZjI)T z=H75@bja!Y8J}ZdiyxYtL~r+Ne0bX?*30$9`7i4KE7w27T;Jyp8vCXM| z&C<46{l$i55@WqroXOr9-*#}0H`fO&eVj?(W=`~}HZt>pD{RUhIbQg(KPUXS^&i{= z#k2p4;Pdx}Nq){NZ@T}CcmK^Xi0AhQQkrtwK@C# F{tLVTip2l` literal 0 HcmV?d00001 diff --git a/htmgo-site/assets/public/icon-192-maskable.png b/htmgo-site/assets/public/icon-192-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d6efb61bf6c212e3c466edca6256d9a3000e86 GIT binary patch literal 3732 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 U`U+xTzkh@n(+eiG#@FKh0jyU=3;+NC literal 0 HcmV?d00001 diff --git a/htmgo-site/assets/public/icon-192.png b/htmgo-site/assets/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f5334355c00b1ff31781f93b97b0efaa0e049d60 GIT binary patch literal 7032 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 x%cimilvfPSdV(Q_^}+tza4QzW{-_?Ogx> literal 0 HcmV?d00001 diff --git a/htmgo-site/assets/public/icon-512-maskable.png b/htmgo-site/assets/public/icon-512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..db61f3dbc056f541e9b215d4be7ec22a8f436e38 GIT binary patch literal 14025 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 KG(KIojr>11q;Vnu literal 0 HcmV?d00001 diff --git a/htmgo-site/assets/public/icon-512.png b/htmgo-site/assets/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0665d887cf19d3a45122767f0d6609ccb1afbb GIT binary patch literal 23888 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 B&S(Gt literal 0 HcmV?d00001 diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 04b79a67..92a90a80 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -17,6 +17,8 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Meta("title", title), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), h.Meta("charset", "utf-8"), h.Meta("author", "htmgo"), h.Meta("description", description), diff --git a/templates/starter/assets/public/apple-touch-icon.png b/templates/starter/assets/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d10e9fe56b9576167656a1270d4ab42bec72d659 GIT binary patch literal 3429 zcmeHK*H_cc7X5`#1VIp#UPMI!siJggL5e_t5ITt9M==NyK}w{GfE3|Fnv_VSNEhiK zB%*+H2)!E=A)$m8di~1uHi7E0F!3@00KlTJrwyZW z^&gy}r^Y+I^f##l@`mYZ0U!JL7paA|vz5M!kr5zH&CdX!s7CDY>ns9#*8O`|jMO~iuFIcM`+$DqYyYbERdYs=} zG@Cn2HOG@*am(sCU8YU4lC`n<5GSkiFgm4DCN(<0;*+7cW;6U2dl#+g)$>=`9yCDe z*SxKFdIVPOFVxtohIP8BWJYOV{o+!MCNMy1CZ{@Ue;$H_nO?k1t=WRfOd7$4& z#`VAe$hoRtbV&OP0A7m5vC5j-@BdEyX(8AxEm+*6uhX!=m@5JE9(-Wtf)W?GE@EnD z$6r%hWBQQdTwMAwAFCTbv>M)?rJNrg>6o1SRxkfb)IdijJL?yJqGdL20SuyT9-2+b@-uyScj;)b8vom%KhA>}tfmHQT^{z4g$k z2pn&Fp&(9x+>CYZ54OR2-7trb)RS|t$JaK(Gt}O{yr;vQ+xqe)<}fW@BBw#_+R(|v z0+K^!*CS$B%kV^ibJ|8*%i>R^Y}U`}$iQR5@*vQ z&^j@LY^&2C66f)(3j|1mHIHz6lO^nOP|&E)2FX&eY>%iSEEMIpl9_bZSSm|bb%n7Y z`3Fop{OsXCj!1XWY^2&x{;rOoAV!~5MLG48W`0*g-snQ3Y=0HBs)Htq z`-qlwr@c3Crk9t#;P#gdFmwC&WWGft>;-v^j)`TV!us?B~V9 zXUwLcQN)SU&E3hRH>bG!E_d(R9j+Eg<7kzWf%2Iq`+&L!s+1Q|OLwnjqqE1jS4CCa zDuhEVm_3cKebz9w=d#bHJz^x;%}0l$r?hQT$c}onn2TbhIJ|Qz;+(s0iPX#YkxqW4 zx50SRb7g(glmqe!KSLA;J0K8`5?(3sX5jC)z>ug`zP-gXrEEVfUTibjn(H8nqB_hS z?6+Fzpp_1?rTcaDHa&jwO+;OIA9qFp*<_1qL?~2*$IM5s(br~yM)u=SYaaj*n13K2 zy9F+u?`q^SFLP{X0!X6X`0>18`^f0Ic?(LBv5Gb`{zotCF^Tg(18 zX6nHn)!(yu3E~mN(rmVb5V}SI^LfSKN)TR9+tzhl_EQM1BeK}ft7F%;|3>C7&Hg4N zyT)@iu%K@tr<%bjiI0*@8QuVYcEC}peid!c_TMh9MP>+u?p$(;f@TdsTN+6f`?p;7 z@Rqq*+)dz$Y^bFmnRaeUF8pzdKzL z^7@`_FoIU&IX9VuDEi?bT>0r8|%N1B$=Y?cL?Qn%X3kE|=ul z(d+9`@j2cMT%Pmrvf0wel$qSnFkzQnV!PaZPS%A@;dHUBSRthC?eb1zi|d3>Vj$W~ z=n0H+)bw}>on=^7RtC-ZG{hxdgsVtg;>*a=CWpmH9Km>IWEV!8#TR$e2zHR#tA4FK zHoPut3hNNU_OI>sBPC1g{CPIlElWvMz#%+g>9v3q6LtVQWpQQuomO9V0VSp(X88vb zzRWukPDA2mywGwKi3??Pn`BKw zjz+`+UDUiQV6JIz>*(-;k)qbBK)1qb_vSHW0@XD>aI47Y!tGn~rd3vSzj;{ivlyPQ zOWZVA+xH!WZ&>;=Tkr09e#t&MNpYu)-c%V{0#!$yfBwWb9h{$emRbJGsSKnvWj$#& zQFJZ#u;NB>@fEMax61V2@q!WI1*6|*P*vBf#4g6}8YE!-E?v$jM`2kBicIAq$ziD$?)9^k02kLY4T}&>8nja#e}QpOd3` z*4(QfhVVZ+UeJu#Dr=|`wYLM7`fPlN%B+dTSy+uPsQG7=`=$Kjet@=LmhZUQwqkEeVZBB1ZepQx>oC%NWF zdmo=0@^$&na^HaJYV3|C9v`Sr*q-{Y?$I=W&1L4|UO1qU$)n&eX$oiEt|!5$e%Bc{#~f{N391h{sB|aM6Cb- literal 0 HcmV?d00001 diff --git a/templates/starter/assets/public/favicon.ico b/templates/starter/assets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..040cccf58ea179321b86f78b5f0a0817f1ec773a GIT binary patch literal 5238 zcmc&%TTc^F5MGTxz&GO?PsX3&laKxa5?VDrsPP_Skg8Epp+!_s6a+*B?}`GJic-7) zB8Vu0f{KVn1m!020|D?VOqU=FFKnXI9e|XbZK)i!~ZGZTTWi zTSj9-g8rZQtBALpc=W0fo8j(S%O?&OATMu&mKe zdP>qtnj0j7LmFfqw!yZd)Rh>62A?G_s?o4sOTFvGNAbC*3$0Is$VuPwznqMf;^%m` zBKz=0LHWmb;c{Ub?%pm!S4T6d$_kX69w!-R#Sd0pLiv>(lwHh1XL}Qx>Z;K4v6xbM9Jy;a*q_>sNeIh9UtF!AnVWu+_|1-rZ4yRAAQDaYk4Tv{GzEA4G+rkyzxG& z%g-x09iR2t2gPUnrpJEN_)C$Oxf8h=J5Y0{1eMovQJA$`$r=3T7$`o=T`lsd|He6! zcaf7Oe5d*%pJUaRwLtpO?`2~<^a>m*ML<#bnL!)#Fjqw{qI90=JUF4i7m%~ zaW5kKJ?njzwjGY{M41bEt~u13D?gK}8DHP`xybWq{SPrV*XV3>?qu2~_-~v=T}>I? zB}F*x+vdm@!`b3U-po(Fmk0WK0Zb7^o^UvX(zB_yHr2T{i!&y3|2hQy7g2RHAEkMz zXsEr7$%%3Ff9b)A)b(~g=x3^RPMxOpH9o4ulZO?`7T>#kf6Kn5_{@Is|IMqXs1M%4 zub*QW9_$zQv{}p)Z~8n}w$+>-lXKY~j0}Gh_T=3A&Q?rKg;8)K8SG#GmyZjI)T z=H75@bja!Y8J}ZdiyxYtL~r+Ne0bX?*30$9`7i4KE7w27T;Jyp8vCXM| z&C<46{l$i55@WqroXOr9-*#}0H`fO&eVj?(W=`~}HZt>pD{RUhIbQg(KPUXS^&i{= z#k2p4;Pdx}Nq){NZ@T}CcmK^Xi0AhQQkrtwK@C# F{tLVTip2l` literal 0 HcmV?d00001 diff --git a/templates/starter/assets/public/icon-192-maskable.png b/templates/starter/assets/public/icon-192-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d6efb61bf6c212e3c466edca6256d9a3000e86 GIT binary patch literal 3732 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 U`U+xTzkh@n(+eiG#@FKh0jyU=3;+NC literal 0 HcmV?d00001 diff --git a/templates/starter/assets/public/icon-192.png b/templates/starter/assets/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f5334355c00b1ff31781f93b97b0efaa0e049d60 GIT binary patch literal 7032 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 x%cimilvfPSdV(Q_^}+tza4QzW{-_?Ogx> literal 0 HcmV?d00001 diff --git a/templates/starter/assets/public/icon-512-maskable.png b/templates/starter/assets/public/icon-512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..db61f3dbc056f541e9b215d4be7ec22a8f436e38 GIT binary patch literal 14025 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 KG(KIojr>11q;Vnu literal 0 HcmV?d00001 diff --git a/templates/starter/assets/public/icon-512.png b/templates/starter/assets/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0665d887cf19d3a45122767f0d6609ccb1afbb GIT binary patch literal 23888 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 B&S(Gt literal 0 HcmV?d00001 diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index 63374f17..cb3e629a 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -8,6 +8,17 @@ func RootPage(children ...h.Ren) h.Ren { return h.Html( h.HxExtension(h.BaseExtensions()), h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("title", "htmgo template"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", "this is a template"), + h.Meta("og:title", "htmgo template"), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:description", "this is a template"), h.Link("/public/main.css", "stylesheet"), h.Script("/public/htmgo.js"), ), From 7fd213ccab243478c010b09f3527498d1e1b3b5d Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 09:30:37 -0500 Subject: [PATCH 036/145] fix taskfile --- htmgo-site/Taskfile.yml | 8 ++++---- templates/starter/Taskfile.yml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htmgo-site/Taskfile.yml b/htmgo-site/Taskfile.yml index a6d57006..caf16b97 100644 --- a/htmgo-site/Taskfile.yml +++ b/htmgo-site/Taskfile.yml @@ -3,14 +3,14 @@ version: '3' tasks: run: cmds: - - go run github.com/maddalax/htmgo/cli@latest run + - htmgo run silent: true build: cmds: - - go run github.com/maddalax/htmgo/cli/htmgo@latest build + - htmgo build watch: cmds: - - go run github.com/maddalax/htmgo/cli@latest watch - silent: true \ No newline at end of file + - htmgo watch + silent: true diff --git a/templates/starter/Taskfile.yml b/templates/starter/Taskfile.yml index 695006f0..28f19024 100644 --- a/templates/starter/Taskfile.yml +++ b/templates/starter/Taskfile.yml @@ -3,12 +3,12 @@ version: '3' tasks: run: cmds: - - go run github.com/maddalax/htmgo/cli/htmgo@latest run + - htmgo run silent: true build: cmds: - - go run github.com/maddalax/htmgo/cli/htmgo@latest build + - htmgo build docker: cmds: @@ -16,5 +16,5 @@ tasks: watch: cmds: - - go run github.com/maddalax/htmgo/cli/htmgo@latest watch - silent: true \ No newline at end of file + - htmgo watch + silent: true From e860f715d8a9ac52c32333a614d5e82575c8444d Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 09:57:37 -0500 Subject: [PATCH 037/145] add ideas about converting html to htmgo code --- .../1_converting_raw_html_to_go.md | 241 ++++++++++++++++++ .../1_common_issues.md | 0 2 files changed, 241 insertions(+) create mode 100644 htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md rename htmgo-site/md/docs/{8_troubleshooting => 9_troubleshooting}/1_common_issues.md (100%) diff --git a/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md b/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md new file mode 100644 index 00000000..e31d6197 --- /dev/null +++ b/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md @@ -0,0 +1,241 @@ +### Converting Raw HTML to Go + +In some cases, you may want to convert raw HTML to Go code. +A tool to do this automatically is in progress, but in the meantime, I've had success using an LLM such as ChatGPT +to convert HTML to Go code. + +Steps: +1. Open an LLM such as ChatGPT +2. Use this prompt: +```text +Using htmgo go html builder, please convert and html below that I send to htmgo code. + +The builder looks like this: + +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" + "github.com/maddalax/htmgo/framework/js" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + h.Div( + h.JoinExtensions( + h.TriggerChildren(), + h.HxExtension("ws"), + ), + h.Attribute("ws-connect", "/chat"), + h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), + Form(ctx), + h.Div( + h.Div( + h.Id("messages"), + h.Class("flex flex-col gap-2 w-full"), + ), + ), + ), + ), + ) +} + +func MessageInput() *h.Element { + return h.Input("text", + h.Id("message-input"), + h.Required(), + h.Class("p-4 rounded-md border border-slate-200"), + h.Name("message"), + h.Placeholder("Message"), + h.HxBeforeWsSend( + js.SetValue(""), + ), + h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), + ) +} + +func Form(ctx *h.RequestContext) *h.Element { + return h.Div( + h.Class("flex flex-col items-center justify-center p-4 gap-6"), + h.H2F("Form submission with ws example", h.Class("text-2xl font-bold")), + h.P(h.Text("example test")), + h.Form( + h.Attribute("ws-send", ""), + h.Class("flex flex-col gap-2"), + h.LabelFor("name", "Your Message"), + MessageInput(), + SubmitButton(), + ), + ) +} + +Imagine it has every attribute and every html tag at your disposal. Make things as reusable as possible by separating elements into reusable components. +``` + +3. Paste the HTML you want to convert to Go code + +4. Here is the result from pasting in example HTML from tailwind components: +```html +
+ + + +
+
+

Work with us

+

Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua.

+
+
+ +
+
+
Offices worldwide
+
12
+
+
+
Full-time colleagues
+
300+
+
+
+
Hours per week
+
40
+
+
+
Paid time off
+
Unlimited
+
+
+
+
+
+``` + +```go +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" +) + +func WorkWithUsSection(ctx *h.RequestContext) *h.Element { + return h.Div( + h.Class("relative isolate overflow-hidden bg-gray-900 py-24 sm:py-32"), + BackgroundImage(), + HiddenBlurredElement(), + TopBlurredElement(), + ContentContainer(ctx), + ) +} + +func BackgroundImage() *h.Element { + return h.Img( + h.Src("https://images.unsplash.com/photo-1521737604893-d14cc237f11d?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&crop=focalpoint&fp-y=.8&w=2830&h=1500&q=80&blend=111827&sat=-100&exp=15&blend-mode=multiply"), + h.Alt(""), + h.Class("absolute inset-0 -z-10 h-full w-full object-cover object-right md:object-center"), + ) +} + +func HiddenBlurredElement() *h.Element { + return h.Div( + h.Class("hidden sm:absolute sm:-top-10 sm:right-1/2 sm:-z-10 sm:mr-10 sm:block sm:transform-gpu sm:blur-3xl"), + h.AriaHidden(true), + BlurredGradient(), + ) +} + +func TopBlurredElement() *h.Element { + return h.Div( + h.Class("absolute -top-52 left-1/2 -z-10 -translate-x-1/2 transform-gpu blur-3xl sm:top-[-28rem] sm:ml-16 sm:translate-x-0 sm:transform-gpu"), + h.AriaHidden(true), + BlurredGradient(), + ) +} + +func BlurredGradient() *h.Element { + return h.Div( + h.Class("aspect-[1097/845] w-[68.5625rem] bg-gradient-to-tr from-[#ff4694] to-[#776fff] opacity-20"), + h.Style("clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"), + ) +} + +func ContentContainer(ctx *h.RequestContext) *h.Element { + return h.Div( + h.Class("mx-auto max-w-7xl px-6 lg:px-8"), + ContentHeader(), + LinksAndStatsSection(), + ) +} + +func ContentHeader() *h.Element { + return h.Div( + h.Class("mx-auto max-w-2xl lg:mx-0"), + h.H2F("Work with us", h.Class("text-4xl font-bold tracking-tight text-white sm:text-6xl")), + h.P( + h.Class("mt-6 text-lg leading-8 text-gray-300"), + h.Text("Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua."), + ), + ) +} + +func LinksAndStatsSection() *h.Element { + return h.Div( + h.Class("mx-auto mt-10 max-w-2xl lg:mx-0 lg:max-w-none"), + LinksGrid(), + StatsGrid(), + ) +} + +func LinksGrid() *h.Element { + return h.Div( + h.Class("grid grid-cols-1 gap-x-8 gap-y-6 text-base font-semibold leading-7 text-white sm:grid-cols-2 md:flex lg:gap-x-10"), + Link("Open roles"), + Link("Internship program"), + Link("Our values"), + Link("Meet our leadership"), + ) +} + +func Link(text string) *h.Element { + return h.A( + h.Href("#"), + h.Text(text), + h.Span(h.Text(" →"), h.AriaHidden(true)), + ) +} + +func StatsGrid() *h.Element { + return h.Dl( + h.Class("mt-16 grid grid-cols-1 gap-8 sm:mt-20 sm:grid-cols-2 lg:grid-cols-4"), + Stat("Offices worldwide", "12"), + Stat("Full-time colleagues", "300+"), + Stat("Hours per week", "40"), + Stat("Paid time off", "Unlimited"), + ) +} + +func Stat(label, value string) *h.Element { + return h.Div( + h.Class("flex flex-col-reverse"), + h.Dt( + h.Class("text-base leading-7 text-gray-300"), + h.Text(label), + ), + h.Dd( + h.Class("text-2xl font-bold leading-9 tracking-tight text-white"), + h.Text(value), + ), + ) +} +``` diff --git a/htmgo-site/md/docs/8_troubleshooting/1_common_issues.md b/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md similarity index 100% rename from htmgo-site/md/docs/8_troubleshooting/1_common_issues.md rename to htmgo-site/md/docs/9_troubleshooting/1_common_issues.md From c0fabcedd2900c3d97d47878d73361556447686c Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 10:13:57 -0500 Subject: [PATCH 038/145] no sticky sidebar for now because of small screens --- htmgo-site/pages/docs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index 1e09152f..6f551737 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -15,7 +15,7 @@ func DocsPage(ctx *h.RequestContext) *h.Page { return h.NewPage(base.RootPage( ctx, h.Div( - h.Class("flex flex-col md:flex-row gap-6 justify-center overflow-x-hidden md:overflow-x-visible"), + h.Class("flex flex-col md:flex-row gap-6 justify-center overflow-x-hidden"), h.Aside( h.Class("md:h-screen md:sticky md:top-0 md:w-42"), // Applied sticky positioning here partials.DocSidebar(pages), From 488094651511d2dc672148fdd69df9e0a6ef7be0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 17:00:20 -0500 Subject: [PATCH 039/145] hn clone --- examples/hackernews/.dockerignore | 11 ++ examples/hackernews/.gitignore | 6 + examples/hackernews/Dockerfile | 38 +++++ examples/hackernews/Taskfile.yml | 20 +++ examples/hackernews/assets.go | 13 ++ examples/hackernews/assets/css/input.css | 15 ++ .../assets/public/apple-touch-icon.png | Bin 0 -> 3429 bytes examples/hackernews/assets/public/favicon.ico | Bin 0 -> 5238 bytes .../assets/public/icon-192-maskable.png | Bin 0 -> 3732 bytes .../hackernews/assets/public/icon-192.png | Bin 0 -> 7032 bytes .../assets/public/icon-512-maskable.png | Bin 0 -> 14025 bytes .../hackernews/assets/public/icon-512.png | Bin 0 -> 23888 bytes examples/hackernews/assets_prod.go | 16 ++ examples/hackernews/components/badge.go | 14 ++ examples/hackernews/go.mod | 10 ++ examples/hackernews/go.sum | 18 +++ .../hackernews/internal/batch/parallel.go | 30 ++++ examples/hackernews/internal/embedded/os.go | 17 +++ .../hackernews/internal/httpjson/client.go | 115 +++++++++++++++ examples/hackernews/internal/news/news.go | 137 ++++++++++++++++++ examples/hackernews/internal/random.go | 13 ++ .../hackernews/internal/timeformat/time.go | 39 +++++ examples/hackernews/main.go | 30 ++++ examples/hackernews/pages/index.go | 21 +++ examples/hackernews/pages/root.go | 32 ++++ examples/hackernews/partials/comments.go | 84 +++++++++++ examples/hackernews/partials/sidebar.go | 126 ++++++++++++++++ examples/hackernews/partials/story.go | 79 ++++++++++ examples/hackernews/tailwind.config.js | 7 + framework/assets/dist/htmgo.js | 4 +- framework/assets/js/htmgo.ts | 16 ++ .../js/htmxextensions/trigger-children.ts | 18 ++- templates/starter/pages/root.go | 2 +- 33 files changed, 920 insertions(+), 11 deletions(-) create mode 100644 examples/hackernews/.dockerignore create mode 100644 examples/hackernews/.gitignore create mode 100644 examples/hackernews/Dockerfile create mode 100644 examples/hackernews/Taskfile.yml create mode 100644 examples/hackernews/assets.go create mode 100644 examples/hackernews/assets/css/input.css create mode 100644 examples/hackernews/assets/public/apple-touch-icon.png create mode 100644 examples/hackernews/assets/public/favicon.ico create mode 100644 examples/hackernews/assets/public/icon-192-maskable.png create mode 100644 examples/hackernews/assets/public/icon-192.png create mode 100644 examples/hackernews/assets/public/icon-512-maskable.png create mode 100644 examples/hackernews/assets/public/icon-512.png create mode 100644 examples/hackernews/assets_prod.go create mode 100644 examples/hackernews/components/badge.go create mode 100644 examples/hackernews/go.mod create mode 100644 examples/hackernews/go.sum create mode 100644 examples/hackernews/internal/batch/parallel.go create mode 100644 examples/hackernews/internal/embedded/os.go create mode 100644 examples/hackernews/internal/httpjson/client.go create mode 100644 examples/hackernews/internal/news/news.go create mode 100644 examples/hackernews/internal/random.go create mode 100644 examples/hackernews/internal/timeformat/time.go create mode 100644 examples/hackernews/main.go create mode 100644 examples/hackernews/pages/index.go create mode 100644 examples/hackernews/pages/root.go create mode 100644 examples/hackernews/partials/comments.go create mode 100644 examples/hackernews/partials/sidebar.go create mode 100644 examples/hackernews/partials/story.go create mode 100644 examples/hackernews/tailwind.config.js diff --git a/examples/hackernews/.dockerignore b/examples/hackernews/.dockerignore new file mode 100644 index 00000000..fb47686a --- /dev/null +++ b/examples/hackernews/.dockerignore @@ -0,0 +1,11 @@ +# Project exclude paths +/tmp/ +node_modules/ +dist/ +js/dist +js/node_modules +go.work +go.work.sum +.idea +!framework/assets/dist +__htmgo \ No newline at end of file diff --git a/examples/hackernews/.gitignore b/examples/hackernews/.gitignore new file mode 100644 index 00000000..3d6a9799 --- /dev/null +++ b/examples/hackernews/.gitignore @@ -0,0 +1,6 @@ +/assets/dist +tmp +node_modules +.idea +__htmgo +dist \ No newline at end of file diff --git a/examples/hackernews/Dockerfile b/examples/hackernews/Dockerfile new file mode 100644 index 00000000..37c299db --- /dev/null +++ b/examples/hackernews/Dockerfile @@ -0,0 +1,38 @@ +# Stage 1: Build the Go binary +FROM golang:1.23-alpine AS builder + +RUN apk update +RUN apk add git +RUN apk add curl + +# Set the working directory inside the container +WORKDIR /app + +# Copy go.mod and go.sum files +COPY go.mod go.sum ./ + +# Download and cache the Go modules +RUN go mod download + +# Copy the source code into the container +COPY . . + +# Build the Go binary for Linux +RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build + + +# Stage 2: Create the smallest possible image +FROM gcr.io/distroless/base-debian11 + +# Set the working directory inside the container +WORKDIR /app + +# Copy the Go binary from the builder stage +COPY --from=builder /app/dist . + +# Expose the necessary port (replace with your server port) +EXPOSE 3000 + + +# Command to run the binary +CMD ["./hackernews"] diff --git a/examples/hackernews/Taskfile.yml b/examples/hackernews/Taskfile.yml new file mode 100644 index 00000000..28f19024 --- /dev/null +++ b/examples/hackernews/Taskfile.yml @@ -0,0 +1,20 @@ +version: '3' + +tasks: + run: + cmds: + - htmgo run + silent: true + + build: + cmds: + - htmgo build + + docker: + cmds: + - docker build . + + watch: + cmds: + - htmgo watch + silent: true diff --git a/examples/hackernews/assets.go b/examples/hackernews/assets.go new file mode 100644 index 00000000..8104b984 --- /dev/null +++ b/examples/hackernews/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "hackernews/internal/embedded" + "io/fs" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/examples/hackernews/assets/css/input.css b/examples/hackernews/assets/css/input.css new file mode 100644 index 00000000..404b710d --- /dev/null +++ b/examples/hackernews/assets/css/input.css @@ -0,0 +1,15 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer utilities { + /* Chrome, Safari and Opera */ + .no-scrollbar::-webkit-scrollbar { + display: none; + } + + .no-scrollbar { + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ + } +} diff --git a/examples/hackernews/assets/public/apple-touch-icon.png b/examples/hackernews/assets/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d10e9fe56b9576167656a1270d4ab42bec72d659 GIT binary patch literal 3429 zcmeHK*H_cc7X5`#1VIp#UPMI!siJggL5e_t5ITt9M==NyK}w{GfE3|Fnv_VSNEhiK zB%*+H2)!E=A)$m8di~1uHi7E0F!3@00KlTJrwyZW z^&gy}r^Y+I^f##l@`mYZ0U!JL7paA|vz5M!kr5zH&CdX!s7CDY>ns9#*8O`|jMO~iuFIcM`+$DqYyYbERdYs=} zG@Cn2HOG@*am(sCU8YU4lC`n<5GSkiFgm4DCN(<0;*+7cW;6U2dl#+g)$>=`9yCDe z*SxKFdIVPOFVxtohIP8BWJYOV{o+!MCNMy1CZ{@Ue;$H_nO?k1t=WRfOd7$4& z#`VAe$hoRtbV&OP0A7m5vC5j-@BdEyX(8AxEm+*6uhX!=m@5JE9(-Wtf)W?GE@EnD z$6r%hWBQQdTwMAwAFCTbv>M)?rJNrg>6o1SRxkfb)IdijJL?yJqGdL20SuyT9-2+b@-uyScj;)b8vom%KhA>}tfmHQT^{z4g$k z2pn&Fp&(9x+>CYZ54OR2-7trb)RS|t$JaK(Gt}O{yr;vQ+xqe)<}fW@BBw#_+R(|v z0+K^!*CS$B%kV^ibJ|8*%i>R^Y}U`}$iQR5@*vQ z&^j@LY^&2C66f)(3j|1mHIHz6lO^nOP|&E)2FX&eY>%iSEEMIpl9_bZSSm|bb%n7Y z`3Fop{OsXCj!1XWY^2&x{;rOoAV!~5MLG48W`0*g-snQ3Y=0HBs)Htq z`-qlwr@c3Crk9t#;P#gdFmwC&WWGft>;-v^j)`TV!us?B~V9 zXUwLcQN)SU&E3hRH>bG!E_d(R9j+Eg<7kzWf%2Iq`+&L!s+1Q|OLwnjqqE1jS4CCa zDuhEVm_3cKebz9w=d#bHJz^x;%}0l$r?hQT$c}onn2TbhIJ|Qz;+(s0iPX#YkxqW4 zx50SRb7g(glmqe!KSLA;J0K8`5?(3sX5jC)z>ug`zP-gXrEEVfUTibjn(H8nqB_hS z?6+Fzpp_1?rTcaDHa&jwO+;OIA9qFp*<_1qL?~2*$IM5s(br~yM)u=SYaaj*n13K2 zy9F+u?`q^SFLP{X0!X6X`0>18`^f0Ic?(LBv5Gb`{zotCF^Tg(18 zX6nHn)!(yu3E~mN(rmVb5V}SI^LfSKN)TR9+tzhl_EQM1BeK}ft7F%;|3>C7&Hg4N zyT)@iu%K@tr<%bjiI0*@8QuVYcEC}peid!c_TMh9MP>+u?p$(;f@TdsTN+6f`?p;7 z@Rqq*+)dz$Y^bFmnRaeUF8pzdKzL z^7@`_FoIU&IX9VuDEi?bT>0r8|%N1B$=Y?cL?Qn%X3kE|=ul z(d+9`@j2cMT%Pmrvf0wel$qSnFkzQnV!PaZPS%A@;dHUBSRthC?eb1zi|d3>Vj$W~ z=n0H+)bw}>on=^7RtC-ZG{hxdgsVtg;>*a=CWpmH9Km>IWEV!8#TR$e2zHR#tA4FK zHoPut3hNNU_OI>sBPC1g{CPIlElWvMz#%+g>9v3q6LtVQWpQQuomO9V0VSp(X88vb zzRWukPDA2mywGwKi3??Pn`BKw zjz+`+UDUiQV6JIz>*(-;k)qbBK)1qb_vSHW0@XD>aI47Y!tGn~rd3vSzj;{ivlyPQ zOWZVA+xH!WZ&>;=Tkr09e#t&MNpYu)-c%V{0#!$yfBwWb9h{$emRbJGsSKnvWj$#& zQFJZ#u;NB>@fEMax61V2@q!WI1*6|*P*vBf#4g6}8YE!-E?v$jM`2kBicIAq$ziD$?)9^k02kLY4T}&>8nja#e}QpOd3` z*4(QfhVVZ+UeJu#Dr=|`wYLM7`fPlN%B+dTSy+uPsQG7=`=$Kjet@=LmhZUQwqkEeVZBB1ZepQx>oC%NWF zdmo=0@^$&na^HaJYV3|C9v`Sr*q-{Y?$I=W&1L4|UO1qU$)n&eX$oiEt|!5$e%Bc{#~f{N391h{sB|aM6Cb- literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/favicon.ico b/examples/hackernews/assets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..040cccf58ea179321b86f78b5f0a0817f1ec773a GIT binary patch literal 5238 zcmc&%TTc^F5MGTxz&GO?PsX3&laKxa5?VDrsPP_Skg8Epp+!_s6a+*B?}`GJic-7) zB8Vu0f{KVn1m!020|D?VOqU=FFKnXI9e|XbZK)i!~ZGZTTWi zTSj9-g8rZQtBALpc=W0fo8j(S%O?&OATMu&mKe zdP>qtnj0j7LmFfqw!yZd)Rh>62A?G_s?o4sOTFvGNAbC*3$0Is$VuPwznqMf;^%m` zBKz=0LHWmb;c{Ub?%pm!S4T6d$_kX69w!-R#Sd0pLiv>(lwHh1XL}Qx>Z;K4v6xbM9Jy;a*q_>sNeIh9UtF!AnVWu+_|1-rZ4yRAAQDaYk4Tv{GzEA4G+rkyzxG& z%g-x09iR2t2gPUnrpJEN_)C$Oxf8h=J5Y0{1eMovQJA$`$r=3T7$`o=T`lsd|He6! zcaf7Oe5d*%pJUaRwLtpO?`2~<^a>m*ML<#bnL!)#Fjqw{qI90=JUF4i7m%~ zaW5kKJ?njzwjGY{M41bEt~u13D?gK}8DHP`xybWq{SPrV*XV3>?qu2~_-~v=T}>I? zB}F*x+vdm@!`b3U-po(Fmk0WK0Zb7^o^UvX(zB_yHr2T{i!&y3|2hQy7g2RHAEkMz zXsEr7$%%3Ff9b)A)b(~g=x3^RPMxOpH9o4ulZO?`7T>#kf6Kn5_{@Is|IMqXs1M%4 zub*QW9_$zQv{}p)Z~8n}w$+>-lXKY~j0}Gh_T=3A&Q?rKg;8)K8SG#GmyZjI)T z=H75@bja!Y8J}ZdiyxYtL~r+Ne0bX?*30$9`7i4KE7w27T;Jyp8vCXM| z&C<46{l$i55@WqroXOr9-*#}0H`fO&eVj?(W=`~}HZt>pD{RUhIbQg(KPUXS^&i{= z#k2p4;Pdx}Nq){NZ@T}CcmK^Xi0AhQQkrtwK@C# F{tLVTip2l` literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-192-maskable.png b/examples/hackernews/assets/public/icon-192-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d6efb61bf6c212e3c466edca6256d9a3000e86 GIT binary patch literal 3732 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 U`U+xTzkh@n(+eiG#@FKh0jyU=3;+NC literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-192.png b/examples/hackernews/assets/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f5334355c00b1ff31781f93b97b0efaa0e049d60 GIT binary patch literal 7032 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 x%cimilvfPSdV(Q_^}+tza4QzW{-_?Ogx> literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-512-maskable.png b/examples/hackernews/assets/public/icon-512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..db61f3dbc056f541e9b215d4be7ec22a8f436e38 GIT binary patch literal 14025 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 KG(KIojr>11q;Vnu literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets/public/icon-512.png b/examples/hackernews/assets/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0665d887cf19d3a45122767f0d6609ccb1afbb GIT binary patch literal 23888 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 B&S(Gt literal 0 HcmV?d00001 diff --git a/examples/hackernews/assets_prod.go b/examples/hackernews/assets_prod.go new file mode 100644 index 00000000..f0598e1c --- /dev/null +++ b/examples/hackernews/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/examples/hackernews/components/badge.go b/examples/hackernews/components/badge.go new file mode 100644 index 00000000..dd97f60b --- /dev/null +++ b/examples/hackernews/components/badge.go @@ -0,0 +1,14 @@ +package components + +import "github.com/maddalax/htmgo/framework/h" + +func Badge(text string, active bool, children ...h.Ren) *h.Element { + return h.Button( + h.Text(text), + h.ClassX("font-semibold px-3 py-1 rounded-full cursor-pointer h-[32px]", h.ClassMap{ + "bg-rose-500 text-white": active, + "bg-neutral-300": !active, + }), + h.Children(children...), + ) +} diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod new file mode 100644 index 00000000..ae1640a8 --- /dev/null +++ b/examples/hackernews/go.mod @@ -0,0 +1,10 @@ +module hackernews + +go 1.23.0 + +require ( + github.com/go-chi/chi/v5 v5.1.0 + github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 +) + +require github.com/google/uuid v1.6.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum new file mode 100644 index 00000000..84d81a5a --- /dev/null +++ b/examples/hackernews/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= +github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= +github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/hackernews/internal/batch/parallel.go b/examples/hackernews/internal/batch/parallel.go new file mode 100644 index 00000000..6f03e5f1 --- /dev/null +++ b/examples/hackernews/internal/batch/parallel.go @@ -0,0 +1,30 @@ +package batch + +import ( + "sync" +) + +func ParallelProcess[T any, Z any](items []T, concurrency int, cb func(item T) Z) []Z { + if len(items) == 0 { + return []Z{} + } + if len(items) == 1 { + return []Z{cb(items[0])} + } + results := make([]Z, len(items)) + wg := sync.WaitGroup{} + sem := make(chan struct{}, concurrency) + for i, item := range items { + wg.Add(1) + sem <- struct{}{} + go func(item T) { + defer func() { + wg.Done() + <-sem + }() + results[i] = cb(item) + }(item) + } + wg.Wait() + return results +} diff --git a/examples/hackernews/internal/embedded/os.go b/examples/hackernews/internal/embedded/os.go new file mode 100644 index 00000000..ddfd55f5 --- /dev/null +++ b/examples/hackernews/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/examples/hackernews/internal/httpjson/client.go b/examples/hackernews/internal/httpjson/client.go new file mode 100644 index 00000000..4c1e5ce3 --- /dev/null +++ b/examples/hackernews/internal/httpjson/client.go @@ -0,0 +1,115 @@ +package httpjson + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "sync" + "time" +) + +var ( + client *http.Client + once sync.Once // Consider allowing configuration parameters for the singleton +) + +func getClient() *http.Client { + once.Do(func() { + client = &http.Client{ + Timeout: 10 * time.Second, + } + }) + return client +} + +func Get[T any](url string) (*T, error) { + client := getClient() + resp, err := client.Get(url) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + var result T + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + if err := json.Unmarshal(body, &result); err != nil { + return nil, err + } + + return &result, nil +} + +func Post[T any](url string, data T) (*http.Response, error) { + client := getClient() + body, err := json.Marshal(data) + if err != nil { + return nil, err + } + + resp, err := client.Post(url, "application/json", bytes.NewBuffer(body)) + if err != nil { + return nil, err + } + + if resp.StatusCode != http.StatusCreated && resp.StatusCode != http.StatusOK { + return resp, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + return resp, nil +} + +func Patch[T any](url string, data T) error { + client := getClient() + body, err := json.Marshal(data) + if err != nil { + return err + } + + req, err := http.NewRequest(http.MethodPatch, url, bytes.NewBuffer(body)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + return nil +} + +func Delete(url string) error { + client := getClient() + req, err := http.NewRequest(http.MethodDelete, url, nil) + if err != nil { + return err + } + + resp, err := client.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + return nil +} diff --git a/examples/hackernews/internal/news/news.go b/examples/hackernews/internal/news/news.go new file mode 100644 index 00000000..a972e680 --- /dev/null +++ b/examples/hackernews/internal/news/news.go @@ -0,0 +1,137 @@ +package news + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "hackernews/internal/batch" + "hackernews/internal/httpjson" + "hackernews/internal/timeformat" + "log/slog" + "strconv" + "time" +) + +const baseUrl = "https://hacker-news.firebaseio.com/v0/" + +func url(path string, qs *h.Qs) string { + return baseUrl + path + ".json?" + qs.ToString() +} + +type Category struct { + Name string + Path string +} + +var Categories = []Category{ + {"Top Stories", "topstories"}, + {"Best Stories", "beststories"}, + {"New Stories", "newstories"}, +} + +type Comment struct { + By string `json:"by"` + Text string `json:"text"` + TimeRaw int64 `json:"time"` + Time time.Time `json:"-"` + Type string `json:"type"` + Kids []int `json:"kids"` + Parent int `json:"parent"` + Id int `json:"id"` +} + +type Story struct { + Id int `json:"id"` + By string `json:"by"` + Text string `json:"text"` + Title string `json:"title"` + Type string `json:"type"` + Descendents int `json:"descendants"` + Score int `json:"score"` + Url string + TimeRaw int64 `json:"time"` + Time time.Time `json:"-"` + // comment ids + Kids []int +} + +type GetTopStoriesRequest struct { + Limit int + Page int +} + +func MustItemId(ctx *h.RequestContext) int { + raw := h.GetQueryParam(ctx, "item") + parsed, err := strconv.ParseInt(raw, 10, 64) + if err != nil { + return 0 + } + return int(parsed) +} + +func GetStories(category string, page int, limit int) []Story { + top, err := httpjson.Get[[]int](url(category, h.NewQs())) + if err != nil { + slog.Error("failed to load top stories", slog.String("err", err.Error())) + return make([]Story, 0) + } + ids := *top + start := page * limit + end := start + limit + return batch.ParallelProcess[int, Story]( + ids[start:end], + 50, + func(id int) Story { + story, err := GetStory(id) + if err != nil { + slog.Error("failed to load story", slog.Int("id", id), slog.String("err", err.Error())) + return Story{} + } + return *story + }, + ) +} + +func GetTopStories(page int, limit int) []Story { + return GetStories("topstories", page, limit) +} + +func GetBestStories(page int, limit int) []Story { + return GetStories("beststories", page, limit) +} + +func GetNewStories(page int, limit int) []Story { + return GetStories("newstories", page, limit) +} + +func GetComments(ids []int) []Comment { + return batch.ParallelProcess( + ids, + 50, + func(id int) Comment { + comment, err := GetComment(id) + if err != nil { + slog.Error("failed to load comment", slog.Int("id", id), slog.String("err", err.Error())) + return Comment{} + } + return *comment + }, + ) +} + +func GetComment(id int) (*Comment, error) { + c, err := httpjson.Get[Comment](url(fmt.Sprintf("item/%d", id), h.NewQs())) + if err != nil { + return nil, err + } + c.Time = timeformat.ParseUnix(c.TimeRaw) + return c, nil +} + +func GetStory(id int) (*Story, error) { + s, err := httpjson.Get[Story](url(fmt.Sprintf("item/%d", id), h.NewQs())) + if err != nil { + return nil, err + } + s.Time = timeformat.ParseUnix(s.TimeRaw) + return s, nil +} diff --git a/examples/hackernews/internal/random.go b/examples/hackernews/internal/random.go new file mode 100644 index 00000000..cdd54167 --- /dev/null +++ b/examples/hackernews/internal/random.go @@ -0,0 +1,13 @@ +package internal + +import "math/rand" + +var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") + +func RandSeq(n int) string { + b := make([]rune, n) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} diff --git a/examples/hackernews/internal/timeformat/time.go b/examples/hackernews/internal/timeformat/time.go new file mode 100644 index 00000000..62af6205 --- /dev/null +++ b/examples/hackernews/internal/timeformat/time.go @@ -0,0 +1,39 @@ +package timeformat + +import ( + "fmt" + "time" +) + +func ParseUnix(t int64) time.Time { + return time.UnixMilli(t * 1000) +} + +func RelativeTime(t time.Time) string { + now := time.Now() + diff := now.Sub(t) + + var pluralize = func(s string) string { + if s[0] == '1' { + return s[:len(s)-5] + " ago" + } + return s + } + + switch { + case diff < time.Minute: + return "just now" + case diff < time.Hour: + return pluralize(fmt.Sprintf("%d minutes ago", int(diff.Minutes()))) + case diff < time.Hour*24: + return pluralize(fmt.Sprintf("%d hours ago", int(diff.Hours()))) + case diff < time.Hour*24*7: + return pluralize(fmt.Sprintf("%d days ago", int(diff.Hours()/24))) + case diff < time.Hour*24*30: + return pluralize(fmt.Sprintf("%d weeks ago", int(diff.Hours()/(24*7)))) + case diff < time.Hour*24*365: + return pluralize(fmt.Sprintf("%d months ago", int(diff.Hours()/(24*30)))) + default: + return pluralize(fmt.Sprintf("%d years ago", int(diff.Hours()/(24*365)))) + } +} diff --git a/examples/hackernews/main.go b/examples/hackernews/main.go new file mode 100644 index 00000000..575e42c6 --- /dev/null +++ b/examples/hackernews/main.go @@ -0,0 +1,30 @@ +package main + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "hackernews/__htmgo" + "io/fs" + "net/http" +) + +func main() { + locator := service.NewLocator() + + h.Start(h.AppOpts{ + ServiceLocator: locator, + LiveReload: true, + Register: func(app *h.App) { + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") + + if err != nil { + panic(err) + } + + http.FileServerFS(sub) + + app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) + __htmgo.Register(app.Router) + }, + }) +} diff --git a/examples/hackernews/pages/index.go b/examples/hackernews/pages/index.go new file mode 100644 index 00000000..b103599e --- /dev/null +++ b/examples/hackernews/pages/index.go @@ -0,0 +1,21 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "hackernews/partials" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + h.Div( + h.Class("flex gap-2 min-h-screen"), + partials.StorySidebar(ctx), + h.Main( + h.Class("flex justify-center items-start p-6 max-w-3xl min-w-3xl mx-auto"), + partials.Story(ctx), + ), + ), + ), + ) +} diff --git a/examples/hackernews/pages/root.go b/examples/hackernews/pages/root.go new file mode 100644 index 00000000..2c785ec6 --- /dev/null +++ b/examples/hackernews/pages/root.go @@ -0,0 +1,32 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RootPage(children ...h.Ren) h.Ren { + return h.Html( + h.HxExtensions(h.BaseExtensions()), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("title", "htmgo template"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", "this is a template"), + h.Meta("og:title", "htmgo template"), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:description", "this is a template"), + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + h.Script("/public/custom.js"), + ), + h.Body( + h.Div( + h.Fragment(children...), + ), + ), + ) +} diff --git a/examples/hackernews/partials/comments.go b/examples/hackernews/partials/comments.go new file mode 100644 index 00000000..14b39bd9 --- /dev/null +++ b/examples/hackernews/partials/comments.go @@ -0,0 +1,84 @@ +package partials + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "hackernews/internal/batch" + "hackernews/internal/news" + "hackernews/internal/timeformat" + "strings" + "time" +) + +func StoryComments(ctx *h.RequestContext) *h.Partial { + return h.NewPartial( + h.Div( + h.Class("flex flex-col gap-3 prose max-w-none"), + CachedStoryComments(news.MustItemId(ctx)), + )) +} + +var CachedStoryComments = h.CachedPerKeyT[string, int](time.Minute*3, func(itemId int) (string, h.GetElementFunc) { + return fmt.Sprintf("story-comments-%d", itemId), func() *h.Element { + story, err := news.GetStory(itemId) + + if err != nil { + return h.Div( + h.Text("Failed to load story"), + ) + } + + comments := news.GetComments(story.Kids) + + // parallel process because each comment needs to load its children comments + items := batch.ParallelProcess[news.Comment, *h.Element](comments, 50, func(item news.Comment) *h.Element { + return Comment(item, 0) + }) + + return h.List(items, func(item *h.Element, index int) *h.Element { + return item + }) + } +}) + +func Comment(item news.Comment, nesting int) *h.Element { + if item.Text == "" { + return h.Empty() + } + + children := news.GetComments(item.Kids) + + return h.Div( + h.ClassX("block bg-white pb-2 pt-2", h.ClassMap{ + "border-b border-gray-200": nesting == 0, + "border-l border-gray-200": nesting > 0, + }), + h.If(nesting > 0, h.Attribute("style", fmt.Sprintf("margin-left: %dpx", (nesting-1)*15))), + h.Div( + h.If(nesting > 0, h.Class("pl-4")), + h.Div( + h.Class("flex gap-1 items-center"), + h.Div( + h.Class("font-bold text-rose-500"), + h.UnsafeRaw(item.By), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw("•"), + h.TextF(" %s", timeformat.RelativeTime(item.Time)), + ), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw(strings.TrimSpace(item.Text)), + ), + ), + h.If(len(children) > 0, h.List( + children, func(child news.Comment, index int) *h.Element { + return h.Div( + Comment(child, nesting+1), + ) + }, + )), + ) +} diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go new file mode 100644 index 00000000..e68325b7 --- /dev/null +++ b/examples/hackernews/partials/sidebar.go @@ -0,0 +1,126 @@ +package partials + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" + "hackernews/components" + "hackernews/internal/news" + "hackernews/internal/timeformat" + "time" +) + +// @lang js +var ScrollJs = ` + const scrollContainer = self; + let isDown = false; + let startX; + let scrollLeft; + + scrollContainer.addEventListener("mousedown", (e) => { + isDown = true; + scrollContainer.classList.add("active"); + startX = e.pageX - scrollContainer.offsetLeft; + scrollLeft = scrollContainer.scrollLeft; + }); + + scrollContainer.addEventListener("mouseleave", () => { + isDown = false; + scrollContainer.classList.remove("active"); + }); + + scrollContainer.addEventListener("mouseup", () => { + isDown = false; + scrollContainer.classList.remove("active"); + }); + + scrollContainer.addEventListener("mousemove", (e) => { + if (!isDown) return; + e.preventDefault(); + const x = e.pageX - scrollContainer.offsetLeft; + const walk = (x - startX) * 3; // Adjust scroll speed here + scrollContainer.scrollLeft = scrollLeft - walk; + }); +` + +func StorySidebar(ctx *h.RequestContext) *h.Partial { + category := h.GetQueryParam(ctx, "category") + if category == "" { + category = "topstories" + } + + body := h.Aside( + h.Id("story-sidebar"), + h.JoinExtensions(h.TriggerChildren()), + h.Class("sticky top-0 h-screen p-1 bg-gray-100 overflow-y-auto max-w-80 min-w-80"), + h.Div( + h.Class("flex flex-col gap-1"), + SidebarTitle(category), + CachedStoryList(category, 0, 50), + ), + ) + + if ctx.IsHxRequest() { + return h.SwapManyPartial(ctx, body) + } + return h.NewPartial(body) +} + +func SidebarTitle(defaultCategory string) *h.Element { + today := time.Now().Format("Mon, 02 Jan 2006") + return h.Div( + h.Class("flex flex-col px-2 pt-4 pb-2"), + h.Div( + h.Class("text-sm text-gray-600"), + h.Text(today), + ), + h.Div( + h.Class("font-bold text-xl"), + h.Text("Hacker News"), + ), + h.Div( + h.OnEvent(hx.LoadDomEvent, h.EvalJs(ScrollJs)), + h.OnEvent(hx.LoadEvent, h.EvalJs(ScrollJs)), + h.Class("scroll-container mt-2 flex gap-1 no-scrollbar overflow-y-hidden whitespace-nowrap overflow-x-auto"), + h.List(news.Categories, func(item news.Category, index int) *h.Element { + return CategoryBadge(defaultCategory, item) + }), + ), + ) +} + +func CategoryBadge(defaultCategory string, category news.Category) *h.Element { + selected := category.Path == defaultCategory + return components.Badge( + category.Name, + selected, + h.Attribute("hx-swap", "none"), + h.If(!selected, h.PostPartialOnClickQs(StorySidebar, h.NewQs("category", category.Path))), + ) +} + +var CachedStoryList = h.CachedPerKeyT3(time.Minute*5, func(category string, page int, limit int) (string, h.GetElementFunc) { + return fmt.Sprintf("%s-stories-%d-%d", category, page, limit), func() *h.Element { + stories := news.GetStories(category, page, limit) + return h.List(stories, func(item news.Story, index int) *h.Element { + return h.Div( + h.Attribute("hx-swap", "none"), + h.PostPartialOnClickQs(Story, h.NewQs("item", fmt.Sprintf("%d", item.Id))), + h.A(h.Href(item.Url)), + h.Class("block p-2 bg-white rounded-md shadow cursor-pointer"), + h.Div( + h.Class("font-bold"), + h.UnsafeRaw(item.Title), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.Div(h.TextF("%s ", item.By), h.UnsafeRaw("•"), h.TextF(" %s", timeformat.RelativeTime(item.Time))), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw(fmt.Sprintf("%d upvotes • %d comments", item.Score, item.Descendents)), + ), + ) + }) + } +}) diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go new file mode 100644 index 00000000..1c05f1ae --- /dev/null +++ b/examples/hackernews/partials/story.go @@ -0,0 +1,79 @@ +package partials + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "hackernews/internal/news" + "hackernews/internal/timeformat" + "strconv" +) + +func Story(ctx *h.RequestContext) *h.Partial { + storyId, err := strconv.ParseInt(ctx.QueryParam("item"), 10, 64) + + if err != nil { + return h.SwapManyPartial( + ctx, + h.Div( + h.Text("Invalid story id"), + ), + ) + } + + story, err := news.GetStory(int(storyId)) + + if err != nil { + return h.SwapManyPartial( + ctx, + h.Div( + h.Text("Failed to load story"), + ), + ) + } + + if ctx.IsHxRequest() { + return h.SwapManyPartialWithHeaders( + ctx, + h.PushUrlHeader(fmt.Sprintf("/?item=%d", storyId)), + StoryBody(story), + ) + } + + return h.NewPartial( + StoryBody(story), + ) +} + +func StoryBody(story *news.Story) *h.Element { + return h.Div( + h.Id("story-body"), + h.Div( + h.Class("prose prose-2xl bg-white border-b border-gray-200 pb-3 max-w-3xl"), + h.H5( + h.Class("flex gap-2 items-center font-bold"), + h.UnsafeRaw(story.Title), + ), + h.A( + h.Href(story.Url), + h.Class("text-sm text-rose-400 no-underline"), + h.Text(story.Url), + ), + h.Div( + h.Class("text-sm text-gray-600"), + h.UnsafeRaw(story.Text), + ), + h.Div( + h.Class("text-sm text-gray-600 mt-2"), + h.TextF("%d upvotes ", story.Score), + h.UnsafeRaw("•"), + h.TextF(" %s ", story.By), + h.UnsafeRaw("•"), + h.TextF(" %s", timeformat.RelativeTime(story.Time)), + ), + ), + h.Div( + h.Class("mt-2 max-w-3xl"), + h.GetPartial(StoryComments, "load"), + ), + ) +} diff --git a/examples/hackernews/tailwind.config.js b/examples/hackernews/tailwind.config.js new file mode 100644 index 00000000..f1b453a9 --- /dev/null +++ b/examples/hackernews/tailwind.config.js @@ -0,0 +1,7 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["**/*.go"], + plugins: [ + require('@tailwindcss/typography') + ], +}; diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index fd740d47..a0aadc4a 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),G=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:G,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let Y=t.split("#"),Z=Y[0],j=Y[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:G,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");if(!r.has(o)){if(o.hasAttribute(s)){let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);}o.children&&$(o,t,n,r);}});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,U,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{U=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var B="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;B===""&&(B=r),B!==r&&(B=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),Z=G[0],j=G[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.onload=function(){let e=["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"];for(let t of Array.from(document.querySelectorAll("[onload]")))if(t!=null&&t instanceof HTMLElement){if(e.includes(t.tagName))continue;t.onload(new Event("load"));}};window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25D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cUJBQXFCLENBQ2xEc1YsQ0FBQUEsQ0FBQUEsRUFDRjFDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCc1YsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmJlZm9yZVN3YXAnLCAnaHRteDphZnRlclN3YXAnLCAnaHRteDpiZWZvcmVPbkxvYWQnLCAnaHRteDphZnRlck9uTG9hZCcsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3RXZlbnQgPSBtYWtlRXZlbnQoZXZlbnROYW1lLnJlcGxhY2UoXCJoeC1vbjo6XCIsIFwiaHRteDpcIiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyZWQuYWRkKGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4oZSBhcyBIVE1MRWxlbWVudCwgbmFtZSwgZXZlbnQsIHRyaWdnZXJlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG5cblxuLy8gQHRzLWlnbm9yZVxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJ0cmlnZ2VyLWNoaWxkcmVuXCIsIHtcbiAgICBvbkV2ZW50OiAobmFtZSwgZXZ0OiBFdmVudCB8IEN1c3RvbUV2ZW50KSA9PiB7XG4gICAgICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKGV2dC5kZXRhaWwubWV0YSA9PT0gJ3RyaWdnZXItY2hpbGRyZW4nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHJpZ2dlcmVkID0gbmV3IFNldDxIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8fCBldnQuZGV0YWlsLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdHJpZ2dlckNoaWxkcmVuKHRhcmdldCwgbmFtZSwgZXZ0LCB0cmlnZ2VyZWQpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJkZWJ1Z1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgIGlmIChjb25zb2xlLmRlYnVnKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIGlmIChjb25zb2xlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkRFQlVHOlwiLCBuYW1lLCBldnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBub29wXG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmNvbnN0IGNvbmZpZzogYW55ID0gaHRteC5jb25maWc7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KFwiLi4vaHRteFwiKS5IdG14SW50ZXJuYWxBcGl9ICovXG5sZXQgYXBpOiBhbnk7XG5cbmNvbnN0IGF0dHJQcmVmaXggPSBcImh4LXRhcmdldC1cIjtcblxuLy8gSUUxMSBkb2Vzbid0IHN1cHBvcnQgc3RyaW5nLnN0YXJ0c1dpdGhcbmZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyOiBzdHJpbmcsIHByZWZpeDogc3RyaW5nKSB7XG4gIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0gcmVzcENvZGVOdW1iZXJcbiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudCB8IG51bGx9XG4gKi9cbmZ1bmN0aW9uIGdldFJlc3BDb2RlVGFyZ2V0KGVsdDogRWxlbWVudCwgcmVzcENvZGVOdW1iZXI6IG51bWJlcikge1xuICBpZiAoIWVsdCB8fCAhcmVzcENvZGVOdW1iZXIpIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHJlc3BDb2RlID0gcmVzcENvZGVOdW1iZXIudG9TdHJpbmcoKTtcblxuICAvLyAnKicgaXMgdGhlIG9yaWdpbmFsIHN5bnRheCwgYXMgdGhlIG9idmlvdXMgY2hhcmFjdGVyIGZvciBhIHdpbGRjYXJkLlxuICAvLyBUaGUgJ3gnIGFsdGVybmF0aXZlIHdhcyBhZGRlZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IHdpdGggSFRNTFxuICAvLyB0ZW1wbGF0aW5nIGVuZ2luZXMsIGR1ZSB0byBhbWJpZ3VpdHkgYXJvdW5kIHdoaWNoIGNoYXJhY3RlcnMgYXJlXG4gIC8vIHN1cHBvcnRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG4gIC8vXG4gIC8vIFN0YXJ0IHdpdGggdGhlIG1vc3Qgc3BlY2lmaWMgcG9zc2libGUgYXR0cmlidXRlIGFuZCBnZW5lcmFsaXplIGZyb21cbiAgLy8gdGhlcmUuXG4gIGNvbnN0IGF0dHJQb3NzaWJpbGl0aWVzID0gW1xuICAgIHJlc3BDb2RlLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDIpICsgXCJ4XCIsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInhcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcIioqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4eFwiLFxuXG4gICAgXCIqXCIsXG4gICAgXCJ4XCIsXG4gICAgXCIqKipcIixcbiAgICBcInh4eFwiLFxuICBdO1xuICBpZiAoc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI0XCIpIHx8IHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNVwiKSkge1xuICAgIGF0dHJQb3NzaWJpbGl0aWVzLnB1c2goXCJlcnJvclwiKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clBvc3NpYmlsaXRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBhdHRyID0gYXR0clByZWZpeCArIGF0dHJQb3NzaWJpbGl0aWVzW2ldO1xuICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGFwaS5nZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKTtcbiAgICBpZiAoYXR0clZhbHVlKSB7XG4gICAgICBpZiAoYXR0clZhbHVlID09PSBcInRoaXNcIikge1xuICAgICAgICByZXR1cm4gYXBpLmZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFwaS5xdWVyeVNlbGVjdG9yRXh0KGVsdCwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqIEBwYXJhbSB7RXZlbnR9IGV2dCAqL1xuZnVuY3Rpb24gaGFuZGxlRXJyb3JGbGFnKGV2dDogQ3VzdG9tRXZlbnQpIHtcbiAgaWYgKGV2dC5kZXRhaWwuaXNFcnJvcikge1xuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvcikge1xuICAgICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvcikge1xuICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IHRydWU7XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJyZXNwb25zZS10YXJnZXRzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBpbml0OiAoYXBpUmVmKSA9PiB7XG4gICAgYXBpID0gYXBpUmVmO1xuXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgbmFtZSA9PT0gXCJodG14OmJlZm9yZVN3YXBcIiAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyAhPT0gMjAwXG4gICAgKSB7XG4gICAgICBpZiAoZXZ0LmRldGFpbC50YXJnZXQpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZykge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciAmJlxuICAgICAgICAgIGV2dC5kZXRhaWwueGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLm1hdGNoKC9IWC1SZXRhcmdldDovaSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFldnQuZGV0YWlsLnJlcXVlc3RDb25maWcpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBnZXRSZXNwQ29kZVRhcmdldChcbiAgICAgICAgZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnLmVsdCxcbiAgICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzLFxuICAgICAgKTtcbiAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgIGV2dC5kZXRhaWwudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJtdXRhdGlvbi1lcnJvclwiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAobmFtZSA9PT0gXCJodG14OmFmdGVyUmVxdWVzdFwiKSB7XG4gICAgICBpZiAoIWV2dC5kZXRhaWwgfHwgIWV2dC5kZXRhaWwueGhyKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXR1cyA9IGV2dC5kZXRhaWwueGhyLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPj0gNDAwKSB7XG4gICAgICAgIGh0bXguZmluZEFsbChcIltoeC1vblxcXFw6XFxcXDptdXRhdGlvbi1lcnJvcl1cIikuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBcImh0bXg6bXV0YXRpb24tZXJyb3JcIiwgeyBzdGF0dXMgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmxldCBsYXN0VmVyc2lvbiA9IFwiXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibGl2ZXJlbG9hZFwiLCB7XG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGxldCBlbmFibGVkID0gZmFsc2VcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIEFycmF5LmZyb20oaHRteC5maW5kQWxsKFwiW2h4LWV4dF1cIikpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaHgtZXh0XCIpO1xuICAgICAgICAgICAgaWYodmFsdWU/LnNwbGl0KFwiIFwiKS5pbmNsdWRlcyhcImxpdmVyZWxvYWRcIikpIHtcbiAgICAgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYoIWVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJ2xpdmVyZWxvYWQgZXh0ZW5zaW9uIGluaXRpYWxpemVkLicpO1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgRXZlbnRTb3VyY2Ugb2JqZWN0IGFuZCBwb2ludCBpdCB0byB5b3VyIFNTRSBlbmRwb2ludFxuICAgICAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2Rldi9saXZlcmVsb2FkJyk7XG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnQuZGF0YVxuICAgICAgICAgICAgLy8gTG9nIHRoZSBtZXNzYWdlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uICE9PSBtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgICAgIHJlbG9hZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgKGUuZy4sIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkKVxuICAgICAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V2ZW50U291cmNlIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgfTtcblxuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcblxuICAgIH0sXG59KTtcblxuZnVuY3Rpb24gcmVsb2FkKCkge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxufVxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmNvbnN0IGV2YWxGdW5jUmVnZXggPS9fX2V2YWxfW0EtWmEtejAtOV0rXFwoW2Etel0rXFwpL2dtXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiaHRtZ29cIiwge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgaWYobmFtZSA9PT0gXCJodG14OmJlZm9yZUNsZWFudXBFbGVtZW50XCIgJiYgZXZ0LnRhcmdldCkge1xuICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyhldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICB9XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZWxlbWVudDogSFRNTEVsZW1lbnQpIHtcbiAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5mcm9tKGVsZW1lbnQuYXR0cmlidXRlcylcbiAgICBmb3IgKGxldCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhdHRyaWJ1dGUudmFsdWUubWF0Y2goZXZhbEZ1bmNSZWdleCkgfHwgW11cbiAgICAgICAgZm9yIChsZXQgbWF0Y2ggb2YgbWF0Y2hlcykge1xuICAgICAgICAgICAgY29uc3QgaWQgPSBtYXRjaC5yZXBsYWNlKFwiKClcIiwgXCJcIikucmVwbGFjZShcIih0aGlzKVwiLCBcIlwiKS5yZXBsYWNlKFwiO1wiLCBcIlwiKVxuICAgICAgICAgICAgY29uc3QgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICAgICAgICBpZihlbGUgJiYgZWxlLnRhZ05hbWUgPT09IFwiU0NSSVBUXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwicmVtb3ZpbmcgYXNzb2NpYXRlZCBzY3JpcHQgd2l0aCBpZFwiLCBpZClcbiAgICAgICAgICAgICAgICBlbGUucmVtb3ZlKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gJ2h0bXgub3JnJ1xuaW1wb3J0IHtyZW1vdmVBc3NvY2lhdGVkU2NyaXB0c30gZnJvbSBcIi4vaHRtZ29cIjtcblxubGV0IGFwaSA6IGFueSA9IG51bGw7XG5sZXQgcHJvY2Vzc2VkID0gbmV3IFNldDxzdHJpbmc+KClcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJzc2VcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uIChhcGlSZWYpIHtcbiAgICAgICAgYXBpID0gYXBpUmVmO1xuICAgIH0sXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldDtcbiAgICAgICAgaWYoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnQnKSB7XG4gICAgICAgICAgICByZW1vdmVBc3NvY2lhdGVkU2NyaXB0cyh0YXJnZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYobmFtZSA9PT0gJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tzc2UtY29ubmVjdF0nKTtcbiAgICAgICAgICAgIGZvciAobGV0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShlbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNzZS1jb25uZWN0XCIpITtcbiAgICAgICAgICAgICAgICBpZih1cmwgJiYgIXByb2Nlc3NlZC5oYXModXJsKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25uZWN0RXZlbnRTb3VyY2UoZWxlbWVudCwgdXJsKVxuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYWRkKHVybClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KVxuXG5mdW5jdGlvbiBjb25uZWN0RXZlbnRTb3VyY2UoZWxlOiBFbGVtZW50LCB1cmw6IHN0cmluZykge1xuICAgIGlmKCF1cmwpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGNvbnNvbGUuaW5mbygnQ29ubmVjdGluZyB0byBFdmVudFNvdXJjZScsIHVybClcbiAgICBjb25zdCBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcihcImNsb3NlXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VDbG9zZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfSlcblxuICAgIGV2ZW50U291cmNlLm9ub3BlbiA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VPcGVuXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUVycm9yXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgaWYgKGV2ZW50U291cmNlLnJlYWR5U3RhdGUgPT0gRXZlbnRTb3VyY2UuQ0xPU0VEKSB7XG4gICAgICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IGFwaS5tYWtlU2V0dGxlSW5mbyhlbGUpO1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQmVmb3JlTWVzc2FnZVwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZlbnQuZGF0YVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IGFwaS5tYWtlRnJhZ21lbnQocmVzcG9uc2UpIGFzIERvY3VtZW50RnJhZ21lbnQ7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gQXJyYXkuZnJvbShmcmFnbWVudC5jaGlsZHJlbik7XG4gICAgICAgIGZvciAobGV0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICAgICAgICBhcGkub29iU3dhcChhcGkuZ2V0QXR0cmlidXRlVmFsdWUoY2hpbGQsICdoeC1zd2FwLW9vYicpIHx8ICd0cnVlJywgY2hpbGQsIHNldHRsZUluZm8pO1xuICAgICAgICAgICAgLy8gc3VwcG9ydCBodG1nbyBldmFsX18gc2NyaXB0c1xuICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gJ1NDUklQVCcgJiYgY2hpbGQuaWQuc3RhcnRzV2l0aChcIl9fZXZhbFwiKSkge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VBZnRlck1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9wYXRoZGVwc1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2RlYnVnXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3Jlc3BvbnNlLXRhcmdldHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3JcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvbGl2ZXJlbG9hZFwiXG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2h0bWdvXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL3NzZVwiXG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwiaWdub3JlZCIsIndhdGNoVXJsIiwibGFzdFVybCIsIl8iLCJuZXdVcmwiLCJvblVybENoYW5nZSIsImhhc01hdGNoIiwiZGVmYXVsdEtleSJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsRUFBQUEsQ0FBUSxVQUFXLENBSXJCLElBQU0sSUFBTyxDQUFBLENBSVgsT0FBUSxJQUVSLENBQUEsT0FBQSxDQUFTLEtBRVQsRUFBSSxDQUFBLElBQUEsQ0FFSixJQUFLLElBRUwsQ0FBQSxPQUFBLENBQVMsS0FFVCxJQUFNLENBQUEsSUFBQSxDQUdOLEtBQU0sSUFFTixDQUFBLE9BQUEsQ0FBUyxLQUVULE9BQVMsQ0FBQSxJQUFBLENBVVQsT0FBUSxTQUFTQyxDQUFBQSxDQUFLQyxFQUFNLENBRTFCLE9BRG9CLGVBQWVELENBQUtDLENBQUFBLENBQUFBLEVBQVEs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RSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXZlbnQuZGV0YWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8vIEB0cy1pZ25vcmVcbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vKipcbiAqIEJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IG9ubG9hZCBmb3IgYWxsIGVsZW1lbnRzLCBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgaXRcbiAqIHRoaXMgaXMgdXNlZnVsIGZvciBsb2NhbGl0eSBvZiBiZWhhdmlvclxuICovXG53aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGlnbm9yZWQgPSBbJ1NDUklQVCcsICdMSU5LJywgJ1NUWUxFJywgJ01FVEEnLCAnQkFTRScsICdUSVRMRScsICdIRUFEJywgJ0hUTUwnLCAnQk9EWSddO1xuICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW29ubG9hZF1gKSkpIHtcbiAgICBpZihlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBpZihpZ25vcmVkLmluY2x1ZGVzKGVsZW1lbnQudGFnTmFtZSkpIHtcbiAgICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBlbGVtZW50Lm9ubG9hZCEobmV3IEV2ZW50KFwibG9hZFwiKSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 29cb7091..308da9bb 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -8,6 +8,22 @@ import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; import "./htmxextensions/sse" +/** + * Browser doesn't support onload for all elements, so we need to manually trigger it + * this is useful for locality of behavior + */ +window.onload = function() { + const ignored = ['SCRIPT', 'LINK', 'STYLE', 'META', 'BASE', 'TITLE', 'HEAD', 'HTML', 'BODY']; + for (let element of Array.from(document.querySelectorAll(`[onload]`))) { + if(element != null && element instanceof HTMLElement) { + if(ignored.includes(element.tagName)) { + continue + } + element.onload!(new Event("load")); + } + } +} + // @ts-ignore window.htmx = htmx; diff --git a/framework/assets/js/htmxextensions/trigger-children.ts b/framework/assets/js/htmxextensions/trigger-children.ts index 7f5b8b5f..c32c7388 100644 --- a/framework/assets/js/htmxextensions/trigger-children.ts +++ b/framework/assets/js/htmxextensions/trigger-children.ts @@ -4,7 +4,7 @@ function kebabEventName(str: string) { return str.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase() } -const ignoredEvents = ['htmx:beforeProcessNode', 'htmx:afterProcessNode', 'htmx:beforeSwap', 'htmx:afterSwap', 'htmx:beforeOnLoad', 'htmx:afterOnLoad', 'htmx:configRequest', 'htmx:configResponse', 'htmx:responseError']; +const ignoredEvents = ['htmx:beforeProcessNode', 'htmx:afterProcessNode', 'htmx:configRequest', 'htmx:configResponse', 'htmx:responseError']; function makeEvent(eventName: string, detail: any) { let evt @@ -28,13 +28,15 @@ function triggerChildren(target: HTMLElement, name: string, event: CustomEvent, const eventName = kehab.replace("htmx:", "hx-on::") if (!triggered.has(e as HTMLElement)) { if(e.hasAttribute(eventName)) { - const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), { - ...event.detail, - target: e, - }) - newEvent.detail.meta = 'trigger-children' - e.dispatchEvent(newEvent) - triggered.add(e as HTMLElement); + setTimeout(() => { + const newEvent = makeEvent(eventName.replace("hx-on::", "htmx:"), { + ...event.detail, + target: e, + }) + newEvent.detail.meta = 'trigger-children' + e.dispatchEvent(newEvent) + triggered.add(e as HTMLElement); + }, 1) } if (e.children) { triggerChildren(e as HTMLElement, name, event, triggered); diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index cb3e629a..bacdd614 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -6,7 +6,7 @@ import ( func RootPage(children ...h.Ren) h.Ren { return h.Html( - h.HxExtension(h.BaseExtensions()), + h.HxExtensions(h.BaseExtensions()), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), From cb6619594a00e4d3839681db62cbc7be1e97b604 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 10 Oct 2024 22:01:07 +0000 Subject: [PATCH 040/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 8 ++++---- examples/hackernews/go.sum | 6 ++---- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 21 insertions(+), 23 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 2a60e714..f875a573 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 + github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 6ce031dd..7c429a61 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index ae1640a8..33efdbc3 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,9 +2,9 @@ module hackernews go 1.23.0 +require github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 + require ( - github.com/go-chi/chi/v5 v5.1.0 - github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect ) - -require github.com/google/uuid v1.6.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 84d81a5a..699273e0 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,12 +4,10 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/puzpuzpuz/xsync/v3 v3.4.0 h1:DuVBAdXuGFHv8adVXjWWZ63pJq+NRXOWVXlKDBZ+mJ4= -github.com/puzpuzpuz/xsync/v3 v3.4.0/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 01cec07e..b2ffa21d 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 + github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 4bee9246..48008265 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 1e1d0c57..00a77abe 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 +require github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index dd658d10..699273e0 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 65a7f7ec..4e057f5b 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 + github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index da9b5b42..d0415fc1 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 5a5d1993..2c43ac73 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 +require github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index dd658d10..699273e0 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7 h1:KzbU4UIVDc+ppklnwEEAAGLXpED16hUoGbbx1qhN7eo= -github.com/maddalax/htmgo/framework v0.0.0-20241009153712-95f9b43395b7/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= +github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 49aae062efd4f4eaea78ef45a35028c9e5837192 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 17:01:38 -0500 Subject: [PATCH 041/145] hn clone --- .github/workflows/release-hn-clone.yml | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/release-hn-clone.yml diff --git a/.github/workflows/release-hn-clone.yml b/.github/workflows/release-hn-clone.yml new file mode 100644 index 00000000..91183a45 --- /dev/null +++ b/.github/workflows/release-hn-clone.yml @@ -0,0 +1,49 @@ +name: Build and Deploy htmgo hackernews clone + +on: + workflow_dispatch: # Trigger on manual workflow_dispatch + push: + branches: + - master # Trigger on pushes to master + paths: + - 'hackernews/**' # Trigger only if files in this directory change + - "framework/**" + - "framework-ui/**" + - "cli/**" + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get short commit hash + id: vars + run: echo "::set-output name=short_sha::$(echo $GITHUB_SHA | cut -c1-7)" + + - name: Build Docker image + run: | + cd ./examples/hackernews && docker build -t ghcr.io/${{ github.repository_owner }}/hackernews:${{ steps.vars.outputs.short_sha }} . + + - name: Tag as latest Docker image + run: | + docker tag ghcr.io/${{ github.repository_owner }}/hackernews:${{ steps.vars.outputs.short_sha }} ghcr.io/${{ github.repository_owner }}/hackernews:latest + + - name: Log in to GitHub Container Registry + run: echo "${{ secrets.CR_PAT }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + - name: Push Docker image + run: | + docker push ghcr.io/${{ github.repository_owner }}/hackernews:latest From 2e998dbb2675e1ce3b6d1dd3745a9fb22fcd29eb Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 17:17:05 -0500 Subject: [PATCH 042/145] fixes --- examples/hackernews/pages/root.go | 1 - examples/hackernews/partials/story.go | 22 +++++++--------------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/examples/hackernews/pages/root.go b/examples/hackernews/pages/root.go index 2c785ec6..cec47ff7 100644 --- a/examples/hackernews/pages/root.go +++ b/examples/hackernews/pages/root.go @@ -21,7 +21,6 @@ func RootPage(children ...h.Ren) h.Ren { h.Meta("og:description", "this is a template"), h.Link("/public/main.css", "stylesheet"), h.Script("/public/htmgo.js"), - h.Script("/public/custom.js"), ), h.Body( h.Div( diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go index 1c05f1ae..bb80a75e 100644 --- a/examples/hackernews/partials/story.go +++ b/examples/hackernews/partials/story.go @@ -11,26 +11,17 @@ import ( func Story(ctx *h.RequestContext) *h.Partial { storyId, err := strconv.ParseInt(ctx.QueryParam("item"), 10, 64) - if err != nil { - return h.SwapManyPartial( - ctx, + if storyId == 0 || err != nil { + return h.NewPartial( h.Div( - h.Text("Invalid story id"), + h.Class("flex justify-center bg-neutral-300"), + h.Id("story-body"), ), ) } story, err := news.GetStory(int(storyId)) - if err != nil { - return h.SwapManyPartial( - ctx, - h.Div( - h.Text("Failed to load story"), - ), - ) - } - if ctx.IsHxRequest() { return h.SwapManyPartialWithHeaders( ctx, @@ -46,9 +37,10 @@ func Story(ctx *h.RequestContext) *h.Partial { func StoryBody(story *news.Story) *h.Element { return h.Div( + h.Class("min-w-3xl"), h.Id("story-body"), h.Div( - h.Class("prose prose-2xl bg-white border-b border-gray-200 pb-3 max-w-3xl"), + h.Class("prose prose-2xl bg-white border-b border-gray-200 pb-3 min-w-3xl max-w-3xl"), h.H5( h.Class("flex gap-2 items-center font-bold"), h.UnsafeRaw(story.Title), @@ -72,7 +64,7 @@ func StoryBody(story *news.Story) *h.Element { ), ), h.Div( - h.Class("mt-2 max-w-3xl"), + h.Class("mt-2 min-w-3xl max-w-3xl"), h.GetPartial(StoryComments, "load"), ), ) From 78f7a68c1e746e8f58eb928926a26807b2eb4b64 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 17:31:07 -0500 Subject: [PATCH 043/145] add hn clone to examples --- .github/workflows/release-hn-clone.yml | 2 +- htmgo-site/assets/public/hn-example.jpg | Bin 0 -> 930082 bytes htmgo-site/pages/examples.go | 21 +++++++++++++++------ 3 files changed, 16 insertions(+), 7 deletions(-) create mode 100644 htmgo-site/assets/public/hn-example.jpg diff --git a/.github/workflows/release-hn-clone.yml b/.github/workflows/release-hn-clone.yml index 91183a45..3d65af91 100644 --- a/.github/workflows/release-hn-clone.yml +++ b/.github/workflows/release-hn-clone.yml @@ -6,7 +6,7 @@ on: branches: - master # Trigger on pushes to master paths: - - 'hackernews/**' # Trigger only if files in this directory change + - 'examples/hackernews/**' # Trigger only if files in this directory change - "framework/**" - "framework-ui/**" - "cli/**" diff --git a/htmgo-site/assets/public/hn-example.jpg b/htmgo-site/assets/public/hn-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..85f5f8804e5cac7d4a933bcb9e286f1baed85a53 GIT binary patch literal 930082 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

Y3Y>x%d4) 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�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

-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

Q&^zt7LtbISd@}+oHQ7)07SeceX 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

bX4-Uc5REIF2nU8f;6<|1Ikd*4;Gr=1l!r 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 HXXZZu%@Mgu literal 0 HcmV?d00001 diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go index 73aaf2b7..0924f667 100644 --- a/htmgo-site/pages/examples.go +++ b/htmgo-site/pages/examples.go @@ -14,6 +14,13 @@ type Example struct { } var examples = []Example{ + { + Title: "Hacker News Clone", + Github: "https://github.com/maddalax/htmgo/tree/master/examples/hackernews", + Description: "A hacker news reader clone built with htmgo", + Demo: "https://hn.htmgo.dev", + Image: "public/hn-example.jpg", + }, { Title: "Chat App Example", Github: "https://github.com/maddalax/htmgo/tree/master/examples/chat", @@ -74,7 +81,7 @@ func ExamplesPage(ctx *h.RequestContext) *h.Page { func ExampleCards() *h.Element { return h.Div( - h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 md:grid-cols-2 gap-6 text-center pb-8"), // Using grid for 3-column layout + h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 gap-6 text-center pb-8"), h.List(examples, func(example Example, index int) *h.Element { return h.Div( h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), // Removed specific width, handled by grid @@ -90,22 +97,24 @@ func ExampleCards() *h.Element { h.Class("not-prose"), h.Img( h.Src(example.Image), - h.Class("md:w-full rounded-md mx-auto"), + h.Class("w-[75%] rounded-md mx-auto"), ), ), // Ensures image is centered within the card )), - h.If(example.Description != "", h.Pf(example.Description)), + h.If(example.Description != "", h.Div( + h.Pf(example.Description), + )), h.Div( h.Div( - h.Class("flex gap-2 justify-center mt-2"), // Slight margin-top for spacing from the image + h.Class("flex gap-2 justify-center mt-2"), h.A( h.Href(example.Github), - h.Class("not-prose p-2 bg-slate-900 text-white rounded-md"), // Reduced padding for the buttons + h.Class("not-prose p-2 bg-slate-900 text-white rounded-md"), h.Text("Github"), ), h.A( h.Href(example.Demo), - h.Class("not-prose p-2 bg-slate-900 text-white rounded-md"), // Reduced padding for the buttons + h.Class("not-prose p-2 bg-slate-900 text-white rounded-md"), h.Text("Demo"), ), ), From c2b3b439e606dad9bde4f7d3345ae6e504504f87 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 17:59:08 -0500 Subject: [PATCH 044/145] add comments loader, cache stories --- examples/hackernews/partials/comments.go | 12 ++++--- examples/hackernews/partials/story.go | 40 ++++++++++++++++++------ 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/examples/hackernews/partials/comments.go b/examples/hackernews/partials/comments.go index 14b39bd9..c0583fee 100644 --- a/examples/hackernews/partials/comments.go +++ b/examples/hackernews/partials/comments.go @@ -12,10 +12,14 @@ import ( func StoryComments(ctx *h.RequestContext) *h.Partial { return h.NewPartial( - h.Div( - h.Class("flex flex-col gap-3 prose max-w-none"), - CachedStoryComments(news.MustItemId(ctx)), - )) + h.Fragment( + h.OobSwap(ctx, h.Div(h.Id("comments-loader"))), + h.Div( + h.Class("flex flex-col gap-3 prose max-w-none"), + CachedStoryComments(news.MustItemId(ctx)), + ), + ), + ) } var CachedStoryComments = h.CachedPerKeyT[string, int](time.Minute*3, func(itemId int) (string, h.GetElementFunc) { diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go index bb80a75e..43e742e1 100644 --- a/examples/hackernews/partials/story.go +++ b/examples/hackernews/partials/story.go @@ -5,13 +5,12 @@ import ( "github.com/maddalax/htmgo/framework/h" "hackernews/internal/news" "hackernews/internal/timeformat" - "strconv" + "time" ) func Story(ctx *h.RequestContext) *h.Partial { - storyId, err := strconv.ParseInt(ctx.QueryParam("item"), 10, 64) - - if storyId == 0 || err != nil { + storyId := news.MustItemId(ctx) + if storyId == 0 { return h.NewPartial( h.Div( h.Class("flex justify-center bg-neutral-300"), @@ -20,29 +19,42 @@ func Story(ctx *h.RequestContext) *h.Partial { ) } - story, err := news.GetStory(int(storyId)) - if ctx.IsHxRequest() { return h.SwapManyPartialWithHeaders( ctx, h.PushUrlHeader(fmt.Sprintf("/?item=%d", storyId)), - StoryBody(story), + h.Div( + h.Id("story-body"), + CachedStoryBody(storyId), + ), ) } return h.NewPartial( - StoryBody(story), + CachedStoryBody(storyId), ) } +var CachedStoryBody = h.CachedPerKeyT[string, int](time.Minute*3, func(itemId int) (string, h.GetElementFunc) { + return fmt.Sprintf("story-%d", itemId), func() *h.Element { + story, err := news.GetStory(itemId) + if err != nil { + return h.Div( + h.Id("story-body"), + h.Text("Failed to load story"), + ) + } + return StoryBody(story) + } +}) + func StoryBody(story *news.Story) *h.Element { return h.Div( - h.Class("min-w-3xl"), h.Id("story-body"), h.Div( h.Class("prose prose-2xl bg-white border-b border-gray-200 pb-3 min-w-3xl max-w-3xl"), h.H5( - h.Class("flex gap-2 items-center font-bold"), + h.Class("flex gap-2 items-left font-bold"), h.UnsafeRaw(story.Title), ), h.A( @@ -63,6 +75,14 @@ func StoryBody(story *news.Story) *h.Element { h.TextF(" %s", timeformat.RelativeTime(story.Time)), ), ), + h.TriggerChildren(), + h.Div( + h.Id("comments-loader"), + h.Class("flex justify-center items-center h-24"), + h.Div( + h.Class("animate-spin rounded-full h-8 w-8 border-t-2 border-b-2 border-rose-500"), + ), + ), h.Div( h.Class("mt-2 min-w-3xl max-w-3xl"), h.GetPartial(StoryComments, "load"), From bd344d56ef0d4b22372fbed7aa85dadc53846268 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 18:01:51 -0500 Subject: [PATCH 045/145] update meta --- examples/hackernews/pages/root.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/hackernews/pages/root.go b/examples/hackernews/pages/root.go index cec47ff7..8c00fc68 100644 --- a/examples/hackernews/pages/root.go +++ b/examples/hackernews/pages/root.go @@ -11,14 +11,14 @@ func RootPage(children ...h.Ren) h.Ren { h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), - h.Meta("title", "htmgo template"), + h.Meta("title", "hackernews"), h.Meta("charset", "utf-8"), h.Meta("author", "htmgo"), - h.Meta("description", "this is a template"), - h.Meta("og:title", "htmgo template"), - h.Meta("og:url", "https://htmgo.dev"), - h.Link("canonical", "https://htmgo.dev"), - h.Meta("og:description", "this is a template"), + h.Meta("description", "hacker news reader, built with htmgo"), + h.Meta("og:title", "hacker news reader"), + h.Meta("og:url", "https://hn.htmgo.dev"), + h.Link("canonical", "https://hn.htmgo.dev"), + h.Meta("og:description", "hacker news reader, built with htmgo"), h.Link("/public/main.css", "stylesheet"), h.Script("/public/htmgo.js"), ), From 819af8b7b87c55e62795698ed94fe968a36fbd17 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 20:17:31 -0500 Subject: [PATCH 046/145] infinite scroll --- examples/hackernews/internal/news/news.go | 9 ++++++ examples/hackernews/internal/parse/parse.go | 11 +++++++ examples/hackernews/partials/sidebar.go | 32 +++++++++++++++++++-- examples/hackernews/partials/story.go | 1 - framework/h/base.go | 3 +- 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 examples/hackernews/internal/parse/parse.go diff --git a/examples/hackernews/internal/news/news.go b/examples/hackernews/internal/news/news.go index a972e680..1b0c7786 100644 --- a/examples/hackernews/internal/news/news.go +++ b/examples/hackernews/internal/news/news.go @@ -77,6 +77,15 @@ func GetStories(category string, page int, limit int) []Story { ids := *top start := page * limit end := start + limit + + if start > len(ids) { + return make([]Story, 0) + } + + if end > len(ids) { + end = len(ids) + } + return batch.ParallelProcess[int, Story]( ids[start:end], 50, diff --git a/examples/hackernews/internal/parse/parse.go b/examples/hackernews/internal/parse/parse.go new file mode 100644 index 00000000..ffd12815 --- /dev/null +++ b/examples/hackernews/internal/parse/parse.go @@ -0,0 +1,11 @@ +package parse + +import "strconv" + +func MustParseInt(s string, fallback int) int { + v, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return fallback + } + return int(v) +} diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go index e68325b7..c803e434 100644 --- a/examples/hackernews/partials/sidebar.go +++ b/examples/hackernews/partials/sidebar.go @@ -6,6 +6,7 @@ import ( "github.com/maddalax/htmgo/framework/hx" "hackernews/components" "hackernews/internal/news" + "hackernews/internal/parse" "hackernews/internal/timeformat" "time" ) @@ -45,10 +46,23 @@ var ScrollJs = ` func StorySidebar(ctx *h.RequestContext) *h.Partial { category := h.GetQueryParam(ctx, "category") + pageRaw := h.GetQueryParam(ctx, "page") + mode := h.GetQueryParam(ctx, "mode") + + if pageRaw == "" { + pageRaw = "0" + } + if category == "" { category = "topstories" } + page := parse.MustParseInt(pageRaw, 0) + + fetchMorePath := h.GetPartialPathWithQs(StorySidebar, h.NewQs("mode", "infinite", "page", fmt.Sprintf("%d", page+1), "category", category)) + + list := CachedStoryList(category, page, 50, fetchMorePath) + body := h.Aside( h.Id("story-sidebar"), h.JoinExtensions(h.TriggerChildren()), @@ -56,13 +70,21 @@ func StorySidebar(ctx *h.RequestContext) *h.Partial { h.Div( h.Class("flex flex-col gap-1"), SidebarTitle(category), - CachedStoryList(category, 0, 50), + h.Id("story-list"), + list, ), ) + if mode == "infinite" { + return h.NewPartial( + list, + ) + } + if ctx.IsHxRequest() { return h.SwapManyPartial(ctx, body) } + return h.NewPartial(body) } @@ -99,7 +121,7 @@ func CategoryBadge(defaultCategory string, category news.Category) *h.Element { ) } -var CachedStoryList = h.CachedPerKeyT3(time.Minute*5, func(category string, page int, limit int) (string, h.GetElementFunc) { +var CachedStoryList = h.CachedPerKeyT4(time.Minute*5, func(category string, page int, limit int, fetchMorePath string) (string, h.GetElementFunc) { return fmt.Sprintf("%s-stories-%d-%d", category, page, limit), func() *h.Element { stories := news.GetStories(category, page, limit) return h.List(stories, func(item news.Story, index int) *h.Element { @@ -120,6 +142,12 @@ var CachedStoryList = h.CachedPerKeyT3(time.Minute*5, func(category string, page h.Class("text-sm text-gray-600"), h.UnsafeRaw(fmt.Sprintf("%d upvotes • %d comments", item.Score, item.Descendents)), ), + h.If(index == len(stories)-1, h.Div( + h.Id("load-more"), + h.Attribute("hx-swap", "beforeend"), + h.HxTarget("#story-list"), + h.Get(fetchMorePath, "intersect once"), + )), ) }) } diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go index 43e742e1..0aa6c056 100644 --- a/examples/hackernews/partials/story.go +++ b/examples/hackernews/partials/story.go @@ -75,7 +75,6 @@ func StoryBody(story *news.Story) *h.Element { h.TextF(" %s", timeformat.RelativeTime(story.Time)), ), ), - h.TriggerChildren(), h.Div( h.Id("comments-loader"), h.Class("flex justify-center items-center h-24"), diff --git a/framework/h/base.go b/framework/h/base.go index ec0030fe..bbb80061 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -1,7 +1,6 @@ package h import ( - "html" "net/http" "reflect" "runtime" @@ -89,5 +88,5 @@ func GetPartialPath(partial PartialFunc) string { } func GetPartialPathWithQs(partial func(ctx *RequestContext) *Partial, qs *Qs) string { - return html.EscapeString(GetPartialPath(partial) + "?" + qs.ToString()) + return GetPartialPath(partial) + "?" + qs.ToString() } From 775d012079d8b5a1a70db6a78b34c9ab19711981 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 01:18:18 +0000 Subject: [PATCH 047/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index f875a573..fed6b88b 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 + github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 7c429a61..7f211e93 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 33efdbc3..6d0cfee7 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 +require github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 699273e0..cb3b2751 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index b2ffa21d..a1bceeb2 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 + github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 48008265..d6ef5c56 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 00a77abe..18c49eee 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 +require github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 699273e0..cb3b2751 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 4e057f5b..b8503b20 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 + github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index d0415fc1..353b5ac2 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 2c43ac73..b5bb5dfc 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 +require github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 699273e0..cb3b2751 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511 h1:4N9hchygi01yJ1frTYxlyIdjfyFc176Qqd/XC9mfJEQ= -github.com/maddalax/htmgo/framework v0.0.0-20241010220020-488094651511/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= +github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 5c87d96a51d466669cdcd16016ac421c7db8efa2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 20:31:20 -0500 Subject: [PATCH 048/145] css fixes --- examples/hackernews/pages/index.go | 2 +- examples/hackernews/partials/story.go | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/hackernews/pages/index.go b/examples/hackernews/pages/index.go index b103599e..44cc3fd8 100644 --- a/examples/hackernews/pages/index.go +++ b/examples/hackernews/pages/index.go @@ -12,7 +12,7 @@ func IndexPage(ctx *h.RequestContext) *h.Page { h.Class("flex gap-2 min-h-screen"), partials.StorySidebar(ctx), h.Main( - h.Class("flex justify-center items-start p-6 max-w-3xl min-w-3xl mx-auto"), + h.Class("flex justify-left items-start p-6 w-full"), partials.Story(ctx), ), ), diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go index 0aa6c056..8b72272b 100644 --- a/examples/hackernews/partials/story.go +++ b/examples/hackernews/partials/story.go @@ -24,6 +24,7 @@ func Story(ctx *h.RequestContext) *h.Partial { ctx, h.PushUrlHeader(fmt.Sprintf("/?item=%d", storyId)), h.Div( + h.Class("w-full"), h.Id("story-body"), CachedStoryBody(storyId), ), @@ -50,9 +51,10 @@ var CachedStoryBody = h.CachedPerKeyT[string, int](time.Minute*3, func(itemId in func StoryBody(story *news.Story) *h.Element { return h.Div( + h.Class("w-full"), h.Id("story-body"), h.Div( - h.Class("prose prose-2xl bg-white border-b border-gray-200 pb-3 min-w-3xl max-w-3xl"), + h.Class("prose prose-2xl border-b border-gray-200 pb-3 max-w-none w-full"), h.H5( h.Class("flex gap-2 items-left font-bold"), h.UnsafeRaw(story.Title), From a49346bda40dc1117c1982a78c25945f35c57b69 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 20:37:24 -0500 Subject: [PATCH 049/145] add top banner --- examples/hackernews/pages/root.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/examples/hackernews/pages/root.go b/examples/hackernews/pages/root.go index 8c00fc68..1df43ef5 100644 --- a/examples/hackernews/pages/root.go +++ b/examples/hackernews/pages/root.go @@ -5,6 +5,12 @@ import ( ) func RootPage(children ...h.Ren) h.Ren { + banner := h.A(h.Class("bg-neutral-200 text-neutral-600 text-center p-2 flex items-center justify-center"), + h.Href("https://github.com/maddalax/htmgo"), + h.Attribute("target", "_blank"), + h.Text("Built with htmgo.dev"), + ) + return h.Html( h.HxExtensions(h.BaseExtensions()), h.Head( @@ -23,6 +29,7 @@ func RootPage(children ...h.Ren) h.Ren { h.Script("/public/htmgo.js"), ), h.Body( + banner, h.Div( h.Fragment(children...), ), From 9f9f43751f53793a51db353c605643b8e704356f Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 10 Oct 2024 21:01:39 -0500 Subject: [PATCH 050/145] handle /item redirect --- examples/hackernews/main.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/hackernews/main.go b/examples/hackernews/main.go index 575e42c6..1d387120 100644 --- a/examples/hackernews/main.go +++ b/examples/hackernews/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "hackernews/__htmgo" @@ -23,6 +24,11 @@ func main() { http.FileServerFS(sub) + app.Router.Handle("/item", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + id := r.URL.Query().Get("id") + w.Header().Set("Location", fmt.Sprintf("/?item=%s", id)) + w.WriteHeader(302) + })) app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) __htmgo.Register(app.Router) }, From ea5d4d5e2e98d4dfdbce9fec6cb8a5e5e2956511 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 08:56:56 -0500 Subject: [PATCH 051/145] update onload to always be called when element gets rendered again --- cli/htmgo/watcher.go | 9 +++++---- examples/hackernews/partials/sidebar.go | 5 +---- framework/assets/dist/htmgo.js | 4 ++-- framework/assets/js/htmgo.ts | 16 ---------------- framework/assets/js/htmxextensions/htmgo.ts | 21 +++++++++++++++++++++ framework/h/lifecycle.go | 1 + framework/hx/htmx.go | 2 +- 7 files changed, 31 insertions(+), 27 deletions(-) diff --git a/cli/htmgo/watcher.go b/cli/htmgo/watcher.go index 809e7e09..0509b3d5 100644 --- a/cli/htmgo/watcher.go +++ b/cli/htmgo/watcher.go @@ -42,11 +42,12 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { } if event.Has(fsnotify.Remove) { - err = watcher.Remove(event.Name) + info, err := os.Stat(event.Name) if err != nil { - slog.Error("Error removing directory from watcher:", slog.String("path", event.Name), slog.String("error", err.Error())) - } else { - slog.Debug("Stopped watching directory:", slog.String("path", event.Name)) + continue + } + if info.IsDir() { + _ = watcher.Remove(event.Name) } } diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go index c803e434..c850d09b 100644 --- a/examples/hackernews/partials/sidebar.go +++ b/examples/hackernews/partials/sidebar.go @@ -3,7 +3,6 @@ package partials import ( "fmt" "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/hx" "hackernews/components" "hackernews/internal/news" "hackernews/internal/parse" @@ -11,7 +10,6 @@ import ( "time" ) -// @lang js var ScrollJs = ` const scrollContainer = self; let isDown = false; @@ -101,8 +99,7 @@ func SidebarTitle(defaultCategory string) *h.Element { h.Text("Hacker News"), ), h.Div( - h.OnEvent(hx.LoadDomEvent, h.EvalJs(ScrollJs)), - h.OnEvent(hx.LoadEvent, h.EvalJs(ScrollJs)), + h.OnLoad(h.EvalJs(ScrollJs)), h.Class("scroll-container mt-2 flex gap-1 no-scrollbar overflow-y-hidden whitespace-nowrap overflow-x-auto"), h.List(news.Categories, func(item news.Category, index int) *h.Element { return CategoryBadge(defaultCategory, item) diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index a0aadc4a..8cbe139a 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var te=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),Z=G[0],j=G[1],D=t;if(M&&(D=Z,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let ee=M?null:encodeParamsForBody(m,n,L);return m.send(ee),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=te;function ne(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=oe(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=se(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,ae="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function le(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=le(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ue());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ue(){window.location.reload();}var ce=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target);}});function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(ce)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,K=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!K.has(i)&&(fe(o,i),K.add(i));}}}});function fe(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.onload=function(){let e=["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"];for(let t of Array.from(document.querySelectorAll("[onload]")))if(t!=null&&t instanceof HTMLElement){if(e.includes(t.tagName))continue;t.onload(new Event("load"));}};window.htmx=f;function de(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}de((e,t)=>{he(t);});function he(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwiaWdub3JlZCIsIndhdGNoVXJsIiwibGFzdFVybCIsIl8iLCJuZXdVcmwiLCJvblVybENoYW5nZSIsImhhc01hdGNoIiwiZGVmYXVsdEtleSJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBSUEsRUFBQUEsQ0FBUSxVQUFXLENBSXJCLElBQU0sSUFBTyxDQUFBLENBSVgsT0FBUSxJQUVSLENBQUEsT0FBQSxDQUFTLEtBRVQsRUFBSSxDQUFBLElBQUEsQ0FFSixJQUFLLElBRUwsQ0FBQSxPQUFBLENBQVMsS0FFVCxJQUFNLENBQUEsSUFBQSxDQUdOLEtBQU0sSUFFTixDQUFBLE9BQUEsQ0FBUyxLQUVULE9BQVMsQ0FBQSxJQUFBLENBVVQsT0FBUSxTQUFTQyxDQUFBQSxDQUFLQyxFQUFNLENBRTFCLE9BRG9CLGVBQWVELENBQUtDLENBQUFBLENBQUFBLEVBQVEs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RSxDQUN6RCxFQUVKLENBQ0YsQ0FBQyxFQUNIIiwiZmlsZSI6Imh0bWdvLmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGh0bXggPSAoZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0J1xuXG4gIC8vIFB1YmxpYyBBUElcbiAgY29uc3QgaHRteCA9IHtcbiAgICAvLyBUc2MgbWFkbmVzcyBoZXJlLCBhc3NpZ25pbmcgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSByZXN1bHRzIGluIGFuIGludmFsaWQgVHlwZVNjcmlwdCBvdXRwdXQsIGJ1dCByZWFzc2lnbmluZyBpcyBmaW5lXG4gICAgLyogRXZlbnQgcHJvY2Vzc2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIG9uTG9hZEhlbHBlcn0gKi9cbiAgICBvbkxvYWQ6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcHJvY2Vzc05vZGV9ICovXG4gICAgcHJvY2VzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFdmVudExpc3RlbmVySW1wbH0gKi9cbiAgICBvZmY6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgdHJpZ2dlckV2ZW50fSAqL1xuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWpheEhlbHBlcn0gKi9cbiAgICBhamF4OiBudWxsLFxuICAgIC8qIERPTSBxdWVyeWluZyBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZmluZH0gKi9cbiAgICBmaW5kOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmRBbGx9ICovXG4gICAgZmluZEFsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBjbG9zZXN0fSAqL1xuICAgIGNsb3Nlc3Q6IG51bGwsXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgaW5wdXQgdmFsdWVzIHRoYXQgd291bGQgcmVzb2x2ZSBmb3IgYSBnaXZlbiBlbGVtZW50IHZpYSB0aGUgaHRteCB2YWx1ZSByZXNvbHV0aW9uIG1lY2hhbmlzbVxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdmFsdWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdCB0aGUgZWxlbWVudCB0byByZXNvbHZlIHZhbHVlcyBvblxuICAgICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHR5cGUgdGhlIHJlcXVlc3QgdHlwZSAoZS5nLiAqKmdldCoqIG9yICoqcG9zdCoqKSBub24tR0VUJ3Mgd2lsbCBpbmNsdWRlIHRoZSBlbmNsb3NpbmcgZm9ybSBvZiB0aGUgZWxlbWVudC4gRGVmYXVsdHMgdG8gKipwb3N0KipcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxuICAgICAqL1xuICAgIHZhbHVlczogZnVuY3Rpb24oZWx0LCB0eXBlKSB7XG4gICAgICBjb25zdCBpbnB1dFZhbHVlcyA9IGdldElucHV0VmFsdWVzKGVsdCwgdHlwZSB8fCAncG9zdCcpXG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXMudmFsdWVzXG4gICAgfSxcbiAgICAvKiBET00gbWFuaXB1bGF0aW9uIGhlbHBlcnMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFbGVtZW50fSAqL1xuICAgIHJlbW92ZTogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBhZGRDbGFzc1RvRWxlbWVudH0gKi9cbiAgICBhZGRDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVDbGFzc0Zyb21FbGVtZW50fSAqL1xuICAgIHJlbW92ZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRvZ2dsZUNsYXNzT25FbGVtZW50fSAqL1xuICAgIHRvZ2dsZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRha2VDbGFzc0ZvckVsZW1lbnR9ICovXG4gICAgdGFrZUNsYXNzOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHN3YXB9ICovXG4gICAgc3dhcDogbnVsbCxcbiAgICAvKiBFeHRlbnNpb24gZW50cnlwb2ludHMgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBkZWZpbmVFeHRlbnNpb259ICovXG4gICAgZGVmaW5lRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHJlbW92ZUV4dGVuc2lvbn0gKi9cbiAgICByZW1vdmVFeHRlbnNpb246IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nQWxsfSAqL1xuICAgIGxvZ0FsbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBsb2dOb25lfSAqL1xuICAgIGxvZ05vbmU6IG51bGwsXG4gICAgLyogRGVidWdnaW5nICovXG4gICAgLyoqXG4gICAgICogVGhlIGxvZ2dlciBodG14IHVzZXMgdG8gbG9nIHdpdGhcbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ2dlclxuICAgICAqL1xuICAgIGxvZ2dlcjogbnVsbCxcbiAgICAvKipcbiAgICAgKiBBIHByb3BlcnR5IGhvbGRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gaHRteCB1c2VzIGF0IHJ1bnRpbWUuXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgdXNpbmcgYSBbbWV0YSB0YWddKGh0dHBzOi8vaHRteC5vcmcvZG9jcy8jY29uZmlnKSBpcyB0aGUgcHJlZmVycmVkIG1lY2hhbmlzbSBmb3Igc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzLlxuICAgICAqXG4gICAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY29uZmlnXG4gICAgICovXG4gICAgY29uZmlnOiB7XG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdG8gdXNlIGhpc3RvcnkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGhpc3RvcnlFbmFibGVkOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGtlZXAgaW4gKipsb2NhbFN0b3JhZ2UqKiBmb3IgaGlzdG9yeSBzdXBwb3J0LlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAxMFxuICAgICAgICovXG4gICAgICBoaXN0b3J5Q2FjaGVTaXplOiAxMCxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgcmVmcmVzaE9uSGlzdG9yeU1pc3M6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBzd2FwIHN0eWxlIHRvIHVzZSBpZiAqKltoeC1zd2FwXShodHRwczovL2h0bXgub3JnL2F0dHJpYnV0ZXMvaHgtc3dhcCkqKiBpcyBvbWl0dGVkLlxuICAgICAgICogQHR5cGUgSHRteFN3YXBTdHlsZVxuICAgICAgICogQGRlZmF1bHQgJ2lubmVySFRNTCdcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBTdHlsZTogJ2lubmVySFRNTCcsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGRlbGF5IGJldHdlZW4gcmVjZWl2aW5nIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyIGFuZCBkb2luZyB0aGUgc3dhcC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICBkZWZhdWx0U3dhcERlbGF5OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIGNvbXBsZXRpbmcgdGhlIGNvbnRlbnQgc3dhcCBhbmQgc2V0dGxpbmcgYXR0cmlidXRlcy5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMjBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFNldHRsZURlbGF5OiAyMCxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdHJ1ZSwgaHRteCB3aWxsIGluamVjdCBhIHNtYWxsIGFtb3VudCBvZiBDU1MgaW50byB0aGUgcGFnZSB0byBtYWtlIGluZGljYXRvcnMgaW52aXNpYmxlIHVubGVzcyB0aGUgKipodG14LWluZGljYXRvcioqIGNsYXNzIGlzIHByZXNlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGluY2x1ZGVJbmRpY2F0b3JTdHlsZXM6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiBpbmRpY2F0b3JzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtaW5kaWNhdG9yJ1xuICAgICAgICovXG4gICAgICBpbmRpY2F0b3JDbGFzczogJ2h0bXgtaW5kaWNhdG9yJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRyaWdnZXJpbmcgZWxlbWVudHMgd2hlbiBhIHJlcXVlc3QgaXMgaW4gZmxpZ2h0LlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1yZXF1ZXN0J1xuICAgICAgICovXG4gICAgICByZXF1ZXN0Q2xhc3M6ICdodG14LXJlcXVlc3QnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gdGVtcG9yYXJpbHkgcGxhY2Ugb24gZWxlbWVudHMgdGhhdCBodG14IGhhcyBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1hZGRlZCdcbiAgICAgICAqL1xuICAgICAgYWRkZWRDbGFzczogJ2h0bXgtYWRkZWQnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc2V0dGxpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXNldHRsaW5nJ1xuICAgICAgICovXG4gICAgICBzZXR0bGluZ0NsYXNzOiAnaHRteC1zZXR0bGluZycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0YXJnZXQgZWxlbWVudHMgd2hlbiBodG14IGlzIGluIHRoZSBzd2FwcGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtc3dhcHBpbmcnXG4gICAgICAgKi9cbiAgICAgIHN3YXBwaW5nQ2xhc3M6ICdodG14LXN3YXBwaW5nJyxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3dzIHRoZSB1c2Ugb2YgZXZhbC1saWtlIGZ1bmN0aW9uYWxpdHkgaW4gaHRteCwgdG8gZW5hYmxlICoqaHgtdmFycyoqLCB0cmlnZ2VyIGNvbmRpdGlvbnMgJiBzY3JpcHQgdGFnIGV2YWx1YXRpb24uIENhbiBiZSBzZXQgdG8gKipmYWxzZSoqIGZvciBDU1AgY29tcGF0aWJpbGl0eS5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dFdmFsOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gZmFsc2UsIGRpc2FibGVzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBzY3JpcHQgdGFncy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dTY3JpcHRUYWdzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzY3JpcHRzLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnJ1xuICAgICAgICovXG4gICAgICBpbmxpbmVTY3JpcHROb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCwgdGhlIG5vbmNlIHdpbGwgYmUgYWRkZWQgdG8gaW5saW5lIHN0eWxlcy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU3R5bGVOb25jZTogJycsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBhdHRyaWJ1dGVzIHRvIHNldHRsZSBkdXJpbmcgdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nW11cbiAgICAgICAqIEBkZWZhdWx0IFsnY2xhc3MnLCAnc3R5bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J11cbiAgICAgICAqL1xuICAgICAgYXR0cmlidXRlc1RvU2V0dGxlOiBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddLFxuICAgICAgLyoqXG4gICAgICAgKiBBbGxvdyBjcm9zcy1zaXRlIEFjY2Vzcy1Db250cm9sIHJlcXVlc3RzIHVzaW5nIGNyZWRlbnRpYWxzIHN1Y2ggYXMgY29va2llcywgYXV0aG9yaXphdGlvbiBoZWFkZXJzIG9yIFRMUyBjbGllbnQgY2VydGlmaWNhdGVzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgd2l0aENyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgbnVtYmVyXG4gICAgICAgKiBAZGVmYXVsdCAwXG4gICAgICAgKi9cbiAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mICoqZ2V0V2ViU29ja2V0UmVjb25uZWN0RGVsYXkqKiBmb3IgcmVjb25uZWN0aW5nIGFmdGVyIHVuZXhwZWN0ZWQgY29ubmVjdGlvbiBsb3NzIGJ5IHRoZSBldmVudCBjb2RlICoqQWJub3JtYWwgQ2xvc3VyZSoqLCAqKlNlcnZpY2UgUmVzdGFydCoqIG9yICoqVHJ5IEFnYWluIExhdGVyKiouXG4gICAgICAgKiBAdHlwZSB7J2Z1bGwtaml0dGVyJyB8ICgocmV0cnlDb3VudDpudW1iZXIpID0+IG51bWJlcil9XG4gICAgICAgKiBAZGVmYXVsdCBcImZ1bGwtaml0dGVyXCJcbiAgICAgICAqL1xuICAgICAgd3NSZWNvbm5lY3REZWxheTogJ2Z1bGwtaml0dGVyJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIHR5cGUgb2YgYmluYXJ5IGRhdGEgYmVpbmcgcmVjZWl2ZWQgb3ZlciB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAqIEB0eXBlIEJpbmFyeVR5cGVcbiAgICAgICAqIEBkZWZhdWx0ICdibG9iJ1xuICAgICAgICovXG4gICAgICB3c0JpbmFyeVR5cGU6ICdibG9iJyxcbiAgICAgIC8qKlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXSdcbiAgICAgICAqL1xuICAgICAgZGlzYWJsZVNlbGVjdG9yOiAnW2h4LWRpc2FibGVdLCBbZGF0YS1oeC1kaXNhYmxlXScsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHsnYXV0bycgfCAnaW5zdGFudCcgfCAnc21vb3RoJ31cbiAgICAgICAqIEBkZWZhdWx0ICdpbnN0YW50J1xuICAgICAgICovXG4gICAgICBzY3JvbGxCZWhhdmlvcjogJ2luc3RhbnQnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiB0aGUgZm9jdXNlZCBlbGVtZW50IHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBkZWZhdWx0Rm9jdXNTY3JvbGw6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgaW5jbHVkZSBhIGNhY2hlLWJ1c3RpbmcgcGFyYW1ldGVyIGluIEdFVCByZXF1ZXN0cyB0byBhdm9pZCBjYWNoaW5nIHBhcnRpYWwgcmVzcG9uc2VzIGJ5IHRoZSBicm93c2VyXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnZXRDYWNoZUJ1c3RlclBhcmFtOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUsIGh0bXggd2lsbCB1c2UgdGhlIFZpZXcgVHJhbnNpdGlvbiBBUEkgd2hlbiBzd2FwcGluZyBpbiBuZXcgY29udGVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGdsb2JhbFZpZXdUcmFuc2l0aW9uczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIGh0bXggd2lsbCBmb3JtYXQgcmVxdWVzdHMgd2l0aCB0aGVzZSBtZXRob2RzIGJ5IGVuY29kaW5nIHRoZWlyIHBhcmFtZXRlcnMgaW4gdGhlIFVSTCwgbm90IHRoZSByZXF1ZXN0IGJvZHlcbiAgICAgICAqIEB0eXBlIHsoSHR0cFZlcmIpW119XG4gICAgICAgKiBAZGVmYXVsdCBbJ2dldCcsICdkZWxldGUnXVxuICAgICAgICovXG4gICAgICBtZXRob2RzVGhhdFVzZVVybFBhcmFtczogWydnZXQnLCAnZGVsZXRlJ10sXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBkaXNhYmxlcyBodG14LWJhc2VkIHJlcXVlc3RzIHRvIG5vbi1vcmlnaW4gaG9zdHMuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBzZWxmUmVxdWVzdHNPbmx5OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSBodG14IHdpbGwgbm90IHVwZGF0ZSB0aGUgdGl0bGUgb2YgdGhlIGRvY3VtZW50IHdoZW4gYSB0aXRsZSB0YWcgaXMgZm91bmQgaW4gbmV3IGNvbnRlbnRcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGlnbm9yZVRpdGxlOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0aGUgdGFyZ2V0IG9mIGEgYm9vc3RlZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBzY3JvbGxJbnRvVmlld09uQm9vc3Q6IHRydWUsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjYWNoZSB0byBzdG9yZSBldmFsdWF0ZWQgdHJpZ2dlciBzcGVjaWZpY2F0aW9ucyBpbnRvLlxuICAgICAgICogWW91IG1heSBkZWZpbmUgYSBzaW1wbGUgb2JqZWN0IHRvIHVzZSBhIG5ldmVyLWNsZWFyaW5nIGNhY2hlLCBvciBpbXBsZW1lbnQgeW91ciBvd24gc3lzdGVtIHVzaW5nIGEgW3Byb3h5IG9iamVjdF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvUHJveHkpXG4gICAgICAgKiBAdHlwZSB7T2JqZWN0fG51bGx9XG4gICAgICAgKiBAZGVmYXVsdCBudWxsXG4gICAgICAgKi9cbiAgICAgIHRyaWdnZXJTcGVjc0NhY2hlOiBudWxsLFxuICAgICAgLyoqIEB0eXBlIGJvb2xlYW4gKi9cbiAgICAgIGRpc2FibGVJbmhlcml0YW5jZTogZmFsc2UsXG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdbXSAqL1xuICAgICAgcmVzcG9uc2VIYW5kbGluZzogW1xuICAgICAgICB7IGNvZGU6ICcyMDQnLCBzd2FwOiBmYWxzZSB9LFxuICAgICAgICB7IGNvZGU6ICdbMjNdLi4nLCBzd2FwOiB0cnVlIH0sXG4gICAgICAgIHsgY29kZTogJ1s0NV0uLicsIHN3YXA6IGZhbHNlLCBlcnJvcjogdHJ1ZSB9XG4gICAgICBdLFxuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHByb2Nlc3MgT09CIHN3YXBzIG9uIGVsZW1lbnRzIHRoYXQgYXJlIG5lc3RlZCB3aXRoaW4gdGhlIG1haW4gcmVzcG9uc2UgZWxlbWVudC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgYWxsb3dOZXN0ZWRPb2JTd2FwczogdHJ1ZVxuICAgIH0sXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcGFyc2VJbnRlcnZhbH0gKi9cbiAgICBwYXJzZUludGVydmFsOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGludGVybmFsRXZhbH0gKi9cbiAgICBfOiBudWxsLFxuICAgIHZlcnNpb246ICcyLjAuMidcbiAgfVxuICAvLyBUc2MgbWFkbmVzcyBwYXJ0IDJcbiAgaHRteC5vbkxvYWQgPSBvbkxvYWRIZWxwZXJcbiAgaHRteC5wcm9jZXNzID0gcHJvY2Vzc05vZGVcbiAgaHRteC5vbiA9IGFkZEV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgub2ZmID0gcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGxcbiAgaHRteC50cmlnZ2VyID0gdHJpZ2dlckV2ZW50XG4gIGh0bXguYWpheCA9IGFqYXhIZWxwZXJcbiAgaHRteC5maW5kID0gZmluZFxuICBodG14LmZpbmRBbGwgPSBmaW5kQWxsXG4gIGh0bXguY2xvc2VzdCA9IGNsb3Nlc3RcbiAgaHRteC5yZW1vdmUgPSByZW1vdmVFbGVtZW50XG4gIGh0bXguYWRkQ2xhc3MgPSBhZGRDbGFzc1RvRWxlbWVudFxuICBodG14LnJlbW92ZUNsYXNzID0gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudFxuICBodG14LnRvZ2dsZUNsYXNzID0gdG9nZ2xlQ2xhc3NPbkVsZW1lbnRcbiAgaHRteC50YWtlQ2xhc3MgPSB0YWtlQ2xhc3NGb3JFbGVtZW50XG4gIGh0bXguc3dhcCA9IHN3YXBcbiAgaHRteC5kZWZpbmVFeHRlbnNpb24gPSBkZWZpbmVFeHRlbnNpb25cbiAgaHRteC5yZW1vdmVFeHRlbnNpb24gPSByZW1vdmVFeHRlbnNpb25cbiAgaHRteC5sb2dBbGwgPSBsb2dBbGxcbiAgaHRteC5sb2dOb25lID0gbG9nTm9uZVxuICBodG14LnBhcnNlSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsXG4gIGh0bXguXyA9IGludGVybmFsRXZhbFxuXG4gIGNvbnN0IGludGVybmFsQVBJID0ge1xuICAgIGFkZFRyaWdnZXJIYW5kbGVyLFxuICAgIGJvZHlDb250YWlucyxcbiAgICBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UsXG4gICAgZmluZFRoaXNFbGVtZW50LFxuICAgIGZpbHRlclZhbHVlcyxcbiAgICBzd2FwLFxuICAgIGhhc0F0dHJpYnV0ZSxcbiAgICBnZXRBdHRyaWJ1dGVWYWx1ZSxcbiAgICBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdE1hdGNoLFxuICAgIGdldEV4cHJlc3Npb25WYXJzLFxuICAgIGdldEhlYWRlcnMsXG4gICAgZ2V0SW5wdXRWYWx1ZXMsXG4gICAgZ2V0SW50ZXJuYWxEYXRhLFxuICAgIGdldFN3YXBTcGVjaWZpY2F0aW9uLFxuICAgIGdldFRyaWdnZXJTcGVjcyxcbiAgICBnZXRUYXJnZXQsXG4gICAgbWFrZUZyYWdtZW50LFxuICAgIG1lcmdlT2JqZWN0cyxcbiAgICBtYWtlU2V0dGxlSW5mbyxcbiAgICBvb2JTd2FwLFxuICAgIHF1ZXJ5U2VsZWN0b3JFeHQsXG4gICAgc2V0dGxlSW1tZWRpYXRlbHksXG4gICAgc2hvdWxkQ2FuY2VsLFxuICAgIHRyaWdnZXJFdmVudCxcbiAgICB0cmlnZ2VyRXJyb3JFdmVudCxcbiAgICB3aXRoRXh0ZW5zaW9uc1xuICB9XG5cbiAgY29uc3QgVkVSQlMgPSBbJ2dldCcsICdwb3N0JywgJ3B1dCcsICdkZWxldGUnLCAncGF0Y2gnXVxuICBjb25zdCBWRVJCX1NFTEVDVE9SID0gVkVSQlMubWFwKGZ1bmN0aW9uKHZlcmIpIHtcbiAgICByZXR1cm4gJ1toeC0nICsgdmVyYiArICddLCBbZGF0YS1oeC0nICsgdmVyYiArICddJ1xuICB9KS5qb2luKCcsICcpXG5cbiAgY29uc3QgSEVBRF9UQUdfUkVHRVggPSBtYWtlVGFnUmVnRXgoJ2hlYWQnKVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFV0aWxpdGllc1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtSZWdFeHB9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlVGFnUmVnRXgodGFnLCBnbG9iYWwgPSBmYWxzZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKGA8JHt0YWd9KFxcXFxzW14+XSo+fD4pKFtcXFxcc1xcXFxTXSo/KTxcXFxcLyR7dGFnfT5gLFxuICAgICAgZ2xvYmFsID8gJ2dpbScgOiAnaW0nKVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBpbnRlcnZhbCBzdHJpbmcgY29uc2lzdGVudCB3aXRoIHRoZSB3YXkgaHRteCBkb2VzLiBVc2VmdWwgZm9yIHBsdWdpbnMgdGhhdCBoYXZlIHRpbWluZy1yZWxhdGVkIGF0dHJpYnV0ZXMuXG4gICAqXG4gICAqIENhdXRpb246IEFjY2VwdHMgYW4gaW50IGZvbGxvd2VkIGJ5IGVpdGhlciAqKnMqKiBvciAqKm1zKiouIEFsbCBvdGhlciB2YWx1ZXMgdXNlICoqcGFyc2VGbG9hdCoqXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3BhcnNlSW50ZXJ2YWxcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aW1pbmcgc3RyaW5nXG4gICAqIEByZXR1cm5zIHtudW1iZXJ8dW5kZWZpbmVkfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VJbnRlcnZhbChzdHIpIHtcbiAgICBpZiAoc3RyID09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGxldCBpbnRlcnZhbCA9IE5hTlxuICAgIGlmIChzdHIuc2xpY2UoLTIpID09ICdtcycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTIpKVxuICAgIH0gZWxzZSBpZiAoc3RyLnNsaWNlKC0xKSA9PSAncycpIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIuc2xpY2UoMCwgLTEpKSAqIDEwMDBcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ20nKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwICogNjBcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0cilcbiAgICB9XG4gICAgcmV0dXJuIGlzTmFOKGludGVydmFsKSA/IHVuZGVmaW5lZCA6IGludGVydmFsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJhd0F0dHJpYnV0ZShlbHQsIG5hbWUpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBlbHQuZ2V0QXR0cmlidXRlKG5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICAvLyByZXNvbHZlIHdpdGggYm90aCBoeCBhbmQgZGF0YS1oeCBwcmVmaXhlc1xuICBmdW5jdGlvbiBoYXNBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB7XG4gICAgcmV0dXJuICEhZWx0Lmhhc0F0dHJpYnV0ZSAmJiAoZWx0Lmhhc0F0dHJpYnV0ZShxdWFsaWZpZWROYW1lKSB8fFxuICAgICAgZWx0Lmhhc0F0dHJpYnV0ZSgnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSkpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHF1YWxpZmllZE5hbWVcbiAgICogQHJldHVybnMgeyhzdHJpbmcgfCBudWxsKX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBxdWFsaWZpZWROYW1lKSB8fCBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZGF0YS0nICsgcXVhbGlmaWVkTmFtZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZSB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJlbnRFbHQoZWx0KSB7XG4gICAgY29uc3QgcGFyZW50ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICBpZiAoIXBhcmVudCAmJiBlbHQucGFyZW50Tm9kZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHJldHVybiBlbHQucGFyZW50Tm9kZVxuICAgIHJldHVybiBwYXJlbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7Tm9kZXxEb2N1bWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJvb3ROb2RlKGVsdCwgZ2xvYmFsKSB7XG4gICAgcmV0dXJuIGVsdC5nZXRSb290Tm9kZSA/IGVsdC5nZXRSb290Tm9kZSh7IGNvbXBvc2VkOiBnbG9iYWwgfSkgOiBnZXREb2N1bWVudCgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHsoZTpOb2RlKSA9PiBib29sZWFufSBjb25kaXRpb25cbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdE1hdGNoKGVsdCwgY29uZGl0aW9uKSB7XG4gICAgd2hpbGUgKGVsdCAmJiAhY29uZGl0aW9uKGVsdCkpIHtcbiAgICAgIGVsdCA9IHBhcmVudEVsdChlbHQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGVsdCB8fCBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBpbml0aWFsRWxlbWVudFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGFuY2VzdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGluaXRpYWxFbGVtZW50LCBhbmNlc3RvciwgYXR0cmlidXRlTmFtZSkge1xuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpXG4gICAgY29uc3QgZGlzaW5oZXJpdCA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCAnaHgtZGlzaW5oZXJpdCcpXG4gICAgdmFyIGluaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWluaGVyaXQnKVxuICAgIGlmIChpbml0aWFsRWxlbWVudCAhPT0gYW5jZXN0b3IpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5kaXNhYmxlSW5oZXJpdGFuY2UpIHtcbiAgICAgICAgaWYgKGluaGVyaXQgJiYgKGluaGVyaXQgPT09ICcqJyB8fCBpbmhlcml0LnNwbGl0KCcgJykuaW5kZXhPZihhdHRyaWJ1dGVOYW1lKSA+PSAwKSkge1xuICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkaXNpbmhlcml0ICYmIChkaXNpbmhlcml0ID09PSAnKicgfHwgZGlzaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuICd1bnNldCdcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGF0dHJpYnV0ZVZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZU5hbWVcbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgbGV0IGNsb3Nlc3RBdHRyID0gbnVsbFxuICAgIGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHJldHVybiAhIShjbG9zZXN0QXR0ciA9IGdldEF0dHJpYnV0ZVZhbHVlV2l0aERpc2luaGVyaXRhbmNlKGVsdCwgYXNFbGVtZW50KGUpLCBhdHRyaWJ1dGVOYW1lKSlcbiAgICB9KVxuICAgIGlmIChjbG9zZXN0QXR0ciAhPT0gJ3Vuc2V0Jykge1xuICAgICAgcmV0dXJuIGNsb3Nlc3RBdHRyXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1hdGNoZXMoZWx0LCBzZWxlY3Rvcikge1xuICAgIC8vIEB0cy1pZ25vcmU6IG5vbi1zdGFuZGFyZCBwcm9wZXJ0aWVzIGZvciBicm93c2VyIGNvbXBhdGliaWxpdHlcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkVmFyaWFibGVcbiAgICBjb25zdCBtYXRjaGVzRnVuY3Rpb24gPSBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIChlbHQubWF0Y2hlcyB8fCBlbHQubWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5tc01hdGNoZXNTZWxlY3RvciB8fCBlbHQubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm9NYXRjaGVzU2VsZWN0b3IpXG4gICAgcmV0dXJuICEhbWF0Y2hlc0Z1bmN0aW9uICYmIG1hdGNoZXNGdW5jdGlvbi5jYWxsKGVsdCwgc2VsZWN0b3IpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0U3RhcnRUYWcoc3RyKSB7XG4gICAgY29uc3QgdGFnTWF0Y2hlciA9IC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaVxuICAgIGNvbnN0IG1hdGNoID0gdGFnTWF0Y2hlci5leGVjKHN0cilcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIHJldHVybiBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcFxuICAgKiBAcmV0dXJucyB7RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUhUTUwocmVzcCkge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKVxuICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHJlc3AsICd0ZXh0L2h0bWwnKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZWx0KSB7XG4gICAgd2hpbGUgKGVsdC5jaGlsZE5vZGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZChlbHQuY2hpbGROb2Rlc1swXSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0XG4gICAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpIHtcbiAgICBjb25zdCBuZXdTY3JpcHQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpXG4gICAgZm9yRWFjaChzY3JpcHQuYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgbmV3U2NyaXB0LnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgfSlcbiAgICBuZXdTY3JpcHQudGV4dENvbnRlbnQgPSBzY3JpcHQudGV4dENvbnRlbnRcbiAgICBuZXdTY3JpcHQuYXN5bmMgPSBmYWxzZVxuICAgIGlmIChodG14LmNvbmZpZy5pbmxpbmVTY3JpcHROb25jZSkge1xuICAgICAgbmV3U2NyaXB0Lm5vbmNlID0gaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2VcbiAgICB9XG4gICAgcmV0dXJuIG5ld1NjcmlwdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSmF2YVNjcmlwdFNjcmlwdE5vZGUoc2NyaXB0KSB7XG4gICAgcmV0dXJuIHNjcmlwdC5tYXRjaGVzKCdzY3JpcHQnKSAmJiAoc2NyaXB0LnR5cGUgPT09ICd0ZXh0L2phdmFzY3JpcHQnIHx8IHNjcmlwdC50eXBlID09PSAnbW9kdWxlJyB8fCBzY3JpcHQudHlwZSA9PT0gJycpXG4gIH1cblxuICAvKipcbiAgICogd2UgaGF2ZSB0byBtYWtlIG5ldyBjb3BpZXMgb2Ygc2NyaXB0IHRhZ3MgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gaW5zZXJ0IGJlY2F1c2VcbiAgICogU09NRSBicm93c2VycyAobm90IHNheWluZyB3aG8sIGJ1dCBpdCBpbnZvbHZlcyBhbiBlbGVtZW50IGFuZCBhbiBhbmltYWwpIGRvbid0XG4gICAqIGV4ZWN1dGUgc2NyaXB0cyBjcmVhdGVkIGluIDx0ZW1wbGF0ZT4gdGFncyB3aGVuIHRoZXkgYXJlIGluc2VydGVkIGludG8gdGhlIERPTVxuICAgKiBhbmQgYWxsIHRoZSBvdGhlcnMgZG8gbG1hb1xuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTY3JpcHRUYWdzKGZyYWdtZW50KSB7XG4gICAgQXJyYXkuZnJvbShmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdzY3JpcHQnKSkuZm9yRWFjaCgvKiogQHBhcmFtIHtIVE1MU2NyaXB0RWxlbWVudH0gc2NyaXB0ICovIChzY3JpcHQpID0+IHtcbiAgICAgIGlmIChpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkpIHtcbiAgICAgICAgY29uc3QgbmV3U2NyaXB0ID0gZHVwbGljYXRlU2NyaXB0KHNjcmlwdClcbiAgICAgICAgY29uc3QgcGFyZW50ID0gc2NyaXB0LnBhcmVudE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld1NjcmlwdCwgc2NyaXB0KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBzY3JpcHQucmVtb3ZlKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge0RvY3VtZW50RnJhZ21lbnQgJiB7dGl0bGU/OiBzdHJpbmd9fSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlXG4gICAqIEBkZXNjcmlwdGlvbiAgYSBkb2N1bWVudCBmcmFnbWVudCByZXByZXNlbnRpbmcgdGhlIHJlc3BvbnNlIEhUTUwsIGluY2x1ZGluZ1xuICAgKiBhIGB0aXRsZWAgcHJvcGVydHkgZm9yIGFueSB0aXRsZSBpbmZvcm1hdGlvbiBmb3VuZFxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIEhUTUxcbiAgICogQHJldHVybnMge0RvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGV9XG4gICAqL1xuICBmdW5jdGlvbiBtYWtlRnJhZ21lbnQocmVzcG9uc2UpIHtcbiAgICAvLyBzdHJpcCBoZWFkIHRhZyB0byBkZXRlcm1pbmUgc2hhcGUgb2YgcmVzcG9uc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aFxuICAgIGNvbnN0IHJlc3BvbnNlV2l0aE5vSGVhZCA9IHJlc3BvbnNlLnJlcGxhY2UoSEVBRF9UQUdfUkVHRVgsICcnKVxuICAgIGNvbnN0IHN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgIC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovXG4gICAgbGV0IGZyYWdtZW50XG4gICAgaWYgKHN0YXJ0VGFnID09PSAnaHRtbCcpIHtcbiAgICAgIC8vIGlmIGl0IGlzIGEgZnVsbCBkb2N1bWVudCwgcGFyc2UgaXQgYW5kIHJldHVybiB0aGUgYm9keVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAobmV3IERvY3VtZW50RnJhZ21lbnQoKSlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTChyZXNwb25zZSlcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSBpZiAoc3RhcnRUYWcgPT09ICdib2R5Jykge1xuICAgICAgLy8gcGFyc2UgYm9keSB3L28gd3JhcHBpbmcgaW4gdGVtcGxhdGVcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2VXaXRoTm9IZWFkKVxuICAgICAgdGFrZUNoaWxkcmVuRm9yKGZyYWdtZW50LCBkb2MuYm9keSlcbiAgICAgIGZyYWdtZW50LnRpdGxlID0gZG9jLnRpdGxlXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG90aGVyd2lzZSB3ZSBoYXZlIG5vbi1ib2R5IHBhcnRpYWwgSFRNTCBjb250ZW50LCBzbyB3cmFwIGl0IGluIGEgdGVtcGxhdGUgdG8gbWF4aW1pemUgcGFyc2luZyBmbGV4aWJpbGl0eVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKCc8Ym9keT48dGVtcGxhdGUgY2xhc3M9XCJpbnRlcm5hbC1odG14LXdyYXBwZXJcIj4nICsgcmVzcG9uc2VXaXRoTm9IZWFkICsgJzwvdGVtcGxhdGU+PC9ib2R5PicpXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChkb2MucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKS5jb250ZW50KVxuICAgICAgLy8gZXh0cmFjdCB0aXRsZSBpbnRvIGZyYWdtZW50IGZvciBsYXRlciBwcm9jZXNzaW5nXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuXG4gICAgICAvLyBmb3IgbGVnYWN5IHJlYXNvbnMgd2Ugc3VwcG9ydCBhIHRpdGxlIHRhZyBhdCB0aGUgcm9vdCBsZXZlbCBvZiBub24tYm9keSByZXNwb25zZXMsIHNvIHdlIG5lZWQgdG8gaGFuZGxlIGl0XG4gICAgICB2YXIgdGl0bGVFbGVtZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcigndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWxlbWVudCAmJiB0aXRsZUVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZnJhZ21lbnQpIHtcbiAgICAgICAgdGl0bGVFbGVtZW50LnJlbW92ZSgpXG4gICAgICAgIGZyYWdtZW50LnRpdGxlID0gdGl0bGVFbGVtZW50LmlubmVyVGV4dFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZnJhZ21lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd1NjcmlwdFRhZ3MpIHtcbiAgICAgICAgbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgc2NyaXB0IHRhZ3MgaWYgc2NyaXB0cyBhcmUgZGlzYWJsZWRcbiAgICAgICAgZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykuZm9yRWFjaCgoc2NyaXB0KSA9PiBzY3JpcHQucmVtb3ZlKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlQ2FsbChmdW5jKSB7XG4gICAgaWYgKGZ1bmMpIHtcbiAgICAgIGZ1bmMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueX0gb1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZVxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZnVuY3Rpb24gaXNUeXBlKG8sIHR5cGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pID09PSAnW29iamVjdCAnICsgdHlwZSArICddJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBGdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzRnVuY3Rpb24obykge1xuICAgIHJldHVybiB0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Kn0gb1xuICAgKiBAcmV0dXJucyB7byBpcyBPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBpc1Jhd09iamVjdChvKSB7XG4gICAgcmV0dXJuIGlzVHlwZShvLCAnT2JqZWN0JylcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBPbkhhbmRsZXJcbiAgICogQHByb3BlcnR5IHsoa2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcCl8c3RyaW5nfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBMaXN0ZW5lckluZm9cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSBvblxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteE5vZGVJbnRlcm5hbERhdGFcbiAgICogRWxlbWVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbaW5pdEhhc2hdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Jvb3N0ZWRdXG4gICAqIEBwcm9wZXJ0eSB7T25IYW5kbGVyW119IFtvbkhhbmRsZXJzXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEBwcm9wZXJ0eSB7TGlzdGVuZXJJbmZvW119IFtsaXN0ZW5lckluZm9zXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjYW5jZWxsZWRdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyaWdnZXJlZE9uY2VdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXllZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ8bnVsbH0gW3Rocm90dGxlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW2xhc3RWYWx1ZV1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbbG9hZGVkXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyYl1cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbcG9sbGluZ11cbiAgICogQHByb3BlcnR5IHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fG51bGx9IFtsYXN0QnV0dG9uQ2xpY2tlZF1cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFtyZXF1ZXN0Q291bnRdXG4gICAqIEBwcm9wZXJ0eSB7WE1MSHR0cFJlcXVlc3R9IFt4aHJdXG4gICAqIEBwcm9wZXJ0eSB7KCgpID0+IHZvaWQpW119IFtxdWV1ZWRSZXF1ZXN0c11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbYWJvcnRhYmxlXVxuICAgKlxuICAgKiBFdmVudCBkYXRhXG4gICAqIEBwcm9wZXJ0eSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBbdHJpZ2dlclNwZWNdXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRUYXJnZXRbXX0gW2hhbmRsZWRGb3JdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBnZXRJbnRlcm5hbERhdGEgcmV0cmlldmVzIFwicHJpdmF0ZVwiIGRhdGEgc3RvcmVkIGJ5IGh0bXggd2l0aGluIGFuIGVsZW1lbnRcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxFdmVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEludGVybmFsRGF0YShlbHQpIHtcbiAgICBjb25zdCBkYXRhUHJvcCA9ICdodG14LWludGVybmFsLWRhdGEnXG4gICAgbGV0IGRhdGEgPSBlbHRbZGF0YVByb3BdXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICBkYXRhID0gZWx0W2RhdGFQcm9wXSA9IHt9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cblxuICAvKipcbiAgICogdG9BcnJheSBjb252ZXJ0cyBhbiBBcnJheUxpa2Ugb2JqZWN0IGludG8gYSByZWFsIGFycmF5LlxuICAgKiBAdGVtcGxhdGUgVFxuICAgKiBAcGFyYW0ge0FycmF5TGlrZTxUPn0gYXJyXG4gICAqIEByZXR1cm5zIHtUW119XG4gICAqL1xuICBmdW5jdGlvbiB0b0FycmF5KGFycikge1xuICAgIGNvbnN0IHJldHVybkFyciA9IFtdXG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcmV0dXJuQXJyLnB1c2goYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0dXJuQXJyXG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtUW118TmFtZWROb2RlTWFwfEhUTUxDb2xsZWN0aW9ufEhUTUxGb3JtQ29udHJvbHNDb2xsZWN0aW9ufEFycmF5TGlrZTxUPn0gYXJyXG4gICAqIEBwYXJhbSB7KFQpID0+IHZvaWR9IGZ1bmNcbiAgICovXG4gIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmdW5jKSB7XG4gICAgaWYgKGFycikge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZnVuYyhhcnJbaV0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc1Njcm9sbGVkSW50b1ZpZXcoZWwpIHtcbiAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClcbiAgICBjb25zdCBlbGVtVG9wID0gcmVjdC50b3BcbiAgICBjb25zdCBlbGVtQm90dG9tID0gcmVjdC5ib3R0b21cbiAgICByZXR1cm4gZWxlbVRvcCA8IHdpbmRvdy5pbm5lckhlaWdodCAmJiBlbGVtQm90dG9tID49IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGJvZHlDb250YWlucyhlbHQpIHtcbiAgICAvLyBJRSBGaXhcbiAgICBjb25zdCByb290Tm9kZSA9IGVsdC5nZXRSb290Tm9kZSAmJiBlbHQuZ2V0Um9vdE5vZGUoKVxuICAgIGlmIChyb290Tm9kZSAmJiByb290Tm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5TaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKHJvb3ROb2RlLmhvc3QpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZXREb2N1bWVudCgpLmJvZHkuY29udGFpbnMoZWx0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHJpZ2dlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nW119XG4gICAqL1xuICBmdW5jdGlvbiBzcGxpdE9uV2hpdGVzcGFjZSh0cmlnZ2VyKSB7XG4gICAgcmV0dXJuIHRyaWdnZXIudHJpbSgpLnNwbGl0KC9cXHMrLylcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZU9iamVjdHMgdGFrZXMgYWxsIHRoZSBrZXlzIGZyb21cbiAgICogb2JqMiBhbmQgZHVwbGljYXRlcyB0aGVtIGludG8gb2JqMVxuICAgKiBAdGVtcGxhdGUgVDFcbiAgICogQHRlbXBsYXRlIFQyXG4gICAqIEBwYXJhbSB7VDF9IG9iajFcbiAgICogQHBhcmFtIHtUMn0gb2JqMlxuICAgKiBAcmV0dXJucyB7VDEgJiBUMn1cbiAgICovXG4gIGZ1bmN0aW9uIG1lcmdlT2JqZWN0cyhvYmoxLCBvYmoyKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqMikge1xuICAgICAgaWYgKG9iajIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICAgICAgb2JqMVtrZXldID0gb2JqMltrZXldXG4gICAgICB9XG4gICAgfVxuICAgIC8vIEB0cy1pZ25vcmUgdHNjIGRvZXNuJ3Qgc2VlbSB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMgbWVyZ2luZ1xuICAgIHJldHVybiBvYmoxXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGpTdHJpbmdcbiAgICogQHJldHVybnMge2FueXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VKU09OKGpTdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoalN0cmluZylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nRXJyb3IoZXJyb3IpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpIHtcbiAgICBjb25zdCB0ZXN0ID0gJ2h0bXg6bG9jYWxTdG9yYWdlVGVzdCdcbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGVzdCwgdGVzdClcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRlc3QpXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aClcbiAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgcGF0aCA9IHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyBzbGFzaCwgdW5sZXNzIGluZGV4IHBhZ2VcbiAgICAgIGlmICghKC9eXFwvJC8udGVzdChwYXRoKSkpIHtcbiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvKyQvLCAnJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gYmUga2luZCB0byBJRTExLCB3aGljaCBkb2Vzbid0IHN1cHBvcnQgVVJMKClcbiAgICAgIHJldHVybiBwYXRoXG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIHB1YmxpYyBBUElcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIGludGVybmFsRXZhbChzdHIpIHtcbiAgICByZXR1cm4gbWF5YmVFdmFsKGdldERvY3VtZW50KCkuYm9keSwgZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXZhbChzdHIpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2FsbGJhY2sgZm9yIHRoZSAqKmh0bXg6bG9hZCoqIGV2ZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbmV3IGNvbnRlbnQsIGZvciBleGFtcGxlIGluaXRpYWxpemluZyB0aGUgY29udGVudCB3aXRoIGEgamF2YXNjcmlwdCBsaWJyYXJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uTG9hZFxuICAgKlxuICAgKiBAcGFyYW0geyhlbHQ6IE5vZGUpID0+IHZvaWR9IGNhbGxiYWNrIHRoZSBjYWxsYmFjayB0byBjYWxsIG9uIG5ld2x5IGxvYWRlZCBjb250ZW50XG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb25Mb2FkSGVscGVyKGNhbGxiYWNrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBodG14Lm9uKCdodG14OmxvYWQnLCAvKiogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZ0ICovIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY2FsbGJhY2soZXZ0LmRldGFpbC5lbHQpXG4gICAgfSlcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2cgYWxsIGh0bXggZXZlbnRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jbG9nQWxsXG4gICAqL1xuICBmdW5jdGlvbiBsb2dBbGwoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBmdW5jdGlvbihlbHQsIGV2ZW50LCBkYXRhKSB7XG4gICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCwgZWx0LCBkYXRhKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGxvZ05vbmUoKSB7XG4gICAgaHRteC5sb2dnZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYW4gZWxlbWVudCBtYXRjaGluZyB0aGUgc2VsZWN0b3JcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZmluZFxuICAgKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yICB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnQgaW4sIGluY2x1c2l2ZSB8IHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yXSB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhbGwgZWxlbWVudHMgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRBbGxcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciB0aGUgcm9vdCBlbGVtZW50IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGVsZW1lbnRzIGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtOb2RlTGlzdE9mPEVsZW1lbnQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFsbChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmaW5kQWxsKGdldERvY3VtZW50KCksIGVsdE9yU2VsZWN0b3IpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdpbmRvd1xuICAgKi9cbiAgZnVuY3Rpb24gZ2V0V2luZG93KCkge1xuICAgIHJldHVybiB3aW5kb3dcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZVxuICAgKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRWxlbWVudChlbHQsIGRlbGF5KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICByZW1vdmVFbGVtZW50KGVsdClcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudEVsdChlbHQpLnJlbW92ZUNoaWxkKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc0VsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IGVsdFxuICAgKiBAcmV0dXJuIHtIVE1MRWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNIdG1sRWxlbWVudChlbHQpIHtcbiAgICByZXR1cm4gZWx0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKiBAcmV0dXJuIHtQYXJlbnROb2RlfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBhc1BhcmVudE5vZGUoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCA/IGVsdCA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBhZGRzIGEgY2xhc3MgdG8gdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FkZENsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGNsYXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gYWRkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZWZvcmUgY2xhc3MgaXMgYWRkZWRcbiAgICovXG4gIGZ1bmN0aW9uIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenosIGRlbGF5KSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgYWRkQ2xhc3NUb0VsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdC5jbGFzc0xpc3QgJiYgZWx0LmNsYXNzTGlzdC5hZGQoY2xhenopXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjbGFzcyBmcm9tIHRoZSBnaXZlbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IG5vZGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGNsYXNzIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byByZW1vdmVcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV0gdGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMgYmVmb3JlIGNsYXNzIGlzIHJlbW92ZWQpXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVDbGFzc0Zyb21FbGVtZW50KG5vZGUsIGNsYXp6LCBkZWxheSkge1xuICAgIGxldCBlbHQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldChub2RlKSlcbiAgICBpZiAoIWVsdCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChlbHQsIGNsYXp6KVxuICAgICAgICBlbHQgPSBudWxsXG4gICAgICB9LCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoY2xhenopXG4gICAgICAgIC8vIGlmIHRoZXJlIGFyZSBubyBjbGFzc2VzIGxlZnQsIHJlbW92ZSB0aGUgY2xhc3MgYXR0cmlidXRlXG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGVsdC5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBnaXZlbiBjbGFzcyBvbiBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3RvZ2dsZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byB0b2dnbGUgdGhlIGNsYXNzIG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gdG9nZ2xlXG4gICAqL1xuICBmdW5jdGlvbiB0b2dnbGVDbGFzc09uRWxlbWVudChlbHQsIGNsYXp6KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgZWx0LmNsYXNzTGlzdC50b2dnbGUoY2xhenopXG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgdGhlIGdpdmVuIGNsYXNzIGZyb20gaXRzIHNpYmxpbmdzLCBzbyB0aGF0IGFtb25nIGl0cyBzaWJsaW5ncywgb25seSB0aGUgZ2l2ZW4gZWxlbWVudCB3aWxsIGhhdmUgdGhlIGNsYXNzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0YWtlQ2xhc3NcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRoYXQgd2lsbCB0YWtlIHRoZSBjbGFzc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRha2VcbiAgICovXG4gIGZ1bmN0aW9uIHRha2VDbGFzc0ZvckVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGZvckVhY2goZWx0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGF6eilcbiAgICB9KVxuICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChlbHQpLCBjbGF6eilcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBtYXRjaGluZyBlbGVtZW50IGluIHRoZSBnaXZlbiBlbGVtZW50cyBwYXJlbnRhZ2UsIGluY2x1c2l2ZSBvZiB0aGUgZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNjbG9zZXN0XG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0byBmaW5kIHRoZSBzZWxlY3RvciBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciB0aGUgc2VsZWN0b3IgdG8gZmluZFxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gY2xvc2VzdChlbHQsIHNlbGVjdG9yKSB7XG4gICAgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoZWx0KSlcbiAgICBpZiAoZWx0ICYmIGVsdC5jbG9zZXN0KSB7XG4gICAgICByZXR1cm4gZWx0LmNsb3Nlc3Qoc2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE8gcmVtb3ZlIHdoZW4gSUUgZ29lcyBhd2F5XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChlbHQgPT0gbnVsbCB8fCBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB3aGlsZSAoZWx0ID0gZWx0ICYmIGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSkpXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzdGFydHNXaXRoKHN0ciwgcHJlZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN1ZmZpeFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGVuZHNXaXRoKHN0ciwgc3VmZml4KSB7XG4gICAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aCAtIHN1ZmZpeC5sZW5ndGgpID09PSBzdWZmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdHJpbW1lZFNlbGVjdG9yID0gc2VsZWN0b3IudHJpbSgpXG4gICAgaWYgKHN0YXJ0c1dpdGgodHJpbW1lZFNlbGVjdG9yLCAnPCcpICYmIGVuZHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJy8+JykpIHtcbiAgICAgIHJldHVybiB0cmltbWVkU2VsZWN0b3Iuc3Vic3RyaW5nKDEsIHRyaW1tZWRTZWxlY3Rvci5sZW5ndGggLSAyKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxFbGVtZW50fERvY3VtZW50fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBnbG9iYWxcbiAgICogQHJldHVybnMgeyhOb2RlfFdpbmRvdylbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3RvciwgZ2xvYmFsKSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2Nsb3Nlc3QgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbY2xvc2VzdChhc0VsZW1lbnQoZWx0KSwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDgpKSldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdmaW5kICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2ZpbmQoYXNQYXJlbnROb2RlKGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig1KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICduZXh0Jykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5uZXh0RWxlbWVudFNpYmxpbmddXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCduZXh0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5Gb3J3YXJkUXVlcnkoZWx0LCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpLCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgcmV0dXJuIFthc0VsZW1lbnQoZWx0KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZigncHJldmlvdXMgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBbc2NhbkJhY2t3YXJkc1F1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDkpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdkb2N1bWVudCcpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnRdXG4gICAgfSBlbHNlIGlmIChzZWxlY3RvciA9PT0gJ3dpbmRvdycpIHtcbiAgICAgIHJldHVybiBbd2luZG93XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdib2R5Jykge1xuICAgICAgcmV0dXJuIFtkb2N1bWVudC5ib2R5XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdyb290Jykge1xuICAgICAgcmV0dXJuIFtnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ2dsb2JhbCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBzZWxlY3Rvci5zbGljZSg3KSwgdHJ1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRvQXJyYXkoYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKGVsdCwgISFnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gc3RhcnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hdGNoXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgdmFyIHNjYW5Gb3J3YXJkUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9QUkVDRURJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuQmFja3dhcmRzUXVlcnkgPSBmdW5jdGlvbihzdGFydCwgbWF0Y2gsIGdsb2JhbCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhc1BhcmVudE5vZGUoZ2V0Um9vdE5vZGUoc3RhcnQsIGdsb2JhbCkpLnF1ZXJ5U2VsZWN0b3JBbGwobWF0Y2gpXG4gICAgZm9yIChsZXQgaSA9IHJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGVsdCA9IHJlc3VsdHNbaV1cbiAgICAgIGlmIChlbHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oc3RhcnQpID09PSBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0ZPTExPV0lORykge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3JcbiAgICogQHBhcmFtIHtzdHJpbmc9fSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d9XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpWzBdXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGdldERvY3VtZW50KCkuYm9keSwgZWx0T3JTZWxlY3RvcilbMF1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHRlbXBsYXRlIHtFdmVudFRhcmdldH0gVFxuICAgKiBAcGFyYW0ge1R8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7VH0gW2NvbnRleHRdXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fFR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVUYXJnZXQoZWx0T3JTZWxlY3RvciwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmaW5kKGFzUGFyZW50Tm9kZShjb250ZXh0KSB8fCBkb2N1bWVudCwgZWx0T3JTZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge2tleW9mIEhUTUxFbGVtZW50RXZlbnRNYXB8c3RyaW5nfSBBbnlFdmVudE5hbWVcbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50QXJnc1xuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0fSB0YXJnZXRcbiAgICogQHByb3BlcnR5IHtBbnlFdmVudE5hbWV9IGV2ZW50XG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8QW55RXZlbnROYW1lfSBhcmcxXG4gICAqIEBwYXJhbSB7QW55RXZlbnROYW1lfEV2ZW50TGlzdGVuZXJ9IGFyZzJcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM11cbiAgICogQHJldHVybnMge0V2ZW50QXJnc31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGFyZzIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IGdldERvY3VtZW50KCkuYm9keSxcbiAgICAgICAgZXZlbnQ6IGFzU3RyaW5nKGFyZzEpLFxuICAgICAgICBsaXN0ZW5lcjogYXJnMlxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXJnZXQ6IHJlc29sdmVUYXJnZXQoYXJnMSksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcyKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29uXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIGFkZCB0aGUgbGlzdGVuZXIgdG8gfCB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIGFkZCB0aGUgbGlzdGVuZXIgZm9yIHwgdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcGFyYW0ge0V2ZW50TGlzdGVuZXJ9IFthcmczXSB0aGUgbGlzdGVuZXIgdG8gYWRkXG4gICAqIEByZXR1cm5zIHtFdmVudExpc3RlbmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lckltcGwoYXJnMSwgYXJnMiwgYXJnMykge1xuICAgIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgZXZlbnRBcmdzID0gcHJvY2Vzc0V2ZW50QXJncyhhcmcxLCBhcmcyLCBhcmczKVxuICAgICAgZXZlbnRBcmdzLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50QXJncy5ldmVudCwgZXZlbnRBcmdzLmxpc3RlbmVyKVxuICAgIH0pXG4gICAgY29uc3QgYiA9IGlzRnVuY3Rpb24oYXJnMilcbiAgICByZXR1cm4gYiA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBmcm9tIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jb2ZmXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBhcmcxIHRoZSBlbGVtZW50IHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ3xFdmVudExpc3RlbmVyfSBhcmcyIHRoZSBldmVudCBuYW1lIHRvIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB8IHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIHJlbW92ZVxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIHJldHVybiBpc0Z1bmN0aW9uKGFyZzIpID8gYXJnMiA6IGFyZzNcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE5vZGUgcHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0IERVTU1ZX0VMVCA9IGdldERvY3VtZW50KCkuY3JlYXRlRWxlbWVudCgnb3V0cHV0JykgLy8gZHVtbXkgZWxlbWVudCBmb3IgYmFkIHNlbGVjdG9yc1xuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJOYW1lXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsIGF0dHJOYW1lKSB7XG4gICAgY29uc3QgYXR0clRhcmdldCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHJOYW1lKVxuICAgIGlmIChhdHRyVGFyZ2V0KSB7XG4gICAgICBpZiAoYXR0clRhcmdldCA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBbZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0ck5hbWUpXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIGF0dHJUYXJnZXQpXG4gICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgbG9nRXJyb3IoJ1RoZSBzZWxlY3RvciBcIicgKyBhdHRyVGFyZ2V0ICsgJ1wiIG9uICcgKyBhdHRyTmFtZSArICcgcmV0dXJuZWQgbm8gbWF0Y2hlcyEnKVxuICAgICAgICAgIHJldHVybiBbRFVNTVlfRUxUXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiByZXN1bHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyaWJ1dGUpIHtcbiAgICByZXR1cm4gYXNFbGVtZW50KGdldENsb3Nlc3RNYXRjaChlbHQsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZVZhbHVlKGFzRWxlbWVudChlbHQpLCBhdHRyaWJ1dGUpICE9IG51bGxcbiAgICB9KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZXxXaW5kb3d8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRhcmdldChlbHQpIHtcbiAgICBjb25zdCB0YXJnZXRTdHIgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICBpZiAodGFyZ2V0U3RyKSB7XG4gICAgICBpZiAodGFyZ2V0U3RyID09PSAndGhpcycpIHtcbiAgICAgICAgcmV0dXJuIGZpbmRUaGlzRWxlbWVudChlbHQsICdoeC10YXJnZXQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB0YXJnZXRTdHIpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKGRhdGEuYm9vc3RlZCkge1xuICAgICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZWx0XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkU2V0dGxlQXR0cmlidXRlKG5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzVG9TZXR0bGUgPSBodG14LmNvbmZpZy5hdHRyaWJ1dGVzVG9TZXR0bGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNUb1NldHRsZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG5hbWUgPT09IGF0dHJpYnV0ZXNUb1NldHRsZVtpXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IG1lcmdlVG9cbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZUZyb21cbiAgICovXG4gIGZ1bmN0aW9uIGNsb25lQXR0cmlidXRlcyhtZXJnZVRvLCBtZXJnZUZyb20pIHtcbiAgICBmb3JFYWNoKG1lcmdlVG8uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKCFtZXJnZUZyb20uaGFzQXR0cmlidXRlKGF0dHIubmFtZSkgJiYgc2hvdWxkU2V0dGxlQXR0cmlidXRlKGF0dHIubmFtZSkpIHtcbiAgICAgICAgbWVyZ2VUby5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKVxuICAgICAgfVxuICAgIH0pXG4gICAgZm9yRWFjaChtZXJnZUZyb20uYXR0cmlidXRlcywgZnVuY3Rpb24oYXR0cikge1xuICAgICAgaWYgKHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8uc2V0QXR0cmlidXRlKGF0dHIubmFtZSwgYXR0ci52YWx1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0KSB7XG4gICAgY29uc3QgZXh0ZW5zaW9ucyA9IGdldEV4dGVuc2lvbnModGFyZ2V0KVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbi5pc0lubGluZVN3YXAoc3dhcFN0eWxlKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTdHlsZSA9PT0gJ291dGVySFRNTCdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb29iVmFsdWVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBvb2JFbGVtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pIHtcbiAgICBsZXQgc2VsZWN0b3IgPSAnIycgKyBnZXRSYXdBdHRyaWJ1dGUob29iRWxlbWVudCwgJ2lkJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTdHlsZSAqL1xuICAgIGxldCBzd2FwU3R5bGUgPSAnb3V0ZXJIVE1MJ1xuICAgIGlmIChvb2JWYWx1ZSA9PT0gJ3RydWUnKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfSBlbHNlIGlmIChvb2JWYWx1ZS5pbmRleE9mKCc6JykgPiAwKSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZS5zdWJzdHIoMCwgb29iVmFsdWUuaW5kZXhPZignOicpKVxuICAgICAgc2VsZWN0b3IgPSBvb2JWYWx1ZS5zdWJzdHIob29iVmFsdWUuaW5kZXhPZignOicpICsgMSwgb29iVmFsdWUubGVuZ3RoKVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2FwU3R5bGUgPSBvb2JWYWx1ZVxuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldHMgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXG4gICAgaWYgKHRhcmdldHMpIHtcbiAgICAgIGZvckVhY2goXG4gICAgICAgIHRhcmdldHMsXG4gICAgICAgIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICAgIGxldCBmcmFnbWVudFxuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnRDbG9uZSA9IG9vYkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpXG4gICAgICAgICAgZnJhZ21lbnQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKVxuICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKG9vYkVsZW1lbnRDbG9uZSlcbiAgICAgICAgICBpZiAoIWlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkpIHtcbiAgICAgICAgICAgIGZyYWdtZW50ID0gYXNQYXJlbnROb2RlKG9vYkVsZW1lbnRDbG9uZSkgLy8gaWYgdGhpcyBpcyBub3QgYW4gaW5saW5lIHN3YXAsIHdlIHVzZSB0aGUgY29udGVudCBvZiB0aGUgbm9kZSwgbm90IHRoZSBub2RlIGl0c2VsZlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJlZm9yZVN3YXBEZXRhaWxzID0geyBzaG91bGRTd2FwOiB0cnVlLCB0YXJnZXQsIGZyYWdtZW50IH1cbiAgICAgICAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14Om9vYkJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgICAgICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgICAgICAgIGlmIChiZWZvcmVTd2FwRGV0YWlscy5zaG91bGRTd2FwKSB7XG4gICAgICAgICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgdGFyZ2V0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpvb2JBZnRlclN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICApXG4gICAgICBvb2JFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQob29iRWxlbWVudClcbiAgICB9IGVsc2Uge1xuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Om9vYkVycm9yTm9UYXJnZXQnLCB7IGNvbnRlbnQ6IG9vYkVsZW1lbnQgfSlcbiAgICB9XG4gICAgcmV0dXJuIG9vYlZhbHVlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpIHtcbiAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICdbaHgtcHJlc2VydmVdLCBbZGF0YS1oeC1wcmVzZXJ2ZV0nKSwgZnVuY3Rpb24ocHJlc2VydmVkRWx0KSB7XG4gICAgICBjb25zdCBpZCA9IGdldEF0dHJpYnV0ZVZhbHVlKHByZXNlcnZlZEVsdCwgJ2lkJylcbiAgICAgIGNvbnN0IG9sZEVsdCA9IGdldERvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoaWQpXG4gICAgICBpZiAob2xkRWx0ICE9IG51bGwpIHtcbiAgICAgICAgcHJlc2VydmVkRWx0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG9sZEVsdCwgcHJlc2VydmVkRWx0KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnW2lkXScpLCBmdW5jdGlvbihuZXdOb2RlKSB7XG4gICAgICBjb25zdCBpZCA9IGdldFJhd0F0dHJpYnV0ZShuZXdOb2RlLCAnaWQnKVxuICAgICAgaWYgKGlkICYmIGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gaWQucmVwbGFjZShcIidcIiwgXCJcXFxcJ1wiKVxuICAgICAgICBjb25zdCBub3JtYWxpemVkVGFnID0gbmV3Tm9kZS50YWdOYW1lLnJlcGxhY2UoJzonLCAnXFxcXDonKVxuICAgICAgICBjb25zdCBwYXJlbnRFbHQgPSBhc1BhcmVudE5vZGUocGFyZW50Tm9kZSlcbiAgICAgICAgY29uc3Qgb2xkTm9kZSA9IHBhcmVudEVsdCAmJiBwYXJlbnRFbHQucXVlcnlTZWxlY3Rvcihub3JtYWxpemVkVGFnICsgXCJbaWQ9J1wiICsgbm9ybWFsaXplZElkICsgXCInXVwiKVxuICAgICAgICBpZiAob2xkTm9kZSAmJiBvbGROb2RlICE9PSBwYXJlbnRFbHQpIHtcbiAgICAgICAgICBjb25zdCBuZXdBdHRyaWJ1dGVzID0gbmV3Tm9kZS5jbG9uZU5vZGUoKVxuICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBvbGROb2RlKVxuICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNsb25lQXR0cmlidXRlcyhuZXdOb2RlLCBuZXdBdHRyaWJ1dGVzKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gY2hpbGRcbiAgICogQHJldHVybnMge0h0bXhTZXR0bGVUYXNrfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUFqYXhMb2FkVGFzayhjaGlsZCkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwcm9jZXNzTm9kZShhc0VsZW1lbnQoY2hpbGQpKVxuICAgICAgcHJvY2Vzc0ZvY3VzKGFzUGFyZW50Tm9kZShjaGlsZCkpXG4gICAgICB0cmlnZ2VyRXZlbnQoY2hpbGQsICdodG14OmxvYWQnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGNoaWxkXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRm9jdXMoY2hpbGQpIHtcbiAgICBjb25zdCBhdXRvZm9jdXMgPSAnW2F1dG9mb2N1c10nXG4gICAgY29uc3QgYXV0b0ZvY3VzZWRFbHQgPSBhc0h0bWxFbGVtZW50KG1hdGNoZXMoY2hpbGQsIGF1dG9mb2N1cykgPyBjaGlsZCA6IGNoaWxkLnF1ZXJ5U2VsZWN0b3IoYXV0b2ZvY3VzKSlcbiAgICBpZiAoYXV0b0ZvY3VzZWRFbHQgIT0gbnVsbCkge1xuICAgICAgYXV0b0ZvY3VzZWRFbHQuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGVcbiAgICogQHBhcmFtIHtOb2RlfSBpbnNlcnRCZWZvcmVcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRCZWZvcmUsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaGFuZGxlQXR0cmlidXRlcyhwYXJlbnROb2RlLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB3aGlsZSAoZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjaGlsZCA9IGZyYWdtZW50LmZpcnN0Q2hpbGRcbiAgICAgIGFkZENsYXNzVG9FbGVtZW50KGFzRWxlbWVudChjaGlsZCksIGh0bXguY29uZmlnLmFkZGVkQ2xhc3MpXG4gICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShjaGlsZCwgaW5zZXJ0QmVmb3JlKVxuICAgICAgaWYgKGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgc2V0dGxlSW5mby50YXNrcy5wdXNoKG1ha2VBamF4TG9hZFRhc2soY2hpbGQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiYXNlZCBvbiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9oeWFtYW1vdG8vZmQ0MzU1MDVkMjllYmZhM2Q5NzE2ZmQyYmU4ZDQyZjAsXG4gICAqIGRlcml2ZWQgZnJvbSBKYXZhJ3Mgc3RyaW5nIGhhc2hjb2RlIGltcGxlbWVudGF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAgICogQHBhcmFtIHtudW1iZXJ9IGhhc2hcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIHN0cmluZ0hhc2goc3RyaW5nLCBoYXNoKSB7XG4gICAgbGV0IGNoYXIgPSAwXG4gICAgd2hpbGUgKGNoYXIgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICBoYXNoID0gKGhhc2ggPDwgNSkgLSBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoY2hhcisrKSB8IDAgLy8gYml0d2lzZSBvciBlbnN1cmVzIHdlIGhhdmUgYSAzMi1iaXQgaW50XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZUhhc2goZWx0KSB7XG4gICAgbGV0IGhhc2ggPSAwXG4gICAgLy8gSUUgZml4XG4gICAgaWYgKGVsdC5hdHRyaWJ1dGVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldXG4gICAgICAgIGlmIChhdHRyaWJ1dGUudmFsdWUpIHsgLy8gb25seSBpbmNsdWRlIGF0dHJpYnV0ZXMgdy8gYWN0dWFsIHZhbHVlcyAoZW1wdHkgaXMgc2FtZSBhcyBub24tZXhpc3RlbnQpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLm5hbWUsIGhhc2gpXG4gICAgICAgICAgaGFzaCA9IHN0cmluZ0hhc2goYXR0cmlidXRlLnZhbHVlLCBoYXNoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXRPbkhhbmRsZXJzKGVsdCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKGludGVybmFsRGF0YS5vbkhhbmRsZXJzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGludGVybmFsRGF0YS5vbkhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXJJbmZvID0gaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNbaV1cbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoZWx0LCBoYW5kbGVySW5mby5ldmVudCwgaGFuZGxlckluZm8ubGlzdGVuZXIpXG4gICAgICB9XG4gICAgICBkZWxldGUgaW50ZXJuYWxEYXRhLm9uSGFuZGxlcnNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBkZUluaXROb2RlKGVsZW1lbnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWxlbWVudClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLnRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dChpbnRlcm5hbERhdGEudGltZW91dClcbiAgICB9XG4gICAgaWYgKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zKSB7XG4gICAgICBmb3JFYWNoKGludGVybmFsRGF0YS5saXN0ZW5lckluZm9zLCBmdW5jdGlvbihpbmZvKSB7XG4gICAgICAgIGlmIChpbmZvLm9uKSB7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGwoaW5mby5vbiwgaW5mby50cmlnZ2VyLCBpbmZvLmxpc3RlbmVyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsZW1lbnQpXG4gICAgZm9yRWFjaChPYmplY3Qua2V5cyhpbnRlcm5hbERhdGEpLCBmdW5jdGlvbihrZXkpIHsgZGVsZXRlIGludGVybmFsRGF0YVtrZXldIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbGVtZW50XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhblVwRWxlbWVudChlbGVtZW50KSB7XG4gICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50JylcbiAgICBkZUluaXROb2RlKGVsZW1lbnQpXG4gICAgLy8gQHRzLWlnbm9yZSBJRTExIGNvZGVcbiAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4pIHsgLy8gSUVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZvckVhY2goZWxlbWVudC5jaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHsgY2xlYW5VcEVsZW1lbnQoY2hpbGQpIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCT0RZJykgeyAvLyBzcGVjaWFsIGNhc2UgdGhlIGJvZHkgdG8gaW5uZXJIVE1MIGJlY2F1c2UgRG9jdW1lbnRGcmFnbWVudHMgY2FuJ3QgY29udGFpbiBhIGJvZHkgZWx0IHVuZm9ydHVuYXRlbHlcbiAgICAgIHJldHVybiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuICAgIC8qKiBAdHlwZSB7Tm9kZX0gKi9cbiAgICBsZXQgbmV3RWx0XG4gICAgY29uc3QgZWx0QmVmb3JlTmV3Q29udGVudCA9IHRhcmdldC5wcmV2aW91c1NpYmxpbmdcbiAgICBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICBpZiAoZWx0QmVmb3JlTmV3Q29udGVudCA9PSBudWxsKSB7XG4gICAgICBuZXdFbHQgPSBwYXJlbnRFbHQodGFyZ2V0KS5maXJzdENoaWxkXG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0VsdCA9IGVsdEJlZm9yZU5ld0NvbnRlbnQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgc2V0dGxlSW5mby5lbHRzID0gc2V0dGxlSW5mby5lbHRzLmZpbHRlcihmdW5jdGlvbihlKSB7IHJldHVybiBlICE9PSB0YXJnZXQgfSlcbiAgICAvLyBzY2FuIHRocm91Z2ggYWxsIG5ld2x5IGFkZGVkIGNvbnRlbnQgYW5kIGFkZCBhbGwgZWxlbWVudHMgdG8gdGhlIHNldHRsZSBpbmZvIHNvIHdlIHRyaWdnZXJcbiAgICAvLyBldmVudHMgcHJvcGVybHkgb24gdGhlbVxuICAgIHdoaWxlIChuZXdFbHQgJiYgbmV3RWx0ICE9PSB0YXJnZXQpIHtcbiAgICAgIGlmIChuZXdFbHQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICAgIHNldHRsZUluZm8uZWx0cy5wdXNoKG5ld0VsdClcbiAgICAgIH1cbiAgICAgIG5ld0VsdCA9IG5ld0VsdC5uZXh0U2libGluZ1xuICAgIH1cbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIHRhcmdldC5yZW1vdmUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIHRhcmdldC5maXJzdENoaWxkLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHBhcmVudEVsdCh0YXJnZXQpLCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgcmV0dXJuIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgbnVsbCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQWZ0ZXJFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0Lm5leHRTaWJsaW5nLCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcERlbGV0ZSh0YXJnZXQpIHtcbiAgICBjbGVhblVwRWxlbWVudCh0YXJnZXQpXG4gICAgcmV0dXJuIHBhcmVudEVsdCh0YXJnZXQpLnJlbW92ZUNoaWxkKHRhcmdldClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBJbm5lckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGNvbnN0IGZpcnN0Q2hpbGQgPSB0YXJnZXQuZmlyc3RDaGlsZFxuICAgIGluc2VydE5vZGVzQmVmb3JlKHRhcmdldCwgZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGZpcnN0Q2hpbGQpIHtcbiAgICAgIHdoaWxlIChmaXJzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQubmV4dFNpYmxpbmcpXG4gICAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgfVxuICAgICAgY2xlYW5VcEVsZW1lbnQoZmlyc3RDaGlsZClcbiAgICAgIHRhcmdldC5yZW1vdmVDaGlsZChmaXJzdENoaWxkKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBXaXRoU3R5bGUoc3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBzd2l0Y2ggKHN3YXBTdHlsZSkge1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnb3V0ZXJIVE1MJzpcbiAgICAgICAgc3dhcE91dGVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyYmVnaW4nOlxuICAgICAgICBzd2FwQWZ0ZXJCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWJlZ2luJzpcbiAgICAgICAgc3dhcEJlZm9yZUJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnYmVmb3JlZW5kJzpcbiAgICAgICAgc3dhcEJlZm9yZUVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2FmdGVyZW5kJzpcbiAgICAgICAgc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIHJldHVyblxuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgICAgc3dhcERlbGV0ZSh0YXJnZXQpXG4gICAgICAgIHJldHVyblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKGVsdClcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZXh0ID0gZXh0ZW5zaW9uc1tpXVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50cyA9IGV4dC5oYW5kbGVTd2FwKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICAgIGlmIChuZXdFbGVtZW50cykge1xuICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShuZXdFbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBoYW5kbGVTd2FwIHJldHVybnMgYW4gYXJyYXkgKGxpa2UpIG9mIGVsZW1lbnRzLCB3ZSBoYW5kbGUgdGhlbVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbmV3RWxlbWVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gbmV3RWxlbWVudHNbal1cbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN3YXBTdHlsZSA9PT0gJ2lubmVySFRNTCcpIHtcbiAgICAgICAgICBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3dhcFdpdGhTdHlsZShodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLCBlbHQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgdmFyIG9vYkVsdHMgPSBmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXN3YXAtb29iXSwgW2RhdGEtaHgtc3dhcC1vb2JdJylcbiAgICBmb3JFYWNoKG9vYkVsdHMsIGZ1bmN0aW9uKG9vYkVsZW1lbnQpIHtcbiAgICAgIGlmIChodG14LmNvbmZpZy5hbGxvd05lc3RlZE9vYlN3YXBzIHx8IG9vYkVsZW1lbnQucGFyZW50RWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKG9vYkVsZW1lbnQsICdoeC1zd2FwLW9vYicpXG4gICAgICAgIGlmIChvb2JWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgb29iU3dhcChvb2JWYWx1ZSwgb29iRWxlbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2h4LXN3YXAtb29iJylcbiAgICAgICAgb29iRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaHgtc3dhcC1vb2InKVxuICAgICAgfVxuICAgIH0pXG4gICAgcmV0dXJuIG9vYkVsdHMubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgY29tcGxldGUgc3dhcHBpbmcgcGlwZWxpbmUsIGluY2x1ZGluZzogZm9jdXMgYW5kIHNlbGVjdGlvbiBwcmVzZXJ2YXRpb24sXG4gICAqIHRpdGxlIHVwZGF0ZXMsIHNjcm9sbCwgT09CIHN3YXBwaW5nLCBub3JtYWwgc3dhcHBpbmcgYW5kIHNldHRsaW5nXG4gICAqIEBwYXJhbSB7c3RyaW5nfEVsZW1lbnR9IHRhcmdldFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICogQHBhcmFtIHtTd2FwT3B0aW9uc30gW3N3YXBPcHRpb25zXVxuICAgKi9cbiAgZnVuY3Rpb24gc3dhcCh0YXJnZXQsIGNvbnRlbnQsIHN3YXBTcGVjLCBzd2FwT3B0aW9ucykge1xuICAgIGlmICghc3dhcE9wdGlvbnMpIHtcbiAgICAgIHN3YXBPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICB0YXJnZXQgPSByZXNvbHZlVGFyZ2V0KHRhcmdldClcblxuICAgIC8vIHByZXNlcnZlIGZvY3VzIGFuZCBzZWxlY3Rpb25cbiAgICBjb25zdCBhY3RpdmVFbHQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgbGV0IHNlbGVjdGlvbkluZm8gPSB7fVxuICAgIHRyeSB7XG4gICAgICBzZWxlY3Rpb25JbmZvID0ge1xuICAgICAgICBlbHQ6IGFjdGl2ZUVsdCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBzdGFydDogYWN0aXZlRWx0ID8gYWN0aXZlRWx0LnNlbGVjdGlvblN0YXJ0IDogbnVsbCxcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBlbmQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25FbmQgOiBudWxsXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gc2FmYXJpIGlzc3VlIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvcGxheXdyaWdodC9pc3N1ZXMvNTg5NFxuICAgIH1cbiAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8odGFyZ2V0KVxuXG4gICAgLy8gRm9yIHRleHQgY29udGVudCBzd2FwcywgZG9uJ3QgcGFyc2UgdGhlIHJlc3BvbnNlIGFzIEhUTUwsIGp1c3QgaW5zZXJ0IGl0XG4gICAgaWYgKHN3YXBTcGVjLnN3YXBTdHlsZSA9PT0gJ3RleHRDb250ZW50Jykge1xuICAgICAgdGFyZ2V0LnRleHRDb250ZW50ID0gY29udGVudFxuICAgIC8vIE90aGVyd2lzZSwgbWFrZSB0aGUgZnJhZ21lbnQgYW5kIHByb2Nlc3MgaXRcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNvbnRlbnQpXG5cbiAgICAgIHNldHRsZUluZm8udGl0bGUgPSBmcmFnbWVudC50aXRsZVxuXG4gICAgICAvLyBzZWxlY3Qtb29iIHN3YXBzXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0T09CKSB7XG4gICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlcyA9IHN3YXBPcHRpb25zLnNlbGVjdE9PQi5zcGxpdCgnLCcpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb29iU2VsZWN0VmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3Qgb29iU2VsZWN0VmFsdWUgPSBvb2JTZWxlY3RWYWx1ZXNbaV0uc3BsaXQoJzonLCAyKVxuICAgICAgICAgIGxldCBpZCA9IG9vYlNlbGVjdFZhbHVlWzBdLnRyaW0oKVxuICAgICAgICAgIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICAgICAgICAgIGlkID0gaWQuc3Vic3RyaW5nKDEpXG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9vYlZhbHVlID0gb29iU2VsZWN0VmFsdWVbMV0gfHwgJ3RydWUnXG4gICAgICAgICAgY29uc3Qgb29iRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJyMnICsgaWQpXG4gICAgICAgICAgaWYgKG9vYkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBvb2Igc3dhcHNcbiAgICAgIGZpbmRBbmRTd2FwT29iRWxlbWVudHMoZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICBmb3JFYWNoKGZpbmRBbGwoZnJhZ21lbnQsICd0ZW1wbGF0ZScpLCAvKiogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSAqL2Z1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICAgIGlmIChmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKHRlbXBsYXRlLmNvbnRlbnQsIHNldHRsZUluZm8pKSB7XG4gICAgICAgICAgLy8gQXZvaWQgcG9sbHV0aW5nIHRoZSBET00gd2l0aCBlbXB0eSB0ZW1wbGF0ZXMgdGhhdCB3ZXJlIG9ubHkgdXNlZCB0byBlbmNhcHN1bGF0ZSBvb2Igc3dhcFxuICAgICAgICAgIHRlbXBsYXRlLnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIG5vcm1hbCBzd2FwXG4gICAgICBpZiAoc3dhcE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgIGNvbnN0IG5ld0ZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgZm9yRWFjaChmcmFnbWVudC5xdWVyeVNlbGVjdG9yQWxsKHN3YXBPcHRpb25zLnNlbGVjdCksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBuZXdGcmFnbWVudC5hcHBlbmRDaGlsZChub2RlKVxuICAgICAgICB9KVxuICAgICAgICBmcmFnbWVudCA9IG5ld0ZyYWdtZW50XG4gICAgICB9XG4gICAgICBoYW5kbGVQcmVzZXJ2ZWRFbGVtZW50cyhmcmFnbWVudClcbiAgICAgIHN3YXBXaXRoU3R5bGUoc3dhcFNwZWMuc3dhcFN0eWxlLCBzd2FwT3B0aW9ucy5jb250ZXh0RWxlbWVudCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICB9XG5cbiAgICAvLyBhcHBseSBzYXZlZCBmb2N1cyBhbmQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHRvIHN3YXBwZWQgY29udGVudFxuICAgIGlmIChzZWxlY3Rpb25JbmZvLmVsdCAmJlxuICAgICAgIWJvZHlDb250YWlucyhzZWxlY3Rpb25JbmZvLmVsdCkgJiZcbiAgICAgIGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpIHtcbiAgICAgIGNvbnN0IG5ld0FjdGl2ZUVsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGdldFJhd0F0dHJpYnV0ZShzZWxlY3Rpb25JbmZvLmVsdCwgJ2lkJykpXG4gICAgICBjb25zdCBmb2N1c09wdGlvbnMgPSB7IHByZXZlbnRTY3JvbGw6IHN3YXBTcGVjLmZvY3VzU2Nyb2xsICE9PSB1bmRlZmluZWQgPyAhc3dhcFNwZWMuZm9jdXNTY3JvbGwgOiAhaHRteC5jb25maWcuZGVmYXVsdEZvY3VzU2Nyb2xsIH1cbiAgICAgIGlmIChuZXdBY3RpdmVFbHQpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoc2VsZWN0aW9uSW5mby5zdGFydCAmJiBuZXdBY3RpdmVFbHQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvbkluZm8uc3RhcnQsIHNlbGVjdGlvbkluZm8uZW5kKVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIHRoZSBzZXRTZWxlY3Rpb25SYW5nZSBtZXRob2QgaXMgcHJlc2VudCBvbiBmaWVsZHMgdGhhdCBkb24ndCBzdXBwb3J0IGl0LCBzbyBqdXN0IGxldCB0aGlzIGZhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3QWN0aXZlRWx0LmZvY3VzKGZvY3VzT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0YXJnZXQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnNldHRsaW5nQ2xhc3MpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclN3YXAnLCBzd2FwT3B0aW9ucy5ldmVudEluZm8pXG4gICAgfSlcbiAgICBpZiAoc3dhcE9wdGlvbnMuYWZ0ZXJTd2FwQ2FsbGJhY2spIHtcbiAgICAgIHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKClcbiAgICB9XG5cbiAgICAvLyBtZXJnZSBpbiBuZXcgdGl0bGUgYWZ0ZXIgc3dhcCBidXQgYmVmb3JlIHNldHRsZVxuICAgIGlmICghc3dhcFNwZWMuaWdub3JlVGl0bGUpIHtcbiAgICAgIGhhbmRsZVRpdGxlKHNldHRsZUluZm8udGl0bGUpXG4gICAgfVxuXG4gICAgLy8gc2V0dGxlXG4gICAgY29uc3QgZG9TZXR0bGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby50YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgICB0YXNrLmNhbGwoKVxuICAgICAgfSlcbiAgICAgIGZvckVhY2goc2V0dGxlSW5mby5lbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgaWYgKGVsdC5jbGFzc0xpc3QpIHtcbiAgICAgICAgICBlbHQuY2xhc3NMaXN0LnJlbW92ZShodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyU2V0dGxlJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgICAgfSlcblxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFuY2hvcikge1xuICAgICAgICBjb25zdCBhbmNob3JUYXJnZXQgPSBhc0VsZW1lbnQocmVzb2x2ZVRhcmdldCgnIycgKyBzd2FwT3B0aW9ucy5hbmNob3IpKVxuICAgICAgICBpZiAoYW5jaG9yVGFyZ2V0KSB7XG4gICAgICAgICAgYW5jaG9yVGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiAnYXV0bycgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVTY3JvbGxTdGF0ZShzZXR0bGVJbmZvLmVsdHMsIHN3YXBTcGVjKVxuICAgICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2spIHtcbiAgICAgICAgc3dhcE9wdGlvbnMuYWZ0ZXJTZXR0bGVDYWxsYmFjaygpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN3YXBTcGVjLnNldHRsZURlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1NldHRsZSwgc3dhcFNwZWMuc2V0dGxlRGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGRvU2V0dGxlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgaGVhZGVyLCBlbHQpIHtcbiAgICBjb25zdCB0cmlnZ2VyQm9keSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihoZWFkZXIpXG4gICAgaWYgKHRyaWdnZXJCb2R5LmluZGV4T2YoJ3snKSA9PT0gMCkge1xuICAgICAgY29uc3QgdHJpZ2dlcnMgPSBwYXJzZUpTT04odHJpZ2dlckJvZHkpXG4gICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0cmlnZ2Vycykge1xuICAgICAgICBpZiAodHJpZ2dlcnMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGxldCBkZXRhaWwgPSB0cmlnZ2Vyc1tldmVudE5hbWVdXG4gICAgICAgICAgaWYgKGlzUmF3T2JqZWN0KGRldGFpbCkpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsdCA9IGRldGFpbC50YXJnZXQgIT09IHVuZGVmaW5lZCA/IGRldGFpbC50YXJnZXQgOiBlbHRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGV0YWlsID0geyB2YWx1ZTogZGV0YWlsIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZXZlbnROYW1lcyA9IHRyaWdnZXJCb2R5LnNwbGl0KCcsJylcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWVzW2ldLnRyaW0oKSwgW10pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgV0hJVEVTUEFDRSA9IC9cXHMvXG4gIGNvbnN0IFdISVRFU1BBQ0VfT1JfQ09NTUEgPSAvW1xccyxdL1xuICBjb25zdCBTWU1CT0xfU1RBUlQgPSAvW18kYS16QS1aXS9cbiAgY29uc3QgU1lNQk9MX0NPTlQgPSAvW18kYS16QS1aMC05XS9cbiAgY29uc3QgU1RSSU5HSVNIX1NUQVJUID0gWydcIicsIFwiJ1wiLCAnLyddXG4gIGNvbnN0IE5PVF9XSElURVNQQUNFID0gL1teXFxzXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfU1RBUlQgPSAvW3soXS9cbiAgY29uc3QgQ09NQklORURfU0VMRUNUT1JfRU5EID0gL1t9KV0vXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9rZW5pemVTdHJpbmcoc3RyKSB7XG4gICAgLyoqIEB0eXBlIHN0cmluZ1tdICovXG4gICAgY29uc3QgdG9rZW5zID0gW11cbiAgICBsZXQgcG9zaXRpb24gPSAwXG4gICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCkge1xuICAgICAgaWYgKFNZTUJPTF9TVEFSVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24pKSkge1xuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHdoaWxlIChTWU1CT0xfQ09OVC5leGVjKHN0ci5jaGFyQXQocG9zaXRpb24gKyAxKSkpIHtcbiAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIH1cbiAgICAgICAgdG9rZW5zLnB1c2goc3RyLnN1YnN0cihzdGFydFBvc2l0aW9uLCBwb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24gKyAxKSlcbiAgICAgIH0gZWxzZSBpZiAoU1RSSU5HSVNIX1NUQVJULmluZGV4T2Yoc3RyLmNoYXJBdChwb3NpdGlvbikpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBzdGFydENoYXIgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB2YXIgc3RhcnRQb3NpdGlvbiA9IHBvc2l0aW9uXG4gICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgc3RyLmxlbmd0aCAmJiBzdHIuY2hhckF0KHBvc2l0aW9uKSAhPT0gc3RhcnRDaGFyKSB7XG4gICAgICAgICAgaWYgKHN0ci5jaGFyQXQocG9zaXRpb24pID09PSAnXFxcXCcpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzeW1ib2wgPSBzdHIuY2hhckF0KHBvc2l0aW9uKVxuICAgICAgICB0b2tlbnMucHVzaChzeW1ib2wpXG4gICAgICB9XG4gICAgICBwb3NpdGlvbisrXG4gICAgfVxuICAgIHJldHVybiB0b2tlbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9rZW5cbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gbGFzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpIHtcbiAgICByZXR1cm4gU1lNQk9MX1NUQVJULmV4ZWModG9rZW4uY2hhckF0KDApKSAmJlxuICAgICAgdG9rZW4gIT09ICd0cnVlJyAmJlxuICAgICAgdG9rZW4gIT09ICdmYWxzZScgJiZcbiAgICAgIHRva2VuICE9PSAndGhpcycgJiZcbiAgICAgIHRva2VuICE9PSBwYXJhbU5hbWUgJiZcbiAgICAgIGxhc3QgIT09ICcuJ1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbU5hbWVcbiAgICogQHJldHVybnMge0NvbmRpdGlvbmFsRnVuY3Rpb258bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgcGFyYW1OYW1lKSB7XG4gICAgaWYgKHRva2Vuc1swXSA9PT0gJ1snKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgbGV0IGJyYWNrZXRDb3VudCA9IDFcbiAgICAgIGxldCBjb25kaXRpb25hbFNvdXJjZSA9ICcgcmV0dXJuIChmdW5jdGlvbignICsgcGFyYW1OYW1lICsgJyl7IHJldHVybiAoJ1xuICAgICAgbGV0IGxhc3QgPSBudWxsXG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbMF1cbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgc2hpZnQgY2FsbCwgYW5kIHRoaW5rcyB3ZSdyZSBjb21wYXJpbmcgdGhlIHNhbWUgdmFsdWUgaGVyZSwgaS5lLiAnWycgdnMgJ10nXG4gICAgICAgIGlmICh0b2tlbiA9PT0gJ10nKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50LS1cbiAgICAgICAgICBpZiAoYnJhY2tldENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgJ3RydWUnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJyl9KSdcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKGNvbmRpdGlvbmFsU291cmNlKSgpXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZSB9KVxuICAgICAgICAgICAgICBjb25kaXRpb25GdW5jdGlvbi5zb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZVxuICAgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uRnVuY3Rpb25cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2U6IGNvbmRpdGlvbmFsU291cmNlIH0pXG4gICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnWycpIHtcbiAgICAgICAgICBicmFja2V0Q291bnQrK1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1Bvc3NpYmxlUmVsYXRpdmVSZWZlcmVuY2UodG9rZW4sIGxhc3QsIHBhcmFtTmFtZSkpIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSArPSAnKCgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA/ICgnICsgcGFyYW1OYW1lICsgJy4nICsgdG9rZW4gKyAnKSA6ICh3aW5kb3cuJyArIHRva2VuICsgJykpJ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlID0gY29uZGl0aW9uYWxTb3VyY2UgKyB0b2tlblxuICAgICAgICB9XG4gICAgICAgIGxhc3QgPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHBhcmFtIHtSZWdFeHB9IG1hdGNoXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjb25zdW1lVW50aWwodG9rZW5zLCBtYXRjaCkge1xuICAgIGxldCByZXN1bHQgPSAnJ1xuICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiAhbWF0Y2gudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICByZXN1bHQgKz0gdG9rZW5zLnNoaWZ0KClcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZUNTU1NlbGVjdG9yKHRva2Vucykge1xuICAgIGxldCByZXN1bHRcbiAgICBpZiAodG9rZW5zLmxlbmd0aCA+IDAgJiYgQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgcmVzdWx0ID0gY29uc3VtZVVudGlsKHRva2VucywgQ09NQklORURfU0VMRUNUT1JfRU5EKS50cmltKClcbiAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGNvbnN0IElOUFVUX1NFTEVDVE9SID0gJ2lucHV0LCB0ZXh0YXJlYSwgc2VsZWN0J1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwbGljaXRUcmlnZ2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjYWNoZSBmb3IgdHJpZ2dlciBzcGVjc1xuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBwYXJzZUFuZENhY2hlVHJpZ2dlcihlbHQsIGV4cGxpY2l0VHJpZ2dlciwgY2FjaGUpIHtcbiAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW10gKi9cbiAgICBjb25zdCB0cmlnZ2VyU3BlY3MgPSBbXVxuICAgIGNvbnN0IHRva2VucyA9IHRva2VuaXplU3RyaW5nKGV4cGxpY2l0VHJpZ2dlcilcbiAgICBkbyB7XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSB0b2tlbnMubGVuZ3RoXG4gICAgICBjb25zdCB0cmlnZ2VyID0gY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pXG4gICAgICBpZiAodHJpZ2dlciAhPT0gJycpIHtcbiAgICAgICAgaWYgKHRyaWdnZXIgPT09ICdldmVyeScpIHtcbiAgICAgICAgICAvKiogQHR5cGUgSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uICovXG4gICAgICAgICAgY29uc3QgZXZlcnkgPSB7IHRyaWdnZXI6ICdldmVyeScgfVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIGV2ZXJ5LnBvbGxJbnRlcnZhbCA9IHBhcnNlSW50ZXJ2YWwoY29uc3VtZVVudGlsKHRva2VucywgL1ssXFxbXFxzXS8pKVxuICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgIHZhciBldmVudEZpbHRlciA9IG1heWJlR2VuZXJhdGVDb25kaXRpb25hbChlbHQsIHRva2VucywgJ2V2ZW50JylcbiAgICAgICAgICBpZiAoZXZlbnRGaWx0ZXIpIHtcbiAgICAgICAgICAgIGV2ZXJ5LmV2ZW50RmlsdGVyID0gZXZlbnRGaWx0ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLnB1c2goZXZlcnkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IHRyaWdnZXJTcGVjID0geyB0cmlnZ2VyIH1cbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlICh0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0gIT09ICcsJykge1xuICAgICAgICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICBpZiAodG9rZW4gPT09ICdjaGFuZ2VkJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5jaGFuZ2VkID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ29uY2UnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLm9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnY29uc3VtZScpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY29uc3VtZSA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdkZWxheScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuZGVsYXkgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2Zyb20nICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIGlmIChDT01CSU5FRF9TRUxFQ1RPUl9TVEFSVC50ZXN0KHRva2Vuc1swXSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBmcm9tX2FyZyA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICAgICAgaWYgKGZyb21fYXJnID09PSAnY2xvc2VzdCcgfHwgZnJvbV9hcmcgPT09ICdmaW5kJyB8fCBmcm9tX2FyZyA9PT0gJ25leHQnIHx8IGZyb21fYXJnID09PSAncHJldmlvdXMnKSB7XG4gICAgICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSBjb25zdW1lQ1NTU2VsZWN0b3IodG9rZW5zKVxuICAgICAgICAgICAgICAgICAgLy8gYG5leHRgIGFuZCBgcHJldmlvdXNgIGFsbG93IGEgc2VsZWN0b3ItbGVzcyBzeW50YXhcbiAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyb21fYXJnICs9ICcgJyArIHNlbGVjdG9yXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmZyb20gPSBmcm9tX2FyZ1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3RhcmdldCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGFyZ2V0ID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJvdHRsZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMudGhyb3R0bGUgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3F1ZXVlJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5xdWV1ZSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAncm9vdCcgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWNbdG9rZW5dID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0aHJlc2hvbGQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIFdISVRFU1BBQ0VfT1JfQ09NTUEpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKHRyaWdnZXJTcGVjKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gaW5pdGlhbExlbmd0aCkge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN5bnRheDplcnJvcicsIHsgdG9rZW46IHRva2Vucy5zaGlmdCgpIH0pXG4gICAgICB9XG4gICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICB9IHdoaWxlICh0b2tlbnNbMF0gPT09ICcsJyAmJiB0b2tlbnMuc2hpZnQoKSlcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0gPSB0cmlnZ2VyU3BlY3NcbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb25bXX1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFRyaWdnZXJTcGVjcyhlbHQpIHtcbiAgICBjb25zdCBleHBsaWNpdFRyaWdnZXIgPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10cmlnZ2VyJylcbiAgICBsZXQgdHJpZ2dlclNwZWNzID0gW11cbiAgICBpZiAoZXhwbGljaXRUcmlnZ2VyKSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGh0bXguY29uZmlnLnRyaWdnZXJTcGVjc0NhY2hlXG4gICAgICB0cmlnZ2VyU3BlY3MgPSAoY2FjaGUgJiYgY2FjaGVbZXhwbGljaXRUcmlnZ2VyXSkgfHwgcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKVxuICAgIH1cblxuICAgIGlmICh0cmlnZ2VyU3BlY3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRyaWdnZXJTcGVjc1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdmb3JtJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnc3VibWl0JyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsICdpbnB1dFt0eXBlPVwiYnV0dG9uXCJdLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdJykpIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfSBlbHNlIGlmIChtYXRjaGVzKGVsdCwgSU5QVVRfU0VMRUNUT1IpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NoYW5nZScgfV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjbGljaycgfV1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIGNhbmNlbFBvbGxpbmcoZWx0KSB7XG4gICAgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuY2FuY2VsbGVkID0gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYykge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBub2RlRGF0YS50aW1lb3V0ID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIGlmIChib2R5Q29udGFpbnMoZWx0KSAmJiBub2RlRGF0YS5jYW5jZWxsZWQgIT09IHRydWUpIHtcbiAgICAgICAgaWYgKCFtYXliZUZpbHRlckV2ZW50KHNwZWMsIGVsdCwgbWFrZUV2ZW50KCdoeDpwb2xsOnRyaWdnZXInLCB7XG4gICAgICAgICAgdHJpZ2dlclNwZWM6IHNwZWMsXG4gICAgICAgICAgdGFyZ2V0OiBlbHRcbiAgICAgICAgfSkpKSB7XG4gICAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICAgIH1cbiAgICAgICAgcHJvY2Vzc1BvbGxpbmcoZWx0LCBoYW5kbGVyLCBzcGVjKVxuICAgICAgfVxuICAgIH0sIHNwZWMucG9sbEludGVydmFsKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTEFuY2hvckVsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzTG9jYWxMaW5rKGVsdCkge1xuICAgIHJldHVybiBsb2NhdGlvbi5ob3N0bmFtZSA9PT0gZWx0Lmhvc3RuYW1lICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBlbHRJc0Rpc2FibGVkKGVsdCkge1xuICAgIHJldHVybiBjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKi9cbiAgZnVuY3Rpb24gYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcykge1xuICAgIGlmICgoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgaXNMb2NhbExpbmsoZWx0KSAmJiAoZWx0LnRhcmdldCA9PT0gJycgfHwgZWx0LnRhcmdldCA9PT0gJ19zZWxmJykpIHx8IChlbHQudGFnTmFtZSA9PT0gJ0ZPUk0nICYmIFN0cmluZyhnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJykpLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSkge1xuICAgICAgbm9kZURhdGEuYm9vc3RlZCA9IHRydWVcbiAgICAgIGxldCB2ZXJiLCBwYXRoXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdBJykge1xuICAgICAgICB2ZXJiID0gJ2dldCdcbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJhd0F0dHJpYnV0ZSA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdtZXRob2QnKVxuICAgICAgICB2ZXJiID0gcmF3QXR0cmlidXRlID8gcmF3QXR0cmlidXRlLnRvTG93ZXJDYXNlKCkgOiAnZ2V0J1xuICAgICAgICBpZiAodmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgICAgfVxuICAgICAgICBwYXRoID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2FjdGlvbicpXG4gICAgICB9XG4gICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgZnVuY3Rpb24obm9kZSwgZXZ0KSB7XG4gICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgIH0sIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgdHJ1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRDYW5jZWwoZXZ0LCBub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZXZ0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGV2dC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSwgYnV0dG9uJykgJiYgY2xvc2VzdChlbHQsICdmb3JtJykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBlbHQuaHJlZiAmJlxuICAgICAgICAoZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpID09PSAnIycgfHwgZWx0LmdldEF0dHJpYnV0ZSgnaHJlZicpLmluZGV4T2YoJyMnKSAhPT0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudHxNb3VzZUV2ZW50fEtleWJvYXJkRXZlbnR8VG91Y2hFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkge1xuICAgIHJldHVybiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkICYmIGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGV2dC50eXBlID09PSAnY2xpY2snICYmXG4gICAgICAvLyBAdHMtaWdub3JlIHRoaXMgd2lsbCByZXNvbHZlIHRvIHVuZGVmaW5lZCBmb3IgZXZlbnRzIHRoYXQgZG9uJ3QgZGVmaW5lIHRob3NlIHByb3BlcnRpZXMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBldnQpIHtcbiAgICBjb25zdCBldmVudEZpbHRlciA9IHRyaWdnZXJTcGVjLmV2ZW50RmlsdGVyXG4gICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gZXZlbnRGaWx0ZXIuY2FsbChlbHQsIGV2dCkgIT09IHRydWVcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnRGaWx0ZXIuc291cmNlXG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6ZXZlbnRGaWx0ZXI6ZXJyb3InLCB7IGVycm9yOiBlLCBzb3VyY2UgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gdHJpZ2dlclNwZWNcbiAgICogQHBhcmFtIHtib29sZWFufSBbZXhwbGljaXRDYW5jZWxdXG4gICAqL1xuICBmdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLCBleHBsaWNpdENhbmNlbCkge1xuICAgIGNvbnN0IGVsZW1lbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAvKiogQHR5cGUgeyhOb2RlfFdpbmRvdylbXX0gKi9cbiAgICBsZXQgZWx0c1RvTGlzdGVuT25cbiAgICBpZiAodHJpZ2dlclNwZWMuZnJvbSkge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgdHJpZ2dlclNwZWMuZnJvbSlcbiAgICB9IGVsc2Uge1xuICAgICAgZWx0c1RvTGlzdGVuT24gPSBbZWx0XVxuICAgIH1cbiAgICAvLyBzdG9yZSB0aGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIGVsZW1lbnRzLCBzbyB3ZSBjYW4gdGVsbCBpZiB0aGV5IGNoYW5nZVxuICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICBlbHRzVG9MaXN0ZW5Pbi5mb3JFYWNoKGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgIH0pXG4gICAgfVxuICAgIGZvckVhY2goZWx0c1RvTGlzdGVuT24sIGZ1bmN0aW9uKGVsdFRvTGlzdGVuT24pIHtcbiAgICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgICBjb25zdCBldmVudExpc3RlbmVyID0gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBlbHRUb0xpc3Rlbk9uLnJlbW92ZUV2ZW50TGlzdGVuZXIodHJpZ2dlclNwZWMudHJpZ2dlciwgZXZlbnRMaXN0ZW5lcilcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoaWdub3JlQm9vc3RlZEFuY2hvckN0cmxDbGljayhlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRDYW5jZWwgfHwgc2hvdWxkQ2FuY2VsKGV2dCwgZWx0KSkge1xuICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldnQpXG4gICAgICAgIGV2ZW50RGF0YS50cmlnZ2VyU3BlYyA9IHRyaWdnZXJTcGVjXG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvciA9PSBudWxsKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudERhdGEuaGFuZGxlZEZvci5pbmRleE9mKGVsdCkgPCAwKSB7XG4gICAgICAgICAgZXZlbnREYXRhLmhhbmRsZWRGb3IucHVzaChlbHQpXG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLmNvbnN1bWUpIHtcbiAgICAgICAgICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGFyZ2V0ICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgIGlmICghbWF0Y2hlcyhhc0VsZW1lbnQoZXZ0LnRhcmdldCksIHRyaWdnZXJTcGVjLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5vbmNlKSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudERhdGEudHJpZ2dlcmVkT25jZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jaGFuZ2VkKSB7XG4gICAgICAgICAgICBjb25zdCBlbHRUb0xpc3Rlbk9uRGF0YSA9IGdldEludGVybmFsRGF0YShlbHRUb0xpc3Rlbk9uKVxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVsdFRvTGlzdGVuT24udmFsdWVcbiAgICAgICAgICAgIGlmIChlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID0gdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLmRlbGF5ZWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChlbGVtZW50RGF0YS5kZWxheWVkKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJvdHRsZSA+IDApIHtcbiAgICAgICAgICAgIGlmICghZWxlbWVudERhdGEudGhyb3R0bGUpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICAgIGVsZW1lbnREYXRhLnRocm90dGxlID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IG51bGxcbiAgICAgICAgICAgICAgfSwgdHJpZ2dlclNwZWMudGhyb3R0bGUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5kZWxheSA+IDApIHtcbiAgICAgICAgICAgIGVsZW1lbnREYXRhLmRlbGF5ZWQgPSBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgICAgaGFuZGxlcihlbHQsIGV2dClcbiAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp0cmlnZ2VyJylcbiAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobm9kZURhdGEubGlzdGVuZXJJbmZvcyA9PSBudWxsKSB7XG4gICAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPSBbXVxuICAgICAgfVxuICAgICAgbm9kZURhdGEubGlzdGVuZXJJbmZvcy5wdXNoKHtcbiAgICAgICAgdHJpZ2dlcjogdHJpZ2dlclNwZWMudHJpZ2dlcixcbiAgICAgICAgbGlzdGVuZXI6IGV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG9uOiBlbHRUb0xpc3Rlbk9uXG4gICAgICB9KVxuICAgICAgZWx0VG9MaXN0ZW5Pbi5hZGRFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgfSlcbiAgfVxuXG4gIGxldCB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlIC8vIHVzZWQgYnkgaW5pdFNjcm9sbEhhbmRsZXJcbiAgbGV0IHNjcm9sbEhhbmRsZXIgPSBudWxsXG4gIGZ1bmN0aW9uIGluaXRTY3JvbGxIYW5kbGVyKCkge1xuICAgIGlmICghc2Nyb2xsSGFuZGxlcikge1xuICAgICAgc2Nyb2xsSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IHRydWVcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBzY3JvbGxIYW5kbGVyKVxuICAgICAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmICh3aW5kb3dJc1Njcm9sbGluZykge1xuICAgICAgICAgIHdpbmRvd0lzU2Nyb2xsaW5nID0gZmFsc2VcbiAgICAgICAgICBmb3JFYWNoKGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXSxbZGF0YS1oeC10cmlnZ2VyKj0ncmV2ZWFsZWQnXVwiKSwgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgICBtYXliZVJldmVhbChlbHQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfSwgMjAwKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVSZXZlYWwoZWx0KSB7XG4gICAgaWYgKCFoYXNBdHRyaWJ1dGUoZWx0LCAnZGF0YS1oeC1yZXZlYWxlZCcpICYmIGlzU2Nyb2xsZWRJbnRvVmlldyhlbHQpKSB7XG4gICAgICBlbHQuc2V0QXR0cmlidXRlKCdkYXRhLWh4LXJldmVhbGVkJywgJ3RydWUnKVxuICAgICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdyZXZlYWxlZCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBpZiB0aGUgbm9kZSBpc24ndCBpbml0aWFsaXplZCwgd2FpdCBmb3IgaXQgYmVmb3JlIHRyaWdnZXJpbmcgdGhlIHJlcXVlc3RcbiAgICAgICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsIGZ1bmN0aW9uKCkgeyB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKSB9LCB7IG9uY2U6IHRydWUgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxheVxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEltbWVkaWF0ZWx5KGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIGRlbGF5KSB7XG4gICAgY29uc3QgbG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFub2RlRGF0YS5sb2FkZWQpIHtcbiAgICAgICAgbm9kZURhdGEubG9hZGVkID0gdHJ1ZVxuICAgICAgICBoYW5kbGVyKGVsdClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGRlbGF5ID4gMCkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChsb2FkLCBkZWxheSlcbiAgICB9IGVsc2Uge1xuICAgICAgbG9hZCgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119IHRyaWdnZXJTcGVjc1xuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBsZXQgZXhwbGljaXRBY3Rpb24gPSBmYWxzZVxuICAgIGZvckVhY2goVkVSQlMsIGZ1bmN0aW9uKHZlcmIpIHtcbiAgICAgIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtJyArIHZlcmIpKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC0nICsgdmVyYilcbiAgICAgICAgZXhwbGljaXRBY3Rpb24gPSB0cnVlXG4gICAgICAgIG5vZGVEYXRhLnBhdGggPSBwYXRoXG4gICAgICAgIG5vZGVEYXRhLnZlcmIgPSB2ZXJiXG4gICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgICAgICAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgICAgICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldnQpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBleHBsaWNpdEFjdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEBjYWxsYmFjayBUcmlnZ2VySGFuZGxlclxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBbZXZ0XVxuICAgKi9cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7SHRteE5vZGVJbnRlcm5hbERhdGF9IG5vZGVEYXRhXG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICovXG4gIGZ1bmN0aW9uIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBoYW5kbGVyKSB7XG4gICAgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdyZXZlYWxlZCcpIHtcbiAgICAgIGluaXRTY3JvbGxIYW5kbGVyKClcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWx0LCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgICBtYXliZVJldmVhbChhc0VsZW1lbnQoZWx0KSlcbiAgICB9IGVsc2UgaWYgKHRyaWdnZXJTcGVjLnRyaWdnZXIgPT09ICdpbnRlcnNlY3QnKSB7XG4gICAgICBjb25zdCBvYnNlcnZlck9wdGlvbnMgPSB7fVxuICAgICAgaWYgKHRyaWdnZXJTcGVjLnJvb3QpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnJvb3QgPSBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdHJpZ2dlclNwZWMucm9vdClcbiAgICAgIH1cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy50aHJlc2hvbGQpIHtcbiAgICAgICAgb2JzZXJ2ZXJPcHRpb25zLnRocmVzaG9sZCA9IHBhcnNlRmxvYXQodHJpZ2dlclNwZWMudGhyZXNob2xkKVxuICAgICAgfVxuICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oZW50cmllcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV1cbiAgICAgICAgICBpZiAoZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdpbnRlcnNlY3QnKVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIG9ic2VydmVyT3B0aW9ucylcbiAgICAgIG9ic2VydmVyLm9ic2VydmUoYXNFbGVtZW50KGVsdCkpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnbG9hZCcpIHtcbiAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudCh0cmlnZ2VyU3BlYywgZWx0LCBtYWtlRXZlbnQoJ2xvYWQnLCB7IGVsdCB9KSkpIHtcbiAgICAgICAgbG9hZEltbWVkaWF0ZWx5KGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCBub2RlRGF0YSwgdHJpZ2dlclNwZWMuZGVsYXkpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy5wb2xsSW50ZXJ2YWwgPiAwKSB7XG4gICAgICBub2RlRGF0YS5wb2xsaW5nID0gdHJ1ZVxuICAgICAgcHJvY2Vzc1BvbGxpbmcoYXNFbGVtZW50KGVsdCksIGhhbmRsZXIsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IG5vZGVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRQcm9jZXNzSHhPbihub2RlKSB7XG4gICAgY29uc3QgZWx0ID0gYXNFbGVtZW50KG5vZGUpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWx0LmF0dHJpYnV0ZXNcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgIGNvbnN0IGF0dHJOYW1lID0gYXR0cmlidXRlc1tqXS5uYW1lXG4gICAgICBpZiAoc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2h4LW9uOicpIHx8IHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdkYXRhLWh4LW9uOicpIHx8XG4gICAgICAgIHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbi0nKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbi0nKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgY29uc3QgSFhfT05fUVVFUlkgPSBuZXcgWFBhdGhFdmFsdWF0b3IoKVxuICAgIC5jcmVhdGVFeHByZXNzaW9uKCcuLy8qW0AqWyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb246XCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uOlwiKSBvcicgK1xuICAgICAgJyBzdGFydHMtd2l0aChuYW1lKCksIFwiaHgtb24tXCIpIG9yIHN0YXJ0cy13aXRoKG5hbWUoKSwgXCJkYXRhLWh4LW9uLVwiKSBdXScpXG5cbiAgZnVuY3Rpb24gcHJvY2Vzc0hYT25Sb290KGVsdCwgZWxlbWVudHMpIHtcbiAgICBpZiAoc2hvdWxkUHJvY2Vzc0h4T24oZWx0KSkge1xuICAgICAgZWxlbWVudHMucHVzaChhc0VsZW1lbnQoZWx0KSlcbiAgICB9XG4gICAgY29uc3QgaXRlciA9IEhYX09OX1FVRVJZLmV2YWx1YXRlKGVsdClcbiAgICBsZXQgbm9kZSA9IG51bGxcbiAgICB3aGlsZSAobm9kZSA9IGl0ZXIuaXRlcmF0ZU5leHQoKSkgZWxlbWVudHMucHVzaChhc0VsZW1lbnQobm9kZSkpXG4gIH1cblxuICBmdW5jdGlvbiBmaW5kSHhPbldpbGRjYXJkRWxlbWVudHMoZWx0KSB7XG4gICAgLyoqIEB0eXBlIHtFbGVtZW50W119ICovXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsdC5jaGlsZE5vZGVzKSB7XG4gICAgICAgIHByb2Nlc3NIWE9uUm9vdChjaGlsZCwgZWxlbWVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50PnxbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpIHtcbiAgICBpZiAoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwpIHtcbiAgICAgIGNvbnN0IGJvb3N0ZWRTZWxlY3RvciA9ICcsIFtoeC1ib29zdF0gYSwgW2RhdGEtaHgtYm9vc3RdIGEsIGFbaHgtYm9vc3RdLCBhW2RhdGEtaHgtYm9vc3RdJ1xuXG4gICAgICBjb25zdCBleHRlbnNpb25TZWxlY3RvcnMgPSBbXVxuICAgICAgZm9yIChjb25zdCBlIGluIGV4dGVuc2lvbnMpIHtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tlXVxuICAgICAgICBpZiAoZXh0ZW5zaW9uLmdldFNlbGVjdG9ycykge1xuICAgICAgICAgIHZhciBzZWxlY3RvcnMgPSBleHRlbnNpb24uZ2V0U2VsZWN0b3JzKClcbiAgICAgICAgICBpZiAoc2VsZWN0b3JzKSB7XG4gICAgICAgICAgICBleHRlbnNpb25TZWxlY3RvcnMucHVzaChzZWxlY3RvcnMpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VsdHMgPSBlbHQucXVlcnlTZWxlY3RvckFsbChWRVJCX1NFTEVDVE9SICsgYm9vc3RlZFNlbGVjdG9yICsgXCIsIGZvcm0sIFt0eXBlPSdzdWJtaXQnXSxcIiArXG4gICAgICAgICcgW2h4LWV4dF0sIFtkYXRhLWh4LWV4dF0sIFtoeC10cmlnZ2VyXSwgW2RhdGEtaHgtdHJpZ2dlcl0nICsgZXh0ZW5zaW9uU2VsZWN0b3JzLmZsYXQoKS5tYXAocyA9PiAnLCAnICsgcykuam9pbignJykpXG5cbiAgICAgIHJldHVybiByZXN1bHRzXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAqIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxCdXR0b25FbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9ICovIChjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpKVxuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gZWx0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVVbnNldExhc3RCdXR0b25DbGlja2VkKGV2dCkge1xuICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldFJlbGF0ZWRGb3JtRGF0YShldnQpXG4gICAgaWYgKGludGVybmFsRGF0YSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHJldHVybnMge0h0bXhOb2RlSW50ZXJuYWxEYXRhfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldFJlbGF0ZWRGb3JtRGF0YShldnQpIHtcbiAgICBjb25zdCBlbHQgPSBjbG9zZXN0KGFzRWxlbWVudChldnQudGFyZ2V0KSwgXCJidXR0b24sIGlucHV0W3R5cGU9J3N1Ym1pdCddXCIpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBmb3JtID0gcmVzb2x2ZVRhcmdldCgnIycgKyBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZm9ybScpLCBlbHQuZ2V0Um9vdE5vZGUoKSkgfHwgY2xvc2VzdChlbHQsICdmb3JtJylcbiAgICBpZiAoIWZvcm0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGZvcm0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0QnV0dG9uVHJhY2tpbmcoZWx0KSB7XG4gICAgLy8gbmVlZCB0byBoYW5kbGUgYm90aCBjbGljayBhbmQgZm9jdXMgaW46XG4gICAgLy8gICBmb2N1c2luIC0gaW4gY2FzZSBzb21lb25lIHRhYnMgaW4gdG8gYSBidXR0b24gYW5kIGhpdHMgdGhlIHNwYWNlIGJhclxuICAgIC8vICAgY2xpY2sgLSBvbiBPU1ggYnV0dG9ucyBkbyBub3QgZm9jdXMgb24gY2xpY2sgc2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzcyNFxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c291dCcsIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlXG4gICAqL1xuICBmdW5jdGlvbiBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCBjb2RlKSB7XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmICghQXJyYXkuaXNBcnJheShub2RlRGF0YS5vbkhhbmRsZXJzKSkge1xuICAgICAgbm9kZURhdGEub25IYW5kbGVycyA9IFtdXG4gICAgfVxuICAgIGxldCBmdW5jXG4gICAgLyoqIEB0eXBlIEV2ZW50TGlzdGVuZXIgKi9cbiAgICBjb25zdCBsaXN0ZW5lciA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoZWx0SXNEaXNhYmxlZChlbHQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFmdW5jKSB7XG4gICAgICAgICAgZnVuYyA9IG5ldyBGdW5jdGlvbignZXZlbnQnLCBjb2RlKVxuICAgICAgICB9XG4gICAgICAgIGZ1bmMuY2FsbChlbHQsIGUpXG4gICAgICB9KVxuICAgIH1cbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyKVxuICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMucHVzaCh7IGV2ZW50OiBldmVudE5hbWUsIGxpc3RlbmVyIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NIeE9uV2lsZGNhcmQoZWx0KSB7XG4gICAgLy8gd2lwZSBhbnkgcHJldmlvdXMgb24gaGFuZGxlcnMgc28gdGhhdCB0aGlzIGZ1bmN0aW9uIHRha2VzIHByZWNlZGVuY2VcbiAgICBkZUluaXRPbkhhbmRsZXJzKGVsdClcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWx0LmF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbHQuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBjb25zdCB2YWx1ZSA9IGVsdC5hdHRyaWJ1dGVzW2ldLnZhbHVlXG4gICAgICBpZiAoc3RhcnRzV2l0aChuYW1lLCAnaHgtb24nKSB8fCBzdGFydHNXaXRoKG5hbWUsICdkYXRhLWh4LW9uJykpIHtcbiAgICAgICAgY29uc3QgYWZ0ZXJPblBvc2l0aW9uID0gbmFtZS5pbmRleE9mKCctb24nKSArIDNcbiAgICAgICAgY29uc3QgbmV4dENoYXIgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiwgYWZ0ZXJPblBvc2l0aW9uICsgMSlcbiAgICAgICAgaWYgKG5leHRDaGFyID09PSAnLScgfHwgbmV4dENoYXIgPT09ICc6Jykge1xuICAgICAgICAgIGxldCBldmVudE5hbWUgPSBuYW1lLnNsaWNlKGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgICAgLy8gaWYgdGhlIGV2ZW50TmFtZSBzdGFydHMgd2l0aCBhIGNvbG9uIG9yIGRhc2gsIHByZXBlbmQgXCJodG14XCIgZm9yIHNob3J0aGFuZCBzdXBwb3J0XG4gICAgICAgICAgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnOicpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteCcgKyBldmVudE5hbWVcbiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0c1dpdGgoZXZlbnROYW1lLCAnLScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDEpXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJ2h0bXgtJykpIHtcbiAgICAgICAgICAgIGV2ZW50TmFtZSA9ICdodG14OicgKyBldmVudE5hbWUuc2xpY2UoNSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhZGRIeE9uRXZlbnRIYW5kbGVyKGVsdCwgZXZlbnROYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8SFRNTElucHV0RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBpbml0Tm9kZShlbHQpIHtcbiAgICBpZiAoY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcikpIHtcbiAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgaWYgKG5vZGVEYXRhLmluaXRIYXNoICE9PSBhdHRyaWJ1dGVIYXNoKGVsdCkpIHtcbiAgICAgIC8vIGNsZWFuIHVwIGFueSBwcmV2aW91c2x5IHByb2Nlc3NlZCBpbmZvXG4gICAgICBkZUluaXROb2RlKGVsdClcblxuICAgICAgbm9kZURhdGEuaW5pdEhhc2ggPSBhdHRyaWJ1dGVIYXNoKGVsdClcblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnKVxuXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGlmIChlbHQudmFsdWUpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBub2RlRGF0YS5sYXN0VmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJpZ2dlclNwZWNzID0gZ2V0VHJpZ2dlclNwZWNzKGVsdClcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0SHR0cEFjdGlvbiA9IHByb2Nlc3NWZXJicyhlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG5cbiAgICAgIGlmICghaGFzRXhwbGljaXRIdHRwQWN0aW9uKSB7XG4gICAgICAgIGlmIChnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtYm9vc3QnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYm9vc3RFbGVtZW50KGVsdCwgbm9kZURhdGEsIHRyaWdnZXJTcGVjcylcbiAgICAgICAgfSBlbHNlIGlmIChoYXNBdHRyaWJ1dGUoZWx0LCAnaHgtdHJpZ2dlcicpKSB7XG4gICAgICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgICAgIC8vIEZvciBcIm5ha2VkXCIgdHJpZ2dlcnMsIGRvbid0IGRvIGFueXRoaW5nIGF0IGFsbFxuICAgICAgICAgICAgYWRkVHJpZ2dlckhhbmRsZXIoZWx0LCB0cmlnZ2VyU3BlYywgbm9kZURhdGEsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBzdWJtaXQgYnV0dG9ucy9pbnB1dHMgdGhhdCBoYXZlIHRoZSBmb3JtIGF0dHJpYnV0ZSBzZXRcbiAgICAgIC8vIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvYnV0dG9uXG4gICAgICBpZiAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyB8fCAoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ3R5cGUnKSA9PT0gJ3N1Ym1pdCcgJiYgaGFzQXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSkpIHtcbiAgICAgICAgaW5pdEJ1dHRvblRyYWNraW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyBuZXcgY29udGVudCwgZW5hYmxpbmcgaHRteCBiZWhhdmlvci4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGNvbnRlbnQgdGhhdCBpcyBhZGRlZCB0byB0aGUgRE9NIG91dHNpZGUgb2YgdGhlIG5vcm1hbCBodG14IHJlcXVlc3QgY3ljbGUgYnV0IHN0aWxsIHdhbnQgaHRteCBhdHRyaWJ1dGVzIHRvIHdvcmsuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3Byb2Nlc3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ30gZWx0IGVsZW1lbnQgdG8gcHJvY2Vzc1xuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc05vZGUoZWx0KSB7XG4gICAgZWx0ID0gcmVzb2x2ZVRhcmdldChlbHQpXG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgaW5pdE5vZGUoZWx0KVxuICAgIGZvckVhY2goZmluZEVsZW1lbnRzVG9Qcm9jZXNzKGVsdCksIGZ1bmN0aW9uKGNoaWxkKSB7IGluaXROb2RlKGNoaWxkKSB9KVxuICAgIGZvckVhY2goZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCksIHByb2Nlc3NIeE9uV2lsZGNhcmQpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFdmVudC9Mb2cgU3VwcG9ydFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbYS16MC05XSkoW0EtWl0pL2csICckMS0kMicpLnRvTG93ZXJDYXNlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7YW55fSBkZXRhaWxcbiAgICogQHJldHVybnMge0N1c3RvbUV2ZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgIC8vIFRoaXMgYnJlYWtzIGV4cGVjdGVkIGVuY2Fwc3VsYXRpb24gYnV0IG5lZWRzIHRvIGJlIGhlcmUgdW50aWwgZGVjaWRlZCBvdGhlcndpc2UgYnkgY29yZSBkZXZzXG4gICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUsIGNvbXBvc2VkOiB0cnVlLCBkZXRhaWwgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgZXZ0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKVxuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbFxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckVycm9yRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgbWVyZ2VPYmplY3RzKHsgZXJyb3I6IGV2ZW50TmFtZSB9LCBkZXRhaWwpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpZ25vcmVFdmVudEZvckxvZ2dpbmcoZXZlbnROYW1lKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZSA9PT0gJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZSdcbiAgfVxuXG4gIC8qKlxuICAgKiBgd2l0aEV4dGVuc2lvbnNgIGxvY2F0ZXMgYWxsIGFjdGl2ZSBleHRlbnNpb25zIGZvciBhIHByb3ZpZGVkIGVsZW1lbnQsIHRoZW5cbiAgICogZXhlY3V0ZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVzaW5nIGVhY2ggb2YgdGhlIGFjdGl2ZSBleHRlbnNpb25zLiAgSXQgc2hvdWxkXG4gICAqIGJlIGNhbGxlZCBpbnRlcm5hbGx5IGF0IGV2ZXJ5IGV4dGVuZGFibGUgZXhlY3V0aW9uIHBvaW50IGluIGh0bXguXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7KGV4dGVuc2lvbjpIdG14RXh0ZW5zaW9uKSA9PiB2b2lkfSB0b0RvXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIGZ1bmN0aW9uIHdpdGhFeHRlbnNpb25zKGVsdCwgdG9Ebykge1xuICAgIGZvckVhY2goZ2V0RXh0ZW5zaW9ucyhlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRvRG8oZXh0ZW5zaW9uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dFcnJvcihlKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBmdW5jdGlvbiBsb2dFcnJvcihtc2cpIHtcbiAgICBpZiAoY29uc29sZS5lcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcihtc2cpXG4gICAgfSBlbHNlIGlmIChjb25zb2xlLmxvZykge1xuICAgICAgY29uc29sZS5sb2coJ0VSUk9SOiAnLCBtc2cpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgZ2l2ZW4gZXZlbnQgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0cmlnZ2VyXG4gICAqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdHJpZ2dlciB0aGUgZXZlbnQgb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSB0aGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gdHJpZ2dlclxuICAgKiBAcGFyYW0ge2FueT19IGRldGFpbCBkZXRhaWxzIGZvciB0aGUgZXZlbnRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZXRhaWwgPT0gbnVsbCkge1xuICAgICAgZGV0YWlsID0ge31cbiAgICB9XG4gICAgZGV0YWlsLmVsdCA9IGVsdFxuICAgIGNvbnN0IGV2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIGlmIChodG14LmxvZ2dlciAmJiAhaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkpIHtcbiAgICAgIGh0bXgubG9nZ2VyKGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpXG4gICAgfVxuICAgIGlmIChkZXRhaWwuZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGRldGFpbC5lcnJvcilcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmVycm9yJywgeyBlcnJvckluZm86IGRldGFpbCB9KVxuICAgIH1cbiAgICBsZXQgZXZlbnRSZXN1bHQgPSBlbHQuZGlzcGF0Y2hFdmVudChldmVudClcbiAgICBjb25zdCBrZWJhYk5hbWUgPSBrZWJhYkV2ZW50TmFtZShldmVudE5hbWUpXG4gICAgaWYgKGV2ZW50UmVzdWx0ICYmIGtlYmFiTmFtZSAhPT0gZXZlbnROYW1lKSB7XG4gICAgICBjb25zdCBrZWJhYmVkRXZlbnQgPSBtYWtlRXZlbnQoa2ViYWJOYW1lLCBldmVudC5kZXRhaWwpXG4gICAgICBldmVudFJlc3VsdCA9IGV2ZW50UmVzdWx0ICYmIGVsdC5kaXNwYXRjaEV2ZW50KGtlYmFiZWRFdmVudClcbiAgICB9XG4gICAgd2l0aEV4dGVuc2lvbnMoYXNFbGVtZW50KGVsdCksIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiAoZXh0ZW5zaW9uLm9uRXZlbnQoZXZlbnROYW1lLCBldmVudCkgIT09IGZhbHNlICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKVxuICAgIH0pXG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBIaXN0b3J5IFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgbGV0IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0SGlzdG9yeUVsZW1lbnQoKSB7XG4gICAgY29uc3QgaGlzdG9yeUVsdCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKVxuICAgIHJldHVybiBoaXN0b3J5RWx0IHx8IGdldERvY3VtZW50KCkuYm9keVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtFbGVtZW50fSByb290RWx0XG4gICAqL1xuICBmdW5jdGlvbiBzYXZlVG9IaXN0b3J5Q2FjaGUodXJsLCByb290RWx0KSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gZ2V0IHN0YXRlIHRvIHNhdmVcbiAgICBjb25zdCBpbm5lckhUTUwgPSBjbGVhbklubmVySHRtbEZvckhpc3Rvcnkocm9vdEVsdClcbiAgICBjb25zdCB0aXRsZSA9IGdldERvY3VtZW50KCkudGl0bGVcbiAgICBjb25zdCBzY3JvbGwgPSB3aW5kb3cuc2Nyb2xsWVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlDYWNoZVNpemUgPD0gMCkge1xuICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgYW4gZXZlbnR1YWxseSBhbHJlYWR5IGV4aXN0aW5nIGNhY2hlIGlzIHB1cmdlZFxuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNwbGljZShpLCAxKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSBIdG14SGlzdG9yeUl0ZW0gKi9cbiAgICBjb25zdCBuZXdIaXN0b3J5SXRlbSA9IHsgdXJsLCBjb250ZW50OiBpbm5lckhUTUwsIHRpdGxlLCBzY3JvbGwgfVxuXG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUl0ZW1DcmVhdGVkJywgeyBpdGVtOiBuZXdIaXN0b3J5SXRlbSwgY2FjaGU6IGhpc3RvcnlDYWNoZSB9KVxuXG4gICAgaGlzdG9yeUNhY2hlLnB1c2gobmV3SGlzdG9yeUl0ZW0pXG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiBodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplKSB7XG4gICAgICBoaXN0b3J5Q2FjaGUuc2hpZnQoKVxuICAgIH1cblxuICAgIC8vIGtlZXAgdHJ5aW5nIHRvIHNhdmUgdGhlIGNhY2hlIHVudGlsIGl0IHN1Y2NlZWRzIG9yIGlzIGVtcHR5XG4gICAgd2hpbGUgKGhpc3RvcnlDYWNoZS5sZW5ndGggPiAwKSB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJywgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeUNhY2hlKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVFcnJvcicsIHsgY2F1c2U6IGUsIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcbiAgICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KCkgLy8gc2hyaW5rIHRoZSBjYWNoZSBhbmQgcmV0cnlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gSHRteEhpc3RvcnlJdGVtXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB1cmxcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IHRpdGxlXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzY3JvbGxcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge0h0bXhIaXN0b3J5SXRlbXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2FjaGVkSGlzdG9yeSh1cmwpIHtcbiAgICBpZiAoIWNhbkFjY2Vzc0xvY2FsU3RvcmFnZSgpKSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cblxuICAgIHVybCA9IG5vcm1hbGl6ZVBhdGgodXJsKVxuXG4gICAgY29uc3QgaGlzdG9yeUNhY2hlID0gcGFyc2VKU09OKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKSkgfHwgW11cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3RvcnlDYWNoZS5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGhpc3RvcnlDYWNoZVtpXS51cmwgPT09IHVybCkge1xuICAgICAgICByZXR1cm4gaGlzdG9yeUNhY2hlW2ldXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNsZWFuSW5uZXJIdG1sRm9ySGlzdG9yeShlbHQpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3NcbiAgICBjb25zdCBjbG9uZSA9IC8qKiBAdHlwZSBFbGVtZW50ICovIChlbHQuY2xvbmVOb2RlKHRydWUpKVxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJy4nICsgY2xhc3NOYW1lKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoY2hpbGQsIGNsYXNzTmFtZSlcbiAgICB9KVxuICAgIC8vIHJlbW92ZSB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGZvciBhbnkgZWxlbWVudCBkaXNhYmxlZCBkdWUgdG8gYW4gaHRteCByZXF1ZXN0XG4gICAgZm9yRWFjaChmaW5kQWxsKGNsb25lLCAnW2RhdGEtZGlzYWJsZWQtYnktaHRteF0nKSwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKVxuICAgIH0pXG4gICAgcmV0dXJuIGNsb25lLmlubmVySFRNTFxuICB9XG5cbiAgZnVuY3Rpb24gc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KCkge1xuICAgIGNvbnN0IGVsdCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICBjb25zdCBwYXRoID0gY3VycmVudFBhdGhGb3JIaXN0b3J5IHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG5cbiAgICAvLyBBbGxvdyBoaXN0b3J5IHNuYXBzaG90IGZlYXR1cmUgdG8gYmUgZGlzYWJsZWQgd2hlcmUgaHgtaGlzdG9yeT1cImZhbHNlXCJcbiAgICAvLyBpcyBwcmVzZW50ICphbnl3aGVyZSogaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQgd2UncmUgYWJvdXQgdG8gc2F2ZSxcbiAgICAvLyBzbyB3ZSBjYW4gcHJldmVudCBwcml2aWxlZ2VkIGRhdGEgZW50ZXJpbmcgdGhlIGNhY2hlLlxuICAgIC8vIFRoZSBwYWdlIHdpbGwgc3RpbGwgYmUgcmVhY2hhYmxlIGFzIGEgaGlzdG9yeSBlbnRyeSwgYnV0IGh0bXggd2lsbCBmZXRjaCBpdFxuICAgIC8vIGxpdmUgZnJvbSB0aGUgc2VydmVyIG9ucG9wc3RhdGUgcmF0aGVyIHRoYW4gbG9vayBpbiB0aGUgbG9jYWxTdG9yYWdlIGNhY2hlXG4gICAgbGV0IGRpc2FibGVIaXN0b3J5Q2FjaGVcbiAgICB0cnkge1xuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiIGldLFtkYXRhLWh4LWhpc3Rvcnk9XCJmYWxzZVwiIGldJylcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSUUxMTogaW5zZW5zaXRpdmUgbW9kaWZpZXIgbm90IHN1cHBvcnRlZCBzbyBmYWxsYmFjayB0byBjYXNlIHNlbnNpdGl2ZSBzZWxlY3RvclxuICAgICAgZGlzYWJsZUhpc3RvcnlDYWNoZSA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignW2h4LWhpc3Rvcnk9XCJmYWxzZVwiXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIl0nKVxuICAgIH1cbiAgICBpZiAoIWRpc2FibGVIaXN0b3J5Q2FjaGUpIHtcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlTYXZlJywgeyBwYXRoLCBoaXN0b3J5RWx0OiBlbHQgfSlcbiAgICAgIHNhdmVUb0hpc3RvcnlDYWNoZShwYXRoLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgZ2V0RG9jdW1lbnQoKS50aXRsZSwgd2luZG93LmxvY2F0aW9uLmhyZWYpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHB1c2hVcmxJbnRvSGlzdG9yeShwYXRoKSB7XG4gIC8vIHJlbW92ZSB0aGUgY2FjaGUgYnVzdGVyIHBhcmFtZXRlciwgaWYgYW55XG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0pIHtcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL29yZ1xcLmh0bXhcXC5jYWNoZS1idXN0ZXI9W14mXSomPy8sICcnKVxuICAgICAgaWYgKGVuZHNXaXRoKHBhdGgsICcmJykgfHwgZW5kc1dpdGgocGF0aCwgJz8nKSkge1xuICAgICAgICBwYXRoID0gcGF0aC5zbGljZSgwLCAtMSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSB7XG4gICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgfVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gcmVwbGFjZVVybEluSGlzdG9yeShwYXRoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmhpc3RvcnlFbmFibGVkKSBoaXN0b3J5LnJlcGxhY2VTdGF0ZSh7IGh0bXg6IHRydWUgfSwgJycsIHBhdGgpXG4gICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAgICovXG4gIGZ1bmN0aW9uIHNldHRsZUltbWVkaWF0ZWx5KHRhc2tzKSB7XG4gICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykge1xuICAgICAgdGFzay5jYWxsKHVuZGVmaW5lZClcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKVxuICAgIGNvbnN0IGRldGFpbHMgPSB7IHBhdGgsIHhocjogcmVxdWVzdCB9XG4gICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzcycsIGRldGFpbHMpXG4gICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBwYXRoLCB0cnVlKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0JywgJ3RydWUnKVxuICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcignSFgtQ3VycmVudC1VUkwnLCBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWYpXG4gICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnN0YXR1cyA+PSAyMDAgJiYgdGhpcy5zdGF0dXMgPCA0MDApIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlTWlzc0xvYWQnLCBkZXRhaWxzKVxuICAgICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudCh0aGlzLnJlc3BvbnNlKVxuICAgICAgICAvKiogQHR5cGUgUGFyZW50Tm9kZSAqL1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnJhZ21lbnQucXVlcnlTZWxlY3RvcignW2h4LWhpc3RvcnktZWx0XSxbZGF0YS1oeC1oaXN0b3J5LWVsdF0nKSB8fCBmcmFnbWVudFxuICAgICAgICBjb25zdCBoaXN0b3J5RWxlbWVudCA9IGdldEhpc3RvcnlFbGVtZW50KClcbiAgICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcblxuICAgICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBjb250ZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICBzZXR0bGVJbW1lZGlhdGVseShzZXR0bGVJbmZvLnRhc2tzKVxuICAgICAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBjYWNoZU1pc3M6IHRydWUsIHNlcnZlclJlc3BvbnNlOiB0aGlzLnJlc3BvbnNlIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkRXJyb3InLCBkZXRhaWxzKVxuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0LnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aF1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc3RvcmVIaXN0b3J5KHBhdGgpIHtcbiAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgIHBhdGggPSBwYXRoIHx8IGxvY2F0aW9uLnBhdGhuYW1lICsgbG9jYXRpb24uc2VhcmNoXG4gICAgY29uc3QgY2FjaGVkID0gZ2V0Q2FjaGVkSGlzdG9yeShwYXRoKVxuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gbWFrZUZyYWdtZW50KGNhY2hlZC5jb250ZW50KVxuICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICBjb25zdCBzZXR0bGVJbmZvID0gbWFrZVNldHRsZUluZm8oaGlzdG9yeUVsZW1lbnQpXG4gICAgICBoYW5kbGVUaXRsZShmcmFnbWVudC50aXRsZSlcbiAgICAgIHN3YXBJbm5lckhUTUwoaGlzdG9yeUVsZW1lbnQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBjYWNoZWQuc2Nyb2xsKVxuICAgICAgfSwgMCkgLy8gbmV4dCAndGljaycsIHNvIGJyb3dzZXIgaGFzIHRpbWUgdG8gcmVuZGVyIGxheW91dFxuICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeVJlc3RvcmUnLCB7IHBhdGgsIGl0ZW06IGNhY2hlZCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaHRteC5jb25maWcucmVmcmVzaE9uSGlzdG9yeU1pc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogb3B0aW9uYWwgcGFyYW1ldGVyIGluIHJlbG9hZCgpIGZ1bmN0aW9uIHRocm93cyBlcnJvclxuICAgICAgICAvLyBub2luc3BlY3Rpb24gSlNVbnJlc29sdmVkUmVmZXJlbmNlXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvYWRIaXN0b3J5RnJvbVNlcnZlcihwYXRoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmVxdWVzdEluZGljYXRvckNsYXNzZXMoZWx0KSB7XG4gICAgbGV0IGluZGljYXRvcnMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmRpY2F0b3InKSlcbiAgICBpZiAoaW5kaWNhdG9ycyA9PSBudWxsKSB7XG4gICAgICBpbmRpY2F0b3JzID0gW2VsdF1cbiAgICB9XG4gICAgZm9yRWFjaChpbmRpY2F0b3JzLCBmdW5jdGlvbihpYykge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGljKVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgaWMuY2xhc3NMaXN0LmFkZC5jYWxsKGljLmNsYXNzTGlzdCwgaHRteC5jb25maWcucmVxdWVzdENsYXNzKVxuICAgIH0pXG4gICAgcmV0dXJuIGluZGljYXRvcnNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZGlzYWJsZUVsZW1lbnRzKGVsdCkge1xuICAgIGxldCBkaXNhYmxlZEVsdHMgPSAvKiogQHR5cGUgRWxlbWVudFtdICovIChmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1kaXNhYmxlZC1lbHQnKSlcbiAgICBpZiAoZGlzYWJsZWRFbHRzID09IG51bGwpIHtcbiAgICAgIGRpc2FibGVkRWx0cyA9IFtdXG4gICAgfVxuICAgIGZvckVhY2goZGlzYWJsZWRFbHRzLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgKyAxXG4gICAgICBkaXNhYmxlZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsICcnKVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JywgJycpXG4gICAgfSlcbiAgICByZXR1cm4gZGlzYWJsZWRFbHRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGluZGljYXRvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50W119IGRpc2FibGVkXG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlZCkge1xuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGljLmNsYXNzTGlzdC5yZW1vdmUuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2goZGlzYWJsZWQsIGZ1bmN0aW9uKGRpc2FibGVkRWxlbWVudCkge1xuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGRpc2FibGVkRWxlbWVudClcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSAtIDFcbiAgICAgIGlmIChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID09PSAwKSB7XG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICAgICAgZGlzYWJsZWRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1kaXNhYmxlZC1ieS1odG14JylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5wdXQgVmFsdWUgUHJvY2Vzc2luZ1xuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaGF2ZVNlZW5Ob2RlKHByb2Nlc3NlZCwgZWx0KSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9jZXNzZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBwcm9jZXNzZWRbaV1cbiAgICAgIGlmIChub2RlLmlzU2FtZU5vZGUoZWx0KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZEluY2x1ZGUoZWxlbWVudCkge1xuICAgIC8vIENhc3QgdG8gdHJpY2sgdHNjLCB1bmRlZmluZWQgdmFsdWVzIHdpbGwgd29yayBmaW5lIGhlcmVcbiAgICBjb25zdCBlbHQgPSAvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovIChlbGVtZW50KVxuICAgIGlmIChlbHQubmFtZSA9PT0gJycgfHwgZWx0Lm5hbWUgPT0gbnVsbCB8fCBlbHQuZGlzYWJsZWQgfHwgY2xvc2VzdChlbHQsICdmaWVsZHNldFtkaXNhYmxlZF0nKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIC8vIGlnbm9yZSBcInN1Ym1pdHRlclwiIHR5cGVzIChzZWUgalF1ZXJ5IHNyYy9zZXJpYWxpemUuanMpXG4gICAgaWYgKGVsdC50eXBlID09PSAnYnV0dG9uJyB8fCBlbHQudHlwZSA9PT0gJ3N1Ym1pdCcgfHwgZWx0LnRhZ05hbWUgPT09ICdpbWFnZScgfHwgZWx0LnRhZ05hbWUgPT09ICdyZXNldCcgfHwgZWx0LnRhZ05hbWUgPT09ICdmaWxlJykge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbHQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgcmV0dXJuIGVsdC5jaGVja2VkXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl8Rm9ybURhdGFFbnRyeVZhbHVlfSB2YWx1ZVxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YSAqL1xuICBmdW5jdGlvbiBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xBcnJheX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKSB7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBsZXQgdmFsdWVzID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHZhbHVlLmluZGV4T2YodikgPCAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVzID0gdmFsdWVzLmZpbHRlcih2ID0+IHYgIT09IHZhbHVlKVxuICAgICAgfVxuICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICBmb3JFYWNoKHZhbHVlcywgdiA9PiBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBwcm9jZXNzZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR8SFRNTFNlbGVjdEVsZW1lbnR8SFRNTEZvcm1FbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSB2YWxpZGF0ZVxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBlbHQsIHZhbGlkYXRlKSB7XG4gICAgaWYgKGVsdCA9PSBudWxsIHx8IGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkpIHtcbiAgICAgIHJldHVyblxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzZWQucHVzaChlbHQpXG4gICAgfVxuICAgIGlmIChzaG91bGRJbmNsdWRlKGVsdCkpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpXG4gICAgICAvLyBAdHMtaWdub3JlIHZhbHVlIHdpbGwgYmUgdW5kZWZpbmVkIGZvciBub24taW5wdXQgZWxlbWVudHMsIHdoaWNoIGlzIGZpbmVcbiAgICAgIGxldCB2YWx1ZSA9IGVsdC52YWx1ZVxuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50ICYmIGVsdC5tdWx0aXBsZSkge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbjpjaGVja2VkJykpLm1hcChmdW5jdGlvbihlKSB7IHJldHVybiAoLyoqIEB0eXBlIEhUTUxPcHRpb25FbGVtZW50ICovKGUpKS52YWx1ZSB9KVxuICAgICAgfVxuICAgICAgLy8gaW5jbHVkZSBmaWxlIGlucHV0c1xuICAgICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgZWx0LmZpbGVzKSB7XG4gICAgICAgIHZhbHVlID0gdG9BcnJheShlbHQuZmlsZXMpXG4gICAgICB9XG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgdmFsdWUsIGZvcm1EYXRhKVxuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIHZhbGlkYXRlRWxlbWVudChlbHQsIGVycm9ycylcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCkge1xuICAgICAgZm9yRWFjaChlbHQuZWxlbWVudHMsIGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIGlmIChwcm9jZXNzZWQuaW5kZXhPZihpbnB1dCkgPj0gMCkge1xuICAgICAgICAgIC8vIFRoZSBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCBhbmQgYWRkZWQgdG8gdGhlIHZhbHVlcywgYnV0IHRoZSBGb3JtRGF0YSB0aGF0IHdpbGwgYmVcbiAgICAgICAgICAvLyAgY29uc3RydWN0ZWQgcmlnaHQgYWZ0ZXIgb24gdGhlIGZvcm0sIHdpbGwgaW5jbHVkZSBpdCBvbmNlIGFnYWluLiBTbyByZW1vdmUgdGhhdCBpbnB1dCdzIHZhbHVlXG4gICAgICAgICAgLy8gIG5vdyB0byBhdm9pZCBkdXBsaWNhdGVzXG4gICAgICAgICAgcmVtb3ZlVmFsdWVGcm9tRm9ybURhdGEoaW5wdXQubmFtZSwgaW5wdXQudmFsdWUsIGZvcm1EYXRhKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb2Nlc3NlZC5wdXNoKGlucHV0KVxuICAgICAgICB9XG4gICAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICAgIHZhbGlkYXRlRWxlbWVudChpbnB1dCwgZXJyb3JzKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgbmV3IEZvcm1EYXRhKGVsdCkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSwgbmFtZSkge1xuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlICYmIHZhbHVlLm5hbWUgPT09ICcnKSB7XG4gICAgICAgICAgcmV0dXJuIC8vIGlnbm9yZSBuby1uYW1lIGZpbGVzXG4gICAgICAgIH1cbiAgICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqL1xuICBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MRWxlbWVudCAmIEVsZW1lbnRJbnRlcm5hbHN9ICovIChlbHQpXG4gICAgaWYgKGVsZW1lbnQud2lsbFZhbGlkYXRlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjp2YWxpZGF0ZScpXG4gICAgICBpZiAoIWVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZWx0OiBlbGVtZW50LCBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWxlbWVudCwgJ2h0bXg6dmFsaWRhdGlvbjpmYWlsZWQnLCB7IG1lc3NhZ2U6IGVsZW1lbnQudmFsaWRhdGlvbk1lc3NhZ2UsIHZhbGlkaXR5OiBlbGVtZW50LnZhbGlkaXR5IH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgb25lIEZvcm1EYXRhIHdpdGggdGhvc2UgZnJvbSBhbm90aGVyLlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSByZWNlaXZlciB0aGUgZm9ybWRhdGEgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZG9ub3IgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBwcm92aWRlIHRoZSBvdmVycmlkaW5nIHZhbHVlc1xuICAgKiBAcmV0dXJucyB7Rm9ybURhdGF9IHRoZSB7QGxpbmtjb2RlIHJlY2VpdmVyfVxuICAgKi9cbiAgZnVuY3Rpb24gb3ZlcnJpZGVGb3JtRGF0YShyZWNlaXZlciwgZG9ub3IpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBkb25vci5rZXlzKCkpIHtcbiAgICAgIHJlY2VpdmVyLmRlbGV0ZShrZXkpXG4gICAgfVxuICAgIGRvbm9yLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmVjZWl2ZXIuYXBwZW5kKGtleSwgdmFsdWUpXG4gICAgfSlcbiAgICByZXR1cm4gcmVjZWl2ZXJcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0h0dHBWZXJifSB2ZXJiXG4gKiBAcmV0dXJucyB7e2Vycm9yczogSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSwgZm9ybURhdGE6IEZvcm1EYXRhLCB2YWx1ZXM6IE9iamVjdH19XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKSB7XG4gICAgLyoqIEB0eXBlIEVsZW1lbnRbXSAqL1xuICAgIGNvbnN0IHByb2Nlc3NlZCA9IFtdXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIGNvbnN0IHByaW9yaXR5Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKVxuICAgIC8qKiBAdHlwZSBIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdICovXG4gICAgY29uc3QgZXJyb3JzID0gW11cbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgJiYgIWJvZHlDb250YWlucyhpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpKSB7XG4gICAgICBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgPSBudWxsXG4gICAgfVxuXG4gICAgLy8gb25seSB2YWxpZGF0ZSB3aGVuIGZvcm0gaXMgZGlyZWN0bHkgc3VibWl0dGVkIGFuZCBub3ZhbGlkYXRlIG9yIGZvcm1ub3ZhbGlkYXRlIGFyZSBub3Qgc2V0XG4gICAgLy8gb3IgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIGV4cGxpY2l0IGh4LXZhbGlkYXRlPVwidHJ1ZVwiIG9uIGl0XG4gICAgbGV0IHZhbGlkYXRlID0gKGVsdCBpbnN0YW5jZW9mIEhUTUxGb3JtRWxlbWVudCAmJiBlbHQubm9WYWxpZGF0ZSAhPT0gdHJ1ZSkgfHwgZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdmFsaWRhdGUnKSA9PT0gJ3RydWUnXG4gICAgaWYgKGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCkge1xuICAgICAgdmFsaWRhdGUgPSB2YWxpZGF0ZSAmJiBpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQuZm9ybU5vVmFsaWRhdGUgIT09IHRydWVcbiAgICB9XG5cbiAgICAvLyBmb3IgYSBub24tR0VUIGluY2x1ZGUgdGhlIGNsb3Nlc3QgZm9ybVxuICAgIGlmICh2ZXJiICE9PSAnZ2V0Jykge1xuICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBwcmlvcml0eUZvcm1EYXRhLCBlcnJvcnMsIGNsb3Nlc3QoZWx0LCAnZm9ybScpLCB2YWxpZGF0ZSlcbiAgICB9XG5cbiAgICAvLyBpbmNsdWRlIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSlcblxuICAgIC8vIGlmIGEgYnV0dG9uIG9yIHN1Ym1pdCB3YXMgY2xpY2tlZCBsYXN0LCBpbmNsdWRlIGl0cyB2YWx1ZVxuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQgfHwgZWx0LnRhZ05hbWUgPT09ICdCVVRUT04nIHx8XG4gICAgKGVsdC50YWdOYW1lID09PSAnSU5QVVQnICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnKSkge1xuICAgICAgY29uc3QgYnV0dG9uID0gaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8ICgvKiogQHR5cGUgSFRNTElucHV0RWxlbWVudHxIVE1MQnV0dG9uRWxlbWVudCAqLyhlbHQpKVxuICAgICAgY29uc3QgbmFtZSA9IGdldFJhd0F0dHJpYnV0ZShidXR0b24sICduYW1lJylcbiAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCBidXR0b24udmFsdWUsIHByaW9yaXR5Rm9ybURhdGEpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSBhbnkgZXhwbGljaXQgaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlcyA9IGZpbmRBdHRyaWJ1dGVUYXJnZXRzKGVsdCwgJ2h4LWluY2x1ZGUnKVxuICAgIGZvckVhY2goaW5jbHVkZXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgYXNFbGVtZW50KG5vZGUpLCB2YWxpZGF0ZSlcbiAgICAgIC8vIGlmIGEgbm9uLWZvcm0gaXMgaW5jbHVkZWQsIGluY2x1ZGUgYW55IGlucHV0IHZhbHVlcyB3aXRoaW4gaXRcbiAgICAgIGlmICghbWF0Y2hlcyhub2RlLCAnZm9ybScpKSB7XG4gICAgICAgIGZvckVhY2goYXNQYXJlbnROb2RlKG5vZGUpLnF1ZXJ5U2VsZWN0b3JBbGwoSU5QVVRfU0VMRUNUT1IpLCBmdW5jdGlvbihkZXNjZW5kYW50KSB7XG4gICAgICAgICAgcHJvY2Vzc0lucHV0VmFsdWUocHJvY2Vzc2VkLCBmb3JtRGF0YSwgZXJyb3JzLCBkZXNjZW5kYW50LCB2YWxpZGF0ZSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gdmFsdWVzIGZyb20gYSA8Zm9ybT4gdGFrZSBwcmVjZWRlbmNlLCBvdmVycmlkaW5nIHRoZSByZWd1bGFyIHZhbHVlc1xuICAgIG92ZXJyaWRlRm9ybURhdGEoZm9ybURhdGEsIHByaW9yaXR5Rm9ybURhdGEpXG5cbiAgICByZXR1cm4geyBlcnJvcnMsIGZvcm1EYXRhLCB2YWx1ZXM6IGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmV0dXJuU3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7YW55fSByZWFsVmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGFwcGVuZFBhcmFtKHJldHVyblN0ciwgbmFtZSwgcmVhbFZhbHVlKSB7XG4gICAgaWYgKHJldHVyblN0ciAhPT0gJycpIHtcbiAgICAgIHJldHVyblN0ciArPSAnJidcbiAgICB9XG4gICAgaWYgKFN0cmluZyhyZWFsVmFsdWUpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgcmVhbFZhbHVlID0gSlNPTi5zdHJpbmdpZnkocmVhbFZhbHVlKVxuICAgIH1cbiAgICBjb25zdCBzID0gZW5jb2RlVVJJQ29tcG9uZW50KHJlYWxWYWx1ZSlcbiAgICByZXR1cm5TdHIgKz0gZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgJz0nICsgc1xuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfE9iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHN0cmluZ1xuICAgKi9cbiAgZnVuY3Rpb24gdXJsRW5jb2RlKHZhbHVlcykge1xuICAgIHZhbHVlcyA9IGZvcm1EYXRhRnJvbU9iamVjdCh2YWx1ZXMpXG4gICAgbGV0IHJldHVyblN0ciA9ICcnXG4gICAgdmFsdWVzLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgICAgcmV0dXJuU3RyID0gYXBwZW5kUGFyYW0ocmV0dXJuU3RyLCBrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJldHVyblN0clxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQWpheFxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvbXB0XG4gKiBAcmV0dXJucyB7SHRteEhlYWRlclNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0KSB7XG4gICAgLyoqIEB0eXBlIEh0bXhIZWFkZXJTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICdIWC1SZXF1ZXN0JzogJ3RydWUnLFxuICAgICAgJ0hYLVRyaWdnZXInOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaWQnKSxcbiAgICAgICdIWC1UcmlnZ2VyLU5hbWUnOiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbmFtZScpLFxuICAgICAgJ0hYLVRhcmdldCc6IGdldEF0dHJpYnV0ZVZhbHVlKHRhcmdldCwgJ2lkJyksXG4gICAgICAnSFgtQ3VycmVudC1VUkwnOiBnZXREb2N1bWVudCgpLmxvY2F0aW9uLmhyZWZcbiAgICB9XG4gICAgZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1oZWFkZXJzJywgZmFsc2UsIGhlYWRlcnMpXG4gICAgaWYgKHByb21wdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzWydIWC1Qcm9tcHQnXSA9IHByb21wdFxuICAgIH1cbiAgICBpZiAoZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCkge1xuICAgICAgaGVhZGVyc1snSFgtQm9vc3RlZCddID0gJ3RydWUnXG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJzXG4gIH1cblxuICAvKipcbiAqIGZpbHRlclZhbHVlcyB0YWtlcyBhbiBvYmplY3QgY29udGFpbmluZyBmb3JtIGlucHV0IHZhbHVlc1xuICogYW5kIHJldHVybnMgYSBuZXcgb2JqZWN0IHRoYXQgb25seSBjb250YWlucyBrZXlzIHRoYXQgYXJlXG4gKiBzcGVjaWZpZWQgYnkgdGhlIGNsb3Nlc3QgXCJoeC1wYXJhbXNcIiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7Rm9ybURhdGF9IGlucHV0VmFsdWVzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGZpbHRlclZhbHVlcyhpbnB1dFZhbHVlcywgZWx0KSB7XG4gICAgY29uc3QgcGFyYW1zVmFsdWUgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcGFyYW1zJylcbiAgICBpZiAocGFyYW1zVmFsdWUpIHtcbiAgICAgIGlmIChwYXJhbXNWYWx1ZSA9PT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKVxuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZSA9PT0gJyonKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgICAgfSBlbHNlIGlmIChwYXJhbXNWYWx1ZS5pbmRleE9mKCdub3QgJykgPT09IDApIHtcbiAgICAgICAgZm9yRWFjaChwYXJhbXNWYWx1ZS5zdWJzdHIoNCkuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlucHV0VmFsdWVzLmRlbGV0ZShuYW1lKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGb3JtRGF0YSgpXG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3BsaXQoJywnKSwgZnVuY3Rpb24obmFtZSkge1xuICAgICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKVxuICAgICAgICAgIGlmIChpbnB1dFZhbHVlcy5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGlucHV0VmFsdWVzLmdldEFsbChuYW1lKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IG5ld1ZhbHVlcy5hcHBlbmQobmFtZSwgdmFsdWUpIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbmV3VmFsdWVzXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpbnB1dFZhbHVlc1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNBbmNob3JMaW5rKGVsdCkge1xuICAgIHJldHVybiAhIWdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykgJiYgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgPj0gMFxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBbc3dhcEluZm9PdmVycmlkZV1cbiAqIEByZXR1cm5zIHtIdG14U3dhcFNwZWNpZmljYXRpb259XG4gKi9cbiAgZnVuY3Rpb24gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwSW5mb092ZXJyaWRlKSB7XG4gICAgY29uc3Qgc3dhcEluZm8gPSBzd2FwSW5mb092ZXJyaWRlIHx8IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zd2FwJylcbiAgICAvKiogQHR5cGUgSHRteFN3YXBTcGVjaWZpY2F0aW9uICovXG4gICAgY29uc3Qgc3dhcFNwZWMgPSB7XG4gICAgICBzd2FwU3R5bGU6IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgPyAnaW5uZXJIVE1MJyA6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwU3R5bGUsXG4gICAgICBzd2FwRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTd2FwRGVsYXksXG4gICAgICBzZXR0bGVEZWxheTogaHRteC5jb25maWcuZGVmYXVsdFNldHRsZURlbGF5XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5zY3JvbGxJbnRvVmlld09uQm9vc3QgJiYgZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiAhaXNBbmNob3JMaW5rKGVsdCkpIHtcbiAgICAgIHN3YXBTcGVjLnNob3cgPSAndG9wJ1xuICAgIH1cbiAgICBpZiAoc3dhcEluZm8pIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gc3BsaXRPbldoaXRlc3BhY2Uoc3dhcEluZm8pXG4gICAgICBpZiAoc3BsaXQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzcGxpdFtpXVxuICAgICAgICAgIGlmICh2YWx1ZS5pbmRleE9mKCdzd2FwOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5zd2FwRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig1KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3NldHRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc2V0dGxlRGVsYXkgPSBwYXJzZUludGVydmFsKHZhbHVlLnN1YnN0cig3KSlcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3RyYW5zaXRpb246JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnRyYW5zaXRpb24gPSB2YWx1ZS5zdWJzdHIoMTEpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2lnbm9yZVRpdGxlOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IHZhbHVlLnN1YnN0cigxMikgPT09ICd0cnVlJ1xuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxTcGVjID0gdmFsdWUuc3Vic3RyKDcpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2Nyb2xsU3BlYy5zcGxpdCgnOicpXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbCA9IHNjcm9sbFZhbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Nob3c6JykgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHNob3dTcGVjID0gdmFsdWUuc3Vic3RyKDUpXG4gICAgICAgICAgICB2YXIgc3BsaXRTcGVjID0gc2hvd1NwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2hvd1ZhbCA9IHNwbGl0U3BlYy5wb3AoKVxuICAgICAgICAgICAgdmFyIHNlbGVjdG9yVmFsID0gc3BsaXRTcGVjLmxlbmd0aCA+IDAgPyBzcGxpdFNwZWMuam9pbignOicpIDogbnVsbFxuICAgICAgICAgICAgc3dhcFNwZWMuc2hvdyA9IHNob3dWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3dUYXJnZXQgPSBzZWxlY3RvclZhbFxuICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUuaW5kZXhPZignZm9jdXMtc2Nyb2xsOicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBmb2N1c1Njcm9sbFZhbCA9IHZhbHVlLnN1YnN0cignZm9jdXMtc2Nyb2xsOicubGVuZ3RoKVxuICAgICAgICAgICAgc3dhcFNwZWMuZm9jdXNTY3JvbGwgPSBmb2N1c1Njcm9sbFZhbCA9PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcFN0eWxlID0gdmFsdWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nRXJyb3IoJ1Vua25vd24gbW9kaWZpZXIgaW4gaHgtc3dhcDogJyArIHZhbHVlKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3dhcFNwZWNcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdXNlc0Zvcm1EYXRhKGVsdCkge1xuICAgIHJldHVybiBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZW5jb2RpbmcnKSA9PT0gJ211bHRpcGFydC9mb3JtLWRhdGEnIHx8XG4gICAgKG1hdGNoZXMoZWx0LCAnZm9ybScpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdlbmN0eXBlJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZmlsdGVyZWRQYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIHsqfHN0cmluZ3xudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRQYXJhbWV0ZXJzKSB7XG4gICAgbGV0IGVuY29kZWRQYXJhbWV0ZXJzID0gbnVsbFxuICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgPT0gbnVsbCkge1xuICAgICAgICBlbmNvZGVkUGFyYW1ldGVycyA9IGV4dGVuc2lvbi5lbmNvZGVQYXJhbWV0ZXJzKHhociwgZmlsdGVyZWRQYXJhbWV0ZXJzLCBlbHQpXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAoZW5jb2RlZFBhcmFtZXRlcnMgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVuY29kZWRQYXJhbWV0ZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgICAvLyBGb3JjZSBjb252ZXJzaW9uIHRvIGFuIGFjdHVhbCBGb3JtRGF0YSBvYmplY3QgaW4gY2FzZSBmaWx0ZXJlZFBhcmFtZXRlcnMgaXMgYSBmb3JtRGF0YVByb3h5XG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC9pc3N1ZXMvMjMxN1xuICAgICAgICByZXR1cm4gb3ZlcnJpZGVGb3JtRGF0YShuZXcgRm9ybURhdGEoKSwgZm9ybURhdGFGcm9tT2JqZWN0KGZpbHRlcmVkUGFyYW1ldGVycykpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsRW5jb2RlKGZpbHRlcmVkUGFyYW1ldGVycylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHJldHVybnMge0h0bXhTZXR0bGVJbmZvfVxuICovXG4gIGZ1bmN0aW9uIG1ha2VTZXR0bGVJbmZvKHRhcmdldCkge1xuICAgIHJldHVybiB7IHRhc2tzOiBbXSwgZWx0czogW3RhcmdldF0gfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBjb250ZW50XG4gICAqIEBwYXJhbSB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufSBzd2FwU3BlY1xuICAgKi9cbiAgZnVuY3Rpb24gdXBkYXRlU2Nyb2xsU3RhdGUoY29udGVudCwgc3dhcFNwZWMpIHtcbiAgICBjb25zdCBmaXJzdCA9IGNvbnRlbnRbMF1cbiAgICBjb25zdCBsYXN0ID0gY29udGVudFtjb250ZW50Lmxlbmd0aCAtIDFdXG4gICAgaWYgKHN3YXBTcGVjLnNjcm9sbCkge1xuICAgICAgdmFyIHRhcmdldCA9IG51bGxcbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGxUYXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHN3YXBTcGVjLnNjcm9sbFRhcmdldCkpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IDBcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zY3JvbGwgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgdGFyZ2V0LnNjcm9sbFRvcCA9IHRhcmdldC5zY3JvbGxIZWlnaHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN3YXBTcGVjLnNob3cpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCkge1xuICAgICAgICBsZXQgdGFyZ2V0U3RyID0gc3dhcFNwZWMuc2hvd1RhcmdldFxuICAgICAgICBpZiAoc3dhcFNwZWMuc2hvd1RhcmdldCA9PT0gJ3dpbmRvdycpIHtcbiAgICAgICAgICB0YXJnZXRTdHIgPSAnYm9keSdcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBhc0VsZW1lbnQocXVlcnlTZWxlY3RvckV4dChmaXJzdCwgdGFyZ2V0U3RyKSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAndG9wJyAmJiAoZmlyc3QgfHwgdGFyZ2V0KSkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQgfHwgZmlyc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdzdGFydCcsIGJlaGF2aW9yOiBodG14LmNvbmZpZy5zY3JvbGxCZWhhdmlvciB9KVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNob3cgPT09ICdib3R0b20nICYmIChsYXN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGxhc3RcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBGb3Igc29tZSByZWFzb24gdHNjIGRvZXNuJ3QgcmVjb2duaXplIFwiaW5zdGFudFwiIGFzIGEgdmFsaWQgb3B0aW9uIGZvciBub3dcbiAgICAgICAgdGFyZ2V0LnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICdlbmQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0clxuICogQHBhcmFtIHtib29sZWFuPX0gZXZhbEFzRGVmYXVsdFxuICogQHBhcmFtIHtPYmplY3Q9fSB2YWx1ZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsIGF0dHIsIGV2YWxBc0RlZmF1bHQsIHZhbHVlcykge1xuICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkge1xuICAgICAgdmFsdWVzID0ge31cbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdmFsdWVzXG4gICAgfVxuICAgIGNvbnN0IGF0dHJpYnV0ZVZhbHVlID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyKVxuICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSkge1xuICAgICAgbGV0IHN0ciA9IGF0dHJpYnV0ZVZhbHVlLnRyaW0oKVxuICAgICAgbGV0IGV2YWx1YXRlVmFsdWUgPSBldmFsQXNEZWZhdWx0XG4gICAgICBpZiAoc3RyID09PSAndW5zZXQnKSB7XG4gICAgICAgIHJldHVybiBudWxsXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ2phdmFzY3JpcHQ6JykgPT09IDApIHtcbiAgICAgICAgc3RyID0gc3RyLnN1YnN0cigxMSlcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoc3RyLmluZGV4T2YoJ2pzOicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMylcbiAgICAgICAgZXZhbHVhdGVWYWx1ZSA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZigneycpICE9PSAwKSB7XG4gICAgICAgIHN0ciA9ICd7JyArIHN0ciArICd9J1xuICAgICAgfVxuICAgICAgbGV0IHZhcnNWYWx1ZXNcbiAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7XG4gICAgICAgIHZhcnNWYWx1ZXMgPSBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHsgcmV0dXJuIEZ1bmN0aW9uKCdyZXR1cm4gKCcgKyBzdHIgKyAnKScpKCkgfSwge30pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXJzVmFsdWVzID0gcGFyc2VKU09OKHN0cilcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhcnNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhcnNWYWx1ZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgIGlmICh2YWx1ZXNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhcnNWYWx1ZXNba2V5XVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpLCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFRhcmdldHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0geygpID0+IGFueX0gdG9FdmFsXG4gICAqIEBwYXJhbSB7YW55PX0gZGVmYXVsdFZhbFxuICAgKiBAcmV0dXJucyB7YW55fVxuICAgKi9cbiAgZnVuY3Rpb24gbWF5YmVFdmFsKGVsdCwgdG9FdmFsLCBkZWZhdWx0VmFsKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmFsbG93RXZhbCkge1xuICAgICAgcmV0dXJuIHRvRXZhbCgpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6ZXZhbERpc2FsbG93ZWRFcnJvcicpXG4gICAgICByZXR1cm4gZGVmYXVsdFZhbFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFyc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhcnMnLCB0cnVlLCBleHByZXNzaW9uVmFycylcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7Kj99IGV4cHJlc3Npb25WYXJzXG4gKiBAcmV0dXJuc1xuICovXG4gIGZ1bmN0aW9uIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0LCBleHByZXNzaW9uVmFycykge1xuICAgIHJldHVybiBnZXRWYWx1ZXNGb3JFbGVtZW50KGVsdCwgJ2h4LXZhbHMnLCBmYWxzZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcmV0dXJucyB7Rm9ybURhdGF9XG4gKi9cbiAgZnVuY3Rpb24gZ2V0RXhwcmVzc2lvblZhcnMoZWx0KSB7XG4gICAgcmV0dXJuIG1lcmdlT2JqZWN0cyhnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCksIGdldEhYVmFsc0ZvckVsZW1lbnQoZWx0KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHBhcmFtIHtzdHJpbmd9IGhlYWRlclxuICAgKiBAcGFyYW0ge3N0cmluZ3xudWxsfSBoZWFkZXJWYWx1ZVxuICAgKi9cbiAgZnVuY3Rpb24gc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKSB7XG4gICAgaWYgKGhlYWRlclZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0cnkge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gT24gYW4gZXhjZXB0aW9uLCB0cnkgdG8gc2V0IHRoZSBoZWFkZXIgVVJJIGVuY29kZWQgaW5zdGVhZFxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGVuY29kZVVSSUNvbXBvbmVudChoZWFkZXJWYWx1ZSkpXG4gICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciArICctVVJJLUF1dG9FbmNvZGVkJywgJ3RydWUnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpIHtcbiAgLy8gTkI6IElFMTEgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIHN0dWZmXG4gICAgaWYgKHhoci5yZXNwb25zZVVSTCAmJiB0eXBlb2YgKFVSTCkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHhoci5yZXNwb25zZVVSTClcbiAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZSArIHVybC5zZWFyY2hcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiYWRSZXNwb25zZVVybCcsIHsgdXJsOiB4aHIucmVzcG9uc2VVUkwgfSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7UmVnRXhwfSByZWdleHBcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhc0hlYWRlcih4aHIsIHJlZ2V4cCkge1xuICAgIHJldHVybiByZWdleHAudGVzdCh4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpXG4gIH1cblxuICAvKipcbiAgICogSXNzdWVzIGFuIGh0bXgtc3R5bGUgQUpBWCByZXF1ZXN0XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2FqYXhcbiAgICpcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgVVJMIHBhdGggdG8gbWFrZSB0aGUgQUpBWFxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfEh0bXhBamF4SGVscGVyQ29udGV4dH0gY29udGV4dCB0aGUgZWxlbWVudCB0byB0YXJnZXQgKGRlZmF1bHRzIHRvIHRoZSAqKmJvZHkqKikgfCBhIHNlbGVjdG9yIGZvciB0aGUgdGFyZ2V0IHwgYSBjb250ZXh0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGFueSBvZiB0aGUgZm9sbG93aW5nXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IFByb21pc2UgdGhhdCByZXNvbHZlcyBpbW1lZGlhdGVseSBpZiBubyByZXF1ZXN0IGlzIHNlbnQsIG9yIHdoZW4gdGhlIHJlcXVlc3QgaXMgY29tcGxldGVcbiAgICovXG4gIGZ1bmN0aW9uIGFqYXhIZWxwZXIodmVyYiwgcGF0aCwgY29udGV4dCkge1xuICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKHZlcmIudG9Mb3dlckNhc2UoKSkpXG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgRWxlbWVudCB8fCB0eXBlb2YgY29udGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICAgIHRhcmdldE92ZXJyaWRlOiByZXNvbHZlVGFyZ2V0KGNvbnRleHQpLFxuICAgICAgICAgIHJldHVyblByb21pc2U6IHRydWVcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIHJlc29sdmVUYXJnZXQoY29udGV4dC5zb3VyY2UpLCBjb250ZXh0LmV2ZW50LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhhbmRsZXI6IGNvbnRleHQuaGFuZGxlcixcbiAgICAgICAgICAgIGhlYWRlcnM6IGNvbnRleHQuaGVhZGVycyxcbiAgICAgICAgICAgIHZhbHVlczogY29udGV4dC52YWx1ZXMsXG4gICAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0LnRhcmdldCksXG4gICAgICAgICAgICBzd2FwT3ZlcnJpZGU6IGNvbnRleHQuc3dhcCxcbiAgICAgICAgICAgIHNlbGVjdDogY29udGV4dC5zZWxlY3QsXG4gICAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgbnVsbCwgbnVsbCwge1xuICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJuIHtFbGVtZW50W119XG4gICAqL1xuICBmdW5jdGlvbiBoaWVyYXJjaHlGb3JFbHQoZWx0KSB7XG4gICAgY29uc3QgYXJyID0gW11cbiAgICB3aGlsZSAoZWx0KSB7XG4gICAgICBhcnIucHVzaChlbHQpXG4gICAgICBlbHQgPSBlbHQucGFyZW50RWxlbWVudFxuICAgIH1cbiAgICByZXR1cm4gYXJyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdmVyaWZ5UGF0aChlbHQsIHBhdGgsIHJlcXVlc3RDb25maWcpIHtcbiAgICBsZXQgc2FtZUhvc3RcbiAgICBsZXQgdXJsXG4gICAgaWYgKHR5cGVvZiBVUkwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVybCA9IG5ldyBVUkwocGF0aCwgZG9jdW1lbnQubG9jYXRpb24uaHJlZilcbiAgICAgIGNvbnN0IG9yaWdpbiA9IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpblxuICAgICAgc2FtZUhvc3QgPSBvcmlnaW4gPT09IHVybC5vcmlnaW5cbiAgICB9IGVsc2Uge1xuICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IFVSTFxuICAgICAgdXJsID0gcGF0aFxuICAgICAgc2FtZUhvc3QgPSBzdGFydHNXaXRoKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbilcbiAgICB9XG5cbiAgICBpZiAoaHRteC5jb25maWcuc2VsZlJlcXVlc3RzT25seSkge1xuICAgICAgaWYgKCFzYW1lSG9zdCkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRlVXJsJywgbWVyZ2VPYmplY3RzKHsgdXJsLCBzYW1lSG9zdCB9LCByZXF1ZXN0Q29uZmlnKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge09iamVjdHxGb3JtRGF0YX0gb2JqXG4gICAqIEByZXR1cm4ge0Zvcm1EYXRhfVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFGcm9tT2JqZWN0KG9iaikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBGb3JtRGF0YSkgcmV0dXJuIG9ialxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBpZiAodHlwZW9mIG9ialtrZXldLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBvYmpba2V5XS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgZm9ybURhdGEuYXBwZW5kKGtleSwgdikgfSlcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnICYmICEob2JqW2tleV0gaW5zdGFuY2VvZiBCbG9iKSkge1xuICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIEpTT04uc3RyaW5naWZ5KG9ialtrZXldKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBvYmpba2V5XSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZm9ybURhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Zvcm1EYXRhfSBmb3JtRGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheVxuICAgKiBAcmV0dXJucyB7QXJyYXl9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YUFycmF5UHJveHkoZm9ybURhdGEsIG5hbWUsIGFycmF5KSB7XG4gICAgLy8gbXV0YXRpbmcgdGhlIGFycmF5IHNob3VsZCBtdXRhdGUgdGhlIHVuZGVybHlpbmcgZm9ybSBkYXRhXG4gICAgcmV0dXJuIG5ldyBQcm94eShhcnJheSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIGtleSkge1xuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ251bWJlcicpIHJldHVybiB0YXJnZXRba2V5XVxuICAgICAgICBpZiAoa2V5ID09PSAnbGVuZ3RoJykgcmV0dXJuIHRhcmdldC5sZW5ndGhcbiAgICAgICAgaWYgKGtleSA9PT0gJ3B1c2gnKSB7XG4gICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQucHVzaCh2YWx1ZSlcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRhcmdldFtrZXldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKVxuICAgICAgICAgICAgZm9ybURhdGEuZGVsZXRlKG5hbWUpXG4gICAgICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YXJnZXRba2V5XSAmJiB0YXJnZXRba2V5XS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1bMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHZhbHVlXG4gICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICB0YXJnZXQuZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHJldHVybnMge09iamVjdH1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhUHJveHkoZm9ybURhdGEpIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZvcm1EYXRhLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgICAgLy8gRm9yd2FyZCBzeW1ib2wgY2FsbHMgdG8gdGhlIEZvcm1EYXRhIGl0c2VsZiBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIG5hbWUpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgPT09ICd0b0pTT04nKSB7XG4gICAgICAgICAgLy8gU3VwcG9ydCBKU09OLnN0cmluZ2lmeSBjYWxsIG9uIHByb3h5XG4gICAgICAgICAgcmV0dXJuICgpID0+IE9iamVjdC5mcm9tRW50cmllcyhmb3JtRGF0YSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmFtZSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAvLyBXcmFwIGluIGZ1bmN0aW9uIHdpdGggYXBwbHkgdG8gY29ycmVjdGx5IGJpbmQgdGhlIEZvcm1EYXRhIGNvbnRleHQsIGFzIGEgZGlyZWN0IGNhbGwgd291bGQgcmVzdWx0IGluIGFuIGlsbGVnYWwgaW52b2NhdGlvbiBlcnJvclxuICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YVtuYW1lXS5hcHBseShmb3JtRGF0YSwgYXJndW1lbnRzKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFycmF5ID0gZm9ybURhdGEuZ2V0QWxsKG5hbWUpXG4gICAgICAgIC8vIFRob3NlIDIgdW5kZWZpbmVkICYgc2luZ2xlIHZhbHVlIHJldHVybnMgYXJlIGZvciByZXRyby1jb21wYXRpYmlsaXR5IGFzIHdlIHdlcmVuJ3QgdXNpbmcgRm9ybURhdGEgYmVmb3JlXG4gICAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgIH0gZWxzZSBpZiAoYXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGFycmF5WzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGZvcm1EYXRhQXJyYXlQcm94eSh0YXJnZXQsIG5hbWUsIGFycmF5KVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQuZGVsZXRlKG5hbWUpXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyB0YXJnZXQuYXBwZW5kKG5hbWUsIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhKHZhbHVlIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIEpTT04uc3RyaW5naWZ5KHZhbHVlKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YXJnZXQuYXBwZW5kKG5hbWUsIHZhbHVlKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgZGVsZXRlUHJvcGVydHk6IGZ1bmN0aW9uKHRhcmdldCwgbmFtZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9LFxuICAgICAgLy8gU3VwcG9ydCBPYmplY3QuYXNzaWduIGNhbGwgZnJvbSBwcm94eVxuICAgICAgb3duS2V5czogZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXMoT2JqZWN0LmZyb21FbnRyaWVzKHRhcmdldCkpXG4gICAgICB9LFxuICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbih0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpLCBwcm9wKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICAgKiBAcGFyYW0ge0h0bXhBamF4RXRjfSBbZXRjXVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtjb25maXJtZWRdXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBmdW5jdGlvbiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgY29uZmlybWVkKSB7XG4gICAgbGV0IHJlc29sdmUgPSBudWxsXG4gICAgbGV0IHJlamVjdCA9IG51bGxcbiAgICBldGMgPSBldGMgIT0gbnVsbCA/IGV0YyA6IHt9XG4gICAgaWYgKGV0Yy5yZXR1cm5Qcm9taXNlICYmIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICByZXNvbHZlID0gX3Jlc29sdmVcbiAgICAgICAgcmVqZWN0ID0gX3JlamVjdFxuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKGVsdCA9PSBudWxsKSB7XG4gICAgICBlbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gZXRjLmhhbmRsZXIgfHwgaGFuZGxlQWpheFJlc3BvbnNlXG4gICAgY29uc3Qgc2VsZWN0ID0gZXRjLnNlbGVjdCB8fCBudWxsXG5cbiAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgLy8gZG8gbm90IGlzc3VlIHJlcXVlc3RzIGZvciBlbGVtZW50cyByZW1vdmVkIGZyb20gdGhlIERPTVxuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICBjb25zdCB0YXJnZXQgPSBldGMudGFyZ2V0T3ZlcnJpZGUgfHwgYXNFbGVtZW50KGdldFRhcmdldChlbHQpKVxuICAgIGlmICh0YXJnZXQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gRFVNTVlfRUxUKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnRhcmdldEVycm9yJywgeyB0YXJnZXQ6IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpIH0pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBsZXQgZWx0RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgY29uc3Qgc3VibWl0dGVyID0gZWx0RGF0YS5sYXN0QnV0dG9uQ2xpY2tlZFxuXG4gICAgaWYgKHN1Ym1pdHRlcikge1xuICAgICAgY29uc3QgYnV0dG9uUGF0aCA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtYWN0aW9uJylcbiAgICAgIGlmIChidXR0b25QYXRoICE9IG51bGwpIHtcbiAgICAgICAgcGF0aCA9IGJ1dHRvblBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgYnV0dG9uVmVyYiA9IGdldFJhd0F0dHJpYnV0ZShzdWJtaXR0ZXIsICdmb3JtbWV0aG9kJylcbiAgICAgIGlmIChidXR0b25WZXJiICE9IG51bGwpIHtcbiAgICAgIC8vIGlnbm9yZSBidXR0b25zIHdpdGggZm9ybW1ldGhvZD1cImRpYWxvZ1wiXG4gICAgICAgIGlmIChidXR0b25WZXJiLnRvTG93ZXJDYXNlKCkgIT09ICdkaWFsb2cnKSB7XG4gICAgICAgICAgdmVyYiA9ICgvKiogQHR5cGUgSHR0cFZlcmIgKi8oYnV0dG9uVmVyYikpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBjb25maXJtUXVlc3Rpb24gPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtY29uZmlybScpXG4gICAgLy8gYWxsb3cgZXZlbnQtYmFzZWQgY29uZmlybWF0aW9uIHcvIGEgY2FsbGJhY2tcbiAgICBpZiAoY29uZmlybWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGlzc3VlUmVxdWVzdCA9IGZ1bmN0aW9uKHNraXBDb25maXJtYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjLCAhIXNraXBDb25maXJtYXRpb24pXG4gICAgICB9XG4gICAgICBjb25zdCBjb25maXJtRGV0YWlscyA9IHsgdGFyZ2V0LCBlbHQsIHBhdGgsIHZlcmIsIHRyaWdnZXJpbmdFdmVudDogZXZlbnQsIGV0YywgaXNzdWVSZXF1ZXN0LCBxdWVzdGlvbjogY29uZmlybVF1ZXN0aW9uIH1cbiAgICAgIGlmICh0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpjb25maXJtJywgY29uZmlybURldGFpbHMpID09PSBmYWxzZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgc3luY0VsdCA9IGVsdFxuICAgIGxldCBzeW5jU3RyYXRlZ3kgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3luYycpXG4gICAgbGV0IHF1ZXVlU3RyYXRlZ3kgPSBudWxsXG4gICAgbGV0IGFib3J0YWJsZSA9IGZhbHNlXG4gICAgaWYgKHN5bmNTdHJhdGVneSkge1xuICAgICAgY29uc3Qgc3luY1N0cmluZ3MgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJzonKVxuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBzeW5jU3RyaW5nc1swXS50cmltKClcbiAgICAgIGlmIChzZWxlY3RvciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHN5bmNFbHQgPSBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtc3luYycpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzeW5jRWx0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBzZWxlY3RvcikpXG4gICAgICB9XG4gICAgICAvLyBkZWZhdWx0IHRvIHRoZSBkcm9wIHN0cmF0ZWd5XG4gICAgICBzeW5jU3RyYXRlZ3kgPSAoc3luY1N0cmluZ3NbMV0gfHwgJ2Ryb3AnKS50cmltKClcbiAgICAgIGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoc3luY0VsdClcbiAgICAgIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdkcm9wJyAmJiBlbHREYXRhLnhociAmJiBlbHREYXRhLmFib3J0YWJsZSAhPT0gdHJ1ZSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH0gZWxzZSBpZiAoc3luY1N0cmF0ZWd5ID09PSAnYWJvcnQnKSB7XG4gICAgICAgIGlmIChlbHREYXRhLnhocikge1xuICAgICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWJvcnRhYmxlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ3JlcGxhY2UnKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChzeW5jRWx0LCAnaHRteDphYm9ydCcpIC8vIGFib3J0IHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGNvbnRpbnVlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneS5pbmRleE9mKCdxdWV1ZScpID09PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlU3RyQXJyYXkgPSBzeW5jU3RyYXRlZ3kuc3BsaXQoJyAnKVxuICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gKHF1ZXVlU3RyQXJyYXlbMV0gfHwgJ2xhc3QnKS50cmltKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgIGlmIChlbHREYXRhLmFib3J0YWJsZSkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXZlbnREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGV2ZW50KVxuICAgICAgICAgICAgaWYgKGV2ZW50RGF0YSAmJiBldmVudERhdGEudHJpZ2dlclNwZWMgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlKSB7XG4gICAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSBldmVudERhdGEudHJpZ2dlclNwZWMucXVldWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT0gbnVsbCkge1xuICAgICAgICAgICAgcXVldWVTdHJhdGVneSA9ICdsYXN0J1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9PSBudWxsKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdmaXJzdCcgJiYgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKHF1ZXVlU3RyYXRlZ3kgPT09ICdhbGwnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnbGFzdCcpIHtcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzID0gW10gLy8gZHVtcCBleGlzdGluZyBxdWV1ZVxuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBlbHREYXRhLnhociA9IHhoclxuICAgIGVsdERhdGEuYWJvcnRhYmxlID0gYWJvcnRhYmxlXG4gICAgY29uc3QgZW5kUmVxdWVzdExvY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgIGVsdERhdGEueGhyID0gbnVsbFxuICAgICAgZWx0RGF0YS5hYm9ydGFibGUgPSBmYWxzZVxuICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgIT0gbnVsbCAmJlxuICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXVlZFJlcXVlc3QgPSBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnNoaWZ0KClcbiAgICAgICAgcXVldWVkUmVxdWVzdCgpXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHByb21wdFF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXByb21wdCcpXG4gICAgaWYgKHByb21wdFF1ZXN0aW9uKSB7XG4gICAgICB2YXIgcHJvbXB0UmVzcG9uc2UgPSBwcm9tcHQocHJvbXB0UXVlc3Rpb24pXG4gICAgICAvLyBwcm9tcHQgcmV0dXJucyBudWxsIGlmIGNhbmNlbGxlZCBhbmQgZW1wdHkgc3RyaW5nIGlmIGFjY2VwdGVkIHdpdGggbm8gZW50cnlcbiAgICAgIGlmIChwcm9tcHRSZXNwb25zZSA9PT0gbnVsbCB8fFxuICAgICAgIXRyaWdnZXJFdmVudChlbHQsICdodG14OnByb21wdCcsIHsgcHJvbXB0OiBwcm9tcHRSZXNwb25zZSwgdGFyZ2V0IH0pKSB7XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpcm1RdWVzdGlvbiAmJiAhY29uZmlybWVkKSB7XG4gICAgICBpZiAoIWNvbmZpcm0oY29uZmlybVF1ZXN0aW9uKSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBoZWFkZXJzID0gZ2V0SGVhZGVycyhlbHQsIHRhcmdldCwgcHJvbXB0UmVzcG9uc2UpXG5cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcgJiYgIXVzZXNGb3JtRGF0YShlbHQpKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXG4gICAgfVxuXG4gICAgaWYgKGV0Yy5oZWFkZXJzKSB7XG4gICAgICBoZWFkZXJzID0gbWVyZ2VPYmplY3RzKGhlYWRlcnMsIGV0Yy5oZWFkZXJzKVxuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gZ2V0SW5wdXRWYWx1ZXMoZWx0LCB2ZXJiKVxuICAgIGxldCBlcnJvcnMgPSByZXN1bHRzLmVycm9yc1xuICAgIGNvbnN0IHJhd0Zvcm1EYXRhID0gcmVzdWx0cy5mb3JtRGF0YVxuICAgIGlmIChldGMudmFsdWVzKSB7XG4gICAgICBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBmb3JtRGF0YUZyb21PYmplY3QoZXRjLnZhbHVlcykpXG4gICAgfVxuICAgIGNvbnN0IGV4cHJlc3Npb25WYXJzID0gZm9ybURhdGFGcm9tT2JqZWN0KGdldEV4cHJlc3Npb25WYXJzKGVsdCkpXG4gICAgY29uc3QgYWxsRm9ybURhdGEgPSBvdmVycmlkZUZvcm1EYXRhKHJhd0Zvcm1EYXRhLCBleHByZXNzaW9uVmFycylcbiAgICBsZXQgZmlsdGVyZWRGb3JtRGF0YSA9IGZpbHRlclZhbHVlcyhhbGxGb3JtRGF0YSwgZWx0KVxuXG4gICAgaWYgKGh0bXguY29uZmlnLmdldENhY2hlQnVzdGVyUGFyYW0gJiYgdmVyYiA9PT0gJ2dldCcpIHtcbiAgICAgIGZpbHRlcmVkRm9ybURhdGEuc2V0KCdvcmcuaHRteC5jYWNoZS1idXN0ZXInLCBnZXRSYXdBdHRyaWJ1dGUodGFyZ2V0LCAnaWQnKSB8fCAndHJ1ZScpXG4gICAgfVxuXG4gICAgLy8gYmVoYXZpb3Igb2YgYW5jaG9ycyB3LyBlbXB0eSBocmVmIGlzIHRvIHVzZSB0aGUgY3VycmVudCBVUkxcbiAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGggPT09ICcnKSB7XG4gICAgICBwYXRoID0gZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAgICAgKiBAcHJvcGVydHkge251bWJlcn0gW3RpbWVvdXRdXG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbbm9IZWFkZXJzXVxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVlc3RBdHRyVmFsdWVzID0gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC1yZXF1ZXN0JylcblxuICAgIGNvbnN0IGVsdElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCB1c2VVcmxQYXJhbXMgPSBodG14LmNvbmZpZy5tZXRob2RzVGhhdFVzZVVybFBhcmFtcy5pbmRleE9mKHZlcmIpID49IDBcblxuICAgIC8qKiBAdHlwZSBIdG14UmVxdWVzdENvbmZpZyAqL1xuICAgIGNvbnN0IHJlcXVlc3RDb25maWcgPSB7XG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICB1c2VVcmxQYXJhbXMsXG4gICAgICBmb3JtRGF0YTogZmlsdGVyZWRGb3JtRGF0YSxcbiAgICAgIHBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoZmlsdGVyZWRGb3JtRGF0YSksXG4gICAgICB1bmZpbHRlcmVkRm9ybURhdGE6IGFsbEZvcm1EYXRhLFxuICAgICAgdW5maWx0ZXJlZFBhcmFtZXRlcnM6IGZvcm1EYXRhUHJveHkoYWxsRm9ybURhdGEpLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRhcmdldCxcbiAgICAgIHZlcmIsXG4gICAgICBlcnJvcnMsXG4gICAgICB3aXRoQ3JlZGVudGlhbHM6IGV0Yy5jcmVkZW50aWFscyB8fCByZXF1ZXN0QXR0clZhbHVlcy5jcmVkZW50aWFscyB8fCBodG14LmNvbmZpZy53aXRoQ3JlZGVudGlhbHMsXG4gICAgICB0aW1lb3V0OiBldGMudGltZW91dCB8fCByZXF1ZXN0QXR0clZhbHVlcy50aW1lb3V0IHx8IGh0bXguY29uZmlnLnRpbWVvdXQsXG4gICAgICBwYXRoLFxuICAgICAgdHJpZ2dlcmluZ0V2ZW50OiBldmVudFxuICAgIH1cblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgLy8gY29weSBvdXQgaW4gY2FzZSB0aGUgb2JqZWN0IHdhcyBvdmVyd3JpdHRlblxuICAgIHBhdGggPSByZXF1ZXN0Q29uZmlnLnBhdGhcbiAgICB2ZXJiID0gcmVxdWVzdENvbmZpZy52ZXJiXG4gICAgaGVhZGVycyA9IHJlcXVlc3RDb25maWcuaGVhZGVyc1xuICAgIGZpbHRlcmVkRm9ybURhdGEgPSBmb3JtRGF0YUZyb21PYmplY3QocmVxdWVzdENvbmZpZy5wYXJhbWV0ZXJzKVxuICAgIGVycm9ycyA9IHJlcXVlc3RDb25maWcuZXJyb3JzXG4gICAgdXNlVXJsUGFyYW1zID0gcmVxdWVzdENvbmZpZy51c2VVcmxQYXJhbXNcblxuICAgIGlmIChlcnJvcnMgJiYgZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnZhbGlkYXRpb246aGFsdGVkJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBzcGxpdFBhdGggPSBwYXRoLnNwbGl0KCcjJylcbiAgICBjb25zdCBwYXRoTm9BbmNob3IgPSBzcGxpdFBhdGhbMF1cbiAgICBjb25zdCBhbmNob3IgPSBzcGxpdFBhdGhbMV1cblxuICAgIGxldCBmaW5hbFBhdGggPSBwYXRoXG4gICAgaWYgKHVzZVVybFBhcmFtcykge1xuICAgICAgZmluYWxQYXRoID0gcGF0aE5vQW5jaG9yXG4gICAgICBjb25zdCBoYXNWYWx1ZXMgPSAhZmlsdGVyZWRGb3JtRGF0YS5rZXlzKCkubmV4dCgpLmRvbmVcbiAgICAgIGlmIChoYXNWYWx1ZXMpIHtcbiAgICAgICAgaWYgKGZpbmFsUGF0aC5pbmRleE9mKCc/JykgPCAwKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICc/J1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnJidcbiAgICAgICAgfVxuICAgICAgICBmaW5hbFBhdGggKz0gdXJsRW5jb2RlKGZpbHRlcmVkRm9ybURhdGEpXG4gICAgICAgIGlmIChhbmNob3IpIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyMnICsgYW5jaG9yXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZlcmlmeVBhdGgoZWx0LCBmaW5hbFBhdGgsIHJlcXVlc3RDb25maWcpKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmludmFsaWRQYXRoJywgcmVxdWVzdENvbmZpZylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIHhoci5vcGVuKHZlcmIudG9VcHBlckNhc2UoKSwgZmluYWxQYXRoLCB0cnVlKVxuICAgIHhoci5vdmVycmlkZU1pbWVUeXBlKCd0ZXh0L2h0bWwnKVxuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSByZXF1ZXN0Q29uZmlnLndpdGhDcmVkZW50aWFsc1xuICAgIHhoci50aW1lb3V0ID0gcmVxdWVzdENvbmZpZy50aW1lb3V0XG5cbiAgICAvLyByZXF1ZXN0IGhlYWRlcnNcbiAgICBpZiAocmVxdWVzdEF0dHJWYWx1ZXMubm9IZWFkZXJzKSB7XG4gICAgLy8gaWdub3JlIGFsbCBoZWFkZXJzXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIGNvbnN0IGhlYWRlclZhbHVlID0gaGVhZGVyc1toZWFkZXJdXG4gICAgICAgICAgc2FmZWx5U2V0SGVhZGVyVmFsdWUoeGhyLCBoZWFkZXIsIGhlYWRlclZhbHVlKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtIdG14UmVzcG9uc2VJbmZvfSAqL1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mbyA9IHtcbiAgICAgIHhocixcbiAgICAgIHRhcmdldCxcbiAgICAgIHJlcXVlc3RDb25maWcsXG4gICAgICBldGMsXG4gICAgICBib29zdGVkOiBlbHRJc0Jvb3N0ZWQsXG4gICAgICBzZWxlY3QsXG4gICAgICBwYXRoSW5mbzoge1xuICAgICAgICByZXF1ZXN0UGF0aDogcGF0aCxcbiAgICAgICAgZmluYWxSZXF1ZXN0UGF0aDogZmluYWxQYXRoLFxuICAgICAgICByZXNwb25zZVBhdGg6IG51bGwsXG4gICAgICAgIGFuY2hvclxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhpZXJhcmNoeSA9IGhpZXJhcmNoeUZvckVsdChlbHQpXG4gICAgICAgIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGggPSBnZXRQYXRoRnJvbVJlc3BvbnNlKHhocilcbiAgICAgICAgcmVzcG9uc2VIYW5kbGVyKGVsdCwgcmVzcG9uc2VJbmZvKVxuICAgICAgICBpZiAocmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzICE9PSB0cnVlKSB7XG4gICAgICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICAgIH1cbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgLy8gaWYgdGhlIGJvZHkgbm8gbG9uZ2VyIGNvbnRhaW5zIHRoZSBlbGVtZW50LCB0cmlnZ2VyIHRoZSBldmVudCBvbiB0aGUgY2xvc2VzdCBwYXJlbnRcbiAgICAgICAgLy8gcmVtYWluaW5nIGluIHRoZSBET01cbiAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgIGxldCBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gbnVsbFxuICAgICAgICAgIHdoaWxlIChoaWVyYXJjaHkubGVuZ3RoID4gMCAmJiBzZWNvbmRhcnlUcmlnZ2VyRWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsdEluSGllcmFyY2h5ID0gaGllcmFyY2h5LnNoaWZ0KClcbiAgICAgICAgICAgIGlmIChib2R5Q29udGFpbnMocGFyZW50RWx0SW5IaWVyYXJjaHkpKSB7XG4gICAgICAgICAgICAgIHNlY29uZGFyeVRyaWdnZXJFbHQgPSBwYXJlbnRFbHRJbkhpZXJhcmNoeVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2Vjb25kYXJ5VHJpZ2dlckVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KHNlY29uZGFyeVRyaWdnZXJFbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlck9uTG9hZCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpvbkxvYWRFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgIHRocm93IGVcbiAgICAgIH1cbiAgICB9XG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnNlbmRFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIHhoci5vbmFib3J0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kQWJvcnQnLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub250aW1lb3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0aW1lb3V0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cbiAgICB2YXIgaW5kaWNhdG9ycyA9IGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdClcbiAgICB2YXIgZGlzYWJsZUVsdHMgPSBkaXNhYmxlRWxlbWVudHMoZWx0KVxuXG4gICAgZm9yRWFjaChbJ2xvYWRzdGFydCcsICdsb2FkZW5kJywgJ3Byb2dyZXNzJywgJ2Fib3J0J10sIGZ1bmN0aW9uKGV2ZW50TmFtZSkge1xuICAgICAgZm9yRWFjaChbeGhyLCB4aHIudXBsb2FkXSwgZnVuY3Rpb24odGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp4aHI6JyArIGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgbGVuZ3RoQ29tcHV0YWJsZTogZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSxcbiAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLFxuICAgICAgICAgICAgdG90YWw6IGV2ZW50LnRvdGFsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSlcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVTZW5kJywgcmVzcG9uc2VJbmZvKVxuICAgIGNvbnN0IHBhcmFtcyA9IHVzZVVybFBhcmFtcyA/IG51bGwgOiBlbmNvZGVQYXJhbXNGb3JCb2R5KHhociwgZWx0LCBmaWx0ZXJlZEZvcm1EYXRhKVxuICAgIHhoci5zZW5kKHBhcmFtcylcbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5VXBkYXRlXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IFt0eXBlXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbcGF0aF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqIEByZXR1cm4ge0h0bXhIaXN0b3J5VXBkYXRlfVxuICAgKi9cbiAgZnVuY3Rpb24gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG5cbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgLy8gRmlyc3QgY29uc3VsdCByZXNwb25zZSBoZWFkZXJzXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIGxldCBwYXRoRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgbGV0IHR5cGVGcm9tSGVhZGVycyA9IG51bGxcbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2g6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3B1c2gnXG4gICAgfSBlbHNlIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUHVzaC1Vcmw6L2kpKSB7XG4gICAgICBwYXRoRnJvbUhlYWRlcnMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVB1c2gtVXJsJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlcGxhY2UtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXBsYWNlLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncmVwbGFjZSdcbiAgICB9XG5cbiAgICAvLyBpZiB0aGVyZSB3YXMgYSByZXNwb25zZSBoZWFkZXIsIHRoYXQgaGFzIHByaW9yaXR5XG4gICAgaWYgKHBhdGhGcm9tSGVhZGVycykge1xuICAgICAgaWYgKHBhdGhGcm9tSGVhZGVycyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICByZXR1cm4ge31cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogdHlwZUZyb21IZWFkZXJzLFxuICAgICAgICAgIHBhdGg6IHBhdGhGcm9tSGVhZGVyc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5leHQgcmVzb2x2ZSB2aWEgRE9NIHZhbHVlc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBjb25zdCByZXF1ZXN0UGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5maW5hbFJlcXVlc3RQYXRoXG4gICAgY29uc3QgcmVzcG9uc2VQYXRoID0gcmVzcG9uc2VJbmZvLnBhdGhJbmZvLnJlc3BvbnNlUGF0aFxuXG4gICAgY29uc3QgcHVzaFVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wdXNoLXVybCcpXG4gICAgY29uc3QgcmVwbGFjZVVybCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1yZXBsYWNlLXVybCcpXG4gICAgY29uc3QgZWxlbWVudElzQm9vc3RlZCA9IGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWRcblxuICAgIGxldCBzYXZlVHlwZSA9IG51bGxcbiAgICBsZXQgcGF0aCA9IG51bGxcblxuICAgIGlmIChwdXNoVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdwdXNoJ1xuICAgICAgcGF0aCA9IHB1c2hVcmxcbiAgICB9IGVsc2UgaWYgKHJlcGxhY2VVcmwpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3JlcGxhY2UnXG4gICAgICBwYXRoID0gcmVwbGFjZVVybFxuICAgIH0gZWxzZSBpZiAoZWxlbWVudElzQm9vc3RlZCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSByZXNwb25zZVBhdGggfHwgcmVxdWVzdFBhdGggLy8gaWYgdGhlcmUgaXMgbm8gcmVzcG9uc2UgcGF0aCwgZ28gd2l0aCB0aGUgb3JpZ2luYWwgcmVxdWVzdCBwYXRoXG4gICAgfVxuXG4gICAgaWYgKHBhdGgpIHtcbiAgICAvLyBmYWxzZSBpbmRpY2F0ZXMgbm8gcHVzaCwgcmV0dXJuIGVtcHR5IG9iamVjdFxuICAgICAgaWYgKHBhdGggPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9XG5cbiAgICAgIC8vIHRydWUgaW5kaWNhdGVzIHdlIHdhbnQgdG8gZm9sbG93IHdoZXJldmVyIHRoZSBzZXJ2ZXIgZW5kZWQgdXAgc2VuZGluZyB1c1xuICAgICAgaWYgKHBhdGggPT09ICd0cnVlJykge1xuICAgICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgICAgfVxuXG4gICAgICAvLyByZXN0b3JlIGFueSBhbmNob3IgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0XG4gICAgICBpZiAocmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvciAmJiBwYXRoLmluZGV4T2YoJyMnKSA9PT0gLTEpIHtcbiAgICAgICAgcGF0aCA9IHBhdGggKyAnIycgKyByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IHNhdmVUeXBlLFxuICAgICAgICBwYXRoXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfSByZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0dXNcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdDb25maWcsIHN0YXR1cykge1xuICAgIHZhciByZWdFeHAgPSBuZXcgUmVnRXhwKHJlc3BvbnNlSGFuZGxpbmdDb25maWcuY29kZSlcbiAgICByZXR1cm4gcmVnRXhwLnRlc3Qoc3RhdHVzLnRvU3RyaW5nKDEwKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAgICogQHJldHVybiB7SHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWd9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmcubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8qKiBAdHlwZSBIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZyAqL1xuICAgICAgdmFyIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50ID0gaHRteC5jb25maWcucmVzcG9uc2VIYW5kbGluZ1tpXVxuICAgICAgaWYgKGNvZGVNYXRjaGVzKHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50LCB4aHIuc3RhdHVzKSkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2VIYW5kbGluZ0VsZW1lbnRcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gbm8gbWF0Y2hlcywgcmV0dXJuIG5vIHN3YXBcbiAgICByZXR1cm4ge1xuICAgICAgc3dhcDogZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVUaXRsZSh0aXRsZSkge1xuICAgIGlmICh0aXRsZSkge1xuICAgICAgY29uc3QgdGl0bGVFbHQgPSBmaW5kKCd0aXRsZScpXG4gICAgICBpZiAodGl0bGVFbHQpIHtcbiAgICAgICAgdGl0bGVFbHQuaW5uZXJIVE1MID0gdGl0bGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5kb2N1bWVudC50aXRsZSA9IHRpdGxlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBoYW5kbGVBamF4UmVzcG9uc2UoZWx0LCByZXNwb25zZUluZm8pIHtcbiAgICBjb25zdCB4aHIgPSByZXNwb25zZUluZm8ueGhyXG4gICAgbGV0IHRhcmdldCA9IHJlc3BvbnNlSW5mby50YXJnZXRcbiAgICBjb25zdCBldGMgPSByZXNwb25zZUluZm8uZXRjXG4gICAgY29uc3QgcmVzcG9uc2VJbmZvU2VsZWN0ID0gcmVzcG9uc2VJbmZvLnNlbGVjdFxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpiZWZvcmVPbkxvYWQnLCByZXNwb25zZUluZm8pKSByZXR1cm5cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlcjovaSkpIHtcbiAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlcicsIGVsdClcbiAgICB9XG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLUxvY2F0aW9uOi9pKSkge1xuICAgICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICAgIGxldCByZWRpcmVjdFBhdGggPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLUxvY2F0aW9uJylcbiAgICAgIC8qKiBAdHlwZSB7SHRteEFqYXhIZWxwZXJDb250ZXh0JntwYXRoOnN0cmluZ319ICovXG4gICAgICB2YXIgcmVkaXJlY3RTd2FwU3BlY1xuICAgICAgaWYgKHJlZGlyZWN0UGF0aC5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgICAgcmVkaXJlY3RTd2FwU3BlYyA9IHBhcnNlSlNPTihyZWRpcmVjdFBhdGgpXG4gICAgICAgIC8vIHdoYXQncyB0aGUgYmVzdCB3YXkgdG8gdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHVzZXIgZGlkbid0IGluY2x1ZGUgdGhpc1xuICAgICAgICByZWRpcmVjdFBhdGggPSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgICAgZGVsZXRlIHJlZGlyZWN0U3dhcFNwZWMucGF0aFxuICAgICAgfVxuICAgICAgYWpheEhlbHBlcignZ2V0JywgcmVkaXJlY3RQYXRoLCByZWRpcmVjdFN3YXBTcGVjKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkocmVkaXJlY3RQYXRoKVxuICAgICAgfSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlZnJlc2ggPSBoYXNIZWFkZXIoeGhyLCAvSFgtUmVmcmVzaDovaSkgJiYgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWZyZXNoJykgPT09ICd0cnVlJ1xuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZWRpcmVjdDovaSkpIHtcbiAgICAgIHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyA9IHRydWVcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlZGlyZWN0JylcbiAgICAgIHNob3VsZFJlZnJlc2ggJiYgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzaG91bGRSZWZyZXNoKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhpc3RvcnlVcGRhdGUgPSBkZXRlcm1pbmVIaXN0b3J5VXBkYXRlcyhlbHQsIHJlc3BvbnNlSW5mbylcblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxpbmcgPSByZXNvbHZlUmVzcG9uc2VIYW5kbGluZyh4aHIpXG4gICAgY29uc3Qgc2hvdWxkU3dhcCA9IHJlc3BvbnNlSGFuZGxpbmcuc3dhcFxuICAgIGxldCBpc0Vycm9yID0gISFyZXNwb25zZUhhbmRsaW5nLmVycm9yXG4gICAgbGV0IGlnbm9yZVRpdGxlID0gaHRteC5jb25maWcuaWdub3JlVGl0bGUgfHwgcmVzcG9uc2VIYW5kbGluZy5pZ25vcmVUaXRsZVxuICAgIGxldCBzZWxlY3RPdmVycmlkZSA9IHJlc3BvbnNlSGFuZGxpbmcuc2VsZWN0XG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcudGFyZ2V0KSB7XG4gICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCByZXNwb25zZUhhbmRsaW5nLnRhcmdldCkpXG4gICAgfVxuICAgIHZhciBzd2FwT3ZlcnJpZGUgPSBldGMuc3dhcE92ZXJyaWRlXG4gICAgaWYgKHN3YXBPdmVycmlkZSA9PSBudWxsICYmIHJlc3BvbnNlSGFuZGxpbmcuc3dhcE92ZXJyaWRlKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZVxuICAgIH1cblxuICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMgb3ZlcnJpZGUgcmVzcG9uc2UgaGFuZGxpbmcgY29uZmlnXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXRhcmdldDovaSkpIHtcbiAgICAgIGlmICh4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykgPT09ICd0aGlzJykge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gZWx0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJldGFyZ2V0JykpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgIHN3YXBPdmVycmlkZSA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVzd2FwJylcbiAgICB9XG5cbiAgICB2YXIgc2VydmVyUmVzcG9uc2UgPSB4aHIucmVzcG9uc2VcbiAgICAvKiogQHR5cGUgSHRteEJlZm9yZVN3YXBEZXRhaWxzICovXG4gICAgdmFyIGJlZm9yZVN3YXBEZXRhaWxzID0gbWVyZ2VPYmplY3RzKHtcbiAgICAgIHNob3VsZFN3YXAsXG4gICAgICBzZXJ2ZXJSZXNwb25zZSxcbiAgICAgIGlzRXJyb3IsXG4gICAgICBpZ25vcmVUaXRsZSxcbiAgICAgIHNlbGVjdE92ZXJyaWRlXG4gICAgfSwgcmVzcG9uc2VJbmZvKVxuXG4gICAgaWYgKHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQgJiYgIXRyaWdnZXJFdmVudCh0YXJnZXQsIHJlc3BvbnNlSGFuZGxpbmcuZXZlbnQsIGJlZm9yZVN3YXBEZXRhaWxzKSkgcmV0dXJuXG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudCh0YXJnZXQsICdodG14OmJlZm9yZVN3YXAnLCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgdGFyZ2V0ID0gYmVmb3JlU3dhcERldGFpbHMudGFyZ2V0IC8vIGFsbG93IHJlLXRhcmdldGluZ1xuICAgIHNlcnZlclJlc3BvbnNlID0gYmVmb3JlU3dhcERldGFpbHMuc2VydmVyUmVzcG9uc2UgLy8gYWxsb3cgdXBkYXRpbmcgY29udGVudFxuICAgIGlzRXJyb3IgPSBiZWZvcmVTd2FwRGV0YWlscy5pc0Vycm9yIC8vIGFsbG93IHVwZGF0aW5nIGVycm9yXG4gICAgaWdub3JlVGl0bGUgPSBiZWZvcmVTd2FwRGV0YWlscy5pZ25vcmVUaXRsZSAvLyBhbGxvdyB1cGRhdGluZyBpZ25vcmluZyB0aXRsZVxuICAgIHNlbGVjdE92ZXJyaWRlID0gYmVmb3JlU3dhcERldGFpbHMuc2VsZWN0T3ZlcnJpZGUgLy8gYWxsb3cgdXBkYXRpbmcgc2VsZWN0IG92ZXJyaWRlXG5cbiAgICByZXNwb25zZUluZm8udGFyZ2V0ID0gdGFyZ2V0IC8vIE1ha2UgdXBkYXRlZCB0YXJnZXQgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuICAgIHJlc3BvbnNlSW5mby5mYWlsZWQgPSBpc0Vycm9yIC8vIE1ha2UgZmFpbGVkIHByb3BlcnR5IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uc3VjY2Vzc2Z1bCA9ICFpc0Vycm9yIC8vIE1ha2Ugc3VjY2Vzc2Z1bCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG5cbiAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgaWYgKHhoci5zdGF0dXMgPT09IDI4Nikge1xuICAgICAgICBjYW5jZWxQb2xsaW5nKGVsdClcbiAgICAgIH1cblxuICAgICAgd2l0aEV4dGVuc2lvbnMoZWx0LCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgICAgc2VydmVyUmVzcG9uc2UgPSBleHRlbnNpb24udHJhbnNmb3JtUmVzcG9uc2Uoc2VydmVyUmVzcG9uc2UsIHhociwgZWx0KVxuICAgICAgfSlcblxuICAgICAgLy8gU2F2ZSBjdXJyZW50IHBhZ2UgaWYgdGhlcmUgd2lsbCBiZSBhIGhpc3RvcnkgdXBkYXRlXG4gICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlKSB7XG4gICAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzd2FwOi9pKSkge1xuICAgICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgICB9XG4gICAgICB2YXIgc3dhcFNwZWMgPSBnZXRTd2FwU3BlY2lmaWNhdGlvbihlbHQsIHN3YXBPdmVycmlkZSlcblxuICAgICAgaWYgKCFzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgnaWdub3JlVGl0bGUnKSkge1xuICAgICAgICBzd2FwU3BlYy5pZ25vcmVUaXRsZSA9IGlnbm9yZVRpdGxlXG4gICAgICB9XG5cbiAgICAgIHRhcmdldC5jbGFzc0xpc3QuYWRkKGh0bXguY29uZmlnLnN3YXBwaW5nQ2xhc3MpXG5cbiAgICAgIC8vIG9wdGlvbmFsIHRyYW5zaXRpb24gQVBJIHByb21pc2UgY2FsbGJhY2tzXG4gICAgICBsZXQgc2V0dGxlUmVzb2x2ZSA9IG51bGxcbiAgICAgIGxldCBzZXR0bGVSZWplY3QgPSBudWxsXG5cbiAgICAgIGlmIChyZXNwb25zZUluZm9TZWxlY3QpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUluZm9TZWxlY3RcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXNlbGVjdDovaSkpIHtcbiAgICAgICAgc2VsZWN0T3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc2VsZWN0JylcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VsZWN0T09CID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdC1vb2InKVxuICAgICAgY29uc3Qgc2VsZWN0ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXNlbGVjdCcpXG5cbiAgICAgIGxldCBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBpZiB3ZSBuZWVkIHRvIHNhdmUgaGlzdG9yeSwgZG8gc28sIGJlZm9yZSBzd2FwcGluZyBzbyB0aGF0IHJlbGF0aXZlIHJlc291cmNlcyBoYXZlIHRoZSBjb3JyZWN0IGJhc2UgVVJMXG4gICAgICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmVmb3JlSGlzdG9yeVVwZGF0ZScsIG1lcmdlT2JqZWN0cyh7IGhpc3Rvcnk6IGhpc3RvcnlVcGRhdGUgfSwgcmVzcG9uc2VJbmZvKSlcbiAgICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUgPT09ICdwdXNoJykge1xuICAgICAgICAgICAgICBwdXNoVXJsSW50b0hpc3RvcnkoaGlzdG9yeVVwZGF0ZS5wYXRoKVxuICAgICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpwdXNoZWRJbnRvSGlzdG9yeScsIHsgcGF0aDogaGlzdG9yeVVwZGF0ZS5wYXRoIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXBsYWNlVXJsSW5IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cmVwbGFjZWRJbkhpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHN3YXAodGFyZ2V0LCBzZXJ2ZXJSZXNwb25zZSwgc3dhcFNwZWMsIHtcbiAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0T3ZlcnJpZGUgfHwgc2VsZWN0LFxuICAgICAgICAgICAgc2VsZWN0T09CLFxuICAgICAgICAgICAgZXZlbnRJbmZvOiByZXNwb25zZUluZm8sXG4gICAgICAgICAgICBhbmNob3I6IHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IsXG4gICAgICAgICAgICBjb250ZXh0RWxlbWVudDogZWx0LFxuICAgICAgICAgICAgYWZ0ZXJTd2FwQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU3dhcDovaSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmluYWxFbHQgPSBlbHRcbiAgICAgICAgICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgICAgICAgICBmaW5hbEVsdCA9IGdldERvY3VtZW50KCkuYm9keVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXItQWZ0ZXItU3dhcCcsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYWZ0ZXJTZXR0bGVDYWxsYmFjazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtVHJpZ2dlci1BZnRlci1TZXR0bGU6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVNldHRsZScsIGZpbmFsRWx0KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1heWJlQ2FsbChzZXR0bGVSZXNvbHZlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnN3YXBFcnJvcicsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVqZWN0KVxuICAgICAgICAgIHRocm93IGVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc2hvdWxkVHJhbnNpdGlvbiA9IGh0bXguY29uZmlnLmdsb2JhbFZpZXdUcmFuc2l0aW9uc1xuICAgICAgaWYgKHN3YXBTcGVjLmhhc093blByb3BlcnR5KCd0cmFuc2l0aW9uJykpIHtcbiAgICAgICAgc2hvdWxkVHJhbnNpdGlvbiA9IHN3YXBTcGVjLnRyYW5zaXRpb25cbiAgICAgIH1cblxuICAgICAgaWYgKHNob3VsZFRyYW5zaXRpb24gJiZcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlVHJhbnNpdGlvbicsIHJlc3BvbnNlSW5mbykgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIFByb21pc2UgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3Qgc2V0dGxlUHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgICAgc2V0dGxlUmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgICAgc2V0dGxlUmVqZWN0ID0gX3JlamVjdFxuICAgICAgICB9KVxuICAgICAgICAvLyB3cmFwIHRoZSBvcmlnaW5hbCBkb1N3YXAoKSBpbiBhIGNhbGwgdG8gc3RhcnRWaWV3VHJhbnNpdGlvbigpXG4gICAgICAgIGNvbnN0IGlubmVyRG9Td2FwID0gZG9Td2FwXG4gICAgICAgIGRvU3dhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmUgZXhwZXJpbWVudGFsIGZlYXR1cmUgYXRtXG4gICAgICAgICAgZG9jdW1lbnQuc3RhcnRWaWV3VHJhbnNpdGlvbihmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlubmVyRG9Td2FwKClcbiAgICAgICAgICAgIHJldHVybiBzZXR0bGVQcm9taXNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3dhcFNwZWMuc3dhcERlbGF5ID4gMCkge1xuICAgICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGRvU3dhcCwgc3dhcFNwZWMuc3dhcERlbGF5KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9Td2FwKClcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6cmVzcG9uc2VFcnJvcicsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiAnUmVzcG9uc2UgU3RhdHVzIEVycm9yIENvZGUgJyArIHhoci5zdGF0dXMgKyAnIGZyb20gJyArIHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXF1ZXN0UGF0aCB9LCByZXNwb25zZUluZm8pKVxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEV4dGVuc2lvbnMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBIdG14RXh0ZW5zaW9uPn0gKi9cbiAgY29uc3QgZXh0ZW5zaW9ucyA9IHt9XG5cbiAgLyoqXG4gICAqIGV4dGVuc2lvbkJhc2UgZGVmaW5lcyB0aGUgZGVmYXVsdCBmdW5jdGlvbnMgZm9yIGFsbCBleHRlbnNpb25zLlxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGV4dGVuc2lvbkJhc2UoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXQ6IGZ1bmN0aW9uKGFwaSkgeyByZXR1cm4gbnVsbCB9LFxuICAgICAgZ2V0U2VsZWN0b3JzOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIG9uRXZlbnQ6IGZ1bmN0aW9uKG5hbWUsIGV2dCkgeyByZXR1cm4gdHJ1ZSB9LFxuICAgICAgdHJhbnNmb3JtUmVzcG9uc2U6IGZ1bmN0aW9uKHRleHQsIHhociwgZWx0KSB7IHJldHVybiB0ZXh0IH0sXG4gICAgICBpc0lubGluZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSkgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGhhbmRsZVN3YXA6IGZ1bmN0aW9uKHN3YXBTdHlsZSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykgeyByZXR1cm4gZmFsc2UgfSxcbiAgICAgIGVuY29kZVBhcmFtZXRlcnM6IGZ1bmN0aW9uKHhociwgcGFyYW1ldGVycywgZWx0KSB7IHJldHVybiBudWxsIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogZGVmaW5lRXh0ZW5zaW9uIGluaXRpYWxpemVzIHRoZSBleHRlbnNpb24gYW5kIGFkZHMgaXQgdG8gdGhlIGh0bXggcmVnaXN0cnlcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jZGVmaW5lRXh0ZW5zaW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIHRoZSBleHRlbnNpb24gbmFtZVxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb259IGV4dGVuc2lvbiB0aGUgZXh0ZW5zaW9uIGRlZmluaXRpb25cbiAgICovXG4gIGZ1bmN0aW9uIGRlZmluZUV4dGVuc2lvbihuYW1lLCBleHRlbnNpb24pIHtcbiAgICBpZiAoZXh0ZW5zaW9uLmluaXQpIHtcbiAgICAgIGV4dGVuc2lvbi5pbml0KGludGVybmFsQVBJKVxuICAgIH1cbiAgICBleHRlbnNpb25zW25hbWVdID0gbWVyZ2VPYmplY3RzKGV4dGVuc2lvbkJhc2UoKSwgZXh0ZW5zaW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIHJlbW92ZUV4dGVuc2lvbiByZW1vdmVzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3JlbW92ZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlRXh0ZW5zaW9uKG5hbWUpIHtcbiAgICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXVxuICB9XG5cbiAgLyoqXG4gICAqIGdldEV4dGVuc2lvbnMgc2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIHJldHVybiBhbGwgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFeHRlbnNpb25bXT19IGV4dGVuc2lvbnNUb1JldHVyblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdPX0gZXh0ZW5zaW9uc1RvSWdub3JlXG4gICAqIEByZXR1cm5zIHtIdG14RXh0ZW5zaW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKGVsdCwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpIHtcbiAgICBpZiAoZXh0ZW5zaW9uc1RvUmV0dXJuID09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuID0gW11cbiAgICB9XG4gICAgaWYgKGVsdCA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBleHRlbnNpb25zVG9SZXR1cm5cbiAgICB9XG4gICAgaWYgKGV4dGVuc2lvbnNUb0lnbm9yZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb0lnbm9yZSA9IFtdXG4gICAgfVxuICAgIGNvbnN0IGV4dGVuc2lvbnNGb3JFbGVtZW50ID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtZXh0JylcbiAgICBpZiAoZXh0ZW5zaW9uc0ZvckVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZXh0ZW5zaW9uc0ZvckVsZW1lbnQuc3BsaXQoJywnKSwgZnVuY3Rpb24oZXh0ZW5zaW9uTmFtZSkge1xuICAgICAgICBleHRlbnNpb25OYW1lID0gZXh0ZW5zaW9uTmFtZS5yZXBsYWNlKC8gL2csICcnKVxuICAgICAgICBpZiAoZXh0ZW5zaW9uTmFtZS5zbGljZSgwLCA3KSA9PSAnaWdub3JlOicpIHtcbiAgICAgICAgICBleHRlbnNpb25zVG9JZ25vcmUucHVzaChleHRlbnNpb25OYW1lLnNsaWNlKDcpKVxuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUuaW5kZXhPZihleHRlbnNpb25OYW1lKSA8IDApIHtcbiAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zW2V4dGVuc2lvbk5hbWVdXG4gICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiBleHRlbnNpb25zVG9SZXR1cm4uaW5kZXhPZihleHRlbnNpb24pIDwgMCkge1xuICAgICAgICAgICAgZXh0ZW5zaW9uc1RvUmV0dXJuLnB1c2goZXh0ZW5zaW9uKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGdldEV4dGVuc2lvbnMoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgZXh0ZW5zaW9uc1RvUmV0dXJuLCBleHRlbnNpb25zVG9JZ25vcmUpXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsaXphdGlvblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICB2YXIgaXNSZWFkeSA9IGZhbHNlXG4gIGdldERvY3VtZW50KCkuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGZ1bmN0aW9uKCkge1xuICAgIGlzUmVhZHkgPSB0cnVlXG4gIH0pXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgYSBmdW5jdGlvbiBub3cgaWYgRE9NQ29udGVudExvYWRlZCBoYXMgZmlyZWQsIG90aGVyd2lzZSBsaXN0ZW4gZm9yIGl0LlxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHVzZXMgaXNSZWFkeSBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0byBhc2sgdGhlIGJyb3dzZXIgd2hldGhlclxuICAgKiB0aGUgRE9NQ29udGVudExvYWRlZCBldmVudCBoYXMgYWxyZWFkeSBiZWVuIGZpcmVkOyB0aGVyZSdzIGEgZ2FwIGJldHdlZW4gRE9NQ29udGVudExvYWRlZFxuICAgKiBmaXJpbmcgYW5kIHJlYWR5c3RhdGU9Y29tcGxldGUuXG4gICAqL1xuICBmdW5jdGlvbiByZWFkeShmbikge1xuICAgIC8vIENoZWNraW5nIHJlYWR5U3RhdGUgaGVyZSBpcyBhIGZhaWxzYWZlIGluIGNhc2UgdGhlIGh0bXggc2NyaXB0IHRhZyBlbnRlcmVkIHRoZSBET00gYnlcbiAgICAvLyBzb21lIG1lYW5zIG90aGVyIHRoYW4gdGhlIGluaXRpYWwgcGFnZSBsb2FkLlxuICAgIGlmIChpc1JlYWR5IHx8IGdldERvY3VtZW50KCkucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgZm4oKVxuICAgIH0gZWxzZSB7XG4gICAgICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbilcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpbnNlcnRJbmRpY2F0b3JTdHlsZXMoKSB7XG4gICAgaWYgKGh0bXguY29uZmlnLmluY2x1ZGVJbmRpY2F0b3JTdHlsZXMgIT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBub25jZUF0dHJpYnV0ZSA9IGh0bXguY29uZmlnLmlubGluZVN0eWxlTm9uY2UgPyBgIG5vbmNlPVwiJHtodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlfVwiYCA6ICcnXG4gICAgICBnZXREb2N1bWVudCgpLmhlYWQuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLFxuICAgICAgICAnPHN0eWxlJyArIG5vbmNlQXR0cmlidXRlICsgJz5cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eTowfVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcgLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICAuJyArIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcyArICcuJyArIGh0bXguY29uZmlnLmluZGljYXRvckNsYXNzICsgJ3tvcGFjaXR5OjE7IHRyYW5zaXRpb246IG9wYWNpdHkgMjAwbXMgZWFzZS1pbjt9XFxcbiAgICAgIDwvc3R5bGU+JylcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZXRhQ29uZmlnKCkge1xuICAgIC8qKiBAdHlwZSBIVE1MTWV0YUVsZW1lbnQgKi9cbiAgICBjb25zdCBlbGVtZW50ID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJodG14LWNvbmZpZ1wiXScpXG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBwYXJzZUpTT04oZWxlbWVudC5jb250ZW50KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlTWV0YUNvbmZpZygpIHtcbiAgICBjb25zdCBtZXRhQ29uZmlnID0gZ2V0TWV0YUNvbmZpZygpXG4gICAgaWYgKG1ldGFDb25maWcpIHtcbiAgICAgIGh0bXguY29uZmlnID0gbWVyZ2VPYmplY3RzKGh0bXguY29uZmlnLCBtZXRhQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIC8vIGluaXRpYWxpemUgdGhlIGRvY3VtZW50XG4gIHJlYWR5KGZ1bmN0aW9uKCkge1xuICAgIG1lcmdlTWV0YUNvbmZpZygpXG4gICAgaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKClcbiAgICBsZXQgYm9keSA9IGdldERvY3VtZW50KCkuYm9keVxuICAgIHByb2Nlc3NOb2RlKGJvZHkpXG4gICAgY29uc3QgcmVzdG9yZWRFbHRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgXCJbaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXSxbZGF0YS1oeC10cmlnZ2VyPSdyZXN0b3JlZCddXCJcbiAgICApXG4gICAgYm9keS5hZGRFdmVudExpc3RlbmVyKCdodG14OmFib3J0JywgZnVuY3Rpb24oZXZ0KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEodGFyZ2V0KVxuICAgICAgaWYgKGludGVybmFsRGF0YSAmJiBpbnRlcm5hbERhdGEueGhyKSB7XG4gICAgICAgIGludGVybmFsRGF0YS54aHIuYWJvcnQoKVxuICAgICAgfVxuICAgIH0pXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICBjb25zdCBvcmlnaW5hbFBvcHN0YXRlID0gd2luZG93Lm9ucG9wc3RhdGUgPyB3aW5kb3cub25wb3BzdGF0ZS5iaW5kKHdpbmRvdykgOiBudWxsXG4gICAgLyoqIEB0eXBlIHsoZXY6IFBvcFN0YXRlRXZlbnQpID0+IGFueX0gKi9cbiAgICB3aW5kb3cub25wb3BzdGF0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBpZiAoZXZlbnQuc3RhdGUgJiYgZXZlbnQuc3RhdGUuaHRteCkge1xuICAgICAgICByZXN0b3JlSGlzdG9yeSgpXG4gICAgICAgIGZvckVhY2gocmVzdG9yZWRFbHRzLCBmdW5jdGlvbihlbHQpIHtcbiAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpyZXN0b3JlZCcsIHtcbiAgICAgICAgICAgIGRvY3VtZW50OiBnZXREb2N1bWVudCgpLFxuICAgICAgICAgICAgdHJpZ2dlckV2ZW50XG4gICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChvcmlnaW5hbFBvcHN0YXRlKSB7XG4gICAgICAgICAgb3JpZ2luYWxQb3BzdGF0ZShldmVudClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgdHJpZ2dlckV2ZW50KGJvZHksICdodG14OmxvYWQnLCB7fSkgLy8gZ2l2ZSByZWFkeSBoYW5kbGVycyBhIGNoYW5jZSB0byBsb2FkIHVwIGJlZm9yZSBmaXJpbmcgdGhpcyBldmVudFxuICAgICAgYm9keSA9IG51bGwgLy8ga2lsbCByZWZlcmVuY2UgZm9yIGdjXG4gICAgfSwgMClcbiAgfSlcblxuICByZXR1cm4gaHRteFxufSkoKVxuXG4vKiogQHR5cGVkZWYgeydnZXQnfCdoZWFkJ3wncG9zdCd8J3B1dCd8J2RlbGV0ZSd8J2Nvbm5lY3QnfCdvcHRpb25zJ3wndHJhY2UnfCdwYXRjaCd9IEh0dHBWZXJiICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3dhcE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RPT0JdXG4gKiBAcHJvcGVydHkgeyp9IFtldmVudEluZm9dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FuY2hvcl1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW2NvbnRleHRFbGVtZW50XVxuICogQHByb3BlcnR5IHtzd2FwQ2FsbGJhY2t9IFthZnRlclN3YXBDYWxsYmFja11cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTZXR0bGVDYWxsYmFja11cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBzd2FwQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnaW5uZXJIVE1MJyB8ICdvdXRlckhUTUwnIHwgJ2JlZm9yZWJlZ2luJyB8ICdhZnRlcmJlZ2luJyB8ICdiZWZvcmVlbmQnIHwgJ2FmdGVyZW5kJyB8ICdkZWxldGUnIHwgJ25vbmUnIHwgc3RyaW5nfSBIdG14U3dhcFN0eWxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBIdG14U3dhcFNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gc3dhcFN0eWxlXG4gKiBAcHJvcGVydHkge251bWJlcn0gc3dhcERlbGF5XG4gKiBAcHJvcGVydHkge251bWJlcn0gc2V0dGxlRGVsYXlcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3RyYW5zaXRpb25dXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaGVhZF1cbiAqIEBwcm9wZXJ0eSB7J3RvcCcgfCAnYm90dG9tJ30gW3Njcm9sbF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2Nyb2xsVGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzaG93VGFyZ2V0XVxuICogQHByb3BlcnR5IHtib29sZWFufSBbZm9jdXNTY3JvbGxdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCh0aGlzOk5vZGUsIGV2dDpFdmVudCkgPT4gYm9vbGVhbikgJiB7c291cmNlOiBzdHJpbmd9fSBDb25kaXRpb25hbEZ1bmN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbF1cbiAqIEBwcm9wZXJ0eSB7Q29uZGl0aW9uYWxGdW5jdGlvbn0gW2V2ZW50RmlsdGVyXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hhbmdlZF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29uY2VdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zdW1lXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWxheV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZnJvbV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aHJvdHRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcXVldWVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jvb3RdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RocmVzaG9sZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7ZWx0OiBFbGVtZW50LCBtZXNzYWdlOiBzdHJpbmcsIHZhbGlkaXR5OiBWYWxpZGl0eVN0YXRlfX0gSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvblxuICogQHByb3BlcnR5IHsndHJ1ZSd9IEhYLVJlcXVlc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRyaWdnZXItTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gSFgtVGFyZ2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gSFgtQ3VycmVudC1VUkxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbSFgtUHJvbXB0XVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1Cb29zdGVkXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtDb250ZW50LVR5cGVdXG4gKiBAcHJvcGVydHkgeyd0cnVlJ30gW0hYLUhpc3RvcnktUmVzdG9yZS1SZXF1ZXN0XVxuICovXG5cbi8qKiBAdHlwZWRlZiBIdG14QWpheEhlbHBlckNvbnRleHRcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudHxzdHJpbmd9IFtzb3VyY2VdXG4gKiBAcHJvcGVydHkge0V2ZW50fSBbZXZlbnRdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcF1cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fEZvcm1EYXRhfSBbdmFsdWVzXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZWxlY3RdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtib29sZWFufSBib29zdGVkXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHVzZVVybFBhcmFtc1xuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gZm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBwYXJhbWV0ZXJzIGZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0Zvcm1EYXRhfSB1bmZpbHRlcmVkRm9ybURhdGFcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB1bmZpbHRlcmVkUGFyYW1ldGVycyB1bmZpbHRlcmVkRm9ybURhdGEgcHJveHlcbiAqIEBwcm9wZXJ0eSB7SHRteEhlYWRlclNwZWNpZmljYXRpb259IGhlYWRlcnNcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0dHBWZXJifSB2ZXJiXG4gKiBAcHJvcGVydHkge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICogQHByb3BlcnR5IHtib29sZWFufSB3aXRoQ3JlZGVudGlhbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aFxuICogQHByb3BlcnR5IHtFdmVudH0gdHJpZ2dlcmluZ0V2ZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14UmVzcG9uc2VJbmZvXG4gKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSB4aHJcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gdGFyZ2V0XG4gKiBAcHJvcGVydHkge0h0bXhSZXF1ZXN0Q29uZmlnfSByZXF1ZXN0Q29uZmlnXG4gKiBAcHJvcGVydHkge0h0bXhBamF4RXRjfSBldGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNlbGVjdFxuICogQHByb3BlcnR5IHt7cmVxdWVzdFBhdGg6IHN0cmluZywgZmluYWxSZXF1ZXN0UGF0aDogc3RyaW5nLCByZXNwb25zZVBhdGg6IHN0cmluZ3xudWxsLCBhbmNob3I6IHN0cmluZ319IHBhdGhJbmZvXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWlsZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzdWNjZXNzZnVsXVxuICogQHByb3BlcnR5IHtib29sZWFufSBba2VlcEluZGljYXRvcnNdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14QWpheEV0Y1xuICogQHByb3BlcnR5IHtib29sZWFufSBbcmV0dXJuUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7SHRteEFqYXhIYW5kbGVyfSBbaGFuZGxlcl1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtFbGVtZW50fSBbdGFyZ2V0T3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsc3RyaW5nPn0gW2hlYWRlcnNdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NyZWRlbnRpYWxzXVxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29kZV1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc3dhcFxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXJyb3JdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpZ25vcmVUaXRsZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0YXJnZXRdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N3YXBPdmVycmlkZV1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXZlbnRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SHRteFJlc3BvbnNlSW5mbyAmIHtzaG91bGRTd2FwOiBib29sZWFuLCBzZXJ2ZXJSZXNwb25zZTogYW55LCBpc0Vycm9yOiBib29sZWFuLCBpZ25vcmVUaXRsZTogYm9vbGVhbiwgc2VsZWN0T3ZlcnJpZGU6c3RyaW5nfX0gSHRteEJlZm9yZVN3YXBEZXRhaWxzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSHRteEFqYXhIYW5kbGVyXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdG14UmVzcG9uc2VJbmZvfSByZXNwb25zZUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKCkgPT4gdm9pZCl9IEh0bXhTZXR0bGVUYXNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14U2V0dGxlSW5mb1xuICogQHByb3BlcnR5IHtIdG14U2V0dGxlVGFza1tdfSB0YXNrc1xuICogQHByb3BlcnR5IHtFbGVtZW50W119IGVsdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGl0bGVdXG4gKi9cblxuLyoqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14LWV4dGVuc2lvbnMvYmxvYi9tYWluL1JFQURNRS5tZFxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEV4dGVuc2lvblxuICogQHByb3BlcnR5IHsoYXBpOiBhbnkpID0+IHZvaWR9IGluaXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgZXZlbnQ6IEV2ZW50fEN1c3RvbUV2ZW50KSA9PiBib29sZWFufSBvbkV2ZW50XG4gKiBAcHJvcGVydHkgeyh0ZXh0OiBzdHJpbmcsIHhocjogWE1MSHR0cFJlcXVlc3QsIGVsdDogRWxlbWVudCkgPT4gc3RyaW5nfSB0cmFuc2Zvcm1SZXNwb25zZVxuICogQHByb3BlcnR5IHsoc3dhcFN0eWxlOiBIdG14U3dhcFN0eWxlKSA9PiBib29sZWFufSBpc0lubGluZVN3YXBcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSwgdGFyZ2V0OiBOb2RlLCBmcmFnbWVudDogTm9kZSwgc2V0dGxlSW5mbzogSHRteFNldHRsZUluZm8pID0+IGJvb2xlYW58Tm9kZVtdfSBoYW5kbGVTd2FwXG4gKiBAcHJvcGVydHkgeyh4aHI6IFhNTEh0dHBSZXF1ZXN0LCBwYXJhbWV0ZXJzOiBGb3JtRGF0YSwgZWx0OiBOb2RlKSA9PiAqfHN0cmluZ3xudWxsfSBlbmNvZGVQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfG51bGx9IGdldFNlbGVjdG9yc1xuICovXG5leHBvcnQgZGVmYXVsdCBodG14XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuZnVuY3Rpb24gZGVwZW5kc09uKHBhdGhTcGVjOiBhbnksIHVybDogc3RyaW5nKSB7XG4gIGlmIChwYXRoU3BlYyA9PT0gXCJpZ25vcmVcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBkZXBlbmRlbmN5UGF0aCA9IHBhdGhTcGVjLnNwbGl0KFwiL1wiKTtcbiAgY29uc3QgdXJsUGF0aCA9IHVybC5zcGxpdChcIi9cIik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdXJsUGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGRlcGVuZGVuY3lFbGVtZW50ID0gZGVwZW5kZW5jeVBhdGguc2hpZnQoKTtcbiAgICBjb25zdCBwYXRoRWxlbWVudCA9IHVybFBhdGhbaV07XG4gICAgaWYgKGRlcGVuZGVuY3lFbGVtZW50ICE9PSBwYXRoRWxlbWVudCAmJiBkZXBlbmRlbmN5RWxlbWVudCAhPT0gXCIqXCIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAoZGVwZW5kZW5jeVBhdGgubGVuZ3RoID09PSAxICYmIGRlcGVuZGVuY3lQYXRoWzBdID09PSBcIlwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGNvbnN0IGVsdHNXaXRoRGVwcyA9IGh0bXguZmluZEFsbChcIltwYXRoLWRlcHNdXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdHNXaXRoRGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGVsdCA9IGVsdHNXaXRoRGVwc1tpXTtcbiAgICBpZiAoZGVwZW5kc09uKGVsdC5nZXRBdHRyaWJ1dGUoXCJwYXRoLWRlcHNcIiksIHBhdGgpKSB7XG4gICAgICBodG14LnRyaWdnZXIoZWx0LCBcInBhdGgtZGVwc1wiLCBudWxsKTtcbiAgICB9XG4gIH1cbn1cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJwYXRoLWRlcHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDpiZWZvcmVPbkxvYWRcIikge1xuICAgICAgY29uc3QgY29uZmlnID0gZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnO1xuICAgICAgLy8gbXV0YXRpbmcgY2FsbFxuICAgICAgaWYgKFxuICAgICAgICBjb25maWcgJiZcbiAgICAgICAgY29uZmlnLnZlcmIgIT09IFwiZ2V0XCIgJiZcbiAgICAgICAgZXZ0LnRhcmdldCAhPSBudWxsICYmXG4gICAgICAgIGV2dC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmXG4gICAgICAgIGV2dC50YXJnZXQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpICE9PSBcImlnbm9yZVwiXG4gICAgICApIHtcbiAgICAgICAgcmVmcmVzaFBhdGgoY29uZmlnLnBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGtlYmFiRXZlbnROYW1lKHN0cjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG59XG5cbmNvbnN0IGlnbm9yZWRFdmVudHMgPSBbJ2h0bXg6YmVmb3JlUHJvY2Vzc05vZGUnLCAnaHRteDphZnRlclByb2Nlc3NOb2RlJywgJ2h0bXg6Y29uZmlnUmVxdWVzdCcsICdodG14OmNvbmZpZ1Jlc3BvbnNlJywgJ2h0bXg6cmVzcG9uc2VFcnJvciddO1xuXG5mdW5jdGlvbiBtYWtlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGRldGFpbDogYW55KSB7XG4gICAgbGV0IGV2dFxuICAgIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgdHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBUT0RPOiBgY29tcG9zZWQ6IHRydWVgIGhlcmUgaXMgYSBoYWNrIHRvIG1ha2UgZ2xvYmFsIGV2ZW50IGhhbmRsZXJzIHdvcmsgd2l0aCBldmVudHMgaW4gc2hhZG93IERPTVxuICAgICAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGJ1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudE5hbWUsIHRydWUsIHRydWUsIGRldGFpbClcbiAgICB9XG4gICAgcmV0dXJuIGV2dFxufVxuXG5mdW5jdGlvbiB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0OiBIVE1MRWxlbWVudCwgbmFtZTogc3RyaW5nLCBldmVudDogQ3VzdG9tRXZlbnQsIHRyaWdnZXJlZDogU2V0PEhUTUxFbGVtZW50Pikge1xuICAgIGlmKGlnbm9yZWRFdmVudHMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmNoaWxkcmVuKSB7XG4gICAgICAgIEFycmF5LmZyb20odGFyZ2V0LmNoaWxkcmVuKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrZWhhYiA9IGtlYmFiRXZlbnROYW1lKG5hbWUpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnROYW1lID0ga2VoYWIucmVwbGFjZShcImh0bXg6XCIsIFwiaHgtb246OlwiKVxuICAgICAgICAgICAgaWYgKCF0cmlnZ2VyZWQuaGFzKGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYoZS5oYXNBdHRyaWJ1dGUoZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0V2ZW50ID0gbWFrZUV2ZW50KGV2ZW50TmFtZS5yZXBsYWNlKFwiaHgtb246OlwiLCBcImh0bXg6XCIpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZXZlbnQuZGV0YWlsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdFdmVudC5kZXRhaWwubWV0YSA9ICd0cmlnZ2VyLWNoaWxkcmVuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5kaXNwYXRjaEV2ZW50KG5ld0V2ZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmVkLmFkZChlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSwgMSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckNoaWxkcmVuKGUgYXMgSFRNTEVsZW1lbnQsIG5hbWUsIGV2ZW50LCB0cmlnZ2VyZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5cbi8vIEB0cy1pZ25vcmVcbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwidHJpZ2dlci1jaGlsZHJlblwiLCB7XG4gICAgb25FdmVudDogKG5hbWUsIGV2dDogRXZlbnQgfCBDdXN0b21FdmVudCkgPT4ge1xuICAgICAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZihldnQuZGV0YWlsLm1ldGEgPT09ICd0cmlnZ2VyLWNoaWxkcmVuJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRyaWdnZXJlZCA9IG5ldyBTZXQ8SFRNTEVsZW1lbnQ+KCk7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfHwgZXZ0LmRldGFpbC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIHRyaWdnZXJDaGlsZHJlbih0YXJnZXQsIG5hbWUsIGV2dCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwiZGVidWdcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICBpZiAoY29uc29sZS5kZWJ1Zykge1xuICAgICAgY29uc29sZS5kZWJ1ZyhuYW1lLCBldnQpO1xuICAgIH0gZWxzZSBpZiAoY29uc29sZSkge1xuICAgICAgY29uc29sZS5sb2coXCJERUJVRzpcIiwgbmFtZSwgZXZ0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gbm9vcFxuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5jb25zdCBjb25maWc6IGFueSA9IGh0bXguY29uZmlnO1xuXG4vKiogQHR5cGUge2ltcG9ydChcIi4uL2h0bXhcIikuSHRteEludGVybmFsQXBpfSAqL1xubGV0IGFwaTogYW55O1xuXG5jb25zdCBhdHRyUHJlZml4ID0gXCJoeC10YXJnZXQtXCI7XG5cbi8vIElFMTEgZG9lc24ndCBzdXBwb3J0IHN0cmluZy5zdGFydHNXaXRoXG5mdW5jdGlvbiBzdGFydHNXaXRoKHN0cjogc3RyaW5nLCBwcmVmaXg6IHN0cmluZykge1xuICByZXR1cm4gc3RyLnN1YnN0cmluZygwLCBwcmVmaXgubGVuZ3RoKSA9PT0gcHJlZml4O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHJlc3BDb2RlTnVtYmVyXG4gKiBAcmV0dXJucyB7SFRNTEVsZW1lbnQgfCBudWxsfVxuICovXG5mdW5jdGlvbiBnZXRSZXNwQ29kZVRhcmdldChlbHQ6IEVsZW1lbnQsIHJlc3BDb2RlTnVtYmVyOiBudW1iZXIpIHtcbiAgaWYgKCFlbHQgfHwgIXJlc3BDb2RlTnVtYmVyKSByZXR1cm4gbnVsbDtcblxuICBjb25zdCByZXNwQ29kZSA9IHJlc3BDb2RlTnVtYmVyLnRvU3RyaW5nKCk7XG5cbiAgLy8gJyonIGlzIHRoZSBvcmlnaW5hbCBzeW50YXgsIGFzIHRoZSBvYnZpb3VzIGNoYXJhY3RlciBmb3IgYSB3aWxkY2FyZC5cbiAgLy8gVGhlICd4JyBhbHRlcm5hdGl2ZSB3YXMgYWRkZWQgZm9yIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIEhUTUxcbiAgLy8gdGVtcGxhdGluZyBlbmdpbmVzLCBkdWUgdG8gYW1iaWd1aXR5IGFyb3VuZCB3aGljaCBjaGFyYWN0ZXJzIGFyZVxuICAvLyBzdXBwb3J0ZWQgaW4gSFRNTCBhdHRyaWJ1dGVzLlxuICAvL1xuICAvLyBTdGFydCB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHBvc3NpYmxlIGF0dHJpYnV0ZSBhbmQgZ2VuZXJhbGl6ZSBmcm9tXG4gIC8vIHRoZXJlLlxuICBjb25zdCBhdHRyUG9zc2liaWxpdGllcyA9IFtcbiAgICByZXNwQ29kZSxcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAyKSArIFwieFwiLFxuXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqXCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCJ4XCIsXG4gICAgcmVzcENvZGUuc3Vic3RyKDAsIDEpICsgXCIqKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieHhcIixcblxuICAgIFwiKlwiLFxuICAgIFwieFwiLFxuICAgIFwiKioqXCIsXG4gICAgXCJ4eHhcIixcbiAgXTtcbiAgaWYgKHN0YXJ0c1dpdGgocmVzcENvZGUsIFwiNFwiKSB8fCBzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjVcIikpIHtcbiAgICBhdHRyUG9zc2liaWxpdGllcy5wdXNoKFwiZXJyb3JcIik7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJQb3NzaWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgYXR0ciA9IGF0dHJQcmVmaXggKyBhdHRyUG9zc2liaWxpdGllc1tpXTtcbiAgICBjb25zdCBhdHRyVmFsdWUgPSBhcGkuZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cik7XG4gICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gXCJ0aGlzXCIpIHtcbiAgICAgICAgcmV0dXJuIGFwaS5maW5kVGhpc0VsZW1lbnQoZWx0LCBhdHRyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhcGkucXVlcnlTZWxlY3RvckV4dChlbHQsIGF0dHJWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBAcGFyYW0ge0V2ZW50fSBldnQgKi9cbmZ1bmN0aW9uIGhhbmRsZUVycm9yRmxhZyhldnQ6IEN1c3RvbUV2ZW50KSB7XG4gIGlmIChldnQuZGV0YWlsLmlzRXJyb3IpIHtcbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IpIHtcbiAgICAgIGV2dC5kZXRhaWwuaXNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IpIHtcbiAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSB0cnVlO1xuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicmVzcG9uc2UtdGFyZ2V0c1wiLCB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgaW5pdDogKGFwaVJlZikgPT4ge1xuICAgIGFwaSA9IGFwaVJlZjtcblxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRVbnNldHNFcnJvciA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRTZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5hbWUgPT09IFwiaHRteDpiZWZvcmVTd2FwXCIgJiZcbiAgICAgIGV2dC5kZXRhaWwueGhyICYmXG4gICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMgIT09IDIwMFxuICAgICkge1xuICAgICAgaWYgKGV2dC5kZXRhaWwudGFyZ2V0KSB7XG4gICAgICAgIGlmIChjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzRXhpc3RpbmcpIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBjb25maWcucmVzcG9uc2VUYXJnZXRQcmVmZXJzUmV0YXJnZXRIZWFkZXIgJiZcbiAgICAgICAgICBldnQuZGV0YWlsLnhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKS5tYXRjaCgvSFgtUmV0YXJnZXQ6L2kpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2dC5kZXRhaWwuc2hvdWxkU3dhcCA9IHRydWU7XG4gICAgICAgICAgaGFuZGxlRXJyb3JGbGFnKGV2dCk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghZXZ0LmRldGFpbC5yZXF1ZXN0Q29uZmlnKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0UmVzcENvZGVUYXJnZXQoXG4gICAgICAgIGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZy5lbHQsXG4gICAgICAgIGV2dC5kZXRhaWwueGhyLnN0YXR1cyxcbiAgICAgICk7XG4gICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICBldnQuZGV0YWlsLnRhcmdldCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSxcbn0pO1xuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwibXV0YXRpb24tZXJyb3JcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIG9uRXZlbnQ6IChuYW1lLCBldnQpID0+IHtcbiAgICBpZiAoIShldnQgaW5zdGFuY2VvZiBDdXN0b21FdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5hbWUgPT09IFwiaHRteDphZnRlclJlcXVlc3RcIikge1xuICAgICAgaWYgKCFldnQuZGV0YWlsIHx8ICFldnQuZGV0YWlsLnhocikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0dXMgPSBldnQuZGV0YWlsLnhoci5zdGF0dXM7XG4gICAgICBpZiAoc3RhdHVzID49IDQwMCkge1xuICAgICAgICBodG14LmZpbmRBbGwoXCJbaHgtb25cXFxcOlxcXFw6bXV0YXRpb24tZXJyb3JdXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgXCJodG14Om11dGF0aW9uLWVycm9yXCIsIHsgc3RhdHVzIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5sZXQgbGFzdFZlcnNpb24gPSBcIlwiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImxpdmVyZWxvYWRcIiwge1xuICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBsZXQgZW5hYmxlZCA9IGZhbHNlXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBBcnJheS5mcm9tKGh0bXguZmluZEFsbChcIltoeC1leHRdXCIpKSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LWV4dFwiKTtcbiAgICAgICAgICAgIGlmKHZhbHVlPy5zcGxpdChcIiBcIikuaW5jbHVkZXMoXCJsaXZlcmVsb2FkXCIpKSB7XG4gICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWVcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFlbmFibGVkKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCdsaXZlcmVsb2FkIGV4dGVuc2lvbiBpbml0aWFsaXplZC4nKTtcbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEV2ZW50U291cmNlIG9iamVjdCBhbmQgcG9pbnQgaXQgdG8geW91ciBTU0UgZW5kcG9pbnRcbiAgICAgICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9kZXYvbGl2ZXJlbG9hZCcpO1xuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICAgICAgICBldmVudFNvdXJjZS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgICAgIC8vIExvZyB0aGUgbWVzc2FnZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihsYXN0VmVyc2lvbiAhPT0gbWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIGxhc3RWZXJzaW9uID0gbWVzc2FnZTtcbiAgICAgICAgICAgICAgICByZWxvYWQoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzIChlLmcuLCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZClcbiAgICAgICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFdmVudFNvdXJjZSBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH07XG5cbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG5cbiAgICB9LFxufSk7XG5cbmZ1bmN0aW9uIHJlbG9hZCgpIHtcbiAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbn1cbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5jb25zdCBldmFsRnVuY1JlZ2V4ID0vX19ldmFsX1tBLVphLXowLTldK1xcKFthLXpdK1xcKS9nbVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImh0bWdvXCIsIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuICAgICAgIGlmKG5hbWUgPT09IFwiaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHMoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vKipcbiAqIEJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IG9ubG9hZCBmb3IgYWxsIGVsZW1lbnRzLCBzbyB3ZSBuZWVkIHRvIG1hbnVhbGx5IHRyaWdnZXIgaXRcbiAqIHRoaXMgaXMgdXNlZnVsIGZvciBsb2NhbGl0eSBvZiBiZWhhdmlvclxuICovXG53aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGlnbm9yZWQgPSBbJ1NDUklQVCcsICdMSU5LJywgJ1NUWUxFJywgJ01FVEEnLCAnQkFTRScsICdUSVRMRScsICdIRUFEJywgJ0hUTUwnLCAnQk9EWSddO1xuICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW29ubG9hZF1gKSkpIHtcbiAgICBpZihlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBpZihpZ25vcmVkLmluY2x1ZGVzKGVsZW1lbnQudGFnTmFtZSkpIHtcbiAgICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBlbGVtZW50Lm9ubG9hZCEobmV3IEV2ZW50KFwibG9hZFwiKSk7XG4gICAgfVxuICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbndpbmRvdy5odG14ID0gaHRteDtcblxuZnVuY3Rpb24gd2F0Y2hVcmwoY2FsbGJhY2s6IChvbGRVcmw6IHN0cmluZywgbmV3VXJsOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgbGV0IGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZiAhPT0gbGFzdFVybCkge1xuICAgICAgY2FsbGJhY2sobGFzdFVybCwgd2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgbGFzdFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cbiAgfSwgMTAwKTtcbn1cblxud2F0Y2hVcmwoKF8sIG5ld1VybCkgPT4ge1xuICBvblVybENoYW5nZShuZXdVcmwpO1xufSk7XG5cbmZ1bmN0aW9uIG9uVXJsQ2hhbmdlKG5ld1VybDogc3RyaW5nKSB7XG4gIGxldCB1cmwgPSBuZXcgVVJMKG5ld1VybCk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC10cmlnZ2VyXVwiKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgY29uc3QgdHJpZ2dlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImh4LXRyaWdnZXJcIik7XG4gICAgaWYgKCF0cmlnZ2Vycykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzcGxpdCA9IHRyaWdnZXJzLnNwbGl0KFwiLCBcIik7XG4gICAgaWYgKHNwbGl0LmZpbmQoKHMpID0+IHMgPT09IFwidXJsXCIpKSB7XG4gICAgICBodG14LnN3YXAoZWxlbWVudCwgXCJ1cmxcIiwge1xuICAgICAgICBzd2FwU3R5bGU6IFwib3V0ZXJIVE1MXCIsXG4gICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgc2V0dGxlRGVsYXk6IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVzXSBvZiB1cmwuc2VhcmNoUGFyYW1zKSB7XG4gICAgICAgIGxldCBldmVudE5hbWUgPSBcInFzOlwiICsga2V5O1xuICAgICAgICBpZiAodHJpZ2dlcnMuaW5jbHVkZXMoZXZlbnROYW1lKSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwidHJpZ2dlcmluZ1wiLCBldmVudE5hbWUpO1xuICAgICAgICAgIGh0bXgudHJpZ2dlcihlbGVtZW50LCBldmVudE5hbWUsIG51bGwpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2h4LW1hdGNoLXFwXVwiKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGxldCBoYXNNYXRjaCA9IGZhbHNlO1xuICAgIGZvciAobGV0IG5hbWUgb2YgZWwuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIpKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IG5hbWUucmVwbGFjZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIsIFwiXCIpO1xuICAgICAgICBsZXQgdmFsdWUgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChtYXRjaCk7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgIGh0bXguc3dhcChlbCwgZWwuZ2V0QXR0cmlidXRlKG5hbWUpID8/IFwiXCIsIHtcbiAgICAgICAgICAgIHN3YXBTdHlsZTogXCJpbm5lckhUTUxcIixcbiAgICAgICAgICAgIHN3YXBEZWxheTogMCxcbiAgICAgICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGhhc01hdGNoID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICBsZXQgZGVmYXVsdEtleSA9IGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLWRlZmF1bHRcIik7XG4gICAgICBpZiAoZGVmYXVsdEtleSkge1xuICAgICAgICBodG14LnN3YXAoXG4gICAgICAgICAgZWwsXG4gICAgICAgICAgZWwuZ2V0QXR0cmlidXRlKFwiaHgtbWF0Y2gtcXAtbWFwcGluZzpcIiArIGRlZmF1bHRLZXkpID8/IFwiXCIsXG4gICAgICAgICAgeyBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsIHN3YXBEZWxheTogMCwgc2V0dGxlRGVsYXk6IDAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuIl19 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwiaW52b2tlT25Mb2FkIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEs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WCxDQUFBQSxDQUFBQSxDQUFXLEdBQ1gsS0FDRixDQUNGLENBRUYsR0FBSSxDQUFDQSxFQUFVLENBQ2IsSUFBSUMsRUFBYXZWLENBQUcsQ0FBQSxZQUFBLENBQWEscUJBQXFCLENBQ2xEdVYsQ0FBQUEsQ0FBQUEsRUFDRjNDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCdVYsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6bG9hZFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICBpbnZva2VPbkxvYWQoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuLyoqXG4gKiBCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBvbmxvYWQgZm9yIGFsbCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGl0XG4gKiB0aGlzIGlzIHVzZWZ1bCBmb3IgbG9jYWxpdHkgb2YgYmVoYXZpb3JcbiAqL1xuZnVuY3Rpb24gaW52b2tlT25Mb2FkKGVsZW1lbnQgOiBFbGVtZW50KSB7XG4gICAgaWYoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaWdub3JlZCA9IFsnU0NSSVBUJywgJ0xJTksnLCAnU1RZTEUnLCAnTUVUQScsICdCQVNFJywgJ1RJVExFJywgJ0hFQUQnLCAnSFRNTCcsICdCT0RZJ107XG4gICAgaWYoIWlnbm9yZWQuaW5jbHVkZXMoZWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICBpZihlbGVtZW50Lmhhc0F0dHJpYnV0ZShcIm9ubG9hZFwiKSkge1xuICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQhKG5ldyBFdmVudChcImxvYWRcIikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGl0cyBjaGlsZHJlblxuICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ubG9hZF0nKS5mb3JFYWNoKGludm9rZU9uTG9hZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vLyBAdHMtaWdub3JlXG53aW5kb3cuaHRteCA9IGh0bXg7XG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMCk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 308da9bb..29cb7091 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -8,22 +8,6 @@ import "./htmxextensions/livereload" import "./htmxextensions/htmgo"; import "./htmxextensions/sse" -/** - * Browser doesn't support onload for all elements, so we need to manually trigger it - * this is useful for locality of behavior - */ -window.onload = function() { - const ignored = ['SCRIPT', 'LINK', 'STYLE', 'META', 'BASE', 'TITLE', 'HEAD', 'HTML', 'BODY']; - for (let element of Array.from(document.querySelectorAll(`[onload]`))) { - if(element != null && element instanceof HTMLElement) { - if(ignored.includes(element.tagName)) { - continue - } - element.onload!(new Event("load")); - } - } -} - // @ts-ignore window.htmx = htmx; diff --git a/framework/assets/js/htmxextensions/htmgo.ts b/framework/assets/js/htmxextensions/htmgo.ts index 6b0ae7ee..a711734d 100644 --- a/framework/assets/js/htmxextensions/htmgo.ts +++ b/framework/assets/js/htmxextensions/htmgo.ts @@ -8,9 +8,30 @@ htmx.defineExtension("htmgo", { if(name === "htmx:beforeCleanupElement" && evt.target) { removeAssociatedScripts(evt.target as HTMLElement); } + if(name === "htmx:load" && evt.target) { + invokeOnLoad(evt.target as HTMLElement); + } }, }); +/** + * Browser doesn't support onload for all elements, so we need to manually trigger it + * this is useful for locality of behavior + */ +function invokeOnLoad(element : Element) { + if(element == null || !(element instanceof HTMLElement)) { + return + } + const ignored = ['SCRIPT', 'LINK', 'STYLE', 'META', 'BASE', 'TITLE', 'HEAD', 'HTML', 'BODY']; + if(!ignored.includes(element.tagName)) { + if(element.hasAttribute("onload")) { + element.onload!(new Event("load")); + } + } + // check its children + element.querySelectorAll('[onload]').forEach(invokeOnLoad) +} + export function removeAssociatedScripts(element: HTMLElement) { const attributes = Array.from(element.attributes) for (let attribute of attributes) { diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index 1dd199aa..c9ceb7de 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -51,6 +51,7 @@ func (l *LifeCycle) OnEvent(event hx.Event, cmd ...Command) *LifeCycle { return l } +// OnLoad This will work on any element because of the htmgo htmx extension to trigger it, instead of the browser. func OnLoad(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.LoadDomEvent, cmd...) } diff --git a/framework/hx/htmx.go b/framework/hx/htmx.go index 9ce7393d..20063e61 100644 --- a/framework/hx/htmx.go +++ b/framework/hx/htmx.go @@ -86,7 +86,6 @@ const ( HistoryCacheMissLoadEvent Event = "htmx:historyCacheMissLoad" HistoryRestoreEvent Event = "htmx:historyRestore" BeforeHistorySaveEvent Event = "htmx:beforeHistorySave" - LoadEvent Event = "htmx:load" NoSSESourceErrorEvent Event = "htmx:noSSESourceError" OnLoadErrorEvent Event = "htmx:onLoadError" OobAfterSwapEvent Event = "htmx:oobAfterSwap" @@ -131,6 +130,7 @@ const ( KeyPressEvent Event = "onkeypress" SubmitEvent Event = "onsubmit" LoadDomEvent Event = "onload" + LoadEvent Event = "onload" UnloadEvent Event = "onunload" ResizeEvent Event = "onresize" ScrollEvent Event = "onscroll" From 21652658c378c297794fa4b8f9d681d6183e7e51 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 13:57:53 +0000 Subject: [PATCH 052/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index fed6b88b..ce547f12 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c + github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 7f211e93..83d9d563 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 6d0cfee7..4706fdf4 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c +require github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index cb3b2751..3e0924b6 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index a1bceeb2..4c5e40c7 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c + github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index d6ef5c56..bcb94235 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 18c49eee..0d7d1821 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c +require github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index cb3b2751..3e0924b6 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index b8503b20..a6ca1394 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c + github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 353b5ac2..5233d7ad 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index b5bb5dfc..b6f56362 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c +require github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index cb3b2751..3e0924b6 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c h1:9uRbjBrHIXPu7kRsuY83NCcfk1MOQ85QiPGhQie3mrI= -github.com/maddalax/htmgo/framework v0.0.0-20241011011731-819af8b7b87c/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= +github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 90b444a097f7ca58b9a08213d0a4c2efe46a3f44 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 09:07:56 -0500 Subject: [PATCH 053/145] test --- .github/workflows/release-hn-clone.yml | 5 ++++- framework/assets/js/htmgo.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release-hn-clone.yml b/.github/workflows/release-hn-clone.yml index 3d65af91..f25e9422 100644 --- a/.github/workflows/release-hn-clone.yml +++ b/.github/workflows/release-hn-clone.yml @@ -1,13 +1,16 @@ name: Build and Deploy htmgo hackernews clone on: + workflow_run: + workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow + types: + - completed workflow_dispatch: # Trigger on manual workflow_dispatch push: branches: - master # Trigger on pushes to master paths: - 'examples/hackernews/**' # Trigger only if files in this directory change - - "framework/**" - "framework-ui/**" - "cli/**" diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 29cb7091..322501e3 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -18,7 +18,7 @@ function watchUrl(callback: (oldUrl: string, newUrl: string) => void) { callback(lastUrl, window.location.href); lastUrl = window.location.href; } - }, 100); + }, 101); } watchUrl((_, newUrl) => { From 4a2a119ef140d628241f09d5214eb37f29047e4d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 14:08:48 +0000 Subject: [PATCH 054/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index ce547f12..9cc6c416 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 + github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 83d9d563..d9ed9a13 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 4706fdf4..bb38c9e3 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 +require github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 3e0924b6..9a23ac6f 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 4c5e40c7..f73ab3fe 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 + github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index bcb94235..46d18dde 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 0d7d1821..99b97916 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 +require github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 3e0924b6..9a23ac6f 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index a6ca1394..3d52620a 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 + github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 5233d7ad..3f3133e1 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index b6f56362..b1a5ae46 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 +require github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 3e0924b6..9a23ac6f 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98 h1:84/EkUFHwVfY8lVVVQLOp/HQBfVRmiX0hdHoVfLkTwI= -github.com/maddalax/htmgo/framework v0.0.0-20241011135656-ea5d4d5e2e98/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= +github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From e750315764063256afe90be3e6f302c2ebc18f89 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 09:11:28 -0500 Subject: [PATCH 055/145] release site after deps updated --- .github/workflows/release-chat-example.yml | 4 ++++ .github/workflows/release-site.yml | 7 +++++-- .github/workflows/release-starter-template.yml | 6 +++++- .github/workflows/release-todo-example.yml | 6 +++++- framework/assets/dist/htmgo.js | 4 ++-- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release-chat-example.yml b/.github/workflows/release-chat-example.yml index 0302bd9d..6f877678 100644 --- a/.github/workflows/release-chat-example.yml +++ b/.github/workflows/release-chat-example.yml @@ -1,6 +1,10 @@ name: Build and Deploy htmgo.dev chat example on: + workflow_run: + workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow + types: + - completed pull_request: branches: - master diff --git a/.github/workflows/release-site.yml b/.github/workflows/release-site.yml index 83b9c46c..f3ab2ab0 100644 --- a/.github/workflows/release-site.yml +++ b/.github/workflows/release-site.yml @@ -1,13 +1,16 @@ name: Build and Deploy htmgo.dev on: + workflow_run: + workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow + types: + - completed workflow_dispatch: # Trigger on manual workflow_dispatch push: branches: - master # Trigger on pushes to master paths: - 'htmgo-site/**' # Trigger only if files in this directory change - - "framework/**" - "framework-ui/**" - "cli/**" @@ -46,4 +49,4 @@ jobs: - name: Push Docker image run: | - docker push ghcr.io/${{ github.repository_owner }}/htmgo-site:latest \ No newline at end of file + docker push ghcr.io/${{ github.repository_owner }}/htmgo-site:latest diff --git a/.github/workflows/release-starter-template.yml b/.github/workflows/release-starter-template.yml index da3167c1..1d22898e 100644 --- a/.github/workflows/release-starter-template.yml +++ b/.github/workflows/release-starter-template.yml @@ -1,6 +1,10 @@ name: Build and Deploy starter template on: + workflow_run: + workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow + types: + - completed workflow_dispatch: # Trigger on manual workflow_dispatch push: branches: @@ -43,4 +47,4 @@ jobs: - name: Push Docker image run: | - docker push ghcr.io/${{ github.repository_owner }}/starter-template:latest \ No newline at end of file + docker push ghcr.io/${{ github.repository_owner }}/starter-template:latest diff --git a/.github/workflows/release-todo-example.yml b/.github/workflows/release-todo-example.yml index 4fce8fb5..a81c2af3 100644 --- a/.github/workflows/release-todo-example.yml +++ b/.github/workflows/release-todo-example.yml @@ -1,6 +1,10 @@ name: Build and Deploy htmgo.dev todo example on: + workflow_run: + workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow + types: + - completed workflow_dispatch: # Trigger on manual workflow_dispatch push: branches: @@ -43,4 +47,4 @@ jobs: - name: Push Docker image run: | - docker push ghcr.io/${{ github.repository_owner }}/htmgo-todo-example:latest \ No newline at end of file + docker push ghcr.io/${{ github.repository_owner }}/htmgo-todo-example:latest diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index 8cbe139a..d886d355 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1,3 @@ -var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},100);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} //# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwiaW52b2tlT25Mb2FkIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEsRUFBUSxNQUFNLENBQ25DLENBQUEsTUFDckIsRUFHQSxNQUFRLENBQUEsSUFBQSxDQUVSLFNBQVUsSUFFVixDQUFBLFdBQUEsQ0FBYSxLQUViLFdBQWEsQ0FBQSxJQUFBLENBRWIsVUFBVyxJQUVYLENBQUEsSUFBQSxDQUFNLEtBR04sZUFBaUIsQ0FBQSxJQUFBLENBRWpCLGdCQUFpQixJQUdqQixDQUFBLE1BQUEsQ0FBUSxLQUVSLE9BQVMsQ0FBQSxJQUFBLENBT1QsT0FBUSxJQVFSLENBQUEsTUFBQSxDQUFRLENBTU4sY0FBZ0IsQ0FBQSxDQUFBLENBQUEsQ0FNaEIsaUJBQWtCLEVBS2xCLENBQUEsb0JBQUEsQ0FBc0IsR0FNdEIsZ0JBQWtCLENBQUEsV0FBQSxDQU1sQixpQkFBa0IsQ0FNbEIsQ0FBQSxrQkFBQSxDQUFvQixHQU1wQixzQkFBd0IsQ0FBQSxDQUFBLENBQUEsQ0FNeEIsZUFBZ0IsZ0JBTWhCLENBQUEsWUFBQSxDQUFjLGVBTWQsVUFBWSxDQUFBLFlBQUEsQ0FNWixjQUFlLGVBTWYsQ0FBQSxhQUFBLENBQWUsZ0JBTWYsU0FBVyxDQUFBLENBQUEsQ0FBQSxDQU1YLGdCQUFpQixDQU1qQixDQUFBLENBQUEsaUJBQUEsQ0FBbUIsRUFNbkIsQ0FBQSxnQkFBQSxDQUFrQixFQU1sQixDQUFBLGtCQUFBLENBQW9CLENBQUMsT0FBUyxDQUFBLE9BQUEsQ0FBUyxRQUFTLFFBQVEsQ0FBQSxDQU14RCxnQkFBaUIsQ0FLakIsQ0FBQSxDQUFBLE9BQUEsQ0FBUyxFQU1ULGdCQUFrQixDQUFBLGFBQUEsQ0FNbEIsYUFBYyxNQUtkLENBQUEsZUFBQSxDQUFpQixrQ0FLakIsY0FBZ0IsQ0FBQSxTQUFBLENBTWhCLG1CQUFvQixDQU1wQixDQUFBLENBQUEsbUJBQUEsQ0FBcUIsR0FNckIscUJBQXVCLENBQUEsQ0FBQSxDQUFBLENBTXZCLHdCQUF5QixDQUFDLEtBQUEsQ0FBTyxRQUFRLENBTXpDLENBQUEsZ0JBQUEsQ0FBa0IsR0FNbEIsV0FBYSxDQUFBLENBQUEsQ0FBQSxDQU1iLHNCQUF1QixDQU92QixDQUFBLENBQUEsaUJBQUEsQ0FBbUIsS0FFbkIsa0JBQW9CLENBQUEsQ0FBQSxDQUFBLENBRXBCLGlCQUFrQixDQUNoQixDQUFFLEtBQU0sS0FBTyxDQUFBLElBQUEsQ0FBTSxDQUFNLENBQUEsQ0FBQSxDQUMzQixDQUFFLElBQUEsQ0FBTSxTQUFVLElBQU0sQ0FBQSxDQUFBLENBQUssRUFDN0IsQ0FBRSxJQUFBLENBQU0sU0FBVSxJQUFNLENBQUEsQ0FBQSxDQUFBLENBQU8sTUFBTyxDQUFLLENBQUEsQ0FDN0MsRUFNQSxtQkFBcUIsQ0FBQSxDQUFBLENBQ3ZCLEVBRUEsYUFBZSxDQUFBLElBQUEsQ0FFZixFQUFHLElBQ0gsQ0FBQSxPQUFBLENBQVMsT0FDWCxDQUVBLENBQUEsSUFBQSxDQUFLLE9BQVMsWUFDZCxDQUFBLElBQUEsQ0FBSyxRQUFVLFdBQ2YsQ0FBQSxJQUFBLENBQUssR0FBSyxvQkFDVixDQUFBLElBQUEsQ0FBSyxJQUFNLHVCQUNYLENBQUEsSUFBQSxDQUFLLFFBQVUsWUFDZixDQUFBLElBQUEsQ0FBSyxLQUFPLFVBQ1osQ0FBQSxJQUFBLENBQUssS0FBTyxJQUNaLENBQUEsSUFBQSxDQUFLLE9BQVUsQ0FBQSxPQUFBLENBQ2YsSUFBSyxDQUFBLE9BQUEsQ0FBVSxRQUNmLElBQUssQ0FBQSxNQUFBLENBQVMsY0FDZCxJQUFLLENBQUEsUUFBQSxDQUFXLGtCQUNoQixJQUFLLENBQUEsV0FBQSxDQUFjLHVCQUNuQixJQUFLLENBQUEsV0FBQSxDQUFjLHFCQUNuQixJQUFLLENBQUEsU0FBQSxDQUFZLG9CQUNqQixJQUFLLENBQUEsSUFBQSxDQUFPLEtBQ1osSUFBSyxDQUFBLGVBQUEsQ0FBa0IsZ0JBQ3ZCLElBQUssQ0FBQSxlQUFBLENBQWtCLGdCQUN2QixJQUFLLENBQUEsTUFBQSxDQUFTLE9BQ2QsSUFBSyxDQUFBLE9BQUEsQ0FBVSxRQUNmLElBQUssQ0FBQSxhQUFBLENBQWdCLGNBQ3JCLElBQUssQ0FBQSxDQUFBLENBQUksYUFFVCxJQUFNLFdBQUEsQ0FBYyxDQUNsQixpQkFDQSxDQUFBLFlBQUEsQ0FDQSxzQkFDQSxlQUNBLENBQUEsWUFBQSxDQUNBLEtBQ0EsWUFDQSxDQUFBLGlCQUFBLENBQ0EseUJBQ0EsZUFDQSxDQUFBLGlCQUFBLENBQ0EsV0FDQSxjQUNBLENBQUEsZUFBQSxDQUNBLHFCQUNBLGVBQ0EsQ0FBQSxTQUFBLENBQ0EsYUFDQSxZQUNBLENBQUEsY0FBQSxDQUNBLFFBQ0EsZ0JBQ0EsQ0FBQSxpQkFBQSxDQUNBLGFBQ0EsWUFDQSxDQUFBLGlCQUFBLENBQ0EsY0FDRixDQUVNLENBQUEsS0FBQSxDQUFRLENBQUMsS0FBTyxDQUFBLE1BQUEsQ0FBUSxNQUFPLFFBQVUsQ0FBQSxPQUFPLEVBQ2hELGFBQWdCLENBQUEsS0FBQSxDQUFNLElBQUksU0FBU0MsQ0FBQUEsQ0FBTSxDQUM3QyxPQUFPLE1BQUEsQ0FBU0EsRUFBTyxjQUFpQkEsQ0FBQUEsQ0FBQUEsQ0FBTyxHQUNqRCxDQUFDLENBQUEsQ0FBRSxLQUFLLElBQUksQ0FBQSxDQUVOLGNBQWlCLENBQUEsWUFBQSxDQUFhLE1BQU0sQ0FBQSxDQVcxQyxTQUFTLFlBQWFDLENBQUFBLENBQUFBLENBQUtDLEVBQVMsQ0FBTyxDQUFBLENBQUEsQ0FDekMsT0FBTyxJQUFJLE1BQUEsQ0FBTyxJQUFJRCxDQUFHLENBQUEsNkJBQUEsRUFBZ0NBLENBQUcsQ0FDMURDLENBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQVMsTUFBUSxJQUFJLENBQ3pCLENBWUEsU0FBUyxhQUFBLENBQWNDLEVBQUssQ0FDMUIsR0FBSUEsR0FBTyxJQUNULENBQUEsT0FHRixJQUFJQyxDQUFXLENBQUEsR0FBQSxDQUNmLE9BQUlELENBQUksQ0FBQSxLQUFBLENBQU0sRUFBRSxDQUFLLEVBQUEsSUFBQSxDQUNuQkMsRUFBVyxVQUFXRCxDQUFBQSxDQUFBQSxDQUFJLE1BQU0sQ0FBRyxDQUFBLENBQUEsQ0FBRSxDQUFDLENBQzdCQSxDQUFBQSxDQUFBQSxDQUFJLEtBQU0sQ0FBQSxDQUFBLENBQUUsQ0FBSyxFQUFBLEdBQUEsQ0FDMUJDLEVBQVcsVUFBV0QsQ0FBQUEsQ0FBQUEsQ0FBSSxNQUFNLENBQUcsQ0FBQSxDQUFBLENBQUUsQ0FBQyxDQUFJLENBQUEsR0FBQSxDQUNqQ0EsRUFBSSxLQUFNLENBQUEsQ0FBQSxDQUFFLEdBQUssR0FDMUJDLENBQUFBLENBQUFBLENBQVcsV0FBV0QsQ0FBSSxDQUFBLEtBQUEsQ0FBTSxFQUFHLENBQUUsQ0FBQSxDQUFDLEVBQUksR0FBTyxDQUFBLEVBQUEsQ0FFakRDLEVBQVcsVUFBV0QsQ0FBQUEsQ0FBRyxFQUVwQixLQUFNQyxDQUFBQSxDQUFRLEVBQUksS0FBWUEsQ0FBQUEsQ0FBQUEsQ0FDdkMsQ0FPQSxTQUFTLGVBQUEsQ0FBZ0JOLEVBQUtPLENBQU0sQ0FBQSxDQUNsQyxPQUFPUCxDQUFlLFlBQUEsT0FBQSxFQUFXQSxFQUFJLFlBQWFPLENBQUFBLENBQUksQ0FDeEQsQ0FRQSxTQUFTLFlBQUEsQ0FBYVAsRUFBS1EsQ0FBZSxDQUFBLENBQ3hDLE9BQU8sQ0FBQyxDQUFDUixFQUFJLFlBQWlCQSxHQUFBQSxDQUFBQSxDQUFJLGFBQWFRLENBQWEsQ0FBQSxFQUMxRFIsRUFBSSxZQUFhLENBQUEsT0FBQSxDQUFVUSxDQUFhLENBQzVDLENBQUEsQ0FRQSxTQUFTLGlCQUFrQlIsQ0FBQUEsQ0FBQUEsQ0FBS1EsRUFBZSxDQUM3QyxPQUFPLGdCQUFnQlIsQ0FBS1EsQ0FBQUEsQ0FBYSxHQUFLLGVBQWdCUixDQUFBQSxDQUFBQSxDQUFLLFFBQVVRLENBQWEsQ0FDNUYsQ0FNQSxTQUFTLFNBQUEsQ0FBVVIsRUFBSyxDQUN0QixJQUFNUyxFQUFTVCxDQUFJLENBQUEsYUFBQSxDQUNuQixPQUFJLENBQUNTLENBQUFBLEVBQVVULEVBQUksVUFBc0IsWUFBQSxVQUFBLENBQW1CQSxFQUFJLFVBQ3pEUyxDQUFBQSxDQUNULENBS0EsU0FBUyxXQUFBLEVBQWMsQ0FDckIsT0FBTyxRQUNULENBT0EsU0FBUyxXQUFBLENBQVlULEVBQUtJLENBQVEsQ0FBQSxDQUNoQyxPQUFPSixDQUFJLENBQUEsV0FBQSxDQUFjQSxFQUFJLFdBQVksQ0FBQSxDQUFFLFNBQVVJLENBQU8sQ0FBQyxFQUFJLFdBQVksRUFDL0UsQ0FPQSxTQUFTLGVBQUEsQ0FBZ0JKLEVBQUtVLENBQVcsQ0FBQSxDQUN2QyxLQUFPVixDQUFPLEVBQUEsQ0FBQ1UsRUFBVVYsQ0FBRyxDQUFBLEVBQzFCQSxFQUFNLFNBQVVBLENBQUFBLENBQUcsRUFHckIsT0FBT0EsQ0FBQUEsRUFBTyxJQUNoQixDQVFBLFNBQVMsbUNBQUEsQ0FBb0NXLEVBQWdCQyxDQUFVQyxDQUFBQSxDQUFBQSxDQUFlLENBQ3BGLElBQU1DLENBQUFBLENBQWlCLGtCQUFrQkYsQ0FBVUMsQ0FBQUEsQ0FBYSxFQUMxREUsQ0FBYSxDQUFBLGlCQUFBLENBQWtCSCxFQUFVLGVBQWUsQ0FBQSxDQUM5RCxJQUFJSSxDQUFVLENBQUEsaUJBQUEsQ0FBa0JKLEVBQVUsWUFBWSxDQUFBLENBQ3RELEdBQUlELENBQW1CQyxHQUFBQSxDQUFBQSxDQUFVLENBQy9CLEdBQUksSUFBQSxDQUFLLE9BQU8sa0JBQ2QsQ0FBQSxPQUFJSSxJQUFZQSxDQUFZLEdBQUEsR0FBQSxFQUFPQSxFQUFRLEtBQU0sQ0FBQSxHQUFHLEVBQUUsT0FBUUgsQ0FBQUEsQ0FBYSxHQUFLLENBQ3ZFQyxDQUFBQSxDQUFBQSxDQUFBQSxDQUVBLEtBR1gsR0FBSUMsQ0FBQUEsR0FBZUEsQ0FBZSxHQUFBLEdBQUEsRUFBT0EsQ0FBVyxDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQUUsQ0FBQSxPQUFBLENBQVFGLENBQWEsQ0FBSyxFQUFBLENBQUEsQ0FBQSxDQUN2RixPQUFPLE9BRVgsQ0FDQSxPQUFPQyxDQUNULENBT0EsU0FBUyx3QkFBeUJkLENBQUFBLENBQUFBLENBQUthLEVBQWUsQ0FDcEQsSUFBSUksRUFBYyxJQUlsQixDQUFBLEdBSEEsZ0JBQWdCakIsQ0FBSyxDQUFBLFNBQVNrQixFQUFHLENBQy9CLE9BQU8sQ0FBQyxFQUFFRCxDQUFBQSxDQUFjLG9DQUFvQ2pCLENBQUssQ0FBQSxTQUFBLENBQVVrQixDQUFDLENBQUdMLENBQUFBLENBQWEsRUFDOUYsQ0FBQyxDQUFBLENBQ0dJLElBQWdCLE9BQ2xCLENBQUEsT0FBT0EsQ0FFWCxDQU9BLFNBQVMsT0FBUWpCLENBQUFBLENBQUFBLENBQUttQixDQUFVLENBQUEsQ0FHOUIsSUFBTUMsQ0FBa0JwQixDQUFBQSxDQUFBQSxZQUFlLFVBQVlBLENBQUksQ0FBQSxPQUFBLEVBQVdBLEVBQUksZUFBbUJBLEVBQUFBLENBQUFBLENBQUksbUJBQXFCQSxDQUFJLENBQUEsa0JBQUEsRUFBc0JBLEVBQUkscUJBQXlCQSxFQUFBQSxDQUFBQSxDQUFJLGtCQUM3SyxPQUFPLENBQUMsQ0FBQ29CLENBQW1CQSxFQUFBQSxDQUFBQSxDQUFnQixLQUFLcEIsQ0FBS21CLENBQUFBLENBQVEsQ0FDaEUsQ0FNQSxTQUFTLFlBQVlkLENBQUssQ0FBQSxDQUV4QixJQUFNZ0IsQ0FEYSxDQUFBLGdDQUFBLENBQ00sS0FBS2hCLENBQUcsQ0FBQSxDQUNqQyxPQUFJZ0IsQ0FDS0EsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUFDLENBQUUsQ0FBQSxXQUFBLEdBRVQsRUFFWCxDQU1BLFNBQVMsU0FBQSxDQUFVQyxDQUFNLENBQUEsQ0FFdkIsT0FEZSxJQUFJLFNBQUEsR0FDTCxlQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBTSxXQUFXLENBQ2pELENBTUEsU0FBUyxlQUFnQkMsQ0FBQUEsQ0FBQUEsQ0FBVXZCLEVBQUssQ0FDdEMsS0FBT0EsRUFBSSxVQUFXLENBQUEsTUFBQSxDQUFTLEdBQzdCdUIsQ0FBUyxDQUFBLE1BQUEsQ0FBT3ZCLEVBQUksVUFBVyxDQUFBLENBQUMsQ0FBQyxFQUVyQyxDQU1BLFNBQVMsZUFBZ0J3QixDQUFBQSxDQUFBQSxDQUFRLENBQy9CLElBQU1DLENBQUFBLENBQVksYUFBYyxDQUFBLGFBQUEsQ0FBYyxRQUFRLENBQ3RELENBQUEsT0FBQSxPQUFBLENBQVFELEVBQU8sVUFBWSxDQUFBLFNBQVNFLEVBQU0sQ0FDeENELENBQUFBLENBQVUsWUFBYUMsQ0FBQUEsQ0FBQUEsQ0FBSyxJQUFNQSxDQUFBQSxDQUFBQSxDQUFLLEtBQUssRUFDOUMsQ0FBQyxFQUNERCxDQUFVLENBQUEsV0FBQSxDQUFjRCxFQUFPLFdBQy9CQyxDQUFBQSxDQUFBQSxDQUFVLE1BQVEsQ0FDZCxDQUFBLENBQUEsSUFBQSxDQUFLLE9BQU8saUJBQ2RBLEdBQUFBLENBQUFBLENBQVUsTUFBUSxJQUFLLENBQUEsTUFBQSxDQUFPLG1CQUV6QkEsQ0FDVCxDQU1BLFNBQVMsc0JBQXVCRCxDQUFBQSxDQUFBQSxDQUFRLENBQ3RDLE9BQU9BLENBQUFBLENBQU8sUUFBUSxRQUFRLENBQUEsR0FBTUEsRUFBTyxJQUFTLEdBQUEsaUJBQUEsRUFBcUJBLEVBQU8sSUFBUyxHQUFBLFFBQUEsRUFBWUEsRUFBTyxJQUFTLEdBQUEsRUFBQSxDQUN2SCxDQVNBLFNBQVMsbUJBQUEsQ0FBb0JELEVBQVUsQ0FDckMsS0FBQSxDQUFNLElBQUtBLENBQUFBLENBQUFBLENBQVMsZ0JBQWlCLENBQUEsUUFBUSxDQUFDLENBQUUsQ0FBQSxPQUFBLENBQWtEQyxHQUFXLENBQzNHLEdBQUksdUJBQXVCQSxDQUFNLENBQUEsQ0FBRyxDQUNsQyxJQUFNQyxDQUFBQSxDQUFZLGdCQUFnQkQsQ0FBTSxDQUFBLENBQ2xDZixFQUFTZSxDQUFPLENBQUEsVUFBQSxDQUN0QixHQUFJLENBQ0ZmLENBQUFBLENBQU8sYUFBYWdCLENBQVdELENBQUFBLENBQU0sRUFDdkMsQ0FBU04sTUFBQUEsQ0FBQUEsQ0FBRyxDQUNWLFFBQVNBLENBQUFBLENBQUMsRUFDWixDQUFFLE9BQUEsQ0FDQU0sRUFBTyxNQUFPLEdBQ2hCLENBQ0YsQ0FDRixDQUFDLEVBQ0gsQ0FZQSxTQUFTLGFBQWFHLENBQVUsQ0FBQSxDQUU5QixJQUFNQyxDQUFBQSxDQUFxQkQsQ0FBUyxDQUFBLE9BQUEsQ0FBUSxlQUFnQixFQUFFLENBQUEsQ0FDeERFLEVBQVcsV0FBWUQsQ0FBQUEsQ0FBa0IsRUFFM0NMLENBQ0osQ0FBQSxHQUFJTSxJQUFhLE1BQVEsQ0FBQSxDQUV2Qk4sRUFBbUQsSUFBSSxnQkFBQSxDQUN2RCxJQUFNTyxDQUFNLENBQUEsU0FBQSxDQUFVSCxDQUFRLENBQzlCLENBQUEsZUFBQSxDQUFnQkosRUFBVU8sQ0FBSSxDQUFBLElBQUksRUFDbENQLENBQVMsQ0FBQSxLQUFBLENBQVFPLEVBQUksTUFDdkIsQ0FBQSxLQUFBLEdBQVdELElBQWEsTUFBUSxDQUFBLENBRTlCTixFQUFtRCxJQUFJLGdCQUFBLENBQ3ZELElBQU1PLENBQU0sQ0FBQSxTQUFBLENBQVVGLENBQWtCLENBQ3hDLENBQUEsZUFBQSxDQUFnQkwsRUFBVU8sQ0FBSSxDQUFBLElBQUksRUFDbENQLENBQVMsQ0FBQSxLQUFBLENBQVFPLEVBQUksTUFDdkIsQ0FBQSxLQUFPLENBRUwsSUFBTUEsQ0FBQUEsQ0FBTSxVQUFVLGdEQUFtREYsQ0FBQUEsQ0FBQUEsQ0FBcUIsb0JBQW9CLENBQ2xITCxDQUFBQSxDQUFBQSxDQUFtRE8sRUFBSSxhQUFjLENBQUEsVUFBVSxFQUFFLE9BRWpGUCxDQUFBQSxDQUFBQSxDQUFTLE1BQVFPLENBQUksQ0FBQSxLQUFBLENBR3JCLElBQUlDLENBQWVSLENBQUFBLENBQUFBLENBQVMsY0FBYyxPQUFPLENBQUEsQ0FDN0NRLEdBQWdCQSxDQUFhLENBQUEsVUFBQSxHQUFlUixJQUM5Q1EsQ0FBYSxDQUFBLE1BQUEsR0FDYlIsQ0FBUyxDQUFBLEtBQUEsQ0FBUVEsRUFBYSxTQUVsQyxFQUFBLENBQ0EsT0FBSVIsQ0FDRSxHQUFBLElBQUEsQ0FBSyxPQUFPLGVBQ2QsQ0FBQSxtQkFBQSxDQUFvQkEsQ0FBUSxDQUFBLENBRzVCQSxDQUFTLENBQUEsZ0JBQUEsQ0FBaUIsUUFBUSxDQUFFLENBQUEsT0FBQSxDQUFTQyxHQUFXQSxDQUFPLENBQUEsTUFBQSxFQUFRLENBR3BFRCxDQUFBQSxDQUFBQSxDQUNULENBS0EsU0FBUyxTQUFBLENBQVVTLEVBQU0sQ0FDbkJBLENBQUFBLEVBQ0ZBLElBRUosQ0FPQSxTQUFTLE1BQU9DLENBQUFBLENBQUFBLENBQUdoQyxFQUFNLENBQ3ZCLE9BQU8sT0FBTyxTQUFVLENBQUEsUUFBQSxDQUFTLEtBQUtnQyxDQUFDLENBQUEsR0FBTSxXQUFhaEMsQ0FBTyxDQUFBLEdBQ25FLENBTUEsU0FBUyxVQUFBLENBQVdnQyxFQUFHLENBQ3JCLE9BQU8sT0FBT0EsQ0FBTSxFQUFBLFVBQ3RCLENBTUEsU0FBUyxXQUFBLENBQVlBLENBQUcsQ0FBQSxDQUN0QixPQUFPLE1BQUEsQ0FBT0EsRUFBRyxRQUFRLENBQzNCLENBZ0RBLFNBQVMsZUFBQSxDQUFnQmpDLEVBQUssQ0FDNUIsSUFBTWtDLEVBQVcsb0JBQ2JDLENBQUFBLENBQUFBLENBQU9uQyxFQUFJa0MsQ0FBUSxDQUFBLENBQ3ZCLE9BQUtDLENBQ0hBLEdBQUFBLENBQUFBLENBQU9uQyxFQUFJa0MsQ0FBUSxDQUFBLENBQUksRUFFbEJDLENBQUFBLENBQUFBLENBQ1QsQ0FRQSxTQUFTLE9BQUEsQ0FBUUMsRUFBSyxDQUNwQixJQUFNQyxFQUFZLEVBQUMsQ0FDbkIsR0FBSUQsQ0FDRixDQUFBLElBQUEsSUFBU0UsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJRixFQUFJLE1BQVFFLENBQUFBLENBQUFBLEVBQUFBLENBQzlCRCxFQUFVLElBQUtELENBQUFBLENBQUFBLENBQUlFLENBQUMsQ0FBQyxDQUd6QixDQUFBLE9BQU9ELENBQ1QsQ0FPQSxTQUFTLFFBQVFELENBQUtKLENBQUFBLENBQUFBLENBQU0sQ0FDMUIsR0FBSUksQ0FBQUEsQ0FDRixRQUFTRSxDQUFJLENBQUEsQ0FBQSxDQUFHQSxFQUFJRixDQUFJLENBQUEsTUFBQSxDQUFRRSxJQUM5Qk4sQ0FBS0ksQ0FBQUEsQ0FBQUEsQ0FBSUUsQ0FBQyxDQUFDLEVBR2pCLENBTUEsU0FBUyxrQkFBQSxDQUFtQkMsRUFBSSxDQUM5QixJQUFNQyxFQUFPRCxDQUFHLENBQUEscUJBQUEsR0FDVkUsQ0FBVUQsQ0FBQUEsQ0FBQUEsQ0FBSyxJQUNmRSxDQUFhRixDQUFBQSxDQUFBQSxDQUFLLE9BQ3hCLE9BQU9DLENBQUFBLENBQVUsT0FBTyxXQUFlQyxFQUFBQSxDQUFBQSxFQUFjLENBQ3ZELENBTUEsU0FBUyxhQUFhMUMsQ0FBSyxDQUFBLENBRXpCLElBQU0yQyxDQUFXM0MsQ0FBQUEsQ0FBQUEsQ0FBSSxhQUFlQSxDQUFJLENBQUEsV0FBQSxHQUN4QyxPQUFJMkMsQ0FBQUEsRUFBWUEsYUFBb0IsTUFBTyxDQUFBLFVBQUEsQ0FDbEMsYUFBYyxDQUFBLElBQUEsQ0FBSyxTQUFTQSxDQUFTLENBQUEsSUFBSSxFQUV6QyxXQUFZLEVBQUEsQ0FBRSxLQUFLLFFBQVMzQyxDQUFBQSxDQUFHLENBRTFDLENBTUEsU0FBUyxrQkFBa0I0QyxDQUFTLENBQUEsQ0FDbEMsT0FBT0EsQ0FBUSxDQUFBLElBQUEsR0FBTyxLQUFNLENBQUEsS0FBSyxDQUNuQyxDQVdBLFNBQVMsYUFBYUMsQ0FBTUMsQ0FBQUEsQ0FBQUEsQ0FBTSxDQUNoQyxJQUFXQyxJQUFBQSxDQUFBQSxJQUFPRCxDQUNaQSxDQUFBQSxDQUFBQSxDQUFLLGNBQWVDLENBQUFBLENBQUcsSUFFekJGLENBQUtFLENBQUFBLENBQUcsRUFBSUQsQ0FBS0MsQ0FBQUEsQ0FBRyxHQUl4QixPQUFPRixDQUNULENBTUEsU0FBUyxTQUFBLENBQVVHLEVBQVMsQ0FDMUIsR0FBSSxDQUNGLE9BQU8sSUFBQSxDQUFLLE1BQU1BLENBQU8sQ0FDM0IsT0FBU0MsQ0FBTyxDQUFBLENBQ2QsZ0JBQVNBLENBQUssQ0FBQSxDQUNQLElBQ1QsQ0FDRixDQUtBLFNBQVMscUJBQXdCLEVBQUEsQ0FDL0IsSUFBTUMsQ0FBTyxDQUFBLHVCQUFBLENBQ2IsR0FBSSxDQUNGLE9BQUEsWUFBQSxDQUFhLFFBQVFBLENBQU1BLENBQUFBLENBQUksRUFDL0IsWUFBYSxDQUFBLFVBQUEsQ0FBV0EsQ0FBSSxDQUFBLENBQ3JCLENBQ1QsQ0FBQSxDQUFBLEtBQVksQ0FDVixPQUFPLENBQUEsQ0FDVCxDQUNGLENBTUEsU0FBUyxjQUFjQyxDQUFNLENBQUEsQ0FDM0IsR0FBSSxDQUNGLElBQU1DLEVBQU0sSUFBSSxHQUFBLENBQUlELENBQUksQ0FDeEIsQ0FBQSxPQUFJQyxJQUNGRCxDQUFPQyxDQUFBQSxDQUFBQSxDQUFJLFNBQVdBLENBQUksQ0FBQSxNQUFBLENBQUEsQ0FHdEIsT0FBTyxJQUFLRCxDQUFBQSxDQUFJLElBQ3BCQSxDQUFPQSxDQUFBQSxDQUFBQSxDQUFLLFFBQVEsTUFBUSxDQUFBLEVBQUUsR0FFekJBLENBQ1QsQ0FBQSxLQUFZLENBRVYsT0FBT0EsQ0FDVCxDQUNGLENBVUEsU0FBUyxhQUFhLEdBQUssQ0FBQSxDQUN6QixPQUFPLFNBQUEsQ0FBVSxXQUFZLEVBQUEsQ0FBRSxLQUFNLFVBQVcsQ0FDOUMsT0FBTyxJQUFLLENBQUEsR0FBRyxDQUNqQixDQUFDLENBQ0gsQ0FVQSxTQUFTLFlBQUEsQ0FBYUUsRUFBVSxDQUk5QixPQUhjLEtBQUssRUFBRyxDQUFBLFdBQUEsQ0FBNkMsU0FBU0MsQ0FBSyxDQUFBLENBQy9FRCxFQUFTQyxDQUFJLENBQUEsTUFBQSxDQUFPLEdBQUcsRUFDekIsQ0FBQyxDQUVILENBT0EsU0FBUyxRQUFTLENBQ2hCLElBQUEsQ0FBSyxPQUFTLFNBQVN0RCxDQUFBQSxDQUFLdUQsRUFBT3BCLENBQU0sQ0FBQSxDQUNuQyxTQUNGLE9BQVEsQ0FBQSxHQUFBLENBQUlvQixFQUFPdkQsQ0FBS21DLENBQUFBLENBQUksRUFFaEMsRUFDRixDQUVBLFNBQVMsT0FBVSxFQUFBLENBQ2pCLEtBQUssTUFBUyxDQUFBLEtBQ2hCLENBV0EsU0FBUyxJQUFBLENBQUtxQixFQUFlckMsQ0FBVSxDQUFBLENBQ3JDLE9BQUksT0FBT3FDLENBQUFBLEVBQWtCLFNBQ3BCQSxDQUFjLENBQUEsYUFBQSxDQUFjckMsQ0FBUSxDQUVwQyxDQUFBLElBQUEsQ0FBSyxhQUFlcUMsQ0FBQUEsQ0FBYSxDQUU1QyxDQVdBLFNBQVMsUUFBUUEsQ0FBZXJDLENBQUFBLENBQUFBLENBQVUsQ0FDeEMsT0FBSSxPQUFPcUMsR0FBa0IsUUFDcEJBLENBQUFBLENBQUFBLENBQWMsaUJBQWlCckMsQ0FBUSxDQUFBLENBRXZDLFFBQVEsV0FBWSxFQUFBLENBQUdxQyxDQUFhLENBRS9DLENBS0EsU0FBUyxTQUFBLEVBQVksQ0FDbkIsT0FBTyxNQUNULENBVUEsU0FBUyxjQUFjeEQsQ0FBS3lELENBQUFBLENBQUFBLENBQU8sQ0FDakN6RCxDQUFNLENBQUEsYUFBQSxDQUFjQSxDQUFHLENBQ25CeUQsQ0FBQUEsQ0FBQUEsQ0FDRixXQUFZLENBQUEsVUFBQSxDQUFXLFVBQVcsQ0FDaEMsYUFBQSxDQUFjekQsQ0FBRyxDQUNqQkEsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUNSLENBQUd5RCxDQUFBQSxDQUFLLEVBRVIsU0FBVXpELENBQUFBLENBQUcsRUFBRSxXQUFZQSxDQUFBQSxDQUFHLEVBRWxDLENBTUEsU0FBUyxVQUFVQSxDQUFLLENBQUEsQ0FDdEIsT0FBT0EsQ0FBZSxZQUFBLE9BQUEsQ0FBVUEsRUFBTSxJQUN4QyxDQU1BLFNBQVMsYUFBY0EsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUMxQixPQUFPQSxDQUFlLFlBQUEsV0FBQSxDQUFjQSxFQUFNLElBQzVDLENBTUEsU0FBUyxRQUFTMEQsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUN2QixPQUFPLE9BQU9BLEdBQVUsUUFBV0EsQ0FBQUEsQ0FBQUEsQ0FBUSxJQUM3QyxDQU1BLFNBQVMsYUFBYTFELENBQUssQ0FBQSxDQUN6QixPQUFPQSxDQUFlLFlBQUEsT0FBQSxFQUFXQSxhQUFlLFFBQVlBLEVBQUFBLENBQUFBLFlBQWUsaUJBQW1CQSxDQUFNLENBQUEsSUFDdEcsQ0FXQSxTQUFTLGlCQUFBLENBQWtCQSxFQUFLMkQsQ0FBT0YsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUM1Q3pELENBQU0sQ0FBQSxTQUFBLENBQVUsY0FBY0EsQ0FBRyxDQUFDLEVBQzdCQSxDQUdEeUQsR0FBQUEsQ0FBQUEsQ0FDRixXQUFZLENBQUEsVUFBQSxDQUFXLFVBQVcsQ0FDaEMsaUJBQWtCekQsQ0FBQUEsQ0FBQUEsQ0FBSzJELENBQUssQ0FDNUIzRCxDQUFBQSxDQUFBQSxDQUFNLEtBQ1IsQ0FBR3lELENBQUFBLENBQUssRUFFUnpELENBQUksQ0FBQSxTQUFBLEVBQWFBLEVBQUksU0FBVSxDQUFBLEdBQUEsQ0FBSTJELENBQUssQ0FFNUMsRUFBQSxDQVdBLFNBQVMsc0JBQXVCQyxDQUFBQSxDQUFBQSxDQUFNRCxFQUFPRixDQUFPLENBQUEsQ0FDbEQsSUFBSXpELENBQU0sQ0FBQSxTQUFBLENBQVUsY0FBYzRELENBQUksQ0FBQyxFQUNsQzVELENBR0R5RCxHQUFBQSxDQUFBQSxDQUNGLFdBQVksQ0FBQSxVQUFBLENBQVcsVUFBVyxDQUNoQyxzQkFBQSxDQUF1QnpELEVBQUsyRCxDQUFLLENBQUEsQ0FDakMzRCxFQUFNLEtBQ1IsQ0FBQSxDQUFHeUQsQ0FBSyxDQUVKekQsQ0FBQUEsQ0FBQUEsQ0FBSSxTQUNOQSxHQUFBQSxDQUFBQSxDQUFJLFNBQVUsQ0FBQSxNQUFBLENBQU8yRCxDQUFLLENBRXRCM0QsQ0FBQUEsQ0FBQUEsQ0FBSSxVQUFVLE1BQVcsR0FBQSxDQUFBLEVBQzNCQSxFQUFJLGVBQWdCLENBQUEsT0FBTyxJQUluQyxDQVVBLFNBQVMscUJBQXFCQSxDQUFLMkQsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUN4QzNELENBQU0sQ0FBQSxhQUFBLENBQWNBLENBQUcsQ0FDdkJBLENBQUFBLENBQUFBLENBQUksVUFBVSxNQUFPMkQsQ0FBQUEsQ0FBSyxFQUM1QixDQVVBLFNBQVMsb0JBQW9CM0QsQ0FBSzJELENBQUFBLENBQUFBLENBQU8sQ0FDdkMzRCxDQUFNLENBQUEsYUFBQSxDQUFjQSxDQUFHLENBQ3ZCLENBQUEsT0FBQSxDQUFRQSxFQUFJLGFBQWMsQ0FBQSxRQUFBLENBQVUsU0FBUzZELENBQU8sQ0FBQSxDQUNsRCx1QkFBdUJBLENBQU9GLENBQUFBLENBQUssRUFDckMsQ0FBQyxDQUNELENBQUEsaUJBQUEsQ0FBa0IsVUFBVTNELENBQUcsQ0FBQSxDQUFHMkQsQ0FBSyxFQUN6QyxDQVdBLFNBQVMsT0FBUTNELENBQUFBLENBQUFBLENBQUttQixFQUFVLENBRTlCLEdBREFuQixFQUFNLFNBQVUsQ0FBQSxhQUFBLENBQWNBLENBQUcsQ0FBQyxDQUFBLENBQzlCQSxHQUFPQSxDQUFJLENBQUEsT0FBQSxDQUNiLE9BQU9BLENBQUksQ0FBQSxPQUFBLENBQVFtQixDQUFRLENBRzNCLENBQUEsTUFDTW5CLENBQU8sRUFBQSxJQUFBLEVBQVEsUUFBUUEsQ0FBS21CLENBQUFBLENBQVEsRUFDdEMsT0FBT25CLENBQUFBLENBQUFBLE1BR0pBLEVBQU1BLENBQU8sRUFBQSxTQUFBLENBQVUsVUFBVUEsQ0FBRyxDQUFDLEdBQzVDLE9BQU8sSUFFWCxDQU9BLFNBQVMsVUFBV0ssQ0FBQUEsQ0FBQUEsQ0FBS3lELEVBQVEsQ0FDL0IsT0FBT3pELEVBQUksU0FBVSxDQUFBLENBQUEsQ0FBR3lELEVBQU8sTUFBTSxDQUFBLEdBQU1BLENBQzdDLENBT0EsU0FBUyxTQUFTekQsQ0FBSzBELENBQUFBLENBQUFBLENBQVEsQ0FDN0IsT0FBTzFELENBQUFBLENBQUksVUFBVUEsQ0FBSSxDQUFBLE1BQUEsQ0FBUzBELEVBQU8sTUFBTSxDQUFBLEdBQU1BLENBQ3ZELENBTUEsU0FBUyxrQkFBa0I1QyxDQUFVLENBQUEsQ0FDbkMsSUFBTTZDLENBQWtCN0MsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUNqQyxDQUFBLE9BQUksV0FBVzZDLENBQWlCLENBQUEsR0FBRyxHQUFLLFFBQVNBLENBQUFBLENBQUFBLENBQWlCLElBQUksQ0FDN0RBLENBQUFBLENBQUFBLENBQWdCLFNBQVUsQ0FBQSxDQUFBLENBQUdBLENBQWdCLENBQUEsTUFBQSxDQUFTLENBQUMsQ0FFdkRBLENBQUFBLENBRVgsQ0FRQSxTQUFTLG1CQUFBLENBQW9CaEUsRUFBS21CLENBQVVmLENBQUFBLENBQUFBLENBQVEsQ0FFbEQsT0FEQUosQ0FBQUEsQ0FBTSxjQUFjQSxDQUFHLENBQUEsQ0FDbkJtQixFQUFTLE9BQVEsQ0FBQSxVQUFVLElBQU0sQ0FDNUIsQ0FBQSxDQUFDLFFBQVEsU0FBVW5CLENBQUFBLENBQUcsRUFBRyxpQkFBa0JtQixDQUFBQSxDQUFBQSxDQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQzdEQSxFQUFTLE9BQVEsQ0FBQSxPQUFPLElBQU0sQ0FDaEMsQ0FBQSxDQUFDLEtBQUssWUFBYW5CLENBQUFBLENBQUcsRUFBRyxpQkFBa0JtQixDQUFBQSxDQUFBQSxDQUFTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQzdEQSxJQUFhLE1BQ2YsQ0FBQSxDQUFDLFVBQVVuQixDQUFHLENBQUEsQ0FBRSxrQkFBa0IsQ0FDaENtQixDQUFBQSxDQUFBQSxDQUFTLFFBQVEsT0FBTyxDQUFBLEdBQU0sRUFDaEMsQ0FBQyxnQkFBQSxDQUFpQm5CLEVBQUssaUJBQWtCbUIsQ0FBQUEsQ0FBQUEsQ0FBUyxPQUFPLENBQUMsQ0FBQyxFQUFHLENBQUMsQ0FBQ2YsQ0FBTSxDQUFDLENBQUEsQ0FDckVlLElBQWEsVUFDZixDQUFBLENBQUMsVUFBVW5CLENBQUcsQ0FBQSxDQUFFLHNCQUFzQixDQUNwQ21CLENBQUFBLENBQUFBLENBQVMsUUFBUSxXQUFXLENBQUEsR0FBTSxFQUNwQyxDQUFDLGtCQUFBLENBQW1CbkIsQ0FBSyxDQUFBLGlCQUFBLENBQWtCbUIsQ0FBUyxDQUFBLE1BQUEsQ0FBTyxDQUFDLENBQUMsQ0FBQSxDQUFHLENBQUMsQ0FBQ2YsQ0FBTSxDQUFDLENBQ3ZFZSxDQUFBQSxDQUFBQSxHQUFhLFdBQ2YsQ0FBQyxRQUFRLEVBQ1BBLENBQWEsR0FBQSxRQUFBLENBQ2YsQ0FBQyxNQUFNLENBQUEsQ0FDTEEsSUFBYSxNQUNmLENBQUEsQ0FBQyxTQUFTLElBQUksQ0FBQSxDQUNaQSxJQUFhLE1BQ2YsQ0FBQSxDQUFDLFlBQVluQixDQUFLLENBQUEsQ0FBQyxDQUFDSSxDQUFNLENBQUMsRUFDekJlLENBQVMsQ0FBQSxPQUFBLENBQVEsU0FBUyxDQUFNLEdBQUEsQ0FBQSxDQUNsQyxvQkFBb0JuQixDQUFLbUIsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFNLENBQUMsQ0FBQSxDQUFHLENBQUksQ0FBQSxDQUFBLENBRWhELE9BQVEsQ0FBQSxZQUFBLENBQWEsWUFBWW5CLENBQUssQ0FBQSxDQUFDLENBQUNJLENBQU0sQ0FBQyxFQUFFLGdCQUFpQixDQUFBLGlCQUFBLENBQWtCZSxDQUFRLENBQUMsQ0FBQyxDQUV6RyxDQVFBLElBQUksaUJBQW1CLFNBQVM4QyxDQUFBQSxDQUFPNUMsRUFBT2pCLENBQVEsQ0FBQSxDQUNwRCxJQUFNOEQsQ0FBVSxDQUFBLFlBQUEsQ0FBYSxZQUFZRCxDQUFPN0QsQ0FBQUEsQ0FBTSxDQUFDLENBQUUsQ0FBQSxnQkFBQSxDQUFpQmlCLENBQUssQ0FDL0UsQ0FBQSxJQUFBLElBQVNpQixFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUk0QixFQUFRLE1BQVE1QixDQUFBQSxDQUFBQSxFQUFBQSxDQUFLLENBQ3ZDLElBQU10QyxDQUFBQSxDQUFNa0UsRUFBUTVCLENBQUMsQ0FBQSxDQUNyQixHQUFJdEMsQ0FBQUEsQ0FBSSx1QkFBd0JpRSxDQUFBQSxDQUFLLElBQU0sSUFBSyxDQUFBLDJCQUFBLENBQzlDLE9BQU9qRSxDQUVYLENBQ0YsRUFRSSxrQkFBcUIsQ0FBQSxTQUFTaUUsRUFBTzVDLENBQU9qQixDQUFBQSxDQUFBQSxDQUFRLENBQ3RELElBQU04RCxDQUFBQSxDQUFVLGFBQWEsV0FBWUQsQ0FBQUEsQ0FBQUEsQ0FBTzdELENBQU0sQ0FBQyxDQUFBLENBQUUsaUJBQWlCaUIsQ0FBSyxDQUFBLENBQy9FLFFBQVNpQixDQUFJNEIsQ0FBQUEsQ0FBQUEsQ0FBUSxPQUFTLENBQUc1QixDQUFBQSxDQUFBQSxFQUFLLEVBQUdBLENBQUssRUFBQSxDQUFBLENBQzVDLElBQU10QyxDQUFNa0UsQ0FBQUEsQ0FBQUEsQ0FBUTVCLENBQUMsQ0FDckIsQ0FBQSxHQUFJdEMsRUFBSSx1QkFBd0JpRSxDQUFBQSxDQUFLLElBQU0sSUFBSyxDQUFBLDJCQUFBLENBQzlDLE9BQU9qRSxDQUVYLENBQ0YsRUFPQSxTQUFTLGdCQUFBLENBQWlCd0QsRUFBZXJDLENBQVUsQ0FBQSxDQUNqRCxPQUFJLE9BQU9xQyxDQUFBQSxFQUFrQixTQUNwQixtQkFBb0JBLENBQUFBLENBQUFBLENBQWVyQyxDQUFRLENBQUUsQ0FBQSxDQUFDLEVBRTlDLG1CQUFvQixDQUFBLFdBQUEsR0FBYyxJQUFNcUMsQ0FBQUEsQ0FBYSxFQUFFLENBQUMsQ0FFbkUsQ0FRQSxTQUFTLGFBQUEsQ0FBY0EsRUFBZVcsQ0FBUyxDQUFBLENBQzdDLE9BQUksT0FBT1gsQ0FBQUEsRUFBa0IsU0FDcEIsSUFBSyxDQUFBLFlBQUEsQ0FBYVcsQ0FBTyxDQUFLLEVBQUEsUUFBQSxDQUFVWCxDQUFhLENBRXJEQSxDQUFBQSxDQUVYLENBbUJBLFNBQVMsZ0JBQUEsQ0FBaUJZLENBQU1DLENBQUFBLENBQUFBLENBQU1DLENBQU0sQ0FBQSxDQUMxQyxPQUFJLFVBQVdELENBQUFBLENBQUksRUFDVixDQUNMLE1BQUEsQ0FBUSxhQUFjLENBQUEsSUFBQSxDQUN0QixNQUFPLFFBQVNELENBQUFBLENBQUksRUFDcEIsUUFBVUMsQ0FBQUEsQ0FDWixFQUVPLENBQ0wsTUFBQSxDQUFRLGNBQWNELENBQUksQ0FBQSxDQUMxQixNQUFPLFFBQVNDLENBQUFBLENBQUksRUFDcEIsUUFBVUMsQ0FBQUEsQ0FDWixDQUVKLENBWUEsU0FBUyxxQkFBcUJGLENBQU1DLENBQUFBLENBQUFBLENBQU1DLEVBQU0sQ0FDOUMsT0FBQSxLQUFBLENBQU0sVUFBVyxDQUNmLElBQU1DLEVBQVksZ0JBQWlCSCxDQUFBQSxDQUFBQSxDQUFNQyxFQUFNQyxDQUFJLENBQUEsQ0FDbkRDLENBQVUsQ0FBQSxNQUFBLENBQU8sZ0JBQWlCQSxDQUFBQSxDQUFBQSxDQUFVLE1BQU9BLENBQVUsQ0FBQSxRQUFRLEVBQ3ZFLENBQUMsQ0FBQSxDQUNTLFdBQVdGLENBQUksQ0FBQSxDQUNkQSxFQUFPQyxDQUNwQixDQVlBLFNBQVMsdUJBQXdCRixDQUFBQSxDQUFBQSxDQUFNQyxFQUFNQyxDQUFNLENBQUEsQ0FDakQsYUFBTSxVQUFXLENBQ2YsSUFBTUMsQ0FBWSxDQUFBLGdCQUFBLENBQWlCSCxFQUFNQyxDQUFNQyxDQUFBQSxDQUFJLEVBQ25EQyxDQUFVLENBQUEsTUFBQSxDQUFPLG9CQUFvQkEsQ0FBVSxDQUFBLEtBQUEsQ0FBT0EsRUFBVSxRQUFRLEVBQzFFLENBQUMsQ0FDTSxDQUFBLFVBQUEsQ0FBV0YsQ0FBSSxDQUFJQSxDQUFBQSxDQUFBQSxDQUFPQyxDQUNuQyxDQU1BLElBQU0sU0FBWSxDQUFBLFdBQUEsRUFBYyxDQUFBLGFBQUEsQ0FBYyxRQUFRLENBTXRELENBQUEsU0FBUyxxQkFBcUJ0RSxDQUFLd0UsQ0FBQUEsQ0FBQUEsQ0FBVSxDQUMzQyxJQUFNQyxDQUFBQSxDQUFhLHlCQUF5QnpFLENBQUt3RSxDQUFBQSxDQUFRLEVBQ3pELEdBQUlDLENBQUFBLENBQVksQ0FDZCxHQUFJQSxDQUFBQSxHQUFlLE9BQ2pCLE9BQU8sQ0FBQyxnQkFBZ0J6RSxDQUFLd0UsQ0FBQUEsQ0FBUSxDQUFDLENBQ2pDLENBQUEsQ0FDTCxJQUFNRSxDQUFTLENBQUEsbUJBQUEsQ0FBb0IxRSxFQUFLeUUsQ0FBVSxDQUFBLENBQ2xELE9BQUlDLENBQU8sQ0FBQSxNQUFBLEdBQVcsR0FDcEIsUUFBUyxDQUFBLGdCQUFBLENBQW1CRCxFQUFhLE9BQVVELENBQUFBLENBQUFBLENBQVcsdUJBQXVCLENBQzlFLENBQUEsQ0FBQyxTQUFTLENBRVZFLEVBQUFBLENBRVgsQ0FDRixDQUNGLENBT0EsU0FBUyxlQUFnQjFFLENBQUFBLENBQUFBLENBQUsyRSxFQUFXLENBQ3ZDLE9BQU8sVUFBVSxlQUFnQjNFLENBQUFBLENBQUFBLENBQUssU0FBU0EsQ0FBSyxDQUFBLENBQ2xELE9BQU8saUJBQWtCLENBQUEsU0FBQSxDQUFVQSxDQUFHLENBQUcyRSxDQUFBQSxDQUFTLEdBQUssSUFDekQsQ0FBQyxDQUFDLENBQ0osQ0FNQSxTQUFTLFNBQVUzRSxDQUFBQSxDQUFBQSxDQUFLLENBQ3RCLElBQU00RSxDQUFBQSxDQUFZLHlCQUF5QjVFLENBQUssQ0FBQSxXQUFXLEVBQzNELE9BQUk0RSxDQUFBQSxDQUNFQSxJQUFjLE1BQ1QsQ0FBQSxlQUFBLENBQWdCNUUsRUFBSyxXQUFXLENBQUEsQ0FFaEMsZ0JBQWlCQSxDQUFBQSxDQUFBQSxDQUFLNEUsQ0FBUyxDQUFBLENBRzNCLGdCQUFnQjVFLENBQUcsQ0FBQSxDQUN2QixRQUNBLFdBQVksRUFBQSxDQUFFLEtBRWRBLENBR2IsQ0FNQSxTQUFTLHFCQUFzQk8sQ0FBQUEsQ0FBQUEsQ0FBTSxDQUNuQyxJQUFNc0UsQ0FBQUEsQ0FBcUIsS0FBSyxNQUFPLENBQUEsa0JBQUEsQ0FDdkMsUUFBU3ZDLENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUl1QyxDQUFtQixDQUFBLE1BQUEsQ0FBUXZDLElBQzdDLEdBQUkvQixDQUFBQSxHQUFTc0UsRUFBbUJ2QyxDQUFDLENBQUEsQ0FDL0IsT0FBTyxDQUdYLENBQUEsQ0FBQSxPQUFPLEVBQ1QsQ0FNQSxTQUFTLGdCQUFnQndDLENBQVNDLENBQUFBLENBQUFBLENBQVcsQ0FDM0MsT0FBUUQsQ0FBQUEsQ0FBQUEsQ0FBUSxXQUFZLFNBQVNwRCxDQUFBQSxDQUFNLENBQ3JDLENBQUNxRCxDQUFVLENBQUEsWUFBQSxDQUFhckQsRUFBSyxJQUFJLENBQUEsRUFBSyxzQkFBc0JBLENBQUssQ0FBQSxJQUFJLEdBQ3ZFb0QsQ0FBUSxDQUFBLGVBQUEsQ0FBZ0JwRCxFQUFLLElBQUksRUFFckMsQ0FBQyxDQUNELENBQUEsT0FBQSxDQUFRcUQsRUFBVSxVQUFZLENBQUEsU0FBU3JELEVBQU0sQ0FDdkMscUJBQUEsQ0FBc0JBLEVBQUssSUFBSSxDQUFBLEVBQ2pDb0QsRUFBUSxZQUFhcEQsQ0FBQUEsQ0FBQUEsQ0FBSyxLQUFNQSxDQUFLLENBQUEsS0FBSyxFQUU5QyxDQUFDLEVBQ0gsQ0FPQSxTQUFTLFlBQUEsQ0FBYXNELEVBQVdDLENBQVEsQ0FBQSxDQUN2QyxJQUFNQyxDQUFhLENBQUEsYUFBQSxDQUFjRCxDQUFNLENBQ3ZDLENBQUEsSUFBQSxJQUFTM0MsQ0FBSSxDQUFBLENBQUEsQ0FBR0EsQ0FBSTRDLENBQUFBLENBQUFBLENBQVcsT0FBUTVDLENBQUssRUFBQSxDQUFBLENBQzFDLElBQU02QyxDQUFZRCxDQUFBQSxDQUFBQSxDQUFXNUMsQ0FBQyxDQUM5QixDQUFBLEdBQUksQ0FDRixHQUFJNkMsQ0FBQUEsQ0FBVSxhQUFhSCxDQUFTLENBQUEsQ0FDbEMsT0FBTyxDQUVYLENBQUEsQ0FBQSxNQUFTOUQsRUFBRyxDQUNWLFFBQUEsQ0FBU0EsQ0FBQyxFQUNaLENBQ0YsQ0FDQSxPQUFPOEQsQ0FBQUEsR0FBYyxXQUN2QixDQVFBLFNBQVMsUUFBUUksQ0FBVUMsQ0FBQUEsQ0FBQUEsQ0FBWUMsRUFBWSxDQUNqRCxJQUFJbkUsRUFBVyxHQUFNLENBQUEsZUFBQSxDQUFnQmtFLEVBQVksSUFBSSxDQUFBLENBRWpETCxFQUFZLFdBQ1pJLENBQUFBLENBQUFBLEdBQWEsTUFFTkEsR0FBQUEsQ0FBQUEsQ0FBUyxPQUFRLENBQUEsR0FBRyxFQUFJLENBQ2pDSixFQUFBQSxDQUFBQSxDQUFZSSxFQUFTLE1BQU8sQ0FBQSxDQUFBLENBQUdBLEVBQVMsT0FBUSxDQUFBLEdBQUcsQ0FBQyxDQUNwRGpFLENBQUFBLENBQUFBLENBQVdpRSxFQUFTLE1BQU9BLENBQUFBLENBQUFBLENBQVMsUUFBUSxHQUFHLENBQUEsQ0FBSSxFQUFHQSxDQUFTLENBQUEsTUFBTSxHQUVyRUosQ0FBWUksQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FHZCxJQUFNRyxDQUFVLENBQUEsV0FBQSxHQUFjLGdCQUFpQnBFLENBQUFBLENBQVEsRUFDdkQsT0FBSW9FLENBQUFBLEVBQ0YsUUFDRUEsQ0FDQSxDQUFBLFNBQVNOLEVBQVEsQ0FDZixJQUFJMUQsRUFDRWlFLENBQWtCSCxDQUFBQSxDQUFBQSxDQUFXLFVBQVUsQ0FBSSxDQUFBLENBQUEsQ0FDakQ5RCxDQUFXLENBQUEsV0FBQSxFQUFjLENBQUEsc0JBQUEsR0FDekJBLENBQVMsQ0FBQSxXQUFBLENBQVlpRSxDQUFlLENBQy9CLENBQUEsWUFBQSxDQUFhUixFQUFXQyxDQUFNLENBQUEsR0FDakMxRCxFQUFXLFlBQWFpRSxDQUFBQSxDQUFlLEdBR3pDLElBQU1DLENBQUFBLENBQW9CLENBQUUsVUFBWSxDQUFBLENBQUEsQ0FBQSxDQUFNLE9BQUFSLENBQVEsQ0FBQSxRQUFBLENBQUExRCxDQUFTLENBQzFELENBQUEsWUFBQSxDQUFhMEQsRUFBUSxvQkFBc0JRLENBQUFBLENBQWlCLElBRWpFUixDQUFTUSxDQUFBQSxDQUFBQSxDQUFrQixPQUN2QkEsQ0FBa0IsQ0FBQSxVQUFBLEVBQ3BCLGNBQWNULENBQVdDLENBQUFBLENBQUFBLENBQVFBLEVBQVExRCxDQUFVK0QsQ0FBQUEsQ0FBVSxFQUUvRCxPQUFRQSxDQUFBQSxDQUFBQSxDQUFXLEtBQU0sU0FBU3RGLENBQUFBLENBQUssQ0FDckMsWUFBQSxDQUFhQSxDQUFLLENBQUEsbUJBQUEsQ0FBcUJ5RixDQUFpQixFQUMxRCxDQUFDLEdBQ0gsQ0FDRixDQUFBLENBQ0FKLEVBQVcsVUFBVyxDQUFBLFdBQUEsQ0FBWUEsQ0FBVSxDQUU1Q0EsR0FBQUEsQ0FBQUEsQ0FBVyxXQUFXLFdBQVlBLENBQUFBLENBQVUsRUFDNUMsaUJBQWtCLENBQUEsV0FBQSxHQUFjLElBQU0sQ0FBQSx1QkFBQSxDQUF5QixDQUFFLE9BQVNBLENBQUFBLENBQVcsQ0FBQyxDQUVqRkQsQ0FBQUEsQ0FBQUEsQ0FDVCxDQUtBLFNBQVMsdUJBQUEsQ0FBd0I3RCxFQUFVLENBQ3pDLE9BQUEsQ0FBUSxRQUFRQSxDQUFVLENBQUEsbUNBQW1DLEVBQUcsU0FBU21FLENBQUFBLENBQWMsQ0FDckYsSUFBTUMsQ0FBQUEsQ0FBSyxrQkFBa0JELENBQWMsQ0FBQSxJQUFJLENBQ3pDRSxDQUFBQSxDQUFBQSxDQUFTLFdBQVksRUFBQSxDQUFFLGVBQWVELENBQUUsQ0FBQSxDQUMxQ0MsR0FBVSxJQUNaRixFQUFBQSxDQUFBQSxDQUFhLFdBQVcsWUFBYUUsQ0FBQUEsQ0FBQUEsQ0FBUUYsQ0FBWSxFQUU3RCxDQUFDLEVBQ0gsQ0FPQSxTQUFTLGlCQUFpQkcsQ0FBWXRFLENBQUFBLENBQUFBLENBQVUrRCxFQUFZLENBQzFELE9BQUEsQ0FBUS9ELEVBQVMsZ0JBQWlCLENBQUEsTUFBTSxFQUFHLFNBQVN1RSxDQUFBQSxDQUFTLENBQzNELElBQU1ILENBQUFBLENBQUssZ0JBQWdCRyxDQUFTLENBQUEsSUFBSSxFQUN4QyxHQUFJSCxDQUFBQSxFQUFNQSxFQUFHLE1BQVMsQ0FBQSxDQUFBLENBQUcsQ0FDdkIsSUFBTUksQ0FBQUEsQ0FBZUosRUFBRyxPQUFRLENBQUEsR0FBQSxDQUFLLEtBQUssQ0FDcENLLENBQUFBLENBQUFBLENBQWdCRixFQUFRLE9BQVEsQ0FBQSxPQUFBLENBQVEsSUFBSyxLQUFLLENBQUEsQ0FDbERHLEVBQVksWUFBYUosQ0FBQUEsQ0FBVSxFQUNuQ0ssQ0FBVUQsQ0FBQUEsQ0FBQUEsRUFBYUEsRUFBVSxhQUFjRCxDQUFBQSxDQUFBQSxDQUFnQixRQUFVRCxDQUFlLENBQUEsSUFBSSxFQUNsRyxHQUFJRyxDQUFBQSxFQUFXQSxJQUFZRCxDQUFXLENBQUEsQ0FDcEMsSUFBTUUsQ0FBZ0JMLENBQUFBLENBQUFBLENBQVEsV0FDOUIsQ0FBQSxlQUFBLENBQWdCQSxFQUFTSSxDQUFPLENBQUEsQ0FDaENaLEVBQVcsS0FBTSxDQUFBLElBQUEsQ0FBSyxVQUFXLENBQy9CLGVBQUEsQ0FBZ0JRLEVBQVNLLENBQWEsRUFDeEMsQ0FBQyxFQUNILENBQ0YsQ0FDRixDQUFDLEVBQ0gsQ0FNQSxTQUFTLGdCQUFpQnRDLENBQUFBLENBQUFBLENBQU8sQ0FDL0IsT0FBTyxVQUFXLENBQ2hCLHNCQUF1QkEsQ0FBQUEsQ0FBQUEsQ0FBTyxLQUFLLE1BQU8sQ0FBQSxVQUFVLEVBQ3BELFdBQVksQ0FBQSxTQUFBLENBQVVBLENBQUssQ0FBQyxDQUFBLENBQzVCLGFBQWEsWUFBYUEsQ0FBQUEsQ0FBSyxDQUFDLENBQ2hDLENBQUEsWUFBQSxDQUFhQSxFQUFPLFdBQVcsRUFDakMsQ0FDRixDQUtBLFNBQVMsYUFBYUEsQ0FBTyxDQUFBLENBQzNCLElBQU11QyxDQUFZLENBQUEsYUFBQSxDQUNaQyxFQUFpQixhQUFjLENBQUEsT0FBQSxDQUFReEMsRUFBT3VDLENBQVMsQ0FBQSxDQUFJdkMsRUFBUUEsQ0FBTSxDQUFBLGFBQUEsQ0FBY3VDLENBQVMsQ0FBQyxDQUVyR0MsQ0FBQUEsQ0FBQUEsRUFBZSxRQUVuQixDQVFBLFNBQVMsaUJBQWtCUixDQUFBQSxDQUFBQSxDQUFZUyxFQUFjL0UsQ0FBVStELENBQUFBLENBQUFBLENBQVksQ0FFekUsSUFEQSxnQkFBQSxDQUFpQk8sRUFBWXRFLENBQVUrRCxDQUFBQSxDQUFVLEVBQzFDL0QsQ0FBUyxDQUFBLFVBQUEsQ0FBVyxPQUFTLENBQUcsRUFBQSxDQUNyQyxJQUFNc0MsQ0FBUXRDLENBQUFBLENBQUFBLENBQVMsV0FDdkIsaUJBQWtCLENBQUEsU0FBQSxDQUFVc0MsQ0FBSyxDQUFHLENBQUEsSUFBQSxDQUFLLE9BQU8sVUFBVSxDQUFBLENBQzFEZ0MsRUFBVyxZQUFhaEMsQ0FBQUEsQ0FBQUEsQ0FBT3lDLENBQVksQ0FDdkN6QyxDQUFBQSxDQUFBQSxDQUFNLFdBQWEsSUFBSyxDQUFBLFNBQUEsRUFBYUEsRUFBTSxRQUFhLEdBQUEsSUFBQSxDQUFLLFlBQy9EeUIsRUFBQUEsQ0FBQUEsQ0FBVyxLQUFNLENBQUEsSUFBQSxDQUFLLGlCQUFpQnpCLENBQUssQ0FBQyxFQUVqRCxDQUNGLENBU0EsU0FBUyxVQUFXMEMsQ0FBQUEsQ0FBQUEsQ0FBUUMsRUFBTSxDQUNoQyxJQUFJQyxFQUFPLENBQ1gsQ0FBQSxLQUFPQSxFQUFPRixDQUFPLENBQUEsTUFBQSxFQUNuQkMsR0FBUUEsQ0FBUSxFQUFBLENBQUEsRUFBS0EsRUFBT0QsQ0FBTyxDQUFBLFVBQUEsQ0FBV0UsR0FBTSxDQUFJLENBQUEsQ0FBQSxDQUUxRCxPQUFPRCxDQUNULENBTUEsU0FBUyxhQUFjeEcsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUMxQixJQUFJd0csQ0FBQUEsQ0FBTyxFQUVYLEdBQUl4RyxDQUFBQSxDQUFJLFdBQ04sSUFBU3NDLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSXRDLENBQUFBLENBQUFBLENBQUksV0FBVyxNQUFRc0MsQ0FBQUEsQ0FBQUEsRUFBQUEsQ0FBSyxDQUM5QyxJQUFNcUMsQ0FBQUEsQ0FBWTNFLEVBQUksVUFBV3NDLENBQUFBLENBQUMsRUFDOUJxQyxDQUFVLENBQUEsS0FBQSxHQUNaNkIsRUFBTyxVQUFXN0IsQ0FBQUEsQ0FBQUEsQ0FBVSxLQUFNNkIsQ0FBSSxDQUFBLENBQ3RDQSxFQUFPLFVBQVc3QixDQUFBQSxDQUFBQSxDQUFVLE1BQU82QixDQUFJLENBQUEsRUFFM0MsQ0FFRixPQUFPQSxDQUNULENBS0EsU0FBUyxnQkFBQSxDQUFpQnhHLEVBQUssQ0FDN0IsSUFBTTBHLEVBQWUsZUFBZ0IxRyxDQUFBQSxDQUFHLEVBQ3hDLEdBQUkwRyxDQUFBQSxDQUFhLFdBQVksQ0FDM0IsSUFBQSxJQUFTcEUsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJb0UsRUFBYSxVQUFXLENBQUEsTUFBQSxDQUFRcEUsQ0FBSyxFQUFBLENBQUEsQ0FDdkQsSUFBTXFFLENBQUFBLENBQWNELEVBQWEsVUFBV3BFLENBQUFBLENBQUMsRUFDN0MsdUJBQXdCdEMsQ0FBQUEsQ0FBQUEsQ0FBSzJHLEVBQVksS0FBT0EsQ0FBQUEsQ0FBQUEsQ0FBWSxRQUFRLEVBQ3RFLENBQ0EsT0FBT0QsQ0FBYSxDQUFBLFdBQ3RCLENBQ0YsQ0FLQSxTQUFTLFdBQVdFLENBQVMsQ0FBQSxDQUMzQixJQUFNRixDQUFlLENBQUEsZUFBQSxDQUFnQkUsQ0FBTyxDQUN4Q0YsQ0FBQUEsQ0FBQUEsQ0FBYSxTQUNmLFlBQWFBLENBQUFBLENBQUFBLENBQWEsT0FBTyxDQUUvQkEsQ0FBQUEsQ0FBQUEsQ0FBYSxlQUNmLE9BQVFBLENBQUFBLENBQUFBLENBQWEsY0FBZSxTQUFTRyxDQUFBQSxDQUFNLENBQzdDQSxDQUFLLENBQUEsRUFBQSxFQUNQLHdCQUF3QkEsQ0FBSyxDQUFBLEVBQUEsQ0FBSUEsQ0FBSyxDQUFBLE9BQUEsQ0FBU0EsQ0FBSyxDQUFBLFFBQVEsRUFFaEUsQ0FBQyxDQUFBLENBRUgsaUJBQWlCRCxDQUFPLENBQUEsQ0FDeEIsUUFBUSxNQUFPLENBQUEsSUFBQSxDQUFLRixDQUFZLENBQUcsQ0FBQSxTQUFTM0QsRUFBSyxDQUFFLE9BQU8yRCxFQUFhM0QsQ0FBRyxFQUFFLENBQUMsRUFDL0UsQ0FLQSxTQUFTLGNBQWU2RCxDQUFBQSxDQUFBQSxDQUFTLENBQy9CLFlBQWFBLENBQUFBLENBQUFBLENBQVMsMkJBQTJCLENBQ2pELENBQUEsVUFBQSxDQUFXQSxDQUFPLENBR2RBLENBQUFBLENBQUFBLENBQVEsVUFFVixPQUFRQSxDQUFBQSxDQUFBQSxDQUFRLFNBQVUsU0FBUy9DLENBQUFBLENBQU8sQ0FBRSxjQUFlQSxDQUFBQSxDQUFLLEVBQUUsQ0FBQyxFQUV2RSxDQU9BLFNBQVMsYUFBY29CLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBWSxDQUFBLENBQ25ELEdBQUlMLENBQWtCLFlBQUEsT0FBQSxFQUFXQSxFQUFPLE9BQVksR0FBQSxNQUFBLENBQ2xELE9BQU8sYUFBY0EsQ0FBQUEsQ0FBQUEsQ0FBUTFELEVBQVUrRCxDQUFVLENBQUEsQ0FHbkQsSUFBSXdCLENBQ0VDLENBQUFBLENBQUFBLENBQXNCOUIsRUFBTyxlQVVuQyxDQUFBLElBVEEsa0JBQWtCLFNBQVVBLENBQUFBLENBQU0sRUFBR0EsQ0FBUTFELENBQUFBLENBQUFBLENBQVUrRCxDQUFVLENBQzdEeUIsQ0FBQUEsQ0FBQUEsRUFBdUIsS0FDekJELENBQVMsQ0FBQSxTQUFBLENBQVU3QixDQUFNLENBQUUsQ0FBQSxVQUFBLENBRTNCNkIsRUFBU0MsQ0FBb0IsQ0FBQSxXQUFBLENBRS9CekIsRUFBVyxJQUFPQSxDQUFBQSxDQUFBQSxDQUFXLEtBQUssTUFBTyxDQUFBLFNBQVNwRSxFQUFHLENBQUUsT0FBT0EsSUFBTStELENBQU8sQ0FBQyxFQUdyRTZCLENBQVVBLEVBQUFBLENBQUFBLEdBQVc3QixHQUN0QjZCLENBQWtCLFlBQUEsT0FBQSxFQUNwQnhCLEVBQVcsSUFBSyxDQUFBLElBQUEsQ0FBS3dCLENBQU0sQ0FFN0JBLENBQUFBLENBQUFBLENBQVNBLEVBQU8sV0FFbEIsQ0FBQSxjQUFBLENBQWU3QixDQUFNLENBQ2pCQSxDQUFBQSxDQUFBQSxZQUFrQixRQUNwQkEsQ0FBTyxDQUFBLE1BQUEsR0FFUEEsQ0FBTyxDQUFBLFVBQUEsQ0FBVyxZQUFZQSxDQUFNLEVBRXhDLENBT0EsU0FBUyxjQUFBLENBQWVBLEVBQVExRCxDQUFVK0QsQ0FBQUEsQ0FBQUEsQ0FBWSxDQUNwRCxPQUFPLGlCQUFBLENBQWtCTCxFQUFRQSxDQUFPLENBQUEsVUFBQSxDQUFZMUQsRUFBVStELENBQVUsQ0FDMUUsQ0FPQSxTQUFTLGVBQWdCTCxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVksQ0FBQSxDQUNyRCxPQUFPLGlCQUFrQixDQUFBLFNBQUEsQ0FBVUwsQ0FBTSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVUsQ0FDMUUsQ0FPQSxTQUFTLGFBQUEsQ0FBY0wsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFBQSxDQUFZLENBQ25ELE9BQU8saUJBQUEsQ0FBa0JMLEVBQVEsSUFBTTFELENBQUFBLENBQUFBLENBQVUrRCxDQUFVLENBQzdELENBT0EsU0FBUyxZQUFhTCxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVksQ0FBQSxDQUNsRCxPQUFPLGlCQUFrQixDQUFBLFNBQUEsQ0FBVUwsQ0FBTSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFPLFlBQWExRCxDQUFVK0QsQ0FBQUEsQ0FBVSxDQUN0RixDQUtBLFNBQVMsVUFBV0wsQ0FBQUEsQ0FBQUEsQ0FBUSxDQUMxQixPQUFBLGNBQUEsQ0FBZUEsQ0FBTSxDQUNkLENBQUEsU0FBQSxDQUFVQSxDQUFNLENBQUUsQ0FBQSxXQUFBLENBQVlBLENBQU0sQ0FDN0MsQ0FPQSxTQUFTLGFBQWNBLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBWSxDQUFBLENBQ25ELElBQU0wQixDQUFhL0IsQ0FBQUEsQ0FBQUEsQ0FBTyxXQUUxQixHQURBLGlCQUFBLENBQWtCQSxFQUFRK0IsQ0FBWXpGLENBQUFBLENBQUFBLENBQVUrRCxDQUFVLENBQ3REMEIsQ0FBQUEsQ0FBQUEsQ0FBWSxDQUNkLEtBQU9BLENBQUFBLENBQVcsYUFDaEIsY0FBZUEsQ0FBQUEsQ0FBQUEsQ0FBVyxXQUFXLENBQ3JDL0IsQ0FBQUEsQ0FBQUEsQ0FBTyxZQUFZK0IsQ0FBVyxDQUFBLFdBQVcsRUFFM0MsY0FBZUEsQ0FBQUEsQ0FBVSxFQUN6Qi9CLENBQU8sQ0FBQSxXQUFBLENBQVkrQixDQUFVLEVBQy9CLENBQ0YsQ0FTQSxTQUFTLGFBQWNoQyxDQUFBQSxDQUFBQSxDQUFXaEYsRUFBS2lGLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsRUFBWSxDQUNuRSxPQUFRTixHQUNOLElBQUssT0FDSCxPQUNGLElBQUssWUFDSCxhQUFjQyxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVUsQ0FBQSxDQUMxQyxPQUNGLElBQUssWUFBQSxDQUNILGVBQWVMLENBQVExRCxDQUFBQSxDQUFBQSxDQUFVK0QsQ0FBVSxDQUMzQyxDQUFBLE9BQ0YsSUFBSyxhQUNILENBQUEsZUFBQSxDQUFnQkwsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFVLEVBQzVDLE9BQ0YsSUFBSyxZQUNILGFBQWNMLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBVSxDQUFBLENBQzFDLE9BQ0YsSUFBSyxVQUNILENBQUEsWUFBQSxDQUFhTCxFQUFRMUQsQ0FBVStELENBQUFBLENBQVUsRUFDekMsT0FDRixJQUFLLFNBQ0gsVUFBV0wsQ0FBQUEsQ0FBTSxFQUNqQixPQUNGLFFBQ0UsSUFBSUMsQ0FBYSxDQUFBLGFBQUEsQ0FBY2xGLENBQUcsQ0FDbEMsQ0FBQSxJQUFBLElBQVNzQyxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUk0QyxFQUFXLE1BQVE1QyxDQUFBQSxDQUFBQSxFQUFBQSxDQUFLLENBQzFDLElBQU0yRSxDQUFBQSxDQUFNL0IsRUFBVzVDLENBQUMsQ0FBQSxDQUN4QixHQUFJLENBQ0YsSUFBTTRFLEVBQWNELENBQUksQ0FBQSxVQUFBLENBQVdqQyxFQUFXQyxDQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FDMUUsQ0FBQSxHQUFJNEIsRUFBYSxDQUNmLEdBQUksS0FBTSxDQUFBLE9BQUEsQ0FBUUEsQ0FBVyxDQUFBLENBRTNCLFFBQVNDLENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUlELENBQVksQ0FBQSxNQUFBLENBQVFDLElBQUssQ0FDM0MsSUFBTXRELEVBQVFxRCxDQUFZQyxDQUFBQSxDQUFDLEVBQ3ZCdEQsQ0FBTSxDQUFBLFFBQUEsR0FBYSxLQUFLLFNBQWFBLEVBQUFBLENBQUFBLENBQU0sV0FBYSxJQUFLLENBQUEsWUFBQSxFQUMvRHlCLEVBQVcsS0FBTSxDQUFBLElBQUEsQ0FBSyxpQkFBaUJ6QixDQUFLLENBQUMsRUFFakQsQ0FFRixNQUNGLENBQ0YsQ0FBUzNDLE1BQUFBLENBQUFBLENBQUcsQ0FDVixRQUFTQSxDQUFBQSxDQUFDLEVBQ1osQ0FDRixDQUNJOEQsSUFBYyxXQUNoQixDQUFBLGFBQUEsQ0FBY0MsRUFBUTFELENBQVUrRCxDQUFBQSxDQUFVLENBRTFDLENBQUEsYUFBQSxDQUFjLElBQUssQ0FBQSxNQUFBLENBQU8saUJBQWtCdEYsQ0FBS2lGLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBVSxFQUVuRixDQUNGLENBTUEsU0FBUyx1QkFBdUIvRCxDQUFVK0QsQ0FBQUEsQ0FBQUEsQ0FBWSxDQUNwRCxJQUFJOEIsQ0FBQUEsQ0FBVSxRQUFRN0YsQ0FBVSxDQUFBLG1DQUFtQyxFQUNuRSxPQUFRNkYsT0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBUyxTQUFTL0IsQ0FBWSxDQUFBLENBQ3BDLEdBQUksSUFBSyxDQUFBLE1BQUEsQ0FBTyxxQkFBdUJBLENBQVcsQ0FBQSxhQUFBLEdBQWtCLEtBQU0sQ0FDeEUsSUFBTUQsRUFBVyxpQkFBa0JDLENBQUFBLENBQUFBLENBQVksYUFBYSxDQUN4REQsQ0FBQUEsQ0FBQUEsRUFBWSxNQUNkLE9BQVFBLENBQUFBLENBQUFBLENBQVVDLEVBQVlDLENBQVUsRUFFNUMsQ0FDRUQsS0FBQUEsQ0FBQUEsQ0FBVyxlQUFnQixDQUFBLGFBQWEsRUFDeENBLENBQVcsQ0FBQSxlQUFBLENBQWdCLGtCQUFrQixFQUVqRCxDQUFDLEVBQ00rQixDQUFRLENBQUEsTUFBQSxDQUFTLENBQzFCLENBVUEsU0FBUyxLQUFLbkMsQ0FBUW9DLENBQUFBLENBQUFBLENBQVNDLEVBQVVDLENBQWEsQ0FBQSxDQUMvQ0EsSUFDSEEsQ0FBYyxDQUFBLElBR2hCdEMsQ0FBUyxDQUFBLGFBQUEsQ0FBY0EsQ0FBTSxDQUc3QixDQUFBLElBQU11QyxFQUFZLFFBQVMsQ0FBQSxhQUFBLENBQ3ZCQyxFQUFnQixFQUFDLENBQ3JCLEdBQUksQ0FDRkEsQ0FBQUEsQ0FBZ0IsQ0FDZCxHQUFLRCxDQUFBQSxDQUFBQSxDQUVMLE1BQU9BLENBQVlBLENBQUFBLENBQUFBLENBQVUsZUFBaUIsSUFFOUMsQ0FBQSxHQUFBLENBQUtBLEVBQVlBLENBQVUsQ0FBQSxZQUFBLENBQWUsSUFDNUMsRUFDRixDQUFBLEtBQVksRUFHWixJQUFNbEMsRUFBYSxjQUFlTCxDQUFBQSxDQUFNLEVBR3hDLEdBQUlxQyxDQUFBQSxDQUFTLFlBQWMsYUFDekJyQyxDQUFBQSxDQUFBQSxDQUFPLFlBQWNvQyxDQUVoQixDQUFBLEtBQUEsQ0FDTCxJQUFJOUYsQ0FBVyxDQUFBLFlBQUEsQ0FBYThGLENBQU8sQ0FLbkMsQ0FBQSxHQUhBL0IsRUFBVyxLQUFRL0QsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUd4QmdHLENBQVksQ0FBQSxTQUFBLENBQVcsQ0FDekIsSUFBTUcsQ0FBQUEsQ0FBa0JILEVBQVksU0FBVSxDQUFBLEtBQUEsQ0FBTSxHQUFHLENBQ3ZELENBQUEsSUFBQSxJQUFTakYsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJb0YsRUFBZ0IsTUFBUXBGLENBQUFBLENBQUFBLEVBQUFBLENBQUssQ0FDL0MsSUFBTXFGLENBQWlCRCxDQUFBQSxDQUFBQSxDQUFnQnBGLENBQUMsQ0FBRSxDQUFBLEtBQUEsQ0FBTSxJQUFLLENBQUMsQ0FBQSxDQUNsRHFELEVBQUtnQyxDQUFlLENBQUEsQ0FBQyxFQUFFLElBQUssRUFBQSxDQUM1QmhDLEVBQUcsT0FBUSxDQUFBLEdBQUcsSUFBTSxDQUN0QkEsR0FBQUEsQ0FBQUEsQ0FBS0EsRUFBRyxTQUFVLENBQUEsQ0FBQyxHQUVyQixJQUFNUCxDQUFBQSxDQUFXdUMsRUFBZSxDQUFDLENBQUEsRUFBSyxPQUNoQ3RDLENBQWE5RCxDQUFBQSxDQUFBQSxDQUFTLGNBQWMsR0FBTW9FLENBQUFBLENBQUUsRUFDOUNOLENBQ0YsRUFBQSxPQUFBLENBQVFELEVBQVVDLENBQVlDLENBQUFBLENBQVUsRUFFNUMsQ0FDRixDQVdBLEdBVEEsc0JBQXVCL0QsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FBQSxDQUMzQyxPQUFRLENBQUEsT0FBQSxDQUFRL0QsRUFBVSxVQUFVLENBQUEsQ0FBK0MsU0FBU3FHLENBQVUsQ0FBQSxDQUNoRyx1QkFBdUJBLENBQVMsQ0FBQSxPQUFBLENBQVN0QyxDQUFVLENBRXJEc0MsRUFBQUEsQ0FBQUEsQ0FBUyxTQUViLENBQUMsRUFHR0wsQ0FBWSxDQUFBLE1BQUEsQ0FBUSxDQUN0QixJQUFNTSxDQUFBQSxDQUFjLGFBQWMsQ0FBQSxzQkFBQSxHQUNsQyxPQUFRdEcsQ0FBQUEsQ0FBQUEsQ0FBUyxpQkFBaUJnRyxDQUFZLENBQUEsTUFBTSxFQUFHLFNBQVMzRCxDQUFBQSxDQUFNLENBQ3BFaUUsQ0FBWSxDQUFBLFdBQUEsQ0FBWWpFLENBQUksRUFDOUIsQ0FBQyxFQUNEckMsQ0FBV3NHLENBQUFBLEVBQ2IsQ0FDQSx1QkFBd0J0RyxDQUFBQSxDQUFRLENBQ2hDLENBQUEsYUFBQSxDQUFjK0YsQ0FBUyxDQUFBLFNBQUEsQ0FBV0MsRUFBWSxjQUFnQnRDLENBQUFBLENBQUFBLENBQVExRCxFQUFVK0QsQ0FBVSxFQUM1RixDQUdBLEdBQUltQyxDQUFBQSxDQUFjLEtBQ2hCLENBQUMsWUFBQSxDQUFhQSxFQUFjLEdBQUcsQ0FBQSxFQUMvQixnQkFBZ0JBLENBQWMsQ0FBQSxHQUFBLENBQUssSUFBSSxDQUFHLENBQUEsQ0FDMUMsSUFBTUssQ0FBZSxDQUFBLFFBQUEsQ0FBUyxlQUFlLGVBQWdCTCxDQUFBQSxDQUFBQSxDQUFjLElBQUssSUFBSSxDQUFDLEVBQy9FTSxDQUFlLENBQUEsQ0FBRSxjQUFlVCxDQUFTLENBQUEsV0FBQSxHQUFnQixPQUFZLENBQUNBLENBQUFBLENBQVMsWUFBYyxDQUFDLElBQUEsQ0FBSyxPQUFPLGtCQUFtQixDQUFBLENBQ25JLEdBQUlRLENBQWMsQ0FBQSxDQUVoQixHQUFJTCxDQUFjLENBQUEsS0FBQSxFQUFTSyxFQUFhLGlCQUN0QyxDQUFBLEdBQUksQ0FFRkEsQ0FBYSxDQUFBLGlCQUFBLENBQWtCTCxFQUFjLEtBQU9BLENBQUFBLENBQUFBLENBQWMsR0FBRyxFQUN2RSxDQUFBLEtBQVksRUFJZEssQ0FBQUEsQ0FBYSxNQUFNQyxDQUFZLEVBQ2pDLENBQ0YsQ0FFQTlDLENBQUFBLENBQU8sVUFBVSxNQUFPLENBQUEsSUFBQSxDQUFLLE9BQU8sYUFBYSxDQUFBLENBQ2pELFFBQVFLLENBQVcsQ0FBQSxJQUFBLENBQU0sU0FBU3RGLENBQUssQ0FBQSxDQUNqQ0EsRUFBSSxTQUNOQSxFQUFBQSxDQUFBQSxDQUFJLFVBQVUsR0FBSSxDQUFBLElBQUEsQ0FBSyxPQUFPLGFBQWEsQ0FBQSxDQUU3QyxZQUFhQSxDQUFBQSxDQUFBQSxDQUFLLGdCQUFrQnVILENBQUFBLENBQUFBLENBQVksU0FBUyxFQUMzRCxDQUFDLEVBQ0dBLENBQVksQ0FBQSxpQkFBQSxFQUNkQSxFQUFZLGlCQUFrQixFQUFBLENBSTNCRCxFQUFTLFdBQ1osRUFBQSxXQUFBLENBQVloQyxFQUFXLEtBQUssQ0FBQSxDQUk5QixJQUFNMEMsQ0FBVyxDQUFBLFVBQVcsQ0FXMUIsR0FWQSxPQUFBLENBQVExQyxFQUFXLEtBQU8sQ0FBQSxTQUFTMkMsRUFBTSxDQUN2Q0EsQ0FBQUEsQ0FBSyxPQUNQLENBQUMsRUFDRCxPQUFRM0MsQ0FBQUEsQ0FBQUEsQ0FBVyxLQUFNLFNBQVN0RixDQUFBQSxDQUFLLENBQ2pDQSxDQUFJLENBQUEsU0FBQSxFQUNOQSxFQUFJLFNBQVUsQ0FBQSxNQUFBLENBQU8sS0FBSyxNQUFPLENBQUEsYUFBYSxDQUVoRCxDQUFBLFlBQUEsQ0FBYUEsQ0FBSyxDQUFBLGtCQUFBLENBQW9CdUgsRUFBWSxTQUFTLEVBQzdELENBQUMsQ0FFR0EsQ0FBQUEsQ0FBQUEsQ0FBWSxPQUFRLENBQ3RCLElBQU1XLEVBQWUsU0FBVSxDQUFBLGFBQUEsQ0FBYyxJQUFNWCxDQUFZLENBQUEsTUFBTSxDQUFDLENBQ2xFVyxDQUFBQSxDQUFBQSxFQUNGQSxFQUFhLGNBQWUsQ0FBQSxDQUFFLE1BQU8sT0FBUyxDQUFBLFFBQUEsQ0FBVSxNQUFPLENBQUMsRUFFcEUsQ0FFQSxpQkFBa0I1QyxDQUFBQSxDQUFBQSxDQUFXLEtBQU1nQyxDQUFRLENBQUEsQ0FDdkNDLEVBQVksbUJBQ2RBLEVBQUFBLENBQUFBLENBQVksc0JBRWhCLENBQUEsQ0FFSUQsRUFBUyxXQUFjLENBQUEsQ0FBQSxDQUN6QixXQUFZLENBQUEsVUFBQSxDQUFXVSxDQUFVVixDQUFBQSxDQUFBQSxDQUFTLFdBQVcsQ0FBQSxDQUVyRFUsSUFFSixDQU9BLFNBQVMsbUJBQW9CRyxDQUFBQSxDQUFBQSxDQUFLQyxFQUFRcEksQ0FBSyxDQUFBLENBQzdDLElBQU1xSSxDQUFjRixDQUFBQSxDQUFBQSxDQUFJLGtCQUFrQkMsQ0FBTSxDQUFBLENBQ2hELEdBQUlDLENBQVksQ0FBQSxPQUFBLENBQVEsR0FBRyxDQUFNLEdBQUEsQ0FBQSxDQUFHLENBQ2xDLElBQU1DLENBQUFBLENBQVcsVUFBVUQsQ0FBVyxDQUFBLENBQ3RDLFFBQVdFLENBQWFELElBQUFBLENBQUFBLENBQ3RCLEdBQUlBLENBQVMsQ0FBQSxjQUFBLENBQWVDLENBQVMsQ0FBRyxDQUFBLENBQ3RDLElBQUlDLENBQVNGLENBQUFBLENBQUFBLENBQVNDLENBQVMsQ0FDM0IsQ0FBQSxXQUFBLENBQVlDLENBQU0sQ0FFcEJ4SSxDQUFBQSxDQUFBQSxDQUFNd0ksRUFBTyxNQUFXLEdBQUEsS0FBQSxDQUFBLENBQVlBLEVBQU8sTUFBU3hJLENBQUFBLENBQUFBLENBRXBEd0ksRUFBUyxDQUFFLEtBQUEsQ0FBT0EsQ0FBTyxDQUUzQixDQUFBLFlBQUEsQ0FBYXhJLEVBQUt1SSxDQUFXQyxDQUFBQSxDQUFNLEVBQ3JDLENBRUosQ0FBQSxLQUFPLENBQ0wsSUFBTUMsQ0FBQUEsQ0FBYUosRUFBWSxLQUFNLENBQUEsR0FBRyxFQUN4QyxJQUFTLElBQUEsQ0FBQSxDQUFJLEVBQUcsQ0FBSUksQ0FBQUEsQ0FBQUEsQ0FBVyxPQUFRLENBQ3JDLEVBQUEsQ0FBQSxZQUFBLENBQWF6SSxFQUFLeUksQ0FBVyxDQUFBLENBQUMsRUFBRSxJQUFLLEVBQUEsQ0FBRyxFQUFFLEVBRTlDLENBQ0YsQ0FFQSxJQUNNLG1CQUFBLENBQXNCLE9BQ3RCLENBQUEsWUFBQSxDQUFlLFlBQ2YsQ0FBQSxXQUFBLENBQWMsZ0JBQ2QsZUFBa0IsQ0FBQSxDQUFDLElBQUssR0FBSyxDQUFBLEdBQUcsRUFDaEMsY0FBaUIsQ0FBQSxPQUFBLENBQ2pCLHdCQUEwQixNQUMxQixDQUFBLHFCQUFBLENBQXdCLE9BTTlCLFNBQVMsY0FBQSxDQUFlcEksRUFBSyxDQUUzQixJQUFNcUksRUFBUyxFQUFDLENBQ1pDLEVBQVcsQ0FDZixDQUFBLEtBQU9BLEVBQVd0SSxDQUFJLENBQUEsTUFBQSxFQUFRLENBQzVCLEdBQUksWUFBQSxDQUFhLEtBQUtBLENBQUksQ0FBQSxNQUFBLENBQU9zSSxDQUFRLENBQUMsQ0FBQSxDQUFHLENBRTNDLElBRElDLElBQUFBLENBQUFBLENBQWdCRCxFQUNiLFdBQVksQ0FBQSxJQUFBLENBQUt0SSxFQUFJLE1BQU9zSSxDQUFBQSxDQUFBQSxDQUFXLENBQUMsQ0FBQyxDQUM5Q0EsRUFBQUEsQ0FBQUEsRUFBQUEsQ0FFRkQsRUFBTyxJQUFLckksQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPdUksQ0FBZUQsQ0FBQUEsQ0FBQUEsQ0FBV0MsRUFBZ0IsQ0FBQyxDQUFDLEVBQ3JFLENBQVcsS0FBQSxHQUFBLGVBQUEsQ0FBZ0IsUUFBUXZJLENBQUksQ0FBQSxNQUFBLENBQU9zSSxDQUFRLENBQUMsQ0FBQSxHQUFNLEdBQUksQ0FDL0QsSUFBTUUsRUFBWXhJLENBQUksQ0FBQSxNQUFBLENBQU9zSSxDQUFRLENBQ3JDLENBQUEsSUFBSUMsRUFBZ0JELENBRXBCLENBQUEsSUFEQUEsSUFDT0EsQ0FBV3RJLENBQUFBLENBQUFBLENBQUksUUFBVUEsQ0FBSSxDQUFBLE1BQUEsQ0FBT3NJLENBQVEsQ0FBTUUsR0FBQUEsQ0FBQUEsRUFDbkR4SSxFQUFJLE1BQU9zSSxDQUFBQSxDQUFRLElBQU0sSUFDM0JBLEVBQUFBLENBQUFBLEVBQUFBLENBRUZBLENBRUZELEVBQUFBLENBQUFBLENBQUFBLENBQU8sSUFBS3JJLENBQUFBLENBQUFBLENBQUksT0FBT3VJLENBQWVELENBQUFBLENBQUFBLENBQVdDLEVBQWdCLENBQUMsQ0FBQyxFQUNyRSxDQUFPLEtBQUEsQ0FDTCxJQUFNRSxDQUFTekksQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPc0ksQ0FBUSxDQUFBLENBQ2xDRCxFQUFPLElBQUtJLENBQUFBLENBQU0sRUFDcEIsQ0FDQUgsQ0FBQUEsR0FDRixDQUNBLE9BQU9ELENBQ1QsQ0FRQSxTQUFTLDJCQUFBLENBQTRCSyxFQUFPQyxDQUFNQyxDQUFBQSxDQUFBQSxDQUFXLENBQzNELE9BQU8sWUFBQSxDQUFhLEtBQUtGLENBQU0sQ0FBQSxNQUFBLENBQU8sQ0FBQyxDQUFDLENBQUEsRUFDdENBLElBQVUsTUFDVkEsRUFBQUEsQ0FBQUEsR0FBVSxTQUNWQSxDQUFVLEdBQUEsTUFBQSxFQUNWQSxDQUFVRSxHQUFBQSxDQUFBQSxFQUNWRCxDQUFTLEdBQUEsR0FDYixDQVFBLFNBQVMsd0JBQUEsQ0FBeUJoSixFQUFLMEksQ0FBUU8sQ0FBQUEsQ0FBQUEsQ0FBVyxDQUN4RCxHQUFJUCxDQUFBQSxDQUFPLENBQUMsQ0FBTSxHQUFBLEdBQUEsQ0FBSyxDQUNyQkEsQ0FBTyxDQUFBLEtBQUEsR0FDUCxJQUFJUSxDQUFBQSxDQUFlLEVBQ2ZDLENBQW9CLENBQUEsb0JBQUEsQ0FBdUJGLEVBQVksYUFDdkRELENBQUFBLENBQUFBLENBQU8sS0FDWCxLQUFPTixDQUFBQSxDQUFPLE9BQVMsQ0FBRyxFQUFBLENBQ3hCLElBQU1LLENBQVFMLENBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUV0QixDQUFBLEdBQUlLLElBQVUsR0FFWixDQUFBLENBQUEsR0FEQUcsSUFDSUEsQ0FBaUIsR0FBQSxDQUFBLENBQUcsQ0FDbEJGLENBQVMsR0FBQSxJQUFBLEdBQ1hHLENBQW9CQSxDQUFBQSxDQUFBQSxDQUFvQixNQUUxQ1QsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBTyxPQUNQUyxDQUFBQSxDQUFBQSxFQUFxQixNQUNyQixHQUFJLENBQ0YsSUFBTUMsQ0FBb0IsQ0FBQSxTQUFBLENBQVVwSixFQUFLLFVBQVcsQ0FDbEQsT0FBTyxRQUFTbUosQ0FBQUEsQ0FBaUIsR0FDbkMsQ0FBQSxDQUNBLFVBQVcsQ0FBRSxPQUFPLEVBQUssQ0FBQyxDQUFBLENBQzFCLE9BQUFDLENBQWtCLENBQUEsTUFBQSxDQUFTRCxFQUNwQkMsQ0FDVCxDQUFBLE1BQVNsSSxFQUFHLENBQ1YsT0FBQSxpQkFBQSxDQUFrQixhQUFjLENBQUEsSUFBQSxDQUFNLG9CQUFxQixDQUFFLEtBQUEsQ0FBT0EsRUFBRyxNQUFRaUksQ0FBQUEsQ0FBa0IsQ0FBQyxDQUMzRixDQUFBLElBQ1QsQ0FDRixDQUFBLENBQUEsS0FDU0osQ0FBVSxHQUFBLEdBQUEsRUFDbkJHLElBRUUsMkJBQTRCSCxDQUFBQSxDQUFBQSxDQUFPQyxFQUFNQyxDQUFTLENBQUEsQ0FDcERFLEdBQXFCLElBQU9GLENBQUFBLENBQUFBLENBQVksSUFBTUYsQ0FBUSxDQUFBLE9BQUEsQ0FBVUUsRUFBWSxHQUFNRixDQUFBQSxDQUFBQSxDQUFRLGVBQWlCQSxDQUFRLENBQUEsSUFBQSxDQUVuSEksRUFBb0JBLENBQW9CSixDQUFBQSxDQUFBQSxDQUUxQ0MsRUFBT04sQ0FBTyxDQUFBLEtBQUEsR0FDaEIsQ0FDRixDQUNGLENBT0EsU0FBUyxZQUFBLENBQWFBLEVBQVFySCxDQUFPLENBQUEsQ0FDbkMsSUFBSXFELENBQVMsQ0FBQSxFQUFBLENBQ2IsS0FBT2dFLENBQU8sQ0FBQSxNQUFBLENBQVMsR0FBSyxDQUFDckgsQ0FBQUEsQ0FBTSxLQUFLcUgsQ0FBTyxDQUFBLENBQUMsQ0FBQyxDQUFBLEVBQy9DaEUsQ0FBVWdFLEVBQUFBLENBQUFBLENBQU8sT0FFbkIsQ0FBQSxPQUFPaEUsQ0FDVCxDQU1BLFNBQVMsbUJBQW1CZ0UsQ0FBUSxDQUFBLENBQ2xDLElBQUloRSxDQUNKLENBQUEsT0FBSWdFLEVBQU8sTUFBUyxDQUFBLENBQUEsRUFBSyx3QkFBd0IsSUFBS0EsQ0FBQUEsQ0FBQUEsQ0FBTyxDQUFDLENBQUMsQ0FBQSxFQUM3REEsRUFBTyxLQUFNLEVBQUEsQ0FDYmhFLEVBQVMsWUFBYWdFLENBQUFBLENBQUFBLENBQVEscUJBQXFCLENBQUUsQ0FBQSxJQUFBLEdBQ3JEQSxDQUFPLENBQUEsS0FBQSxJQUVQaEUsQ0FBUyxDQUFBLFlBQUEsQ0FBYWdFLEVBQVEsbUJBQW1CLENBQUEsQ0FFNUNoRSxDQUNULENBRUEsSUFBTSxlQUFpQix5QkFRdkIsQ0FBQSxTQUFTLHFCQUFxQjFFLENBQUtxSixDQUFBQSxDQUFBQSxDQUFpQkMsRUFBTyxDQUV6RCxJQUFNQyxFQUFlLEVBQUMsQ0FDaEJiLEVBQVMsY0FBZVcsQ0FBQUEsQ0FBZSxFQUM3QyxFQUFHLENBQ0QsYUFBYVgsQ0FBUSxDQUFBLGNBQWMsRUFDbkMsSUFBTWMsQ0FBQUEsQ0FBZ0JkLEVBQU8sTUFDdkI5RixDQUFBQSxDQUFBQSxDQUFVLGFBQWE4RixDQUFRLENBQUEsU0FBUyxFQUM5QyxHQUFJOUYsQ0FBQUEsR0FBWSxHQUNkLEdBQUlBLENBQUFBLEdBQVksUUFBUyxDQUV2QixJQUFNNkcsRUFBUSxDQUFFLE9BQUEsQ0FBUyxPQUFRLENBQ2pDLENBQUEsWUFBQSxDQUFhZixFQUFRLGNBQWMsQ0FBQSxDQUNuQ2UsRUFBTSxZQUFlLENBQUEsYUFBQSxDQUFjLFlBQWFmLENBQUFBLENBQUFBLENBQVEsU0FBUyxDQUFDLEVBQ2xFLFlBQWFBLENBQUFBLENBQUFBLENBQVEsY0FBYyxDQUNuQyxDQUFBLElBQUlnQixFQUFjLHdCQUF5QjFKLENBQUFBLENBQUFBLENBQUswSSxFQUFRLE9BQU8sQ0FBQSxDQUMzRGdCLElBQ0ZELENBQU0sQ0FBQSxXQUFBLENBQWNDLEdBRXRCSCxDQUFhLENBQUEsSUFBQSxDQUFLRSxDQUFLLEVBQ3pCLENBQUEsS0FBTyxDQUVMLElBQU1FLENBQUFBLENBQWMsQ0FBRSxPQUFBL0csQ0FBQUEsQ0FBUSxFQUM5QixJQUFJOEcsQ0FBQUEsQ0FBYyx5QkFBeUIxSixDQUFLMEksQ0FBQUEsQ0FBQUEsQ0FBUSxPQUFPLENBSS9ELENBQUEsSUFISWdCLElBQ0ZDLENBQVksQ0FBQSxXQUFBLENBQWNELEdBRXJCaEIsQ0FBTyxDQUFBLE1BQUEsQ0FBUyxHQUFLQSxDQUFPLENBQUEsQ0FBQyxDQUFNLEdBQUEsR0FBQSxFQUFLLENBQzdDLFlBQUEsQ0FBYUEsRUFBUSxjQUFjLENBQUEsQ0FDbkMsSUFBTUssQ0FBUUwsQ0FBQUEsQ0FBQUEsQ0FBTyxPQUNyQixDQUFBLEdBQUlLLElBQVUsU0FDWlksQ0FBQUEsQ0FBQUEsQ0FBWSxRQUFVLENBQ2JaLENBQUFBLENBQUFBLEtBQUFBLEdBQUFBLENBQUFBLEdBQVUsT0FDbkJZLENBQVksQ0FBQSxJQUFBLENBQU8sV0FDVlosQ0FBVSxHQUFBLFNBQUEsQ0FDbkJZLEVBQVksT0FBVSxDQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsR0FDYlosSUFBVSxPQUFXTCxFQUFBQSxDQUFBQSxDQUFPLENBQUMsQ0FBTSxHQUFBLEdBQUEsQ0FDNUNBLEVBQU8sS0FBTSxFQUFBLENBQ2JpQixFQUFZLEtBQVEsQ0FBQSxhQUFBLENBQWMsYUFBYWpCLENBQVEsQ0FBQSxtQkFBbUIsQ0FBQyxDQUNsRUssQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsR0FBVSxRQUFVTCxDQUFPLENBQUEsQ0FBQyxDQUFNLEdBQUEsR0FBQSxDQUFLLENBRWhELEdBREFBLEVBQU8sS0FBTSxFQUFBLENBQ1Qsd0JBQXdCLElBQUtBLENBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUFDLENBQUEsQ0FDeEMsSUFBSWtCLENBQVcsQ0FBQSxrQkFBQSxDQUFtQmxCLENBQU0sQ0FDbkMsQ0FBQSxLQUFBLENBQ0wsSUFBSWtCLENBQVcsQ0FBQSxZQUFBLENBQWFsQixFQUFRLG1CQUFtQixDQUFBLENBQ3ZELEdBQUlrQixDQUFhLEdBQUEsU0FBQSxFQUFhQSxJQUFhLE1BQVVBLEVBQUFBLENBQUFBLEdBQWEsUUFBVUEsQ0FBYSxHQUFBLFVBQUEsQ0FBWSxDQUNuR2xCLENBQU8sQ0FBQSxLQUFBLEdBQ1AsSUFBTXZILENBQUFBLENBQVcsbUJBQW1CdUgsQ0FBTSxDQUFBLENBRXRDdkgsRUFBUyxNQUFTLENBQUEsQ0FBQSxHQUNwQnlJLEdBQVksR0FBTXpJLENBQUFBLENBQUFBLEVBRXRCLENBQ0YsQ0FDQXdJLENBQUFBLENBQVksS0FBT0MsRUFDckIsQ0FBQSxLQUFXYixJQUFVLFFBQVlMLEVBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUFNLEdBQUEsR0FBQSxFQUM3Q0EsRUFBTyxLQUFNLEVBQUEsQ0FDYmlCLEVBQVksTUFBUyxDQUFBLGtCQUFBLENBQW1CakIsQ0FBTSxDQUNyQ0ssRUFBQUEsQ0FBQUEsR0FBVSxZQUFjTCxDQUFPLENBQUEsQ0FBQyxJQUFNLEdBQy9DQSxFQUFBQSxDQUFBQSxDQUFPLE9BQ1BpQixDQUFBQSxDQUFBQSxDQUFZLFNBQVcsYUFBYyxDQUFBLFlBQUEsQ0FBYWpCLEVBQVEsbUJBQW1CLENBQUMsR0FDckVLLENBQVUsR0FBQSxPQUFBLEVBQVdMLEVBQU8sQ0FBQyxDQUFBLEdBQU0sS0FDNUNBLENBQU8sQ0FBQSxLQUFBLEdBQ1BpQixDQUFZLENBQUEsS0FBQSxDQUFRLFlBQWFqQixDQUFBQSxDQUFBQSxDQUFRLG1CQUFtQixDQUFBLEVBQ25ESyxJQUFVLE1BQVVMLEVBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUFNLEdBQUEsR0FBQSxFQUMzQ0EsRUFBTyxLQUFNLEVBQUEsQ0FDYmlCLEVBQVlaLENBQUssQ0FBQSxDQUFJLG1CQUFtQkwsQ0FBTSxDQUFBLEVBQ3JDSyxJQUFVLFdBQWVMLEVBQUFBLENBQUFBLENBQU8sQ0FBQyxDQUFNLEdBQUEsR0FBQSxFQUNoREEsRUFBTyxLQUFNLEVBQUEsQ0FDYmlCLEVBQVlaLENBQUssQ0FBQSxDQUFJLGFBQWFMLENBQVEsQ0FBQSxtQkFBbUIsR0FFN0QsaUJBQWtCMUksQ0FBQUEsQ0FBQUEsQ0FBSyxvQkFBcUIsQ0FBRSxLQUFBLENBQU8wSSxFQUFPLEtBQU0sRUFBRSxDQUFDLEVBRXpFLENBQ0FhLEVBQWEsSUFBS0ksQ0FBQUEsQ0FBVyxFQUMvQixDQUVFakIsQ0FBTyxDQUFBLE1BQUEsR0FBV2MsR0FDcEIsaUJBQWtCeEosQ0FBQUEsQ0FBQUEsQ0FBSyxvQkFBcUIsQ0FBRSxLQUFBLENBQU8wSSxFQUFPLEtBQU0sRUFBRSxDQUFDLENBRXZFLENBQUEsWUFBQSxDQUFhQSxFQUFRLGNBQWMsRUFDckMsT0FBU0EsQ0FBTyxDQUFBLENBQUMsSUFBTSxHQUFPQSxFQUFBQSxDQUFBQSxDQUFPLE9BQ3JDLEVBQUEsT0FBSVksSUFDRkEsQ0FBTUQsQ0FBQUEsQ0FBZSxFQUFJRSxDQUVwQkEsQ0FBQUEsQ0FBQUEsQ0FDVCxDQU1BLFNBQVMsZUFBQSxDQUFnQnZKLEVBQUssQ0FDNUIsSUFBTXFKLEVBQWtCLGlCQUFrQnJKLENBQUFBLENBQUFBLENBQUssWUFBWSxDQUN2RHVKLENBQUFBLENBQUFBLENBQWUsRUFDbkIsQ0FBQSxHQUFJRixDQUFpQixDQUFBLENBQ25CLElBQU1DLENBQUFBLENBQVEsS0FBSyxNQUFPLENBQUEsaUJBQUEsQ0FDMUJDLEVBQWdCRCxDQUFTQSxFQUFBQSxDQUFBQSxDQUFNRCxDQUFlLENBQU0sRUFBQSxvQkFBQSxDQUFxQnJKLEVBQUtxSixDQUFpQkMsQ0FBQUEsQ0FBSyxFQUN0RyxDQUVBLE9BQUlDLEVBQWEsTUFBUyxDQUFBLENBQUEsQ0FDakJBLEVBQ0UsT0FBUXZKLENBQUFBLENBQUFBLENBQUssTUFBTSxDQUNyQixDQUFBLENBQUMsQ0FBRSxPQUFTLENBQUEsUUFBUyxDQUFDLENBQ3BCLENBQUEsT0FBQSxDQUFRQSxFQUFLLDRDQUE0QyxDQUFBLENBQzNELENBQUMsQ0FBRSxPQUFBLENBQVMsT0FBUSxDQUFDLENBQUEsQ0FDbkIsUUFBUUEsQ0FBSyxDQUFBLGNBQWMsRUFDN0IsQ0FBQyxDQUFFLFFBQVMsUUFBUyxDQUFDLEVBRXRCLENBQUMsQ0FBRSxRQUFTLE9BQVEsQ0FBQyxDQUVoQyxDQUtBLFNBQVMsY0FBY0EsQ0FBSyxDQUFBLENBQzFCLGdCQUFnQkEsQ0FBRyxDQUFBLENBQUUsVUFBWSxDQUNuQyxFQUFBLENBT0EsU0FBUyxjQUFlQSxDQUFBQSxDQUFBQSxDQUFLNkosRUFBU0MsQ0FBTSxDQUFBLENBQzFDLElBQU1DLENBQVcsQ0FBQSxlQUFBLENBQWdCL0osQ0FBRyxDQUNwQytKLENBQUFBLENBQUFBLENBQVMsUUFBVSxTQUFVLEVBQUEsQ0FBRSxXQUFXLFVBQVcsQ0FDL0MsYUFBYS9KLENBQUcsQ0FBQSxFQUFLK0osRUFBUyxTQUFjLEdBQUEsQ0FBQSxDQUFBLEdBQ3pDLGlCQUFpQkQsQ0FBTTlKLENBQUFBLENBQUFBLENBQUssU0FBVSxDQUFBLGlCQUFBLENBQW1CLENBQzVELFdBQUEsQ0FBYThKLEVBQ2IsTUFBUTlKLENBQUFBLENBQ1YsQ0FBQyxDQUFDLENBQUEsRUFDQTZKLEVBQVE3SixDQUFHLENBQUEsQ0FFYixlQUFlQSxDQUFLNkosQ0FBQUEsQ0FBQUEsQ0FBU0MsQ0FBSSxDQUVyQyxFQUFBLENBQUEsQ0FBR0EsRUFBSyxZQUFZLEVBQ3RCLENBTUEsU0FBUyxXQUFBLENBQVk5SixFQUFLLENBQ3hCLE9BQU8sU0FBUyxRQUFhQSxHQUFBQSxDQUFBQSxDQUFJLFVBQy9CLGVBQWdCQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FDM0IsRUFBQSxlQUFBLENBQWdCQSxFQUFLLE1BQU0sQ0FBQSxDQUFFLFFBQVEsR0FBRyxDQUFBLEdBQU0sQ0FDbEQsQ0FLQSxTQUFTLGNBQWNBLENBQUssQ0FBQSxDQUMxQixPQUFPLE9BQUEsQ0FBUUEsQ0FBSyxDQUFBLElBQUEsQ0FBSyxPQUFPLGVBQWUsQ0FDakQsQ0FPQSxTQUFTLFlBQUEsQ0FBYUEsRUFBSytKLENBQVVSLENBQUFBLENBQUFBLENBQWMsQ0FDakQsR0FBS3ZKLENBQUFBLFlBQWUsbUJBQXFCLFdBQVlBLENBQUFBLENBQUcsSUFBTUEsQ0FBSSxDQUFBLE1BQUEsR0FBVyxJQUFNQSxDQUFJLENBQUEsTUFBQSxHQUFXLFVBQWNBLENBQUksQ0FBQSxPQUFBLEdBQVksUUFBVSxNQUFPLENBQUEsZUFBQSxDQUFnQkEsRUFBSyxRQUFRLENBQUMsRUFBRSxXQUFZLEVBQUEsR0FBTSxTQUFXLENBQzVNK0osQ0FBQUEsQ0FBUyxRQUFVLENBQ25CLENBQUEsQ0FBQSxJQUFJN0osRUFBTWlELENBQ1YsQ0FBQSxHQUFJbkQsRUFBSSxPQUFZLEdBQUEsR0FBQSxDQUNsQkUsQ0FBTyxDQUFBLEtBQUEsQ0FDUGlELENBQU8sQ0FBQSxlQUFBLENBQWdCbkQsRUFBSyxNQUFNLENBQUEsQ0FBQSxLQUM3QixDQUNMLElBQU1nSyxDQUFBQSxDQUFlLGdCQUFnQmhLLENBQUssQ0FBQSxRQUFRLEVBQ2xERSxDQUFPOEosQ0FBQUEsQ0FBQUEsQ0FBZUEsRUFBYSxXQUFZLEVBQUEsQ0FBSSxNQUduRDdHLENBQU8sQ0FBQSxlQUFBLENBQWdCbkQsRUFBSyxRQUFRLEVBQ3RDLENBQ0F1SixDQUFhLENBQUEsT0FBQSxDQUFRLFNBQVNJLENBQWEsQ0FBQSxDQUN6QyxpQkFBaUIzSixDQUFLLENBQUEsU0FBUzRELEVBQU1OLENBQUssQ0FBQSxDQUN4QyxJQUFNdEQsQ0FBTSxDQUFBLFNBQUEsQ0FBVTRELENBQUksQ0FDMUIsQ0FBQSxHQUFJLGNBQWM1RCxDQUFHLENBQUEsQ0FBRyxDQUN0QixjQUFlQSxDQUFBQSxDQUFHLENBQ2xCLENBQUEsTUFDRixDQUNBLGdCQUFBLENBQWlCRSxFQUFNaUQsQ0FBTW5ELENBQUFBLENBQUFBLENBQUtzRCxDQUFHLEVBQ3ZDLENBQUEsQ0FBR3lHLEVBQVVKLENBQWEsQ0FBQSxDQUFBLENBQUksRUFDaEMsQ0FBQyxFQUNILENBQ0YsQ0FPQSxTQUFTLGFBQWFyRyxDQUFLTSxDQUFBQSxDQUFBQSxDQUFNLENBQy9CLElBQU01RCxDQUFBQSxDQUFNLFVBQVU0RCxDQUFJLENBQUEsQ0FDMUIsT0FBSzVELENBR0QsQ0FBQSxDQUFBLEVBQUEsQ0FBQXNELEVBQUksSUFBUyxHQUFBLFFBQUEsRUFBWUEsRUFBSSxJQUFTLEdBQUEsT0FBQSxJQUNwQ3RELEVBQUksT0FBWSxHQUFBLE1BQUEsRUFHaEIsUUFBUUEsQ0FBSyxDQUFBLDhCQUE4QixHQUFLLE9BQVFBLENBQUFBLENBQUFBLENBQUssTUFBTSxDQUFNLEdBQUEsSUFBQSxFQUd6RUEsQ0FBZSxZQUFBLGlCQUFBLEVBQXFCQSxDQUFJLENBQUEsSUFBQSxHQUN6Q0EsRUFBSSxZQUFhLENBQUEsTUFBTSxJQUFNLEdBQU9BLEVBQUFBLENBQUFBLENBQUksYUFBYSxNQUFNLENBQUEsQ0FBRSxRQUFRLEdBQUcsQ0FBQSxHQUFNLEtBVjFFLENBZVgsQ0FBQSxDQU9BLFNBQVMsNEJBQTZCQSxDQUFBQSxDQUFBQSxDQUFLc0QsRUFBSyxDQUM5QyxPQUFPLGdCQUFnQnRELENBQUcsQ0FBQSxDQUFFLFNBQVdBLENBQWUsWUFBQSxpQkFBQSxFQUFxQnNELEVBQUksSUFBUyxHQUFBLE9BQUEsR0FFckZBLEVBQUksT0FBV0EsRUFBQUEsQ0FBQUEsQ0FBSSxRQUN4QixDQVFBLFNBQVMsaUJBQWlCcUcsQ0FBYTNKLENBQUFBLENBQUFBLENBQUtzRCxFQUFLLENBQy9DLElBQU1vRyxFQUFjQyxDQUFZLENBQUEsV0FBQSxDQUNoQyxHQUFJRCxDQUFBQSxDQUNGLEdBQUksQ0FDRixPQUFPQSxDQUFZLENBQUEsSUFBQSxDQUFLMUosRUFBS3NELENBQUcsQ0FBQSxHQUFNLEVBQ3hDLENBQVNwQyxNQUFBQSxDQUFBQSxDQUFHLENBQ1YsSUFBTStJLENBQUFBLENBQVNQLEVBQVksTUFDM0IsQ0FBQSxPQUFBLGlCQUFBLENBQWtCLGFBQWMsQ0FBQSxJQUFBLENBQU0seUJBQTBCLENBQUUsS0FBQSxDQUFPeEksRUFBRyxNQUFBK0ksQ0FBQUEsQ0FBTyxDQUFDLENBQzdFLENBQUEsQ0FBQSxDQUNULENBRUYsT0FBTyxDQUFBLENBQ1QsQ0FTQSxTQUFTLGdCQUFBLENBQWlCakssRUFBSzZKLENBQVNFLENBQUFBLENBQUFBLENBQVVKLEVBQWFPLENBQWdCLENBQUEsQ0FDN0UsSUFBTUMsQ0FBYyxDQUFBLGVBQUEsQ0FBZ0JuSyxDQUFHLENBRW5Db0ssQ0FBQUEsQ0FBQUEsQ0FDQVQsQ0FBWSxDQUFBLElBQUEsQ0FDZFMsQ0FBaUIsQ0FBQSxtQkFBQSxDQUFvQnBLLEVBQUsySixDQUFZLENBQUEsSUFBSSxFQUUxRFMsQ0FBaUIsQ0FBQSxDQUFDcEssQ0FBRyxDQUduQjJKLENBQUFBLENBQUFBLENBQVksU0FDZFMsQ0FBZSxDQUFBLE9BQUEsQ0FBUSxTQUFTQyxDQUFlLENBQUEsQ0FDN0MsSUFBTUMsQ0FBb0IsQ0FBQSxlQUFBLENBQWdCRCxDQUFhLENBRXZEQyxDQUFBQSxDQUFBQSxDQUFrQixVQUFZRCxDQUFjLENBQUEsTUFDOUMsQ0FBQyxDQUVILENBQUEsT0FBQSxDQUFRRCxFQUFnQixTQUFTQyxDQUFBQSxDQUFlLENBRTlDLElBQU1FLENBQUFBLENBQWdCLFNBQVNqSCxDQUFLLENBQUEsQ0FDbEMsR0FBSSxDQUFDLFlBQUEsQ0FBYXRELENBQUcsQ0FBRyxDQUFBLENBQ3RCcUssRUFBYyxtQkFBb0JWLENBQUFBLENBQUFBLENBQVksUUFBU1ksQ0FBYSxDQUFBLENBQ3BFLE1BQ0YsQ0FPQSxHQU5JLDZCQUE2QnZLLENBQUtzRCxDQUFBQSxDQUFHLEtBR3JDNEcsQ0FBa0IsRUFBQSxZQUFBLENBQWE1RyxFQUFLdEQsQ0FBRyxDQUFBLEdBQ3pDc0QsRUFBSSxjQUFlLEVBQUEsQ0FFakIsaUJBQWlCcUcsQ0FBYTNKLENBQUFBLENBQUFBLENBQUtzRCxDQUFHLENBQ3hDLENBQUEsQ0FBQSxPQUVGLElBQU1rSCxDQUFZLENBQUEsZUFBQSxDQUFnQmxILENBQUcsQ0FLckMsQ0FBQSxHQUpBa0gsRUFBVSxXQUFjYixDQUFBQSxDQUFBQSxDQUNwQmEsRUFBVSxVQUFjLEVBQUEsSUFBQSxHQUMxQkEsRUFBVSxVQUFhLENBQUEsSUFFckJBLENBQVUsQ0FBQSxVQUFBLENBQVcsUUFBUXhLLENBQUcsQ0FBQSxDQUFJLEVBQUcsQ0FLekMsR0FKQXdLLENBQVUsQ0FBQSxVQUFBLENBQVcsSUFBS3hLLENBQUFBLENBQUcsRUFDekIySixDQUFZLENBQUEsT0FBQSxFQUNkckcsRUFBSSxlQUFnQixFQUFBLENBRWxCcUcsRUFBWSxNQUFVckcsRUFBQUEsQ0FBQUEsQ0FBSSxRQUN4QixDQUFDLE9BQUEsQ0FBUSxVQUFVQSxDQUFJLENBQUEsTUFBTSxFQUFHcUcsQ0FBWSxDQUFBLE1BQU0sRUFDcEQsT0FHSixHQUFJQSxFQUFZLElBQU0sQ0FBQSxDQUNwQixHQUFJUSxDQUFZLENBQUEsYUFBQSxDQUNkLE9BRUFBLENBQVksQ0FBQSxhQUFBLENBQWdCLEdBRWhDLENBQ0EsR0FBSVIsRUFBWSxPQUFTLENBQUEsQ0FDdkIsSUFBTVcsQ0FBb0IsQ0FBQSxlQUFBLENBQWdCRCxDQUFhLENBRWpEM0csQ0FBQUEsQ0FBQUEsQ0FBUTJHLEVBQWMsS0FDNUIsQ0FBQSxHQUFJQyxDQUFrQixDQUFBLFNBQUEsR0FBYzVHLENBQ2xDLENBQUEsT0FFRjRHLEVBQWtCLFNBQVk1RyxDQUFBQSxFQUNoQyxDQUlBLEdBSEl5RyxDQUFBQSxDQUFZLFNBQ2QsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBWSxPQUFPLENBRTlCQSxDQUFBQSxDQUFBQSxDQUFZLFNBQ2QsT0FHRVIsQ0FBQUEsQ0FBWSxTQUFXLENBQ3BCUSxDQUFBQSxDQUFBQSxDQUFZLFdBQ2YsWUFBYW5LLENBQUFBLENBQUFBLENBQUssY0FBYyxDQUNoQzZKLENBQUFBLENBQUFBLENBQVE3SixFQUFLc0QsQ0FBRyxDQUFBLENBQ2hCNkcsRUFBWSxRQUFXLENBQUEsU0FBQSxHQUFZLFVBQVcsQ0FBQSxVQUFXLENBQ3ZEQSxDQUFZLENBQUEsUUFBQSxDQUFXLEtBQ3pCLENBQUdSLENBQUFBLENBQUFBLENBQVksUUFBUSxDQUVoQkEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBWSxNQUFRLENBQzdCUSxDQUFBQSxDQUFBQSxDQUFZLE9BQVUsQ0FBQSxTQUFBLEVBQVksQ0FBQSxVQUFBLENBQVcsVUFBVyxDQUN0RCxZQUFBLENBQWFuSyxFQUFLLGNBQWMsQ0FBQSxDQUNoQzZKLEVBQVE3SixDQUFLc0QsQ0FBQUEsQ0FBRyxFQUNsQixDQUFHcUcsQ0FBQUEsQ0FBQUEsQ0FBWSxLQUFLLENBRXBCLEVBQUEsWUFBQSxDQUFhM0osRUFBSyxjQUFjLENBQUEsQ0FDaEM2SixFQUFRN0osQ0FBS3NELENBQUFBLENBQUcsR0FFcEIsQ0FDRixDQUFBLENBQ0l5RyxFQUFTLGFBQWlCLEVBQUEsSUFBQSxHQUM1QkEsRUFBUyxhQUFnQixDQUFBLElBRTNCQSxDQUFTLENBQUEsYUFBQSxDQUFjLEtBQUssQ0FDMUIsT0FBQSxDQUFTSixFQUFZLE9BQ3JCLENBQUEsUUFBQSxDQUFVWSxFQUNWLEVBQUlGLENBQUFBLENBQ04sQ0FBQyxDQUNEQSxDQUFBQSxDQUFBQSxDQUFjLGlCQUFpQlYsQ0FBWSxDQUFBLE9BQUEsQ0FBU1ksQ0FBYSxFQUNuRSxDQUFDLEVBQ0gsQ0FFQSxJQUFJLGtCQUFvQixDQUNwQixDQUFBLENBQUEsYUFBQSxDQUFnQixLQUNwQixTQUFTLGlCQUFBLEVBQW9CLENBQ3RCLGFBQ0gsR0FBQSxhQUFBLENBQWdCLFVBQVcsQ0FDekIsaUJBQUEsQ0FBb0IsR0FDdEIsQ0FDQSxDQUFBLE1BQUEsQ0FBTyxpQkFBaUIsUUFBVSxDQUFBLGFBQWEsRUFDL0MsV0FBWSxDQUFBLFVBQVcsQ0FDakIsaUJBQ0YsR0FBQSxpQkFBQSxDQUFvQixHQUNwQixPQUFRLENBQUEsV0FBQSxHQUFjLGdCQUFpQixDQUFBLHdEQUF3RCxFQUFHLFNBQVN2SyxDQUFBQSxDQUFLLENBQzlHLFdBQVlBLENBQUFBLENBQUcsRUFDakIsQ0FBQyxDQUFBLEVBRUwsQ0FBRyxDQUFBLEdBQUcsQ0FFVixFQUFBLENBS0EsU0FBUyxXQUFZQSxDQUFBQSxDQUFBQSxDQUFLLENBQ3BCLENBQUMsWUFBQSxDQUFhQSxFQUFLLGtCQUFrQixDQUFBLEVBQUssbUJBQW1CQSxDQUFHLENBQUEsR0FDbEVBLEVBQUksWUFBYSxDQUFBLGtCQUFBLENBQW9CLE1BQU0sQ0FDMUIsQ0FBQSxlQUFBLENBQWdCQSxDQUFHLENBQ3ZCLENBQUEsUUFBQSxDQUNYLGFBQWFBLENBQUssQ0FBQSxVQUFVLEVBRzVCQSxDQUFJLENBQUEsZ0JBQUEsQ0FBaUIsd0JBQXlCLFVBQVcsQ0FBRSxhQUFhQSxDQUFLLENBQUEsVUFBVSxFQUFFLENBQUcsQ0FBQSxDQUFFLEtBQU0sQ0FBSyxDQUFBLENBQUMsR0FHaEgsQ0FVQSxTQUFTLGdCQUFnQkEsQ0FBSzZKLENBQUFBLENBQUFBLENBQVNFLENBQVV0RyxDQUFBQSxDQUFBQSxDQUFPLENBQ3RELElBQU1nSCxFQUFPLFVBQVcsQ0FDakJWLEVBQVMsTUFDWkEsR0FBQUEsQ0FBQUEsQ0FBUyxPQUFTLENBQ2xCRixDQUFBQSxDQUFBQSxDQUFBQSxDQUFRN0osQ0FBRyxDQUVmLEVBQUEsQ0FBQSxDQUNJeUQsRUFBUSxDQUNWLENBQUEsU0FBQSxHQUFZLFVBQVdnSCxDQUFBQSxDQUFBQSxDQUFNaEgsQ0FBSyxDQUVsQ2dILENBQUFBLENBQUFBLEdBRUosQ0FRQSxTQUFTLGFBQWF6SyxDQUFLK0osQ0FBQUEsQ0FBQUEsQ0FBVVIsRUFBYyxDQUNqRCxJQUFJbUIsRUFBaUIsQ0FDckIsQ0FBQSxDQUFBLE9BQUEsT0FBQSxDQUFRLE1BQU8sU0FBU3hLLENBQUFBLENBQU0sQ0FDNUIsR0FBSSxZQUFBLENBQWFGLEVBQUssS0FBUUUsQ0FBQUEsQ0FBSSxFQUFHLENBQ25DLElBQU1pRCxDQUFPLENBQUEsaUJBQUEsQ0FBa0JuRCxDQUFLLENBQUEsS0FBQSxDQUFRRSxDQUFJLENBQ2hEd0ssQ0FBQUEsQ0FBQUEsQ0FBaUIsR0FDakJYLENBQVMsQ0FBQSxJQUFBLENBQU81RyxFQUNoQjRHLENBQVMsQ0FBQSxJQUFBLENBQU83SixFQUNoQnFKLENBQWEsQ0FBQSxPQUFBLENBQVEsU0FBU0ksQ0FBYSxDQUFBLENBQ3pDLGtCQUFrQjNKLENBQUsySixDQUFBQSxDQUFBQSxDQUFhSSxFQUFVLFNBQVNuRyxDQUFBQSxDQUFNTixFQUFLLENBQ2hFLElBQU10RCxFQUFNLFNBQVU0RCxDQUFBQSxDQUFJLEVBQzFCLEdBQUksT0FBQSxDQUFRNUQsRUFBSyxJQUFLLENBQUEsTUFBQSxDQUFPLGVBQWUsQ0FBRyxDQUFBLENBQzdDLGVBQWVBLENBQUcsQ0FBQSxDQUNsQixNQUNGLENBQ0EsZ0JBQUEsQ0FBaUJFLEVBQU1pRCxDQUFNbkQsQ0FBQUEsQ0FBQUEsQ0FBS3NELENBQUcsRUFDdkMsQ0FBQyxFQUNILENBQUMsRUFDSCxDQUNGLENBQUMsQ0FBQSxDQUNNb0gsQ0FDVCxDQWNBLFNBQVMsa0JBQWtCMUssQ0FBSzJKLENBQUFBLENBQUFBLENBQWFJLEVBQVVGLENBQVMsQ0FBQSxDQUM5RCxHQUFJRixDQUFZLENBQUEsT0FBQSxHQUFZLFdBQzFCLGlCQUFrQixFQUFBLENBQ2xCLGlCQUFpQjNKLENBQUs2SixDQUFBQSxDQUFBQSxDQUFTRSxFQUFVSixDQUFXLENBQUEsQ0FDcEQsWUFBWSxTQUFVM0osQ0FBQUEsQ0FBRyxDQUFDLENBQ2pCMkosQ0FBQUEsS0FBQUEsR0FBQUEsQ0FBQUEsQ0FBWSxVQUFZLFdBQWEsQ0FBQSxDQUM5QyxJQUFNZ0IsQ0FBa0IsQ0FBQSxHQUNwQmhCLENBQVksQ0FBQSxJQUFBLEdBQ2RnQixFQUFnQixJQUFPLENBQUEsZ0JBQUEsQ0FBaUIzSyxDQUFLMkosQ0FBQUEsQ0FBQUEsQ0FBWSxJQUFJLENBQUEsQ0FBQSxDQUUzREEsRUFBWSxTQUNkZ0IsR0FBQUEsQ0FBQUEsQ0FBZ0IsVUFBWSxVQUFXaEIsQ0FBQUEsQ0FBQUEsQ0FBWSxTQUFTLENBRTdDLENBQUEsQ0FBQSxJQUFJLHFCQUFxQixTQUFTaUIsQ0FBQUEsQ0FBUyxDQUMxRCxJQUFTdEksSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJc0ksQ0FBQUEsQ0FBQUEsQ0FBUSxPQUFRdEksQ0FFbEMsRUFBQSxDQUFBLEdBRGNzSSxFQUFRdEksQ0FBQyxDQUFBLENBQ2IsZUFBZ0IsQ0FDeEIsWUFBQSxDQUFhdEMsRUFBSyxXQUFXLENBQUEsQ0FDN0IsS0FDRixDQUVKLENBQUEsQ0FBRzJLLENBQWUsQ0FDVCxDQUFBLE9BQUEsQ0FBUSxVQUFVM0ssQ0FBRyxDQUFDLEVBQy9CLGdCQUFpQixDQUFBLFNBQUEsQ0FBVUEsQ0FBRyxDQUFHNkosQ0FBQUEsQ0FBQUEsQ0FBU0UsQ0FBVUosQ0FBQUEsQ0FBVyxFQUNqRSxDQUFBLEtBQVdBLEVBQVksT0FBWSxHQUFBLE1BQUEsQ0FDNUIsaUJBQWlCQSxDQUFhM0osQ0FBQUEsQ0FBQUEsQ0FBSyxVQUFVLE1BQVEsQ0FBQSxDQUFFLElBQUFBLENBQUksQ0FBQyxDQUFDLENBQ2hFLEVBQUEsZUFBQSxDQUFnQixVQUFVQSxDQUFHLENBQUEsQ0FBRzZKLEVBQVNFLENBQVVKLENBQUFBLENBQUFBLENBQVksS0FBSyxDQUU3REEsQ0FBQUEsQ0FBQUEsQ0FBWSxhQUFlLENBQ3BDSSxFQUFBQSxDQUFBQSxDQUFTLFFBQVUsQ0FDbkIsQ0FBQSxDQUFBLGNBQUEsQ0FBZSxVQUFVL0osQ0FBRyxDQUFBLENBQUc2SixFQUFTRixDQUFXLENBQUEsRUFFbkQsaUJBQWlCM0osQ0FBSzZKLENBQUFBLENBQUFBLENBQVNFLEVBQVVKLENBQVcsRUFFeEQsQ0FNQSxTQUFTLGlCQUFBLENBQWtCL0YsQ0FBTSxDQUFBLENBQy9CLElBQU01RCxDQUFBQSxDQUFNLFVBQVU0RCxDQUFJLENBQUEsQ0FDMUIsR0FBSSxDQUFDNUQsQ0FBQUEsQ0FDSCxPQUFPLENBRVQsQ0FBQSxDQUFBLElBQU02SyxFQUFhN0ssQ0FBSSxDQUFBLFVBQUEsQ0FDdkIsUUFBU21ILENBQUksQ0FBQSxDQUFBLENBQUdBLEVBQUkwRCxDQUFXLENBQUEsTUFBQSxDQUFRMUQsSUFBSyxDQUMxQyxJQUFNM0MsRUFBV3FHLENBQVcxRCxDQUFBQSxDQUFDLEVBQUUsSUFDL0IsQ0FBQSxHQUFJLFdBQVczQyxDQUFVLENBQUEsUUFBUSxHQUFLLFVBQVdBLENBQUFBLENBQUFBLENBQVUsYUFBYSxDQUN0RSxFQUFBLFVBQUEsQ0FBV0EsRUFBVSxRQUFRLENBQUEsRUFBSyxXQUFXQSxDQUFVLENBQUEsYUFBYSxFQUNwRSxPQUFPLENBQUEsQ0FFWCxDQUNBLE9BQU8sQ0FDVCxDQUFBLENBTUEsSUFBTSxXQUFjLENBQUEsSUFBSSxnQkFDckIsQ0FBQSxnQkFBQSxDQUFpQix3SkFDeUQsQ0FFN0UsQ0FBQSxTQUFTLGdCQUFnQnhFLENBQUs4SyxDQUFBQSxDQUFBQSxDQUFVLENBQ2xDLGlCQUFrQjlLLENBQUFBLENBQUcsR0FDdkI4SyxDQUFTLENBQUEsSUFBQSxDQUFLLFVBQVU5SyxDQUFHLENBQUMsRUFFOUIsSUFBTStLLENBQUFBLENBQU8sWUFBWSxRQUFTL0ssQ0FBQUEsQ0FBRyxFQUNqQzRELENBQU8sQ0FBQSxJQUFBLENBQ1gsS0FBT0EsQ0FBT21ILENBQUFBLENBQUFBLENBQUssYUFBZUQsRUFBQUEsQ0FBQUEsQ0FBUyxLQUFLLFNBQVVsSCxDQUFBQSxDQUFJLENBQUMsRUFDakUsQ0FFQSxTQUFTLHdCQUF5QjVELENBQUFBLENBQUFBLENBQUssQ0FFckMsSUFBTThLLENBQVcsQ0FBQSxHQUNqQixHQUFJOUssQ0FBQUEsWUFBZSxpQkFDakIsSUFBVzZELElBQUFBLENBQUFBLElBQVM3RCxFQUFJLFVBQ3RCLENBQUEsZUFBQSxDQUFnQjZELEVBQU9pSCxDQUFRLENBQUEsQ0FBQSxLQUdqQyxnQkFBZ0I5SyxDQUFLOEssQ0FBQUEsQ0FBUSxFQUUvQixPQUFPQSxDQUNULENBTUEsU0FBUyxxQkFBQSxDQUFzQjlLLEVBQUssQ0FDbEMsR0FBSUEsRUFBSSxnQkFBa0IsQ0FBQSxDQUN4QixJQUFNZ0wsQ0FBa0IsQ0FBQSxrRUFBQSxDQUVsQkMsRUFBcUIsRUFBQyxDQUM1QixRQUFXL0osQ0FBSyxJQUFBLFVBQUEsQ0FBWSxDQUMxQixJQUFNaUUsQ0FBQUEsQ0FBWSxXQUFXakUsQ0FBQyxDQUFBLENBQzlCLEdBQUlpRSxDQUFVLENBQUEsWUFBQSxDQUFjLENBQzFCLElBQUkrRixDQUFZL0YsQ0FBQUEsQ0FBQUEsQ0FBVSxjQUN0QitGLENBQUFBLENBQUFBLEVBQ0ZELEVBQW1CLElBQUtDLENBQUFBLENBQVMsRUFFckMsQ0FDRixDQUtBLE9BSGdCbEwsQ0FBSSxDQUFBLGdCQUFBLENBQWlCLGNBQWdCZ0wsQ0FBa0IsQ0FBQSxtRkFBQSxDQUNQQyxFQUFtQixJQUFLLEVBQUEsQ0FBRSxJQUFJRSxDQUFLLEVBQUEsSUFBQSxDQUFPQSxDQUFDLENBQUUsQ0FBQSxJQUFBLENBQUssRUFBRSxDQUFDLENBR3ZILE1BQ1MsT0FBQSxFQUVYLENBT0EsU0FBUywwQkFBMEI3SCxDQUFLLENBQUEsQ0FDdEMsSUFBTXRELENBQXlELENBQUEsT0FBQSxDQUFRLFVBQVVzRCxDQUFJLENBQUEsTUFBTSxFQUFHLDhCQUE4QixDQUFBLENBQ3RIb0QsQ0FBZSxDQUFBLGtCQUFBLENBQW1CcEQsQ0FBRyxDQUFBLENBQ3ZDb0QsSUFDRkEsQ0FBYSxDQUFBLGlCQUFBLENBQW9CMUcsR0FFckMsQ0FLQSxTQUFTLDRCQUE0QnNELENBQUssQ0FBQSxDQUN4QyxJQUFNb0QsQ0FBZSxDQUFBLGtCQUFBLENBQW1CcEQsQ0FBRyxDQUN2Q29ELENBQUFBLENBQUFBLEdBQ0ZBLEVBQWEsaUJBQW9CLENBQUEsSUFBQSxFQUVyQyxDQU1BLFNBQVMsa0JBQUEsQ0FBbUJwRCxFQUFLLENBQy9CLElBQU10RCxFQUFNLE9BQVEsQ0FBQSxTQUFBLENBQVVzRCxFQUFJLE1BQU0sQ0FBQSxDQUFHLDhCQUE4QixDQUN6RSxDQUFBLEdBQUksQ0FBQ3RELENBQ0gsQ0FBQSxPQUVGLElBQU1vTCxDQUFPLENBQUEsYUFBQSxDQUFjLElBQU0sZUFBZ0JwTCxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSSxhQUFhLENBQUEsRUFBSyxRQUFRQSxDQUFLLENBQUEsTUFBTSxFQUN4RyxHQUFLb0wsQ0FBQUEsQ0FHTCxPQUFPLGVBQWdCQSxDQUFBQSxDQUFJLENBQzdCLENBS0EsU0FBUyxtQkFBbUJwTCxDQUFLLENBQUEsQ0FJL0JBLEVBQUksZ0JBQWlCLENBQUEsT0FBQSxDQUFTLHlCQUF5QixDQUN2REEsQ0FBQUEsQ0FBQUEsQ0FBSSxpQkFBaUIsU0FBVyxDQUFBLHlCQUF5QixFQUN6REEsQ0FBSSxDQUFBLGdCQUFBLENBQWlCLFdBQVksMkJBQTJCLEVBQzlELENBT0EsU0FBUyxtQkFBQSxDQUFvQkEsRUFBS3VJLENBQVc4QyxDQUFBQSxDQUFBQSxDQUFNLENBQ2pELElBQU10QixDQUFBQSxDQUFXLGdCQUFnQi9KLENBQUcsQ0FBQSxDQUMvQixNQUFNLE9BQVErSixDQUFBQSxDQUFBQSxDQUFTLFVBQVUsQ0FBQSxHQUNwQ0EsQ0FBUyxDQUFBLFVBQUEsQ0FBYSxFQUV4QixDQUFBLENBQUEsSUFBSS9ILEVBRUVzSixDQUFXLENBQUEsU0FBU3BLLEVBQUcsQ0FDM0IsU0FBQSxDQUFVbEIsRUFBSyxVQUFXLENBQ3BCLGNBQWNBLENBQUcsQ0FBQSxHQUdoQmdDLElBQ0hBLENBQU8sQ0FBQSxJQUFJLFNBQVMsT0FBU3FKLENBQUFBLENBQUksR0FFbkNySixDQUFLLENBQUEsSUFBQSxDQUFLaEMsRUFBS2tCLENBQUMsQ0FBQSxFQUNsQixDQUFDLEVBQ0gsQ0FBQSxDQUNBbEIsRUFBSSxnQkFBaUJ1SSxDQUFBQSxDQUFBQSxDQUFXK0MsQ0FBUSxDQUN4Q3ZCLENBQUFBLENBQUFBLENBQVMsV0FBVyxJQUFLLENBQUEsQ0FBRSxNQUFPeEIsQ0FBVyxDQUFBLFFBQUEsQ0FBQStDLENBQVMsQ0FBQyxFQUN6RCxDQUtBLFNBQVMsbUJBQW9CdEwsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUVoQyxnQkFBaUJBLENBQUFBLENBQUcsRUFFcEIsSUFBU3NDLElBQUFBLENBQUFBLENBQUksRUFBR0EsQ0FBSXRDLENBQUFBLENBQUFBLENBQUksV0FBVyxNQUFRc0MsQ0FBQUEsQ0FBQUEsRUFBQUEsQ0FBSyxDQUM5QyxJQUFNL0IsQ0FBQUEsQ0FBT1AsRUFBSSxVQUFXc0MsQ0FBQUEsQ0FBQyxFQUFFLElBQ3pCb0IsQ0FBQUEsQ0FBQUEsQ0FBUTFELEVBQUksVUFBV3NDLENBQUFBLENBQUMsRUFBRSxLQUNoQyxDQUFBLEdBQUksV0FBVy9CLENBQU0sQ0FBQSxPQUFPLEdBQUssVUFBV0EsQ0FBQUEsQ0FBQUEsQ0FBTSxZQUFZLENBQUcsQ0FBQSxDQUMvRCxJQUFNZ0wsQ0FBa0JoTCxDQUFBQSxDQUFBQSxDQUFLLFFBQVEsS0FBSyxDQUFBLENBQUksRUFDeENpTCxDQUFXakwsQ0FBQUEsQ0FBQUEsQ0FBSyxLQUFNZ0wsQ0FBQUEsQ0FBQUEsQ0FBaUJBLENBQWtCLENBQUEsQ0FBQyxFQUNoRSxHQUFJQyxDQUFBQSxHQUFhLEtBQU9BLENBQWEsR0FBQSxHQUFBLENBQUssQ0FDeEMsSUFBSWpELENBQUFBLENBQVloSSxFQUFLLEtBQU1nTCxDQUFBQSxDQUFBQSxDQUFrQixDQUFDLENBRTFDLENBQUEsVUFBQSxDQUFXaEQsRUFBVyxHQUFHLENBQUEsQ0FDM0JBLEVBQVksTUFBU0EsQ0FBQUEsQ0FBQUEsQ0FDWixXQUFXQSxDQUFXLENBQUEsR0FBRyxFQUNsQ0EsQ0FBWSxDQUFBLE9BQUEsQ0FBVUEsRUFBVSxLQUFNLENBQUEsQ0FBQyxFQUM5QixVQUFXQSxDQUFBQSxDQUFBQSxDQUFXLE9BQU8sQ0FDdENBLEdBQUFBLENBQUFBLENBQVksUUFBVUEsQ0FBVSxDQUFBLEtBQUEsQ0FBTSxDQUFDLENBR3pDLENBQUEsQ0FBQSxtQkFBQSxDQUFvQnZJLEVBQUt1SSxDQUFXN0UsQ0FBQUEsQ0FBSyxFQUMzQyxDQUNGLENBQ0YsQ0FDRixDQUtBLFNBQVMsU0FBUzFELENBQUssQ0FBQSxDQUNyQixHQUFJLE9BQVFBLENBQUFBLENBQUFBLENBQUssS0FBSyxNQUFPLENBQUEsZUFBZSxFQUFHLENBQzdDLGNBQUEsQ0FBZUEsQ0FBRyxDQUNsQixDQUFBLE1BQ0YsQ0FDQSxJQUFNK0osQ0FBQUEsQ0FBVyxnQkFBZ0IvSixDQUFHLENBQUEsQ0FDcEMsR0FBSStKLENBQVMsQ0FBQSxRQUFBLEdBQWEsY0FBYy9KLENBQUcsQ0FBQSxDQUFHLENBRTVDLFVBQVdBLENBQUFBLENBQUcsRUFFZCtKLENBQVMsQ0FBQSxRQUFBLENBQVcsY0FBYy9KLENBQUcsQ0FBQSxDQUVyQyxhQUFhQSxDQUFLLENBQUEsd0JBQXdCLEVBR3RDQSxDQUFJLENBQUEsS0FBQSxHQUVOK0osQ0FBUyxDQUFBLFNBQUEsQ0FBWS9KLENBQUksQ0FBQSxLQUFBLENBQUEsQ0FHM0IsSUFBTXVKLENBQWUsQ0FBQSxlQUFBLENBQWdCdkosQ0FBRyxDQUNWLENBQUEsWUFBQSxDQUFhQSxFQUFLK0osQ0FBVVIsQ0FBQUEsQ0FBWSxJQUdoRSx3QkFBeUJ2SixDQUFBQSxDQUFBQSxDQUFLLFVBQVUsQ0FBTSxHQUFBLE1BQUEsQ0FDaEQsYUFBYUEsQ0FBSytKLENBQUFBLENBQUFBLENBQVVSLENBQVksQ0FDL0IsQ0FBQSxZQUFBLENBQWF2SixFQUFLLFlBQVksQ0FBQSxFQUN2Q3VKLEVBQWEsT0FBUSxDQUFBLFNBQVNJLEVBQWEsQ0FFekMsaUJBQUEsQ0FBa0IzSixFQUFLMkosQ0FBYUksQ0FBQUEsQ0FBQUEsQ0FBVSxVQUFXLEVBQ3hELEVBQ0gsQ0FBQyxDQUFBLENBQUEsQ0FBQSxDQU1EL0osRUFBSSxPQUFZLEdBQUEsTUFBQSxFQUFXLGdCQUFnQkEsQ0FBSyxDQUFBLE1BQU0sQ0FBTSxHQUFBLFFBQUEsRUFBWSxZQUFhQSxDQUFBQSxDQUFBQSxDQUFLLE1BQU0sQ0FDbEcsR0FBQSxrQkFBQSxDQUFtQkEsQ0FBRyxDQUd4QixDQUFBLFlBQUEsQ0FBYUEsRUFBSyx1QkFBdUIsRUFDM0MsQ0FDRixDQVNBLFNBQVMsWUFBWUEsQ0FBSyxDQUFBLENBRXhCLEdBREFBLENBQU0sQ0FBQSxhQUFBLENBQWNBLENBQUcsQ0FDbkIsQ0FBQSxPQUFBLENBQVFBLEVBQUssSUFBSyxDQUFBLE1BQUEsQ0FBTyxlQUFlLENBQUcsQ0FBQSxDQUM3QyxlQUFlQSxDQUFHLENBQUEsQ0FDbEIsTUFDRixDQUNBLFFBQUEsQ0FBU0EsQ0FBRyxDQUNaLENBQUEsT0FBQSxDQUFRLHNCQUFzQkEsQ0FBRyxDQUFBLENBQUcsU0FBUzZELENBQU8sQ0FBQSxDQUFFLFNBQVNBLENBQUssRUFBRSxDQUFDLENBQUEsQ0FDdkUsT0FBUSxDQUFBLHdCQUFBLENBQXlCN0QsQ0FBRyxDQUFHLENBQUEsbUJBQW1CLEVBQzVELENBVUEsU0FBUyxlQUFlSyxDQUFLLENBQUEsQ0FDM0IsT0FBT0EsQ0FBSSxDQUFBLE9BQUEsQ0FBUSxxQkFBc0IsT0FBTyxDQUFBLENBQUUsYUFDcEQsQ0FPQSxTQUFTLFNBQVVrSSxDQUFBQSxDQUFBQSxDQUFXQyxFQUFRLENBQ3BDLElBQUlsRixFQUNKLE9BQUksTUFBQSxDQUFPLGFBQWUsT0FBTyxNQUFBLENBQU8sYUFBZ0IsVUFHdERBLENBQUFBLENBQUFBLENBQU0sSUFBSSxXQUFZaUYsQ0FBQUEsQ0FBQUEsQ0FBVyxDQUFFLE9BQVMsQ0FBQSxDQUFBLENBQUEsQ0FBTSxXQUFZLENBQU0sQ0FBQSxDQUFBLFFBQUEsQ0FBVSxHQUFNLE1BQUFDLENBQUFBLENBQU8sQ0FBQyxDQUU1RmxGLEVBQUFBLENBQUFBLENBQU0sYUFBYyxDQUFBLFdBQUEsQ0FBWSxhQUFhLENBQzdDQSxDQUFBQSxDQUFBQSxDQUFJLGdCQUFnQmlGLENBQVcsQ0FBQSxDQUFBLENBQUEsQ0FBTSxHQUFNQyxDQUFNLENBQUEsQ0FBQSxDQUU1Q2xGLENBQ1QsQ0FPQSxTQUFTLGtCQUFrQnRELENBQUt1SSxDQUFBQSxDQUFBQSxDQUFXQyxFQUFRLENBQ2pELFlBQUEsQ0FBYXhJLEVBQUt1SSxDQUFXLENBQUEsWUFBQSxDQUFhLENBQUUsS0FBT0EsQ0FBQUEsQ0FBVSxFQUFHQyxDQUFNLENBQUMsRUFDekUsQ0FNQSxTQUFTLHNCQUFzQkQsQ0FBVyxDQUFBLENBQ3hDLE9BQU9BLENBQWMsR0FBQSx1QkFDdkIsQ0FXQSxTQUFTLGNBQUEsQ0FBZXZJLEVBQUt5TCxDQUFNLENBQUEsQ0FDakMsT0FBUSxDQUFBLGFBQUEsQ0FBY3pMLENBQUcsQ0FBQSxDQUFHLFNBQVNtRixDQUFXLENBQUEsQ0FDOUMsR0FBSSxDQUNGc0csQ0FBQUEsQ0FBS3RHLENBQVMsRUFDaEIsQ0FBQSxNQUFTakUsRUFBRyxDQUNWLFFBQUEsQ0FBU0EsQ0FBQyxFQUNaLENBQ0YsQ0FBQyxFQUNILENBRUEsU0FBUyxRQUFTd0ssQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNqQixPQUFRLENBQUEsS0FBQSxDQUNWLFFBQVEsS0FBTUEsQ0FBQUEsQ0FBRyxFQUNSLE9BQVEsQ0FBQSxHQUFBLEVBQ2pCLFFBQVEsR0FBSSxDQUFBLFNBQUEsQ0FBV0EsQ0FBRyxFQUU5QixDQVlBLFNBQVMsWUFBYTFMLENBQUFBLENBQUFBLENBQUt1SSxFQUFXQyxDQUFRLENBQUEsQ0FDNUN4SSxFQUFNLGFBQWNBLENBQUFBLENBQUcsQ0FDbkJ3SSxDQUFBQSxDQUFBQSxFQUFVLElBQ1pBLEdBQUFBLENBQUFBLENBQVMsRUFFWEEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBTyxJQUFNeEksQ0FDYixDQUFBLElBQU11RCxFQUFRLFNBQVVnRixDQUFBQSxDQUFBQSxDQUFXQyxDQUFNLENBQ3JDLENBQUEsSUFBQSxDQUFLLFFBQVUsQ0FBQyxxQkFBQSxDQUFzQkQsQ0FBUyxDQUNqRCxFQUFBLElBQUEsQ0FBSyxPQUFPdkksQ0FBS3VJLENBQUFBLENBQUFBLENBQVdDLENBQU0sQ0FFaENBLENBQUFBLENBQUFBLENBQU8sUUFDVCxRQUFTQSxDQUFBQSxDQUFBQSxDQUFPLEtBQUssQ0FDckIsQ0FBQSxZQUFBLENBQWF4SSxFQUFLLFlBQWMsQ0FBQSxDQUFFLFVBQVd3SSxDQUFPLENBQUMsR0FFdkQsSUFBSW1ELENBQUFBLENBQWMzTCxFQUFJLGFBQWN1RCxDQUFBQSxDQUFLLEVBQ25DcUksQ0FBWSxDQUFBLGNBQUEsQ0FBZXJELENBQVMsQ0FBQSxDQUMxQyxHQUFJb0QsQ0FBQUEsRUFBZUMsSUFBY3JELENBQVcsQ0FBQSxDQUMxQyxJQUFNc0QsQ0FBZSxDQUFBLFNBQUEsQ0FBVUQsRUFBV3JJLENBQU0sQ0FBQSxNQUFNLEVBQ3REb0ksQ0FBY0EsQ0FBQUEsQ0FBQUEsRUFBZTNMLEVBQUksYUFBYzZMLENBQUFBLENBQVksRUFDN0QsQ0FDQSxPQUFBLGNBQUEsQ0FBZSxVQUFVN0wsQ0FBRyxDQUFBLENBQUcsU0FBU21GLENBQVcsQ0FBQSxDQUNqRHdHLEVBQWNBLENBQWdCeEcsRUFBQUEsQ0FBQUEsQ0FBVSxRQUFRb0QsQ0FBV2hGLENBQUFBLENBQUssSUFBTSxDQUFTLENBQUEsRUFBQSxDQUFDQSxFQUFNLGlCQUN4RixDQUFDLEVBQ01vSSxDQUNULENBS0EsSUFBSSxxQkFBd0IsQ0FBQSxRQUFBLENBQVMsU0FBVyxRQUFTLENBQUEsTUFBQSxDQUt6RCxTQUFTLGlCQUFBLEVBQW9CLENBRTNCLE9BRG1CLGFBQWMsQ0FBQSxhQUFBLENBQWMsd0NBQXdDLENBQ2xFLEVBQUEsV0FBQSxHQUFjLElBQ3JDLENBTUEsU0FBUyxrQkFBbUJ2SSxDQUFBQSxDQUFBQSxDQUFLMEksRUFBUyxDQUN4QyxHQUFJLENBQUMscUJBQXNCLEVBQUEsQ0FDekIsT0FJRixJQUFNQyxDQUFBQSxDQUFZLHlCQUF5QkQsQ0FBTyxDQUFBLENBQzVDRSxFQUFRLFdBQVksRUFBQSxDQUFFLE1BQ3RCQyxDQUFTLENBQUEsTUFBQSxDQUFPLFFBRXRCLEdBQUksSUFBQSxDQUFLLE9BQU8sZ0JBQW9CLEVBQUEsQ0FBQSxDQUFHLENBRXJDLFlBQWEsQ0FBQSxVQUFBLENBQVcsb0JBQW9CLENBQzVDLENBQUEsTUFDRixDQUVBN0ksQ0FBTSxDQUFBLGFBQUEsQ0FBY0EsQ0FBRyxDQUFBLENBRXZCLElBQU04SSxDQUFBQSxDQUFlLFVBQVUsWUFBYSxDQUFBLE9BQUEsQ0FBUSxvQkFBb0IsQ0FBQyxDQUFBLEVBQUssRUFDOUUsQ0FBQSxJQUFBLElBQVM1SixFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUk0SixFQUFhLE1BQVE1SixDQUFBQSxDQUFBQSxFQUFBQSxDQUN2QyxHQUFJNEosQ0FBYTVKLENBQUFBLENBQUMsRUFBRSxHQUFRYyxHQUFBQSxDQUFBQSxDQUFLLENBQy9COEksQ0FBYSxDQUFBLE1BQUEsQ0FBTzVKLEVBQUcsQ0FBQyxDQUFBLENBQ3hCLEtBQ0YsQ0FJRixJQUFNNkosRUFBaUIsQ0FBRSxHQUFBLENBQUEvSSxFQUFLLE9BQVMySSxDQUFBQSxDQUFBQSxDQUFXLE1BQUFDLENBQU8sQ0FBQSxNQUFBLENBQUFDLENBQU8sQ0FLaEUsQ0FBQSxJQUhBLGFBQWEsV0FBWSxFQUFBLENBQUUsSUFBTSxDQUFBLHlCQUFBLENBQTJCLENBQUUsSUFBQSxDQUFNRSxFQUFnQixLQUFPRCxDQUFBQSxDQUFhLENBQUMsQ0FFekdBLENBQUFBLENBQUFBLENBQWEsS0FBS0MsQ0FBYyxDQUFBLENBQ3pCRCxFQUFhLE1BQVMsQ0FBQSxJQUFBLENBQUssT0FBTyxnQkFDdkNBLEVBQUFBLENBQUFBLENBQWEsT0FJZixDQUFBLEtBQU9BLEVBQWEsTUFBUyxDQUFBLENBQUEsRUFDM0IsR0FBSSxDQUNGLFlBQUEsQ0FBYSxRQUFRLG9CQUFzQixDQUFBLElBQUEsQ0FBSyxVQUFVQSxDQUFZLENBQUMsRUFDdkUsS0FDRixDQUFBLE1BQVNoTCxFQUFHLENBQ1YsaUJBQUEsQ0FBa0IsYUFBYyxDQUFBLElBQUEsQ0FBTSx5QkFBMEIsQ0FBRSxLQUFBLENBQU9BLEVBQUcsS0FBT2dMLENBQUFBLENBQWEsQ0FBQyxDQUFBLENBQ2pHQSxDQUFhLENBQUEsS0FBQSxHQUNmLENBRUosQ0FjQSxTQUFTLGdCQUFpQjlJLENBQUFBLENBQUFBLENBQUssQ0FDN0IsR0FBSSxDQUFDLHVCQUNILENBQUEsT0FBTyxLQUdUQSxDQUFNLENBQUEsYUFBQSxDQUFjQSxDQUFHLENBRXZCLENBQUEsSUFBTThJLEVBQWUsU0FBVSxDQUFBLFlBQUEsQ0FBYSxRQUFRLG9CQUFvQixDQUFDLEdBQUssRUFBQyxDQUMvRSxRQUFTNUosQ0FBSSxDQUFBLENBQUEsQ0FBR0EsRUFBSTRKLENBQWEsQ0FBQSxNQUFBLENBQVE1SixJQUN2QyxHQUFJNEosQ0FBQUEsQ0FBYTVKLENBQUMsQ0FBRSxDQUFBLEdBQUEsR0FBUWMsRUFDMUIsT0FBTzhJLENBQUFBLENBQWE1SixDQUFDLENBR3pCLENBQUEsT0FBTyxJQUNULENBTUEsU0FBUyx5QkFBeUJ0QyxDQUFLLENBQUEsQ0FDckMsSUFBTW9NLENBQVksQ0FBQSxJQUFBLENBQUssT0FBTyxZQUN4QkMsQ0FBQUEsQ0FBQUEsQ0FBOEJyTSxFQUFJLFNBQVUsQ0FBQSxDQUFBLENBQUksRUFDdEQsT0FBUSxPQUFBLENBQUEsT0FBQSxDQUFRcU0sRUFBTyxHQUFNRCxDQUFBQSxDQUFTLEVBQUcsU0FBU3ZJLENBQUFBLENBQU8sQ0FDdkQsc0JBQXVCQSxDQUFBQSxDQUFBQSxDQUFPdUksQ0FBUyxFQUN6QyxDQUFDLEVBRUQsT0FBUSxDQUFBLE9BQUEsQ0FBUUMsRUFBTyx5QkFBeUIsQ0FBQSxDQUFHLFNBQVN4SSxDQUFPLENBQUEsQ0FDakVBLEVBQU0sZUFBZ0IsQ0FBQSxVQUFVLEVBQ2xDLENBQUMsQ0FBQSxDQUNNd0ksRUFBTSxTQUNmLENBRUEsU0FBUyx3QkFBQSxFQUEyQixDQUNsQyxJQUFNck0sRUFBTSxpQkFBa0IsRUFBQSxDQUN4Qm1ELEVBQU8scUJBQXlCLEVBQUEsUUFBQSxDQUFTLFNBQVcsUUFBUyxDQUFBLE1BQUEsQ0FPL0RtSixFQUNKLEdBQUksQ0FDRkEsRUFBc0IsV0FBWSxFQUFBLENBQUUsY0FBYyxvREFBb0QsRUFDeEcsTUFBWSxDQUVWQSxDQUFBQSxDQUFzQixhQUFjLENBQUEsYUFBQSxDQUFjLGdEQUFnRCxFQUNwRyxDQUNLQSxJQUNILFlBQWEsQ0FBQSxXQUFBLEdBQWMsSUFBTSxDQUFBLHdCQUFBLENBQTBCLENBQUUsSUFBQW5KLENBQUFBLENBQUFBLENBQU0sV0FBWW5ELENBQUksQ0FBQyxFQUNwRixrQkFBbUJtRCxDQUFBQSxDQUFBQSxDQUFNbkQsQ0FBRyxDQUcxQixDQUFBLENBQUEsSUFBQSxDQUFLLE1BQU8sQ0FBQSxjQUFBLEVBQWdCLE9BQVEsQ0FBQSxZQUFBLENBQWEsQ0FBRSxJQUFNLENBQUEsQ0FBQSxDQUFLLEVBQUcsV0FBWSxFQUFBLENBQUUsTUFBTyxNQUFPLENBQUEsUUFBQSxDQUFTLElBQUksRUFDaEgsQ0FLQSxTQUFTLGtCQUFtQm1ELENBQUFBLENBQUFBLENBQU0sQ0FFNUIsSUFBSyxDQUFBLE1BQUEsQ0FBTyxzQkFDZEEsQ0FBT0EsQ0FBQUEsQ0FBQUEsQ0FBSyxRQUFRLGlDQUFtQyxDQUFBLEVBQUUsR0FDckQsUUFBU0EsQ0FBQUEsQ0FBQUEsQ0FBTSxHQUFHLENBQUssRUFBQSxRQUFBLENBQVNBLEVBQU0sR0FBRyxDQUFBLElBQzNDQSxFQUFPQSxDQUFLLENBQUEsS0FBQSxDQUFNLEVBQUcsQ0FBRSxDQUFBLENBQUEsQ0FBQSxDQUFBLENBR3ZCLEtBQUssTUFBTyxDQUFBLGNBQUEsRUFDZCxRQUFRLFNBQVUsQ0FBQSxDQUFFLElBQU0sQ0FBQSxDQUFBLENBQUssQ0FBRyxDQUFBLEVBQUEsQ0FBSUEsQ0FBSSxDQUU1QyxDQUFBLHFCQUFBLENBQXdCQSxFQUMxQixDQUtBLFNBQVMsb0JBQW9CQSxDQUFNLENBQUEsQ0FDN0IsS0FBSyxNQUFPLENBQUEsY0FBQSxFQUFnQixRQUFRLFlBQWEsQ0FBQSxDQUFFLEtBQU0sQ0FBSyxDQUFBLENBQUEsQ0FBRyxHQUFJQSxDQUFJLENBQUEsQ0FDN0Usc0JBQXdCQSxFQUMxQixDQUtBLFNBQVMsaUJBQWtCb0osQ0FBQUEsQ0FBQUEsQ0FBTyxDQUNoQyxPQUFRQSxDQUFBQSxDQUFBQSxDQUFPLFNBQVN0RSxDQUFNLENBQUEsQ0FDNUJBLEVBQUssSUFBSyxDQUFBLEtBQUEsQ0FBUyxFQUNyQixDQUFDLEVBQ0gsQ0FLQSxTQUFTLHFCQUFBLENBQXNCOUUsRUFBTSxDQUNuQyxJQUFNcUosRUFBVSxJQUFJLGNBQUEsQ0FDZEMsRUFBVSxDQUFFLElBQUEsQ0FBQXRKLEVBQU0sR0FBS3FKLENBQUFBLENBQVEsRUFDckMsWUFBYSxDQUFBLFdBQUEsR0FBYyxJQUFNLENBQUEsdUJBQUEsQ0FBeUJDLENBQU8sQ0FDakVELENBQUFBLENBQUFBLENBQVEsS0FBSyxLQUFPckosQ0FBQUEsQ0FBQUEsQ0FBTSxFQUFJLENBQzlCcUosQ0FBQUEsQ0FBQUEsQ0FBUSxpQkFBaUIsWUFBYyxDQUFBLE1BQU0sRUFDN0NBLENBQVEsQ0FBQSxnQkFBQSxDQUFpQiw2QkFBOEIsTUFBTSxDQUFBLENBQzdEQSxFQUFRLGdCQUFpQixDQUFBLGdCQUFBLENBQWtCLGFBQWMsQ0FBQSxRQUFBLENBQVMsSUFBSSxDQUN0RUEsQ0FBQUEsQ0FBQUEsQ0FBUSxPQUFTLFVBQVcsQ0FDMUIsR0FBSSxJQUFLLENBQUEsTUFBQSxFQUFVLEdBQU8sRUFBQSxJQUFBLENBQUssTUFBUyxDQUFBLEdBQUEsQ0FBSyxDQUMzQyxZQUFhLENBQUEsV0FBQSxHQUFjLElBQU0sQ0FBQSwyQkFBQSxDQUE2QkMsQ0FBTyxDQUNyRSxDQUFBLElBQU1sTCxFQUFXLFlBQWEsQ0FBQSxJQUFBLENBQUssUUFBUSxDQUVyQzhGLENBQUFBLENBQUFBLENBQVU5RixFQUFTLGFBQWMsQ0FBQSx3Q0FBd0MsR0FBS0EsQ0FDOUVtTCxDQUFBQSxDQUFBQSxDQUFpQixtQkFDakJwSCxDQUFBQSxDQUFBQSxDQUFhLGVBQWVvSCxDQUFjLENBQUEsQ0FDaEQsWUFBWW5MLENBQVMsQ0FBQSxLQUFLLEVBRTFCLGFBQWNtTCxDQUFBQSxDQUFBQSxDQUFnQnJGLEVBQVMvQixDQUFVLENBQUEsQ0FDakQsa0JBQWtCQSxDQUFXLENBQUEsS0FBSyxFQUNsQyxxQkFBd0JuQyxDQUFBQSxDQUFBQSxDQUN4QixhQUFhLFdBQVksRUFBQSxDQUFFLElBQU0sQ0FBQSxxQkFBQSxDQUF1QixDQUFFLElBQUEsQ0FBQUEsRUFBTSxTQUFXLENBQUEsQ0FBQSxDQUFBLENBQU0sZUFBZ0IsSUFBSyxDQUFBLFFBQVMsQ0FBQyxFQUNsSCxDQUFBLEtBQ0Usa0JBQWtCLFdBQVksRUFBQSxDQUFFLEtBQU0sZ0NBQWtDc0osQ0FBQUEsQ0FBTyxFQUVuRixDQUNBRCxDQUFBQSxDQUFBQSxDQUFRLE9BQ1YsQ0FLQSxTQUFTLGNBQWVySixDQUFBQSxDQUFBQSxDQUFNLENBQzVCLHdCQUF5QixFQUFBLENBQ3pCQSxFQUFPQSxDQUFRLEVBQUEsUUFBQSxDQUFTLFNBQVcsUUFBUyxDQUFBLE1BQUEsQ0FDNUMsSUFBTXdKLENBQVMsQ0FBQSxnQkFBQSxDQUFpQnhKLENBQUksQ0FDcEMsQ0FBQSxHQUFJd0osRUFBUSxDQUNWLElBQU1wTCxFQUFXLFlBQWFvTCxDQUFBQSxDQUFBQSxDQUFPLE9BQU8sQ0FBQSxDQUN0Q0QsQ0FBaUIsQ0FBQSxpQkFBQSxHQUNqQnBILENBQWEsQ0FBQSxjQUFBLENBQWVvSCxDQUFjLENBQ2hELENBQUEsV0FBQSxDQUFZbkwsRUFBUyxLQUFLLENBQUEsQ0FDMUIsY0FBY21MLENBQWdCbkwsQ0FBQUEsQ0FBQUEsQ0FBVStELENBQVUsQ0FDbEQsQ0FBQSxpQkFBQSxDQUFrQkEsRUFBVyxLQUFLLENBQUEsQ0FDbEMsV0FBWSxDQUFBLFVBQUEsQ0FBVyxVQUFXLENBQ2hDLE1BQUEsQ0FBTyxTQUFTLENBQUdxSCxDQUFBQSxDQUFBQSxDQUFPLE1BQU0sRUFDbEMsQ0FBQSxDQUFHLENBQUMsQ0FDSixDQUFBLHFCQUFBLENBQXdCeEosRUFDeEIsWUFBYSxDQUFBLFdBQUEsR0FBYyxJQUFNLENBQUEscUJBQUEsQ0FBdUIsQ0FBRSxJQUFBQSxDQUFBQSxDQUFBQSxDQUFNLEtBQU13SixDQUFPLENBQUMsRUFDaEYsQ0FDTSxLQUFBLElBQUEsQ0FBSyxPQUFPLG9CQUdkLENBQUEsTUFBQSxDQUFPLFNBQVMsTUFBTyxDQUFBLENBQUEsQ0FBSSxFQUUzQixxQkFBc0J4SixDQUFBQSxDQUFJLEVBR2hDLENBTUEsU0FBUywyQkFBMkJuRCxDQUFLLENBQUEsQ0FDdkMsSUFBSTRNLENBQXFDLENBQUEsb0JBQUEsQ0FBcUI1TSxFQUFLLGNBQWMsQ0FBQSxDQUNqRixPQUFJNE0sQ0FBYyxFQUFBLElBQUEsR0FDaEJBLEVBQWEsQ0FBQzVNLENBQUcsR0FFbkIsT0FBUTRNLENBQUFBLENBQUFBLENBQVksU0FBU0MsQ0FBSSxDQUFBLENBQy9CLElBQU1uRyxDQUFlLENBQUEsZUFBQSxDQUFnQm1HLENBQUUsQ0FDdkNuRyxDQUFBQSxDQUFBQSxDQUFhLGNBQWdCQSxDQUFhLENBQUEsWUFBQSxFQUFnQixHQUFLLENBQy9EbUcsQ0FBQUEsQ0FBQUEsQ0FBRyxTQUFVLENBQUEsR0FBQSxDQUFJLElBQUtBLENBQUFBLENBQUFBLENBQUcsVUFBVyxJQUFLLENBQUEsTUFBQSxDQUFPLFlBQVksRUFDOUQsQ0FBQyxFQUNNRCxDQUNULENBTUEsU0FBUyxlQUFnQjVNLENBQUFBLENBQUFBLENBQUssQ0FDNUIsSUFBSThNLENBQUFBLENBQXVDLHFCQUFxQjlNLENBQUssQ0FBQSxpQkFBaUIsRUFDdEYsT0FBSThNLENBQUFBLEVBQWdCLE9BQ2xCQSxDQUFlLENBQUEsSUFFakIsT0FBUUEsQ0FBQUEsQ0FBQUEsQ0FBYyxTQUFTQyxDQUFpQixDQUFBLENBQzlDLElBQU1yRyxDQUFlLENBQUEsZUFBQSxDQUFnQnFHLENBQWUsQ0FDcERyRyxDQUFBQSxDQUFBQSxDQUFhLGNBQWdCQSxDQUFhLENBQUEsWUFBQSxFQUFnQixHQUFLLENBQy9EcUcsQ0FBQUEsQ0FBQUEsQ0FBZ0IsYUFBYSxVQUFZLENBQUEsRUFBRSxDQUMzQ0EsQ0FBQUEsQ0FBQUEsQ0FBZ0IsWUFBYSxDQUFBLHVCQUFBLENBQXlCLEVBQUUsRUFDMUQsQ0FBQyxFQUNNRCxDQUNULENBTUEsU0FBUyx1QkFBd0JGLENBQUFBLENBQUFBLENBQVlJLEVBQVUsQ0FDckQsT0FBQSxDQUFRSixFQUFZLFNBQVNDLENBQUFBLENBQUksQ0FDL0IsSUFBTW5HLENBQUFBLENBQWUsZ0JBQWdCbUcsQ0FBRSxDQUFBLENBQ3ZDbkcsRUFBYSxZQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FBYSxjQUFnQixDQUFLLEVBQUEsQ0FBQSxDQUMzREEsRUFBYSxZQUFpQixHQUFBLENBQUEsRUFDaENtRyxFQUFHLFNBQVUsQ0FBQSxNQUFBLENBQU8sS0FBS0EsQ0FBRyxDQUFBLFNBQUEsQ0FBVyxLQUFLLE1BQU8sQ0FBQSxZQUFZLEVBRW5FLENBQUMsQ0FBQSxDQUNELFFBQVFHLENBQVUsQ0FBQSxTQUFTRCxDQUFpQixDQUFBLENBQzFDLElBQU1yRyxDQUFBQSxDQUFlLGdCQUFnQnFHLENBQWUsQ0FBQSxDQUNwRHJHLEVBQWEsWUFBZ0JBLENBQUFBLENBQUFBLENBQUFBLENBQWEsY0FBZ0IsQ0FBSyxFQUFBLENBQUEsQ0FDM0RBLEVBQWEsWUFBaUIsR0FBQSxDQUFBLEdBQ2hDcUcsRUFBZ0IsZUFBZ0IsQ0FBQSxVQUFVLEVBQzFDQSxDQUFnQixDQUFBLGVBQUEsQ0FBZ0IsdUJBQXVCLENBRTNELEVBQUEsQ0FBQyxFQUNILENBV0EsU0FBUyxhQUFhRSxDQUFXak4sQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNwQyxJQUFTc0MsSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJMkssQ0FBQUEsQ0FBQUEsQ0FBVSxPQUFRM0ssQ0FFcEMsRUFBQSxDQUFBLEdBRGEySyxFQUFVM0ssQ0FBQyxDQUFBLENBQ2YsV0FBV3RDLENBQUcsQ0FBQSxDQUNyQixPQUFPLENBR1gsQ0FBQSxDQUFBLE9BQU8sQ0FDVCxDQUFBLENBTUEsU0FBUyxhQUFBLENBQWM0RyxFQUFTLENBRTlCLElBQU01RyxFQUF1QzRHLENBSzdDLENBQUEsT0FKSTVHLEVBQUksSUFBUyxHQUFBLEVBQUEsRUFBTUEsRUFBSSxJQUFRLEVBQUEsSUFBQSxFQUFRQSxFQUFJLFFBQVksRUFBQSxPQUFBLENBQVFBLEVBQUssb0JBQW9CLENBQUEsRUFJeEZBLEVBQUksSUFBUyxHQUFBLFFBQUEsRUFBWUEsRUFBSSxJQUFTLEdBQUEsUUFBQSxFQUFZQSxFQUFJLE9BQVksR0FBQSxPQUFBLEVBQVdBLEVBQUksT0FBWSxHQUFBLE9BQUEsRUFBV0EsRUFBSSxPQUFZLEdBQUEsTUFBQSxDQUNuSCxHQUVMQSxDQUFJLENBQUEsSUFBQSxHQUFTLFlBQWNBLENBQUksQ0FBQSxJQUFBLEdBQVMsUUFDbkNBLENBQUksQ0FBQSxPQUFBLENBRU4sRUFDVCxDQUtBLFNBQVMsa0JBQW1CTyxDQUFBQSxDQUFBQSxDQUFNbUQsQ0FBT3dKLENBQUFBLENBQUFBLENBQVUsQ0FDN0MzTSxDQUFRLEVBQUEsSUFBQSxFQUFRbUQsR0FBUyxJQUN2QixHQUFBLEtBQUEsQ0FBTSxRQUFRQSxDQUFLLENBQUEsQ0FDckJBLEVBQU0sT0FBUSxDQUFBLFNBQVN5SixFQUFHLENBQUVELENBQUFBLENBQVMsT0FBTzNNLENBQU00TSxDQUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFBLENBRXRERCxFQUFTLE1BQU8zTSxDQUFBQSxDQUFBQSxDQUFNbUQsQ0FBSyxDQUdqQyxFQUFBLENBS0EsU0FBUyx1QkFBd0JuRCxDQUFBQSxDQUFBQSxDQUFNbUQsRUFBT3dKLENBQVUsQ0FBQSxDQUN0RCxHQUFJM00sQ0FBUSxFQUFBLElBQUEsRUFBUW1ELEdBQVMsSUFBTSxDQUFBLENBQ2pDLElBQUkwSixDQUFTRixDQUFBQSxDQUFBQSxDQUFTLE9BQU8zTSxDQUFJLENBQUEsQ0FDN0IsS0FBTSxDQUFBLE9BQUEsQ0FBUW1ELENBQUssQ0FBQSxDQUNyQjBKLEVBQVNBLENBQU8sQ0FBQSxNQUFBLENBQU9ELEdBQUt6SixDQUFNLENBQUEsT0FBQSxDQUFReUosQ0FBQyxDQUFJLENBQUEsQ0FBQyxFQUVoREMsQ0FBU0EsQ0FBQUEsQ0FBQUEsQ0FBTyxPQUFPRCxDQUFLQSxFQUFBQSxDQUFBQSxHQUFNekosQ0FBSyxDQUV6Q3dKLENBQUFBLENBQUFBLENBQVMsT0FBTzNNLENBQUksQ0FBQSxDQUNwQixRQUFRNk0sQ0FBUUQsQ0FBQUEsQ0FBQUEsRUFBS0QsRUFBUyxNQUFPM00sQ0FBQUEsQ0FBQUEsQ0FBTTRNLENBQUMsQ0FBQyxFQUMvQyxDQUNGLENBU0EsU0FBUyxrQkFBa0JGLENBQVdDLENBQUFBLENBQUFBLENBQVVHLEVBQVFyTixDQUFLc04sQ0FBQUEsQ0FBQUEsQ0FBVSxDQUNyRSxHQUFJLEVBQUF0TixHQUFPLElBQVEsRUFBQSxZQUFBLENBQWFpTixDQUFXak4sQ0FBQUEsQ0FBRyxDQUs5QyxDQUFBLENBQUEsQ0FBQSxHQUZFaU4sRUFBVSxJQUFLak4sQ0FBQUEsQ0FBRyxFQUVoQixhQUFjQSxDQUFBQSxDQUFHLEVBQUcsQ0FDdEIsSUFBTU8sRUFBTyxlQUFnQlAsQ0FBQUEsQ0FBQUEsQ0FBSyxNQUFNLENBRXBDMEQsQ0FBQUEsQ0FBQUEsQ0FBUTFELEVBQUksS0FDWkEsQ0FBQUEsQ0FBQUEsWUFBZSxtQkFBcUJBLENBQUksQ0FBQSxRQUFBLEdBQzFDMEQsRUFBUSxPQUFRMUQsQ0FBQUEsQ0FBQUEsQ0FBSSxpQkFBaUIsZ0JBQWdCLENBQUMsRUFBRSxHQUFJLENBQUEsU0FBU2tCLEVBQUcsQ0FBRSxPQUF1Q0EsRUFBSSxLQUFNLENBQUMsR0FHMUhsQixDQUFlLFlBQUEsZ0JBQUEsRUFBb0JBLEVBQUksS0FDekMwRCxHQUFBQSxDQUFBQSxDQUFRLFFBQVExRCxDQUFJLENBQUEsS0FBSyxHQUUzQixrQkFBbUJPLENBQUFBLENBQUFBLENBQU1tRCxFQUFPd0osQ0FBUSxDQUFBLENBQ3BDSSxHQUNGLGVBQWdCdE4sQ0FBQUEsQ0FBQUEsQ0FBS3FOLENBQU0sRUFFL0IsQ0FDSXJOLGFBQWUsZUFDakIsR0FBQSxPQUFBLENBQVFBLEVBQUksUUFBVSxDQUFBLFNBQVN1TixFQUFPLENBQ2hDTixDQUFBQSxDQUFVLFFBQVFNLENBQUssQ0FBQSxFQUFLLEVBSTlCLHVCQUF3QkEsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUFNQSxDQUFNLENBQUEsS0FBQSxDQUFPTCxDQUFRLENBRXpERCxDQUFBQSxDQUFBQSxDQUFVLEtBQUtNLENBQUssQ0FBQSxDQUVsQkQsR0FDRixlQUFnQkMsQ0FBQUEsQ0FBQUEsQ0FBT0YsQ0FBTSxFQUVqQyxDQUFDLEVBQ0QsSUFBSSxRQUFBLENBQVNyTixDQUFHLENBQUUsQ0FBQSxPQUFBLENBQVEsU0FBUzBELENBQUFBLENBQU9uRCxDQUFNLENBQUEsQ0FDMUNtRCxhQUFpQixJQUFRQSxFQUFBQSxDQUFBQSxDQUFNLE9BQVMsRUFHNUMsRUFBQSxrQkFBQSxDQUFtQm5ELEVBQU1tRCxDQUFPd0osQ0FBQUEsQ0FBUSxFQUMxQyxDQUFDLENBQUEsRUFBQSxDQUVMLENBT0EsU0FBUyxlQUFBLENBQWdCbE4sRUFBS3FOLENBQVEsQ0FBQSxDQUNwQyxJQUFNekcsQ0FBeUQ1RyxDQUFBQSxDQUFBQSxDQUMzRDRHLEVBQVEsWUFDVixHQUFBLFlBQUEsQ0FBYUEsRUFBUywwQkFBMEIsQ0FBQSxDQUMzQ0EsRUFBUSxhQUFjLEVBQUEsR0FDekJ5RyxFQUFPLElBQUssQ0FBQSxDQUFFLElBQUt6RyxDQUFTLENBQUEsT0FBQSxDQUFTQSxFQUFRLGlCQUFtQixDQUFBLFFBQUEsQ0FBVUEsRUFBUSxRQUFTLENBQUMsRUFDNUYsWUFBYUEsQ0FBQUEsQ0FBQUEsQ0FBUyx3QkFBMEIsQ0FBQSxDQUFFLE9BQVNBLENBQUFBLENBQUFBLENBQVEsa0JBQW1CLFFBQVVBLENBQUFBLENBQUFBLENBQVEsUUFBUyxDQUFDLENBQUEsQ0FBQSxFQUd4SCxDQVFBLFNBQVMsZ0JBQUEsQ0FBaUI0RyxFQUFVQyxDQUFPLENBQUEsQ0FDekMsUUFBVzFLLENBQU8wSyxJQUFBQSxDQUFBQSxDQUFNLE1BQ3RCRCxDQUFBQSxDQUFBQSxDQUFTLE9BQU96SyxDQUFHLENBQUEsQ0FFckIsT0FBQTBLLENBQU0sQ0FBQSxPQUFBLENBQVEsU0FBUy9KLENBQU9YLENBQUFBLENBQUFBLENBQUssQ0FDakN5SyxDQUFTLENBQUEsTUFBQSxDQUFPekssRUFBS1csQ0FBSyxFQUM1QixDQUFDLENBQ004SixDQUFBQSxDQUNULENBT0EsU0FBUyxjQUFBLENBQWV4TixFQUFLRSxDQUFNLENBQUEsQ0FFakMsSUFBTStNLENBQVksQ0FBQSxFQUNaQyxDQUFBQSxDQUFBQSxDQUFXLElBQUksUUFBQSxDQUNmUSxFQUFtQixJQUFJLFFBQUEsQ0FFdkJMLEVBQVMsRUFBQyxDQUNWM0csRUFBZSxlQUFnQjFHLENBQUFBLENBQUcsRUFDcEMwRyxDQUFhLENBQUEsaUJBQUEsRUFBcUIsQ0FBQyxZQUFhQSxDQUFBQSxDQUFBQSxDQUFhLGlCQUFpQixDQUNoRkEsR0FBQUEsQ0FBQUEsQ0FBYSxrQkFBb0IsSUFLbkMsQ0FBQSxDQUFBLElBQUk0RyxFQUFZdE4sQ0FBZSxZQUFBLGVBQUEsRUFBbUJBLEVBQUksVUFBZSxHQUFBLENBQUEsQ0FBQSxFQUFTLGtCQUFrQkEsQ0FBSyxDQUFBLGFBQWEsSUFBTSxNQWN4SCxDQUFBLEdBYkkwRyxFQUFhLGlCQUNmNEcsR0FBQUEsQ0FBQUEsQ0FBV0EsR0FBWTVHLENBQWEsQ0FBQSxpQkFBQSxDQUFrQixpQkFBbUIsQ0FJdkV4RyxDQUFBQSxDQUFBQSxDQUFBQSxDQUFBQSxHQUFTLE9BQ1gsaUJBQWtCK00sQ0FBQUEsQ0FBQUEsQ0FBV1MsRUFBa0JMLENBQVEsQ0FBQSxPQUFBLENBQVFyTixFQUFLLE1BQU0sQ0FBQSxDQUFHc04sQ0FBUSxDQUl2RixDQUFBLGlCQUFBLENBQWtCTCxFQUFXQyxDQUFVRyxDQUFBQSxDQUFBQSxDQUFRck4sRUFBS3NOLENBQVEsQ0FBQSxDQUd4RDVHLEVBQWEsaUJBQXFCMUcsRUFBQUEsQ0FBQUEsQ0FBSSxVQUFZLFFBQ3JEQSxFQUFBQSxDQUFBQSxDQUFJLFVBQVksT0FBVyxFQUFBLGVBQUEsQ0FBZ0JBLEVBQUssTUFBTSxDQUFBLEdBQU0sU0FBVyxDQUN0RSxJQUFNMk4sRUFBU2pILENBQWEsQ0FBQSxpQkFBQSxFQUFzRTFHLEVBQzVGTyxDQUFPLENBQUEsZUFBQSxDQUFnQm9OLEVBQVEsTUFBTSxDQUFBLENBQzNDLG1CQUFtQnBOLENBQU1vTixDQUFBQSxDQUFBQSxDQUFPLE1BQU9ELENBQWdCLEVBQ3pELENBR0EsSUFBTUUsQ0FBQUEsQ0FBVyxvQkFBcUI1TixDQUFBQSxDQUFBQSxDQUFLLFlBQVksQ0FBQSxDQUN2RCxlQUFRNE4sQ0FBVSxDQUFBLFNBQVNoSyxFQUFNLENBQy9CLGlCQUFBLENBQWtCcUosRUFBV0MsQ0FBVUcsQ0FBQUEsQ0FBQUEsQ0FBUSxVQUFVekosQ0FBSSxDQUFBLENBQUcwSixDQUFRLENBRW5FLENBQUEsT0FBQSxDQUFRMUosRUFBTSxNQUFNLENBQUEsRUFDdkIsUUFBUSxZQUFhQSxDQUFBQSxDQUFJLEVBQUUsZ0JBQWlCLENBQUEsY0FBYyxFQUFHLFNBQVNpSyxDQUFBQSxDQUFZLENBQ2hGLGlCQUFrQlosQ0FBQUEsQ0FBQUEsQ0FBV0MsRUFBVUcsQ0FBUVEsQ0FBQUEsQ0FBQUEsQ0FBWVAsQ0FBUSxFQUNyRSxDQUFDLEVBRUwsQ0FBQyxDQUFBLENBR0QsaUJBQWlCSixDQUFVUSxDQUFBQSxDQUFnQixFQUVwQyxDQUFFLE1BQUEsQ0FBQUwsQ0FBUSxDQUFBLFFBQUEsQ0FBQUgsQ0FBVSxDQUFBLE1BQUEsQ0FBUSxjQUFjQSxDQUFRLENBQUUsQ0FDN0QsQ0FRQSxTQUFTLFlBQVlZLENBQVd2TixDQUFBQSxDQUFBQSxDQUFNd04sRUFBVyxDQUMzQ0QsQ0FBQUEsR0FBYyxLQUNoQkEsQ0FBYSxFQUFBLEdBQUEsQ0FBQSxDQUVYLE9BQU9DLENBQVMsQ0FBQSxHQUFNLG9CQUN4QkEsQ0FBWSxDQUFBLElBQUEsQ0FBSyxVQUFVQSxDQUFTLENBQUEsQ0FBQSxDQUV0QyxJQUFNNUMsQ0FBSSxDQUFBLGtCQUFBLENBQW1CNEMsQ0FBUyxDQUN0QyxDQUFBLE9BQUFELEdBQWEsa0JBQW1Cdk4sQ0FBQUEsQ0FBSSxFQUFJLEdBQU00SyxDQUFBQSxDQUFBQSxDQUN2QzJDLENBQ1QsQ0FNQSxTQUFTLFVBQVVWLENBQVEsQ0FBQSxDQUN6QkEsRUFBUyxrQkFBbUJBLENBQUFBLENBQU0sQ0FDbEMsQ0FBQSxJQUFJVSxDQUFZLENBQUEsRUFBQSxDQUNoQixPQUFBVixDQUFPLENBQUEsT0FBQSxDQUFRLFNBQVMxSixDQUFPWCxDQUFBQSxDQUFBQSxDQUFLLENBQ2xDK0ssQ0FBWSxDQUFBLFdBQUEsQ0FBWUEsRUFBVy9LLENBQUtXLENBQUFBLENBQUssRUFDL0MsQ0FBQyxDQUFBLENBQ01vSyxDQUNULENBWUEsU0FBUyxXQUFXOU4sQ0FBS2lGLENBQUFBLENBQUFBLENBQVErSSxFQUFRLENBRXZDLElBQU1DLEVBQVUsQ0FDZCxZQUFBLENBQWMsT0FDZCxZQUFjLENBQUEsZUFBQSxDQUFnQmpPLEVBQUssSUFBSSxDQUFBLENBQ3ZDLGtCQUFtQixlQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBSyxNQUFNLENBQzlDLENBQUEsV0FBQSxDQUFhLGtCQUFrQmlGLENBQVEsQ0FBQSxJQUFJLEVBQzNDLGdCQUFrQixDQUFBLFdBQUEsR0FBYyxRQUFTLENBQUEsSUFDM0MsRUFDQSxPQUFvQmpGLG1CQUFBQSxDQUFBQSxDQUFBQSxDQUFLLGFBQWMsQ0FBT2lPLENBQUFBLENBQUFBLENBQU8sRUFDakRELENBQVcsR0FBQSxLQUFBLENBQUEsR0FDYkMsRUFBUSxXQUFXLENBQUEsQ0FBSUQsR0FFckIsZUFBZ0JoTyxDQUFBQSxDQUFHLEVBQUUsT0FDdkJpTyxHQUFBQSxDQUFBQSxDQUFRLFlBQVksQ0FBSSxDQUFBLE1BQUEsQ0FBQSxDQUVuQkEsQ0FDVCxDQVVBLFNBQVMsYUFBYUMsQ0FBYWxPLENBQUFBLENBQUFBLENBQUssQ0FDdEMsSUFBTW1PLENBQUFBLENBQWMseUJBQXlCbk8sQ0FBSyxDQUFBLFdBQVcsRUFDN0QsR0FBSW1PLENBQUFBLENBQWEsQ0FDZixHQUFJQSxDQUFBQSxHQUFnQixPQUNsQixPQUFPLElBQUksU0FDTixHQUFJQSxDQUFBQSxHQUFnQixHQUN6QixDQUFBLE9BQU9ELENBQ0YsQ0FBQSxHQUFJQyxFQUFZLE9BQVEsQ0FBQSxNQUFNLElBQU0sQ0FDekMsQ0FBQSxPQUFBLE9BQUEsQ0FBUUEsRUFBWSxNQUFPLENBQUEsQ0FBQyxFQUFFLEtBQU0sQ0FBQSxHQUFHLEVBQUcsU0FBUzVOLENBQUFBLENBQU0sQ0FDdkRBLENBQU9BLENBQUFBLENBQUFBLENBQUssTUFDWjJOLENBQUFBLENBQUFBLENBQVksT0FBTzNOLENBQUksRUFDekIsQ0FBQyxDQUNNMk4sQ0FBQUEsQ0FBQUEsQ0FDRixDQUNMLElBQU1FLENBQUFBLENBQVksSUFBSSxRQUN0QixDQUFBLE9BQUEsT0FBQSxDQUFRRCxFQUFZLEtBQU0sQ0FBQSxHQUFHLEVBQUcsU0FBUzVOLENBQUFBLENBQU0sQ0FDN0NBLENBQU9BLENBQUFBLENBQUFBLENBQUssTUFDUjJOLENBQUFBLENBQUFBLENBQVksR0FBSTNOLENBQUFBLENBQUksQ0FDdEIyTixFQUFBQSxDQUFBQSxDQUFZLE9BQU8zTixDQUFJLENBQUEsQ0FBRSxRQUFRLFNBQVNtRCxDQUFBQSxDQUFPLENBQUUwSyxDQUFVLENBQUEsTUFBQSxDQUFPN04sRUFBTW1ELENBQUssRUFBRSxDQUFDLEVBRXRGLENBQUMsRUFDTTBLLENBQ1QsQ0FDRixNQUNTRixPQUFBQSxDQUVYLENBTUEsU0FBUyxZQUFBLENBQWFsTyxFQUFLLENBQ3pCLE9BQU8sQ0FBQyxDQUFDLGVBQUEsQ0FBZ0JBLEVBQUssTUFBTSxDQUFBLEVBQUssZ0JBQWdCQSxDQUFLLENBQUEsTUFBTSxFQUFFLE9BQVEsQ0FBQSxHQUFHLEdBQUssQ0FDeEYsQ0FPQSxTQUFTLG9CQUFxQkEsQ0FBQUEsQ0FBQUEsQ0FBS3FPLENBQWtCLENBQUEsQ0FDbkQsSUFBTUMsQ0FBQUEsQ0FBV0QsR0FBb0Isd0JBQXlCck8sQ0FBQUEsQ0FBQUEsQ0FBSyxTQUFTLENBRXRFc0gsQ0FBQUEsQ0FBQUEsQ0FBVyxDQUNmLFNBQVcsQ0FBQSxlQUFBLENBQWdCdEgsQ0FBRyxDQUFFLENBQUEsT0FBQSxDQUFVLFlBQWMsSUFBSyxDQUFBLE1BQUEsQ0FBTyxpQkFDcEUsU0FBVyxDQUFBLElBQUEsQ0FBSyxPQUFPLGdCQUN2QixDQUFBLFdBQUEsQ0FBYSxLQUFLLE1BQU8sQ0FBQSxrQkFDM0IsRUFJQSxHQUhJLElBQUEsQ0FBSyxPQUFPLHFCQUF5QixFQUFBLGVBQUEsQ0FBZ0JBLENBQUcsQ0FBRSxDQUFBLE9BQUEsRUFBVyxDQUFDLFlBQWFBLENBQUFBLENBQUcsSUFDeEZzSCxDQUFTLENBQUEsSUFBQSxDQUFPLE9BRWRnSCxDQUFVLENBQUEsQ0FDWixJQUFNQyxDQUFRLENBQUEsaUJBQUEsQ0FBa0JELENBQVEsQ0FBQSxDQUN4QyxHQUFJQyxDQUFBQSxDQUFNLE9BQVMsQ0FDakIsQ0FBQSxJQUFBLElBQVNqTSxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUlpTSxFQUFNLE1BQVFqTSxDQUFBQSxDQUFBQSxFQUFBQSxDQUFLLENBQ3JDLElBQU1vQixDQUFBQSxDQUFRNkssRUFBTWpNLENBQUMsQ0FBQSxDQUNyQixHQUFJb0IsQ0FBTSxDQUFBLE9BQUEsQ0FBUSxPQUFPLENBQU0sR0FBQSxDQUFBLENBQzdCNEQsRUFBUyxTQUFZLENBQUEsYUFBQSxDQUFjNUQsRUFBTSxNQUFPLENBQUEsQ0FBQyxDQUFDLENBQ3pDQSxDQUFBQSxLQUFBQSxHQUFBQSxDQUFBQSxDQUFNLFFBQVEsU0FBUyxDQUFBLEdBQU0sRUFDdEM0RCxDQUFTLENBQUEsV0FBQSxDQUFjLGNBQWM1RCxDQUFNLENBQUEsTUFBQSxDQUFPLENBQUMsQ0FBQyxDQUFBLENBQUEsS0FBQSxHQUMzQ0EsRUFBTSxPQUFRLENBQUEsYUFBYSxDQUFNLEdBQUEsQ0FBQSxDQUMxQzRELENBQVMsQ0FBQSxVQUFBLENBQWE1RCxFQUFNLE1BQU8sQ0FBQSxFQUFFLElBQU0sTUFDbENBLENBQUFBLEtBQUFBLEdBQUFBLENBQUFBLENBQU0sUUFBUSxjQUFjLENBQUEsR0FBTSxFQUMzQzRELENBQVMsQ0FBQSxXQUFBLENBQWM1RCxFQUFNLE1BQU8sQ0FBQSxFQUFFLElBQU0sTUFDbkNBLENBQUFBLEtBQUFBLEdBQUFBLENBQUFBLENBQU0sUUFBUSxTQUFTLENBQUEsR0FBTSxFQUFHLENBRXpDLElBQUk4SyxFQURlOUssQ0FBTSxDQUFBLE1BQUEsQ0FBTyxDQUFDLENBQ04sQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUNwQyxDQUFBLElBQU0rSyxFQUFZRCxDQUFVLENBQUEsR0FBQSxHQUM1QixJQUFJRSxDQUFBQSxDQUFjRixFQUFVLE1BQVMsQ0FBQSxDQUFBLENBQUlBLEVBQVUsSUFBSyxDQUFBLEdBQUcsQ0FBSSxDQUFBLElBQUEsQ0FFL0RsSCxDQUFTLENBQUEsTUFBQSxDQUFTbUgsRUFDbEJuSCxDQUFTLENBQUEsWUFBQSxDQUFlb0gsRUFDMUIsQ0FBV2hMLEtBQUFBLEdBQUFBLENBQUFBLENBQU0sUUFBUSxPQUFPLENBQUEsR0FBTSxFQUFHLENBRXZDLElBQUk4SyxFQURhOUssQ0FBTSxDQUFBLE1BQUEsQ0FBTyxDQUFDLENBQ04sQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUNsQyxDQUFBLElBQU1pTCxFQUFVSCxDQUFVLENBQUEsR0FBQSxHQUMxQixJQUFJRSxDQUFBQSxDQUFjRixFQUFVLE1BQVMsQ0FBQSxDQUFBLENBQUlBLEVBQVUsSUFBSyxDQUFBLEdBQUcsRUFBSSxJQUMvRGxILENBQUFBLENBQUFBLENBQVMsS0FBT3FILENBQ2hCckgsQ0FBQUEsQ0FBQUEsQ0FBUyxXQUFhb0gsRUFDeEIsQ0FBQSxLQUFBLEdBQVdoTCxFQUFNLE9BQVEsQ0FBQSxlQUFlLENBQU0sR0FBQSxDQUFBLENBQUcsQ0FDL0MsSUFBTWtMLEVBQWlCbEwsQ0FBTSxDQUFBLE1BQUEsQ0FBTyxFQUFzQixDQUMxRDRELENBQUFBLENBQUFBLENBQVMsWUFBY3NILENBQWtCLEVBQUEsT0FDM0MsTUFBV3RNLENBQUssRUFBQSxDQUFBLENBQ2RnRixFQUFTLFNBQVk1RCxDQUFBQSxDQUFBQSxDQUVyQixTQUFTLCtCQUFrQ0EsQ0FBQUEsQ0FBSyxFQUVwRCxDQUVKLENBQ0EsT0FBTzRELENBQ1QsQ0FNQSxTQUFTLFlBQWF0SCxDQUFBQSxDQUFBQSxDQUFLLENBQ3pCLE9BQU8sd0JBQUEsQ0FBeUJBLEVBQUssYUFBYSxDQUFBLEdBQU0sdUJBQ3ZELE9BQVFBLENBQUFBLENBQUFBLENBQUssTUFBTSxDQUFLLEVBQUEsZUFBQSxDQUFnQkEsRUFBSyxTQUFTLENBQUEsR0FBTSxxQkFDL0QsQ0FRQSxTQUFTLG9CQUFvQm1JLENBQUtuSSxDQUFBQSxDQUFBQSxDQUFLNk8sRUFBb0IsQ0FDekQsSUFBSUMsRUFBb0IsSUFNeEIsQ0FBQSxPQUxBLGVBQWU5TyxDQUFLLENBQUEsU0FBU21GLEVBQVcsQ0FDbEMySixDQUFBQSxFQUFxQixPQUN2QkEsQ0FBb0IzSixDQUFBQSxDQUFBQSxDQUFVLGlCQUFpQmdELENBQUswRyxDQUFBQSxDQUFBQSxDQUFvQjdPLENBQUcsQ0FFL0UsRUFBQSxDQUFDLEVBQ0c4TyxDQUdFLEdBQUEsWUFBQSxDQUFhOU8sQ0FBRyxDQUdYLENBQUEsZ0JBQUEsQ0FBaUIsSUFBSSxRQUFZLENBQUEsa0JBQUEsQ0FBbUI2TyxDQUFrQixDQUFDLENBQUEsQ0FFdkUsVUFBVUEsQ0FBa0IsQ0FBQSxDQUd6QyxDQU9BLFNBQVMsY0FBQSxDQUFlNUosRUFBUSxDQUM5QixPQUFPLENBQUUsS0FBTyxDQUFBLEVBQUksQ0FBQSxJQUFBLENBQU0sQ0FBQ0EsQ0FBTSxDQUFFLENBQ3JDLENBTUEsU0FBUyxpQkFBa0JvQyxDQUFBQSxDQUFBQSxDQUFTQyxFQUFVLENBQzVDLElBQU15SCxFQUFRMUgsQ0FBUSxDQUFBLENBQUMsRUFDakIyQixDQUFPM0IsQ0FBQUEsQ0FBQUEsQ0FBUUEsRUFBUSxNQUFTLENBQUEsQ0FBQyxFQUN2QyxHQUFJQyxDQUFBQSxDQUFTLE9BQVEsQ0FDbkIsSUFBSXJDLEVBQVMsSUFDVHFDLENBQUFBLENBQUFBLENBQVMsZUFDWHJDLENBQVMsQ0FBQSxTQUFBLENBQVUsaUJBQWlCOEosQ0FBT3pILENBQUFBLENBQUFBLENBQVMsWUFBWSxDQUFDLENBQUEsQ0FBQSxDQUUvREEsRUFBUyxNQUFXLEdBQUEsS0FBQSxHQUFVeUgsR0FBUzlKLENBQ3pDQSxDQUFBQSxHQUFBQSxDQUFBQSxDQUFTQSxHQUFVOEosQ0FDbkI5SixDQUFBQSxDQUFBQSxDQUFPLFNBQVksQ0FBQSxDQUFBLENBQUEsQ0FFakJxQyxDQUFTLENBQUEsTUFBQSxHQUFXLFdBQWEwQixDQUFRL0QsRUFBQUEsQ0FBQUEsQ0FBQUEsR0FDM0NBLEVBQVNBLENBQVUrRCxFQUFBQSxDQUFBQSxDQUNuQi9ELEVBQU8sU0FBWUEsQ0FBQUEsQ0FBQUEsQ0FBTyxjQUU5QixDQUNBLEdBQUlxQyxFQUFTLElBQU0sQ0FBQSxDQUNqQixJQUFJckMsQ0FBUyxDQUFBLElBQUEsQ0FDYixHQUFJcUMsQ0FBUyxDQUFBLFVBQUEsQ0FBWSxDQUN2QixJQUFJMUMsQ0FBQUEsQ0FBWTBDLEVBQVMsVUFDckJBLENBQUFBLENBQUFBLENBQVMsYUFBZSxRQUMxQjFDLEdBQUFBLENBQUFBLENBQVksUUFFZEssQ0FBUyxDQUFBLFNBQUEsQ0FBVSxpQkFBaUI4SixDQUFPbkssQ0FBQUEsQ0FBUyxDQUFDLEVBQ3ZELENBQ0kwQyxFQUFTLElBQVMsR0FBQSxLQUFBLEdBQVV5SCxHQUFTOUosQ0FDdkNBLENBQUFBLEdBQUFBLENBQUFBLENBQVNBLENBQVU4SixFQUFBQSxDQUFBQSxDQUVuQjlKLENBQU8sQ0FBQSxjQUFBLENBQWUsQ0FBRSxLQUFPLENBQUEsT0FBQSxDQUFTLFNBQVUsSUFBSyxDQUFBLE1BQUEsQ0FBTyxjQUFlLENBQUMsQ0FBQSxDQUFBLENBRTVFcUMsRUFBUyxJQUFTLEdBQUEsUUFBQSxHQUFhMEIsR0FBUS9ELENBQ3pDQSxDQUFBQSxHQUFBQSxDQUFBQSxDQUFTQSxHQUFVK0QsQ0FFbkIvRCxDQUFBQSxDQUFBQSxDQUFPLGVBQWUsQ0FBRSxLQUFBLENBQU8sTUFBTyxRQUFVLENBQUEsSUFBQSxDQUFLLE9BQU8sY0FBZSxDQUFDLEdBRWhGLENBQ0YsQ0FTQSxTQUFTLG1CQUFvQmpGLENBQUFBLENBQUFBLENBQUswQixFQUFNc04sQ0FBZTVCLENBQUFBLENBQUFBLENBQVEsQ0FJN0QsR0FISUEsQ0FBQUEsRUFBVSxPQUNaQSxDQUFTLENBQUEsSUFFUHBOLENBQU8sRUFBQSxJQUFBLENBQ1QsT0FBT29OLENBRVQsQ0FBQSxJQUFNdE0sRUFBaUIsaUJBQWtCZCxDQUFBQSxDQUFBQSxDQUFLMEIsQ0FBSSxDQUNsRCxDQUFBLEdBQUlaLEVBQWdCLENBQ2xCLElBQUlULEVBQU1TLENBQWUsQ0FBQSxJQUFBLEdBQ3JCbU8sQ0FBZ0JELENBQUFBLENBQUFBLENBQ3BCLEdBQUkzTyxDQUFRLEdBQUEsT0FBQSxDQUNWLE9BQU8sSUFFTEEsQ0FBQUEsQ0FBQUEsQ0FBSSxRQUFRLGFBQWEsQ0FBQSxHQUFNLEdBQ2pDQSxDQUFNQSxDQUFBQSxDQUFBQSxDQUFJLE9BQU8sRUFBRSxDQUFBLENBQ25CNE8sRUFBZ0IsQ0FDUDVPLENBQUFBLEVBQUFBLENBQUFBLENBQUksUUFBUSxLQUFLLENBQUEsR0FBTSxJQUNoQ0EsQ0FBTUEsQ0FBQUEsQ0FBQUEsQ0FBSSxPQUFPLENBQUMsQ0FBQSxDQUNsQjRPLEVBQWdCLENBRWQ1TyxDQUFBQSxDQUFBQSxDQUFBQSxDQUFBQSxDQUFJLE9BQVEsQ0FBQSxHQUFHLENBQU0sR0FBQSxDQUFBLEdBQ3ZCQSxFQUFNLEdBQU1BLENBQUFBLENBQUFBLENBQU0sS0FFcEIsSUFBSTZPLENBQUFBLENBQ0FELEVBQ0ZDLENBQWEsQ0FBQSxTQUFBLENBQVVsUCxFQUFLLFVBQVcsQ0FBRSxPQUFPLFFBQVMsQ0FBQSxVQUFBLENBQWFLLEVBQU0sR0FBRyxDQUFBLEVBQUksQ0FBRyxDQUFBLEVBQUUsQ0FFeEY2TyxDQUFBQSxDQUFBQSxDQUFhLFVBQVU3TyxDQUFHLENBQUEsQ0FFNUIsUUFBVzBDLENBQU9tTSxJQUFBQSxDQUFBQSxDQUNaQSxFQUFXLGNBQWVuTSxDQUFBQSxDQUFHLEdBQzNCcUssQ0FBT3JLLENBQUFBLENBQUcsR0FBSyxJQUNqQnFLLEdBQUFBLENBQUFBLENBQU9ySyxDQUFHLENBQUltTSxDQUFBQSxDQUFBQSxDQUFXbk0sQ0FBRyxDQUlwQyxFQUFBLENBQ0EsT0FBTyxtQkFBQSxDQUFvQixTQUFVLENBQUEsU0FBQSxDQUFVL0MsQ0FBRyxDQUFDLENBQUEsQ0FBRzBCLEVBQU1zTixDQUFlNUIsQ0FBQUEsQ0FBTSxDQUNuRixDQVFBLFNBQVMsVUFBVXBOLENBQUttUCxDQUFBQSxDQUFBQSxDQUFRQyxFQUFZLENBQzFDLE9BQUksS0FBSyxNQUFPLENBQUEsU0FBQSxDQUNQRCxHQUVQLEVBQUEsaUJBQUEsQ0FBa0JuUCxFQUFLLDBCQUEwQixDQUFBLENBQzFDb1AsRUFFWCxDQU9BLFNBQVMsb0JBQW9CcFAsQ0FBS3FQLENBQUFBLENBQUFBLENBQWdCLENBQ2hELE9BQU8sbUJBQUEsQ0FBb0JyUCxFQUFLLFNBQVcsQ0FBQSxDQUFBLENBQUEsQ0FBTXFQLENBQWMsQ0FDakUsQ0FPQSxTQUFTLG1CQUFvQnJQLENBQUFBLENBQUFBLENBQUtxUCxFQUFnQixDQUNoRCxPQUFPLG1CQUFvQnJQLENBQUFBLENBQUFBLENBQUssU0FBVyxDQUFBLENBQUEsQ0FBQSxDQUFPcVAsQ0FBYyxDQUNsRSxDQU1BLFNBQVMsaUJBQWtCclAsQ0FBQUEsQ0FBQUEsQ0FBSyxDQUM5QixPQUFPLFlBQUEsQ0FBYSxvQkFBb0JBLENBQUcsQ0FBQSxDQUFHLG9CQUFvQkEsQ0FBRyxDQUFDLENBQ3hFLENBT0EsU0FBUyxxQkFBcUJtSSxDQUFLQyxDQUFBQSxDQUFBQSxDQUFRa0gsRUFBYSxDQUN0RCxHQUFJQSxJQUFnQixJQUNsQixDQUFBLEdBQUksQ0FDRm5ILENBQUksQ0FBQSxnQkFBQSxDQUFpQkMsRUFBUWtILENBQVcsRUFDMUMsTUFBWSxDQUVWbkgsQ0FBQUEsQ0FBSSxpQkFBaUJDLENBQVEsQ0FBQSxrQkFBQSxDQUFtQmtILENBQVcsQ0FBQyxDQUFBLENBQzVEbkgsRUFBSSxnQkFBaUJDLENBQUFBLENBQUFBLENBQVMsbUJBQW9CLE1BQU0sRUFDMUQsQ0FFSixDQU1BLFNBQVMsb0JBQW9CRCxDQUFLLENBQUEsQ0FFaEMsR0FBSUEsQ0FBSSxDQUFBLFdBQUEsRUFBZSxPQUFRLEdBQVMsQ0FBQSxHQUFBLENBQ3RDLEdBQUksQ0FDRixJQUFNL0UsRUFBTSxJQUFJLEdBQUEsQ0FBSStFLEVBQUksV0FBVyxDQUFBLENBQ25DLE9BQU8vRSxDQUFJLENBQUEsUUFBQSxDQUFXQSxFQUFJLE1BQzVCLENBQUEsS0FBWSxDQUNWLGlCQUFrQixDQUFBLFdBQUEsR0FBYyxJQUFNLENBQUEscUJBQUEsQ0FBdUIsQ0FBRSxHQUFLK0UsQ0FBQUEsQ0FBQUEsQ0FBSSxXQUFZLENBQUMsRUFDdkYsQ0FFSixDQU9BLFNBQVMsVUFBVUEsQ0FBS29ILENBQUFBLENBQUFBLENBQVEsQ0FDOUIsT0FBT0EsQ0FBTyxDQUFBLElBQUEsQ0FBS3BILEVBQUkscUJBQXNCLEVBQUMsQ0FDaEQsQ0FZQSxTQUFTLFdBQVdqSSxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTWdCLEVBQVMsQ0FFdkMsT0FEQWpFLEVBQThCQSxDQUFLLENBQUEsV0FBQSxHQUMvQmlFLENBQ0VBLENBQUFBLENBQUFBLFlBQW1CLFNBQVcsT0FBT0EsQ0FBQUEsRUFBWSxTQUM1QyxnQkFBaUJqRSxDQUFBQSxDQUFBQSxDQUFNaUQsRUFBTSxJQUFNLENBQUEsSUFBQSxDQUFNLENBQzlDLGNBQWdCLENBQUEsYUFBQSxDQUFjZ0IsQ0FBTyxDQUNyQyxDQUFBLGFBQUEsQ0FBZSxFQUNqQixDQUFDLENBQUEsQ0FFTSxpQkFBaUJqRSxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTSxjQUFjZ0IsQ0FBUSxDQUFBLE1BQU0sRUFBR0EsQ0FBUSxDQUFBLEtBQUEsQ0FDekUsQ0FDRSxPQUFBLENBQVNBLENBQVEsQ0FBQSxPQUFBLENBQ2pCLFFBQVNBLENBQVEsQ0FBQSxPQUFBLENBQ2pCLE9BQVFBLENBQVEsQ0FBQSxNQUFBLENBQ2hCLGVBQWdCLGFBQWNBLENBQUFBLENBQUFBLENBQVEsTUFBTSxDQUM1QyxDQUFBLFlBQUEsQ0FBY0EsRUFBUSxJQUN0QixDQUFBLE1BQUEsQ0FBUUEsRUFBUSxNQUNoQixDQUFBLGFBQUEsQ0FBZSxFQUNqQixDQUFDLENBQUEsQ0FHRSxpQkFBaUJqRSxDQUFNaUQsQ0FBQUEsQ0FBQUEsQ0FBTSxLQUFNLElBQU0sQ0FBQSxDQUM5QyxjQUFlLENBQ2pCLENBQUEsQ0FBQyxDQUVMLENBTUEsU0FBUyxnQkFBZ0JuRCxDQUFLLENBQUEsQ0FDNUIsSUFBTW9DLENBQU0sQ0FBQSxHQUNaLEtBQU9wQyxDQUFBQSxFQUNMb0MsRUFBSSxJQUFLcEMsQ0FBQUEsQ0FBRyxDQUNaQSxDQUFBQSxDQUFBQSxDQUFNQSxDQUFJLENBQUEsYUFBQSxDQUVaLE9BQU9vQyxDQUNULENBUUEsU0FBUyxVQUFXcEMsQ0FBQUEsQ0FBQUEsQ0FBS21ELEVBQU1xTSxDQUFlLENBQUEsQ0FDNUMsSUFBSUMsQ0FDQXJNLENBQUFBLENBQUFBLENBV0osT0FWSSxPQUFPLEdBQUEsRUFBUSxZQUNqQkEsQ0FBTSxDQUFBLElBQUksSUFBSUQsQ0FBTSxDQUFBLFFBQUEsQ0FBUyxTQUFTLElBQUksQ0FBQSxDQUUxQ3NNLEVBRGUsUUFBUyxDQUFBLFFBQUEsQ0FBUyxTQUNYck0sQ0FBSSxDQUFBLE1BQUEsR0FHMUJBLEVBQU1ELENBQ05zTSxDQUFBQSxDQUFBQSxDQUFXLFdBQVd0TSxDQUFNLENBQUEsUUFBQSxDQUFTLFNBQVMsTUFBTSxDQUFBLENBQUEsQ0FHbEQsS0FBSyxNQUFPLENBQUEsZ0JBQUEsRUFDVixDQUFDc00sQ0FDSSxDQUFBLENBQUEsQ0FBQSxDQUdKLFlBQWF6UCxDQUFBQSxDQUFBQSxDQUFLLGtCQUFvQixDQUFBLFlBQUEsQ0FBYSxDQUFFLEdBQUFvRCxDQUFBQSxDQUFBQSxDQUFLLFNBQUFxTSxDQUFTLENBQUEsQ0FBR0QsQ0FBYSxDQUFDLENBQzdGLENBTUEsU0FBUyxrQkFBQSxDQUFtQkUsRUFBSyxDQUMvQixHQUFJQSxhQUFlLFFBQVUsQ0FBQSxPQUFPQSxFQUNwQyxJQUFNeEMsQ0FBQUEsQ0FBVyxJQUFJLFFBQ3JCLENBQUEsSUFBQSxJQUFXbkssS0FBTzJNLENBQ1pBLENBQUFBLENBQUFBLENBQUksZUFBZTNNLENBQUcsQ0FBQSxHQUNwQixPQUFPMk0sQ0FBSTNNLENBQUFBLENBQUcsRUFBRSxPQUFZLEVBQUEsVUFBQSxDQUM5QjJNLEVBQUkzTSxDQUFHLENBQUEsQ0FBRSxRQUFRLFNBQVNvSyxDQUFBQSxDQUFHLENBQUVELENBQVMsQ0FBQSxNQUFBLENBQU9uSyxDQUFLb0ssQ0FBQUEsQ0FBQyxFQUFFLENBQUMsRUFDL0MsT0FBT3VDLENBQUFBLENBQUkzTSxDQUFHLENBQU0sRUFBQSxRQUFBLEVBQVksRUFBRTJNLENBQUkzTSxDQUFBQSxDQUFHLFlBQWEsSUFDL0RtSyxDQUFBQSxDQUFBQSxDQUFBQSxDQUFTLE9BQU9uSyxDQUFLLENBQUEsSUFBQSxDQUFLLFVBQVUyTSxDQUFJM00sQ0FBQUEsQ0FBRyxDQUFDLENBQUMsQ0FBQSxDQUU3Q21LLEVBQVMsTUFBT25LLENBQUFBLENBQUFBLENBQUsyTSxFQUFJM00sQ0FBRyxDQUFDLEdBSW5DLE9BQU9tSyxDQUNULENBUUEsU0FBUyxrQkFBQSxDQUFtQkEsRUFBVTNNLENBQU1vUCxDQUFBQSxDQUFBQSxDQUFPLENBRWpELE9BQU8sSUFBSSxNQUFNQSxDQUFPLENBQUEsQ0FDdEIsSUFBSyxTQUFTMUssQ0FBQUEsQ0FBUWxDLENBQUssQ0FBQSxDQUN6QixPQUFJLE9BQU9BLEdBQVEsUUFBaUJrQyxDQUFBQSxDQUFBQSxDQUFPbEMsQ0FBRyxDQUMxQ0EsQ0FBQUEsQ0FBQUEsR0FBUSxTQUFpQmtDLENBQU8sQ0FBQSxNQUFBLENBQ2hDbEMsSUFBUSxNQUNILENBQUEsU0FBU1csRUFBTyxDQUNyQnVCLENBQUFBLENBQU8sS0FBS3ZCLENBQUssQ0FBQSxDQUNqQndKLEVBQVMsTUFBTzNNLENBQUFBLENBQUFBLENBQU1tRCxDQUFLLEVBQzdCLENBQUEsQ0FFRSxPQUFPdUIsQ0FBT2xDLENBQUFBLENBQUcsR0FBTSxVQUNsQixDQUFBLFVBQVcsQ0FDaEJrQyxDQUFPbEMsQ0FBQUEsQ0FBRyxFQUFFLEtBQU1rQyxDQUFBQSxDQUFBQSxDQUFRLFNBQVMsQ0FDbkNpSSxDQUFBQSxDQUFBQSxDQUFTLE9BQU8zTSxDQUFJLENBQUEsQ0FDcEIwRSxFQUFPLE9BQVEsQ0FBQSxTQUFTa0ksQ0FBRyxDQUFBLENBQUVELENBQVMsQ0FBQSxNQUFBLENBQU8zTSxFQUFNNE0sQ0FBQyxFQUFFLENBQUMsRUFDekQsQ0FBQSxDQUdFbEksRUFBT2xDLENBQUcsQ0FBQSxFQUFLa0MsRUFBT2xDLENBQUcsQ0FBQSxDQUFFLFNBQVcsQ0FDakNrQyxDQUFBQSxDQUFBQSxDQUFPbEMsQ0FBRyxDQUFFLENBQUEsQ0FBQyxFQUVia0MsQ0FBT2xDLENBQUFBLENBQUcsQ0FFckIsQ0FDQSxDQUFBLEdBQUEsQ0FBSyxTQUFTa0MsQ0FBUTJLLENBQUFBLENBQUFBLENBQU9sTSxFQUFPLENBQ2xDLE9BQUF1QixFQUFPMkssQ0FBSyxDQUFBLENBQUlsTSxFQUNoQndKLENBQVMsQ0FBQSxNQUFBLENBQU8zTSxDQUFJLENBQ3BCMEUsQ0FBQUEsQ0FBQUEsQ0FBTyxRQUFRLFNBQVNrSSxDQUFBQSxDQUFHLENBQUVELENBQVMsQ0FBQSxNQUFBLENBQU8zTSxFQUFNNE0sQ0FBQyxFQUFFLENBQUMsQ0FDaEQsQ0FBQSxDQUFBLENBQ1QsQ0FDRixDQUFDLENBQ0gsQ0FNQSxTQUFTLGFBQUEsQ0FBY0QsRUFBVSxDQUMvQixPQUFPLElBQUksS0FBTUEsQ0FBQUEsQ0FBQUEsQ0FBVSxDQUN6QixHQUFLLENBQUEsU0FBU2pJLEVBQVExRSxDQUFNLENBQUEsQ0FDMUIsR0FBSSxPQUFPQSxDQUFBQSxFQUFTLFNBRWxCLE9BQU8sT0FBQSxDQUFRLElBQUkwRSxDQUFRMUUsQ0FBQUEsQ0FBSSxFQUVqQyxHQUFJQSxDQUFBQSxHQUFTLFNBRVgsT0FBTyxJQUFNLE9BQU8sV0FBWTJNLENBQUFBLENBQVEsRUFFMUMsR0FBSTNNLENBQUFBLElBQVEwRSxFQUVWLE9BQUksT0FBT0EsQ0FBTzFFLENBQUFBLENBQUksQ0FBTSxFQUFBLFVBQUEsQ0FDbkIsVUFBVyxDQUNoQixPQUFPMk0sRUFBUzNNLENBQUksQ0FBQSxDQUFFLE1BQU0yTSxDQUFVLENBQUEsU0FBUyxDQUNqRCxDQUVPakksQ0FBQUEsQ0FBQUEsQ0FBTzFFLENBQUksQ0FHdEIsQ0FBQSxJQUFNb1AsRUFBUXpDLENBQVMsQ0FBQSxNQUFBLENBQU8zTSxDQUFJLENBRWxDLENBQUEsR0FBSW9QLEVBQU0sTUFBVyxHQUFBLENBQUEsQ0FFZCxPQUFJQSxDQUFNLENBQUEsTUFBQSxHQUFXLEVBQ25CQSxDQUFNLENBQUEsQ0FBQyxFQUVQLGtCQUFtQjFLLENBQUFBLENBQUFBLENBQVExRSxFQUFNb1AsQ0FBSyxDQUVqRCxFQUNBLEdBQUssQ0FBQSxTQUFTMUssRUFBUTFFLENBQU1tRCxDQUFBQSxDQUFBQSxDQUFPLENBQ2pDLE9BQUksT0FBT25ELENBQVMsRUFBQSxRQUFBLENBQ1gsQ0FFVDBFLENBQUFBLEVBQUFBLENBQUFBLENBQU8sT0FBTzFFLENBQUksQ0FBQSxDQUNkLE9BQU9tRCxDQUFNLENBQUEsT0FBQSxFQUFZLFdBQzNCQSxDQUFNLENBQUEsT0FBQSxDQUFRLFNBQVN5SixDQUFHLENBQUEsQ0FBRWxJLEVBQU8sTUFBTzFFLENBQUFBLENBQUFBLENBQU00TSxDQUFDLEVBQUUsQ0FBQyxFQUMzQyxPQUFPekosQ0FBQUEsRUFBVSxVQUFZLEVBQUVBLENBQUFBLFlBQWlCLE1BQ3pEdUIsQ0FBTyxDQUFBLE1BQUEsQ0FBTzFFLEVBQU0sSUFBSyxDQUFBLFNBQUEsQ0FBVW1ELENBQUssQ0FBQyxDQUFBLENBRXpDdUIsRUFBTyxNQUFPMUUsQ0FBQUEsQ0FBQUEsQ0FBTW1ELENBQUssQ0FFcEIsQ0FBQSxDQUFBLENBQUEsQ0FDVCxFQUNBLGNBQWdCLENBQUEsU0FBU3VCLEVBQVExRSxDQUFNLENBQUEsQ0FDckMsT0FBSSxPQUFPQSxDQUFTLEVBQUEsUUFBQSxFQUNsQjBFLEVBQU8sTUFBTzFFLENBQUFBLENBQUksRUFFYixDQUNULENBQUEsQ0FBQSxDQUVBLFFBQVMsU0FBUzBFLENBQUFBLENBQVEsQ0FDeEIsT0FBTyxPQUFBLENBQVEsUUFBUSxNQUFPLENBQUEsV0FBQSxDQUFZQSxDQUFNLENBQUMsQ0FDbkQsRUFDQSx3QkFBMEIsQ0FBQSxTQUFTQSxFQUFRNEssQ0FBTSxDQUFBLENBQy9DLE9BQU8sT0FBUSxDQUFBLHdCQUFBLENBQXlCLE9BQU8sV0FBWTVLLENBQUFBLENBQU0sRUFBRzRLLENBQUksQ0FDMUUsQ0FDRixDQUFDLENBQ0gsQ0FXQSxTQUFTLGdCQUFBLENBQWlCM1AsRUFBTWlELENBQU1uRCxDQUFBQSxDQUFBQSxDQUFLdUQsRUFBT3VNLENBQUtDLENBQUFBLENBQUFBLENBQVcsQ0FDaEUsSUFBSUMsQ0FBQUEsQ0FBVSxLQUNWQyxDQUFTLENBQUEsSUFBQSxDQUViLEdBREFILENBQU1BLENBQUFBLENBQUFBLEVBQW9CLEVBQ3RCQSxDQUFBQSxDQUFBQSxDQUFJLGVBQWlCLE9BQU8sT0FBQSxDQUFZLElBQzFDLElBQUlJLENBQUFBLENBQVUsSUFBSSxPQUFRLENBQUEsU0FBU0MsRUFBVUMsQ0FBUyxDQUFBLENBQ3BESixFQUFVRyxDQUNWRixDQUFBQSxDQUFBQSxDQUFTRyxFQUNYLENBQUMsQ0FBQSxDQUVDcFEsR0FBTyxJQUNUQSxHQUFBQSxDQUFBQSxDQUFNLGFBQWMsQ0FBQSxJQUFBLENBQUEsQ0FFdEIsSUFBTXFRLENBQWtCUCxDQUFBQSxDQUFBQSxDQUFJLFNBQVcsa0JBQ2pDUSxDQUFBQSxDQUFBQSxDQUFTUixFQUFJLE1BQVUsRUFBQSxJQUFBLENBRTdCLEdBQUksQ0FBQyxZQUFBLENBQWE5UCxDQUFHLENBQUEsQ0FFbkIsT0FBVWdRLFNBQUFBLENBQUFBLENBQU8sRUFDVkUsQ0FFVCxDQUFBLElBQU1qTCxFQUFTNkssQ0FBSSxDQUFBLGNBQUEsRUFBa0IsVUFBVSxTQUFVOVAsQ0FBQUEsQ0FBRyxDQUFDLENBQzdELENBQUEsR0FBSWlGLEdBQVUsSUFBUUEsRUFBQUEsQ0FBQUEsRUFBVSxVQUM5QixPQUFrQmpGLGlCQUFBQSxDQUFBQSxDQUFBQSxDQUFLLG1CQUFvQixDQUFFLE1BQUEsQ0FBUSxrQkFBa0JBLENBQUssQ0FBQSxXQUFXLENBQUUsQ0FBQyxDQUFBLENBQzFGLFVBQVVpUSxDQUFNLENBQUEsQ0FDVEMsRUFHVCxJQUFJSyxDQUFBQSxDQUFVLGdCQUFnQnZRLENBQUcsQ0FBQSxDQUMzQndRLEVBQVlELENBQVEsQ0FBQSxpQkFBQSxDQUUxQixHQUFJQyxDQUFXLENBQUEsQ0FDYixJQUFNQyxDQUFhLENBQUEsZUFBQSxDQUFnQkQsQ0FBVyxDQUFBLFlBQVksQ0FDdERDLENBQUFBLENBQUFBLEVBQWMsT0FDaEJ0TixDQUFPc04sQ0FBQUEsQ0FBQUEsQ0FBQUEsQ0FHVCxJQUFNQyxDQUFhLENBQUEsZUFBQSxDQUFnQkYsRUFBVyxZQUFZLENBQUEsQ0FDdERFLEdBQWMsSUFFWkEsRUFBQUEsQ0FBQUEsQ0FBVyxhQUFrQixHQUFBLFFBQUEsR0FDL0J4USxFQUE4QndRLENBR3BDLEVBQUEsQ0FFQSxJQUFNQyxDQUFrQixDQUFBLHdCQUFBLENBQXlCM1EsRUFBSyxZQUFZLENBQUEsQ0FFbEUsR0FBSStQLENBQWMsR0FBQSxLQUFBLENBQUEsRUFLWixhQUFhL1AsQ0FBSyxDQUFBLGNBQUEsQ0FEQyxDQUFFLE1BQUFpRixDQUFBQSxDQUFBQSxDQUFRLElBQUFqRixDQUFLLENBQUEsSUFBQSxDQUFBbUQsRUFBTSxJQUFBakQsQ0FBQUEsQ0FBQUEsQ0FBTSxnQkFBaUJxRCxDQUFPLENBQUEsR0FBQSxDQUFBdU0sRUFBSyxZQUgxRCxDQUFBLFNBQVNjLENBQWtCLENBQUEsQ0FDOUMsT0FBTyxnQkFBQSxDQUFpQjFRLEVBQU1pRCxDQUFNbkQsQ0FBQUEsQ0FBQUEsQ0FBS3VELEVBQU91TSxDQUFLLENBQUEsQ0FBQyxDQUFDYyxDQUFnQixDQUN6RSxFQUM2RixRQUFVRCxDQUFBQSxDQUFnQixDQUNuRSxDQUFNLEdBQUEsQ0FBQSxDQUFBLENBQ3hELGlCQUFVWCxDQUFPLENBQUEsQ0FDVkUsRUFJWCxJQUFJVyxDQUFBQSxDQUFVN1EsRUFDVjhRLENBQWUsQ0FBQSx3QkFBQSxDQUF5QjlRLEVBQUssU0FBUyxDQUFBLENBQ3REK1EsRUFBZ0IsSUFDaEJDLENBQUFBLENBQUFBLENBQVksR0FDaEIsR0FBSUYsQ0FBQUEsQ0FBYyxDQUNoQixJQUFNRyxDQUFBQSxDQUFjSCxFQUFhLEtBQU0sQ0FBQSxHQUFHLEVBQ3BDM1AsQ0FBVzhQLENBQUFBLENBQUFBLENBQVksQ0FBQyxDQUFFLENBQUEsSUFBQSxHQVNoQyxHQVJJOVAsQ0FBQUEsR0FBYSxPQUNmMFAsQ0FBVSxDQUFBLGVBQUEsQ0FBZ0I3USxFQUFLLFNBQVMsQ0FBQSxDQUV4QzZRLEVBQVUsU0FBVSxDQUFBLGdCQUFBLENBQWlCN1EsRUFBS21CLENBQVEsQ0FBQyxFQUdyRDJQLENBQWdCRyxDQUFBQSxDQUFBQSxDQUFBQSxDQUFZLENBQUMsQ0FBSyxFQUFBLE1BQUEsRUFBUSxNQUMxQ1YsQ0FBQUEsQ0FBQUEsQ0FBVSxnQkFBZ0JNLENBQU8sQ0FBQSxDQUM3QkMsSUFBaUIsTUFBVVAsRUFBQUEsQ0FBQUEsQ0FBUSxLQUFPQSxDQUFRLENBQUEsU0FBQSxHQUFjLEdBQ2xFLE9BQVVQLFNBQUFBLENBQUFBLENBQU8sRUFDVkUsQ0FDRixDQUFBLEdBQUlZLElBQWlCLE9BQVMsQ0FBQSxDQUNuQyxHQUFJUCxDQUFRLENBQUEsR0FBQSxDQUNWLGlCQUFVUCxDQUFPLENBQUEsQ0FDVkUsQ0FFUGMsQ0FBQUEsQ0FBQUEsQ0FBWSxDQUVoQixFQUFBLENBQUEsS0FBV0YsSUFBaUIsU0FDMUIsQ0FBQSxZQUFBLENBQWFELEVBQVMsWUFBWSxDQUFBLENBQ3pCQyxFQUFhLE9BQVEsQ0FBQSxPQUFPLElBQU0sQ0FFM0NDLEdBQUFBLENBQUFBLENBQUFBLENBRHNCRCxFQUFhLEtBQU0sQ0FBQSxHQUFHLEVBQ2IsQ0FBQyxDQUFBLEVBQUssUUFBUSxJQUFLLEVBQUEsRUFFdEQsQ0FFQSxHQUFJUCxDQUFBQSxDQUFRLElBQ1YsR0FBSUEsQ0FBQUEsQ0FBUSxVQUNWLFlBQWFNLENBQUFBLENBQUFBLENBQVMsWUFBWSxDQUM3QixDQUFBLEtBQUEsQ0FDTCxHQUFJRSxDQUFpQixFQUFBLElBQUEsQ0FBTSxDQUN6QixHQUFJeE4sQ0FBQUEsQ0FBTyxDQUNULElBQU1pSCxDQUFBQSxDQUFZLGdCQUFnQmpILENBQUssQ0FBQSxDQUNuQ2lILENBQWFBLEVBQUFBLENBQUFBLENBQVUsV0FBZUEsRUFBQUEsQ0FBQUEsQ0FBVSxZQUFZLEtBQzlEdUcsR0FBQUEsQ0FBQUEsQ0FBZ0J2RyxFQUFVLFdBQVksQ0FBQSxLQUFBLEVBRTFDLENBQ0l1RyxDQUFpQixFQUFBLElBQUEsR0FDbkJBLEVBQWdCLE1BRXBCLEVBQUEsQ0FDQSxPQUFJUixDQUFRLENBQUEsY0FBQSxFQUFrQixPQUM1QkEsQ0FBUSxDQUFBLGNBQUEsQ0FBaUIsRUFFdkJRLENBQUFBLENBQUFBLENBQUFBLEdBQWtCLFNBQVdSLENBQVEsQ0FBQSxjQUFBLENBQWUsU0FBVyxDQUNqRUEsQ0FBQUEsQ0FBQUEsQ0FBUSxlQUFlLElBQUssQ0FBQSxVQUFXLENBQ3JDLGdCQUFpQnJRLENBQUFBLENBQUFBLENBQU1pRCxFQUFNbkQsQ0FBS3VELENBQUFBLENBQUFBLENBQU91TSxDQUFHLEVBQzlDLENBQUMsRUFDUWlCLENBQWtCLEdBQUEsS0FBQSxDQUMzQlIsRUFBUSxjQUFlLENBQUEsSUFBQSxDQUFLLFVBQVcsQ0FDckMsZ0JBQWlCclEsQ0FBQUEsQ0FBQUEsQ0FBTWlELEVBQU1uRCxDQUFLdUQsQ0FBQUEsQ0FBQUEsQ0FBT3VNLENBQUcsRUFDOUMsQ0FBQyxFQUNRaUIsQ0FBa0IsR0FBQSxNQUFBLEdBQzNCUixFQUFRLGNBQWlCLENBQUEsR0FDekJBLENBQVEsQ0FBQSxjQUFBLENBQWUsS0FBSyxVQUFXLENBQ3JDLGlCQUFpQnJRLENBQU1pRCxDQUFBQSxDQUFBQSxDQUFNbkQsRUFBS3VELENBQU91TSxDQUFBQSxDQUFHLEVBQzlDLENBQUMsQ0FBQSxDQUFBLENBRUgsVUFBVUUsQ0FBTyxDQUFBLENBQ1ZFLENBQ1QsQ0FHRixJQUFNL0gsRUFBTSxJQUFJLGNBQUEsQ0FDaEJvSSxFQUFRLEdBQU1wSSxDQUFBQSxDQUFBQSxDQUNkb0ksRUFBUSxTQUFZUyxDQUFBQSxDQUFBQSxDQUNwQixJQUFNRSxDQUFpQixDQUFBLFVBQVcsQ0FDaENYLENBQUFBLENBQVEsR0FBTSxDQUFBLElBQUEsQ0FDZEEsRUFBUSxTQUFZLENBQUEsQ0FBQSxDQUFBLENBQ2hCQSxFQUFRLGNBQWtCLEVBQUEsSUFBQSxFQUM5QkEsRUFBUSxjQUFlLENBQUEsTUFBQSxDQUFTLEdBQ1JBLENBQVEsQ0FBQSxjQUFBLENBQWUsT0FDL0IsR0FFbEIsRUFDTVksQ0FBaUIsQ0FBQSx3QkFBQSxDQUF5Qm5SLEVBQUssV0FBVyxDQUFBLENBQ2hFLEdBQUltUixDQUFnQixDQUFBLENBQ2xCLElBQUlDLENBQWlCLENBQUEsTUFBQSxDQUFPRCxDQUFjLENBRTFDLENBQUEsR0FBSUMsSUFBbUIsSUFDdkIsRUFBQSxDQUFDLGFBQWFwUixDQUFLLENBQUEsYUFBQSxDQUFlLENBQUUsTUFBUW9SLENBQUFBLENBQUFBLENBQWdCLE9BQUFuTSxDQUFPLENBQUMsRUFDbEUsT0FBVStLLFNBQUFBLENBQUFBLENBQU8sQ0FDakJrQixDQUFBQSxDQUFBQSxFQUNPaEIsQ0FBQUEsQ0FFWCxDQUVBLEdBQUlTLENBQUFBLEVBQW1CLENBQUNaLENBQ2xCLEVBQUEsQ0FBQyxRQUFRWSxDQUFlLENBQUEsQ0FDMUIsaUJBQVVYLENBQU8sQ0FBQSxDQUNqQmtCLEdBQ09oQixDQUFBQSxDQUFBQSxDQUlYLElBQUlqQyxDQUFVLENBQUEsVUFBQSxDQUFXak8sRUFBS2lGLENBQVFtTSxDQUFBQSxDQUFjLEVBRWhEbFIsQ0FBUyxHQUFBLEtBQUEsRUFBUyxDQUFDLFlBQWFGLENBQUFBLENBQUcsSUFDckNpTyxDQUFRLENBQUEsY0FBYyxFQUFJLG1DQUd4QjZCLENBQUFBLENBQUFBLENBQUFBLENBQUksVUFDTjdCLENBQVUsQ0FBQSxZQUFBLENBQWFBLEVBQVM2QixDQUFJLENBQUEsT0FBTyxHQUU3QyxJQUFNNUwsQ0FBQUEsQ0FBVSxlQUFlbEUsQ0FBS0UsQ0FBQUEsQ0FBSSxDQUNwQ21OLENBQUFBLENBQUFBLENBQVNuSixDQUFRLENBQUEsTUFBQSxDQUNmbU4sRUFBY25OLENBQVEsQ0FBQSxRQUFBLENBQ3hCNEwsRUFBSSxNQUNOLEVBQUEsZ0JBQUEsQ0FBaUJ1QixFQUFhLGtCQUFtQnZCLENBQUFBLENBQUFBLENBQUksTUFBTSxDQUFDLENBQUEsQ0FFOUQsSUFBTVQsQ0FBaUIsQ0FBQSxrQkFBQSxDQUFtQixrQkFBa0JyUCxDQUFHLENBQUMsRUFDMURzUixDQUFjLENBQUEsZ0JBQUEsQ0FBaUJELEVBQWFoQyxDQUFjLENBQUEsQ0FDNURrQyxFQUFtQixZQUFhRCxDQUFBQSxDQUFBQSxDQUFhdFIsQ0FBRyxDQUVoRCxDQUFBLElBQUEsQ0FBSyxPQUFPLG1CQUF1QkUsRUFBQUEsQ0FBQUEsR0FBUyxPQUM5Q3FSLENBQWlCLENBQUEsR0FBQSxDQUFJLHdCQUF5QixlQUFnQnRNLENBQUFBLENBQUFBLENBQVEsSUFBSSxDQUFLLEVBQUEsTUFBTSxHQUluRjlCLENBQVEsRUFBQSxJQUFBLEVBQVFBLENBQVMsR0FBQSxFQUFBLElBQzNCQSxDQUFPLENBQUEsV0FBQSxHQUFjLFFBQVMsQ0FBQSxJQUFBLENBQUEsQ0FTaEMsSUFBTXFPLENBQW9CLENBQUEsbUJBQUEsQ0FBb0J4UixFQUFLLFlBQVksQ0FBQSxDQUV6RHlSLEVBQWUsZUFBZ0J6UixDQUFBQSxDQUFHLEVBQUUsT0FFdEMwUixDQUFBQSxDQUFBQSxDQUFlLEtBQUssTUFBTyxDQUFBLHVCQUFBLENBQXdCLFFBQVF4UixDQUFJLENBQUEsRUFBSyxFQUdsRXNQLENBQWdCLENBQUEsQ0FDcEIsUUFBU2lDLENBQ1QsQ0FBQSxZQUFBLENBQUFDLEVBQ0EsUUFBVUgsQ0FBQUEsQ0FBQUEsQ0FDVixXQUFZLGFBQWNBLENBQUFBLENBQWdCLEVBQzFDLGtCQUFvQkQsQ0FBQUEsQ0FBQUEsQ0FDcEIscUJBQXNCLGFBQWNBLENBQUFBLENBQVcsRUFDL0MsT0FBQXJELENBQUFBLENBQUFBLENBQ0EsT0FBQWhKLENBQ0EsQ0FBQSxJQUFBLENBQUEvRSxFQUNBLE1BQUFtTixDQUFBQSxDQUFBQSxDQUNBLGdCQUFpQnlDLENBQUksQ0FBQSxXQUFBLEVBQWUwQixFQUFrQixXQUFlLEVBQUEsSUFBQSxDQUFLLE9BQU8sZUFDakYsQ0FBQSxPQUFBLENBQVMxQixFQUFJLE9BQVcwQixFQUFBQSxDQUFBQSxDQUFrQixTQUFXLElBQUssQ0FBQSxNQUFBLENBQU8sUUFDakUsSUFBQXJPLENBQUFBLENBQUFBLENBQ0EsZ0JBQWlCSSxDQUNuQixDQUFBLENBRUEsR0FBSSxDQUFDLFlBQUEsQ0FBYXZELEVBQUssb0JBQXNCd1AsQ0FBQUEsQ0FBYSxFQUN4RCxPQUFVUSxTQUFBQSxDQUFBQSxDQUFPLEVBQ2pCa0IsQ0FBZSxFQUFBLENBQ1JoQixFQVdULEdBUEEvTSxDQUFBQSxDQUFPcU0sRUFBYyxJQUNyQnRQLENBQUFBLENBQUFBLENBQU9zUCxFQUFjLElBQ3JCdkIsQ0FBQUEsQ0FBQUEsQ0FBVXVCLEVBQWMsT0FDeEIrQixDQUFBQSxDQUFBQSxDQUFtQixrQkFBbUIvQixDQUFBQSxDQUFBQSxDQUFjLFVBQVUsQ0FBQSxDQUM5RG5DLEVBQVNtQyxDQUFjLENBQUEsTUFBQSxDQUN2QmtDLEVBQWVsQyxDQUFjLENBQUEsWUFBQSxDQUV6Qm5DLEdBQVVBLENBQU8sQ0FBQSxNQUFBLENBQVMsRUFDNUIsT0FBYXJOLFlBQUFBLENBQUFBLENBQUFBLENBQUsseUJBQTBCd1AsQ0FBYSxDQUFBLENBQ3pELFVBQVVRLENBQU8sQ0FBQSxDQUNqQmtCLEdBQ09oQixDQUFBQSxDQUFBQSxDQUdULElBQU15QixDQUFZeE8sQ0FBQUEsQ0FBQUEsQ0FBSyxNQUFNLEdBQUcsQ0FBQSxDQUMxQnlPLEdBQWVELENBQVUsQ0FBQSxDQUFDLEVBQzFCRSxDQUFTRixDQUFBQSxDQUFBQSxDQUFVLENBQUMsQ0FFdEJHLENBQUFBLENBQUFBLENBQVkzTyxFQWlCaEIsR0FoQkl1TyxDQUFBQSxHQUNGSSxFQUFZRixFQUNNLENBQUEsQ0FBQ0wsRUFBaUIsSUFBSyxFQUFBLENBQUUsSUFBSyxFQUFBLENBQUUsSUFFNUNPLEdBQUFBLENBQUFBLENBQVUsUUFBUSxHQUFHLENBQUEsQ0FBSSxFQUMzQkEsQ0FBYSxFQUFBLEdBQUEsQ0FFYkEsR0FBYSxHQUVmQSxDQUFBQSxDQUFBQSxFQUFhLFVBQVVQLENBQWdCLENBQUEsQ0FDbkNNLElBQ0ZDLENBQWEsRUFBQSxHQUFBLENBQU1ELEtBS3JCLENBQUMsVUFBQSxDQUFXN1IsRUFBSzhSLENBQVd0QyxDQUFBQSxDQUFhLEVBQzNDLE9BQWtCeFAsaUJBQUFBLENBQUFBLENBQUFBLENBQUssbUJBQW9Cd1AsQ0FBYSxDQUFBLENBQ3hELFVBQVVTLENBQU0sQ0FBQSxDQUNUQyxFQVNULEdBTkEvSCxDQUFBQSxDQUFJLEtBQUtqSSxDQUFLLENBQUEsV0FBQSxHQUFlNFIsQ0FBVyxDQUFBLENBQUEsQ0FBSSxFQUM1QzNKLENBQUksQ0FBQSxnQkFBQSxDQUFpQixXQUFXLENBQ2hDQSxDQUFBQSxDQUFBQSxDQUFJLGVBQWtCcUgsQ0FBQUEsQ0FBQUEsQ0FBYyxlQUNwQ3JILENBQUFBLENBQUFBLENBQUksUUFBVXFILENBQWMsQ0FBQSxPQUFBLENBR3hCLENBQUFnQyxDQUFrQixDQUFBLFNBQUEsQ0FBQSxDQUdwQixRQUFXcEosQ0FBVTZGLElBQUFBLENBQUFBLENBQ25CLEdBQUlBLENBQVEsQ0FBQSxjQUFBLENBQWU3RixDQUFNLENBQUcsQ0FBQSxDQUNsQyxJQUFNa0gsQ0FBY3JCLENBQUFBLENBQUFBLENBQVE3RixDQUFNLENBQ2xDLENBQUEsb0JBQUEsQ0FBcUJELEVBQUtDLENBQVFrSCxDQUFBQSxDQUFXLEVBQy9DLENBS0osQ0FBQSxJQUFNeUMsRUFBZSxDQUNuQixHQUFBLENBQUE1SixFQUNBLE1BQUFsRCxDQUFBQSxDQUFBQSxDQUNBLGNBQUF1SyxDQUNBLENBQUEsR0FBQSxDQUFBTSxFQUNBLE9BQVMyQixDQUFBQSxDQUFBQSxDQUNULE9BQUFuQixDQUNBLENBQUEsUUFBQSxDQUFVLENBQ1IsV0FBYW5OLENBQUFBLENBQUFBLENBQ2IsaUJBQWtCMk8sQ0FDbEIsQ0FBQSxZQUFBLENBQWMsS0FDZCxNQUFBRCxDQUFBQSxDQUNGLENBQ0YsQ0F1REEsQ0FBQSxHQXJEQTFKLEVBQUksTUFBUyxDQUFBLFVBQVcsQ0FDdEIsR0FBSSxDQUNGLElBQU02SixDQUFZLENBQUEsZUFBQSxDQUFnQmhTLENBQUcsQ0FVckMsQ0FBQSxHQVRBK1IsRUFBYSxRQUFTLENBQUEsWUFBQSxDQUFlLG9CQUFvQjVKLENBQUcsQ0FBQSxDQUM1RGtJLEVBQWdCclEsQ0FBSytSLENBQUFBLENBQVksRUFDN0JBLENBQWEsQ0FBQSxjQUFBLEdBQW1CLElBQ2xDLHVCQUF3Qm5GLENBQUFBLENBQUFBLENBQVlxRixDQUFXLENBRWpELENBQUEsWUFBQSxDQUFhalMsRUFBSyxtQkFBcUIrUixDQUFBQSxDQUFZLEVBQ25ELFlBQWEvUixDQUFBQSxDQUFBQSxDQUFLLG1CQUFvQitSLENBQVksQ0FBQSxDQUc5QyxDQUFDLFlBQUEsQ0FBYS9SLENBQUcsQ0FBQSxDQUFHLENBQ3RCLElBQUlrUyxDQUFBQSxDQUFzQixLQUMxQixLQUFPRixDQUFBQSxDQUFVLE9BQVMsQ0FBS0UsRUFBQUEsQ0FBQUEsRUFBdUIsTUFBTSxDQUMxRCxJQUFNQyxFQUF1QkgsQ0FBVSxDQUFBLEtBQUEsR0FDbkMsWUFBYUcsQ0FBQUEsQ0FBb0IsSUFDbkNELENBQXNCQyxDQUFBQSxDQUFBQSxFQUUxQixDQUNJRCxDQUNGLEdBQUEsWUFBQSxDQUFhQSxFQUFxQixtQkFBcUJILENBQUFBLENBQVksRUFDbkUsWUFBYUcsQ0FBQUEsQ0FBQUEsQ0FBcUIsbUJBQW9CSCxDQUFZLENBQUEsRUFFdEUsQ0FDQSxTQUFVL0IsQ0FBQUEsQ0FBTyxFQUNqQmtCLENBQWUsR0FDakIsT0FBU2hRLENBQUcsQ0FBQSxDQUNWLHdCQUFrQmxCLENBQUssQ0FBQSxrQkFBQSxDQUFvQixZQUFhLENBQUEsQ0FBRSxLQUFPa0IsQ0FBQUEsQ0FBRSxFQUFHNlEsQ0FBWSxDQUFDLEVBQzdFN1EsQ0FDUixDQUNGLEVBQ0FpSCxDQUFJLENBQUEsT0FBQSxDQUFVLFVBQVcsQ0FDdkIsdUJBQUEsQ0FBd0J5RSxFQUFZcUYsQ0FBVyxDQUFBLENBQy9DLGtCQUFrQmpTLENBQUssQ0FBQSxtQkFBQSxDQUFxQitSLENBQVksQ0FDeEQsQ0FBQSxpQkFBQSxDQUFrQi9SLEVBQUssZ0JBQWtCK1IsQ0FBQUEsQ0FBWSxFQUNyRCxTQUFVOUIsQ0FBQUEsQ0FBTSxFQUNoQmlCLENBQWUsR0FDakIsRUFDQS9JLENBQUksQ0FBQSxPQUFBLENBQVUsVUFBVyxDQUN2Qix1QkFBQSxDQUF3QnlFLEVBQVlxRixDQUFXLENBQUEsQ0FDL0Msa0JBQWtCalMsQ0FBSyxDQUFBLG1CQUFBLENBQXFCK1IsQ0FBWSxDQUN4RCxDQUFBLGlCQUFBLENBQWtCL1IsQ0FBSyxDQUFBLGdCQUFBLENBQWtCK1IsQ0FBWSxDQUFBLENBQ3JELFVBQVU5QixDQUFNLENBQUEsQ0FDaEJpQixJQUNGLENBQUEsQ0FDQS9JLEVBQUksU0FBWSxDQUFBLFVBQVcsQ0FDekIsdUJBQXdCeUUsQ0FBQUEsQ0FBQUEsQ0FBWXFGLENBQVcsQ0FDL0MsQ0FBQSxpQkFBQSxDQUFrQmpTLEVBQUssbUJBQXFCK1IsQ0FBQUEsQ0FBWSxFQUN4RCxpQkFBa0IvUixDQUFBQSxDQUFBQSxDQUFLLGVBQWdCK1IsQ0FBWSxDQUFBLENBQ25ELFVBQVU5QixDQUFNLENBQUEsQ0FDaEJpQixJQUNGLENBQUEsQ0FDSSxDQUFDLFlBQWFsUixDQUFBQSxDQUFBQSxDQUFLLHFCQUFzQitSLENBQVksQ0FBQSxDQUN2RCxpQkFBVS9CLENBQU8sQ0FBQSxDQUNqQmtCLEdBQ09oQixDQUFBQSxDQUFBQSxDQUVULElBQUl0RCxDQUFhLENBQUEsMEJBQUEsQ0FBMkI1TSxDQUFHLENBQzNDaVMsQ0FBQUEsQ0FBQUEsQ0FBYyxnQkFBZ0JqUyxDQUFHLENBQUEsQ0FFckMsUUFBUSxDQUFDLFdBQUEsQ0FBYSxVQUFXLFVBQVksQ0FBQSxPQUFPLEVBQUcsU0FBU3VJLENBQUFBLENBQVcsQ0FDekUsT0FBUSxDQUFBLENBQUNKLEVBQUtBLENBQUksQ0FBQSxNQUFNLEVBQUcsU0FBU2xELENBQUFBLENBQVEsQ0FDMUNBLENBQU8sQ0FBQSxnQkFBQSxDQUFpQnNELEVBQVcsU0FBU2hGLENBQUFBLENBQU8sQ0FDakQsWUFBYXZELENBQUFBLENBQUFBLENBQUssWUFBY3VJLENBQVcsQ0FBQSxDQUN6QyxpQkFBa0JoRixDQUFNLENBQUEsZ0JBQUEsQ0FDeEIsT0FBUUEsQ0FBTSxDQUFBLE1BQUEsQ0FDZCxNQUFPQSxDQUFNLENBQUEsS0FDZixDQUFDLEVBQ0gsQ0FBQyxFQUNILENBQUMsRUFDSCxDQUFDLEVBQ0QsWUFBYXZELENBQUFBLENBQUFBLENBQUssa0JBQW1CK1IsQ0FBWSxDQUFBLENBQ2pELElBQU1LLEVBQVNWLENBQUFBLENBQUFBLENBQWUsS0FBTyxtQkFBb0J2SixDQUFBQSxDQUFBQSxDQUFLbkksRUFBS3VSLENBQWdCLENBQUEsQ0FDbkYsT0FBQXBKLENBQUksQ0FBQSxJQUFBLENBQUtpSyxFQUFNLENBQ1JsQyxDQUFBQSxDQUNULENBYUEsU0FBUyx1QkFBQSxDQUF3QmxRLEVBQUsrUixDQUFjLENBQUEsQ0FDbEQsSUFBTTVKLENBQU00SixDQUFBQSxDQUFBQSxDQUFhLElBS3JCTSxDQUFrQixDQUFBLElBQUEsQ0FDbEJDLEVBQWtCLElBYXRCLENBQUEsR0FaSSxVQUFVbkssQ0FBSyxDQUFBLFdBQVcsR0FDNUJrSyxDQUFrQmxLLENBQUFBLENBQUFBLENBQUksa0JBQWtCLFNBQVMsQ0FBQSxDQUNqRG1LLENBQWtCLENBQUEsTUFBQSxFQUNULFNBQVVuSyxDQUFBQSxDQUFBQSxDQUFLLGVBQWUsQ0FDdkNrSyxFQUFBQSxDQUFBQSxDQUFrQmxLLEVBQUksaUJBQWtCLENBQUEsYUFBYSxFQUNyRG1LLENBQWtCLENBQUEsTUFBQSxFQUNULFVBQVVuSyxDQUFLLENBQUEsa0JBQWtCLElBQzFDa0ssQ0FBa0JsSyxDQUFBQSxDQUFBQSxDQUFJLGtCQUFrQixnQkFBZ0IsQ0FBQSxDQUN4RG1LLEVBQWtCLFNBSWhCRCxDQUFBQSxDQUFBQSxDQUFBQSxDQUNGLE9BQUlBLENBQW9CLEdBQUEsT0FBQSxDQUNmLEVBRUEsQ0FBQSxDQUNMLEtBQU1DLENBQ04sQ0FBQSxJQUFBLENBQU1ELENBQ1IsQ0FPSixDQUFBLElBQU1FLEVBQWNSLENBQWEsQ0FBQSxRQUFBLENBQVMsaUJBQ3BDUyxDQUFlVCxDQUFBQSxDQUFBQSxDQUFhLFNBQVMsWUFFckNVLENBQUFBLENBQUFBLENBQVUseUJBQXlCelMsQ0FBSyxDQUFBLGFBQWEsQ0FDckQwUyxDQUFBQSxDQUFBQSxDQUFhLHdCQUF5QjFTLENBQUFBLENBQUFBLENBQUssZ0JBQWdCLENBQzNEMlMsQ0FBQUEsQ0FBQUEsQ0FBbUIsZ0JBQWdCM1MsQ0FBRyxDQUFBLENBQUUsUUFFMUM0UyxDQUFXLENBQUEsSUFBQSxDQUNYelAsRUFBTyxJQWFYLENBQUEsT0FYSXNQLEdBQ0ZHLENBQVcsQ0FBQSxNQUFBLENBQ1h6UCxFQUFPc1AsQ0FDRUMsRUFBQUEsQ0FBQUEsRUFDVEUsRUFBVyxTQUNYelAsQ0FBQUEsQ0FBQUEsQ0FBT3VQLEdBQ0VDLENBQ1RDLEdBQUFBLENBQUFBLENBQVcsT0FDWHpQLENBQU9xUCxDQUFBQSxDQUFBQSxFQUFnQkQsR0FHckJwUCxDQUVFQSxDQUFBQSxDQUFBQSxHQUFTLFFBQ0osRUFBQyxFQUlOQSxJQUFTLE1BQ1hBLEdBQUFBLENBQUFBLENBQU9xUCxHQUFnQkQsQ0FJckJSLENBQUFBLENBQUFBLENBQUFBLENBQWEsU0FBUyxNQUFVNU8sRUFBQUEsQ0FBQUEsQ0FBSyxRQUFRLEdBQUcsQ0FBQSxHQUFNLENBQ3hEQSxDQUFBQSxHQUFBQSxDQUFBQSxDQUFPQSxDQUFPLENBQUEsR0FBQSxDQUFNNE8sRUFBYSxRQUFTLENBQUEsTUFBQSxDQUFBLENBR3JDLENBQ0wsSUFBTWEsQ0FBQUEsQ0FBQUEsQ0FDTixLQUFBelAsQ0FDRixDQUFBLENBQUEsQ0FFTyxFQUVYLENBT0EsU0FBUyxXQUFZMFAsQ0FBQUEsQ0FBQUEsQ0FBd0JDLEVBQVEsQ0FDbkQsSUFBSUMsRUFBUyxJQUFJLE1BQUEsQ0FBT0YsRUFBdUIsSUFBSSxDQUFBLENBQ25ELE9BQU9FLENBQU8sQ0FBQSxJQUFBLENBQUtELEVBQU8sUUFBUyxDQUFBLEVBQUUsQ0FBQyxDQUN4QyxDQU1BLFNBQVMsdUJBQXdCM0ssQ0FBQUEsQ0FBQUEsQ0FBSyxDQUNwQyxJQUFTN0YsSUFBQUEsQ0FBQUEsQ0FBSSxFQUFHQSxDQUFJLENBQUEsSUFBQSxDQUFLLE9BQU8sZ0JBQWlCLENBQUEsTUFBQSxDQUFRQSxDQUFLLEVBQUEsQ0FBQSxDQUU1RCxJQUFJMFEsQ0FBQUEsQ0FBMEIsS0FBSyxNQUFPLENBQUEsZ0JBQUEsQ0FBaUIxUSxDQUFDLENBQzVELENBQUEsR0FBSSxZQUFZMFEsQ0FBeUI3SyxDQUFBQSxDQUFBQSxDQUFJLE1BQU0sQ0FDakQsQ0FBQSxPQUFPNkssQ0FFWCxDQUVBLE9BQU8sQ0FDTCxJQUFNLENBQUEsQ0FBQSxDQUNSLENBQ0YsQ0FLQSxTQUFTLFlBQVloSCxDQUFPLENBQUEsQ0FDMUIsR0FBSUEsQ0FBTyxDQUFBLENBQ1QsSUFBTWlILENBQVcsQ0FBQSxJQUFBLENBQUssT0FBTyxDQUN6QkEsQ0FBQUEsQ0FBQUEsQ0FDRkEsRUFBUyxTQUFZakgsQ0FBQUEsQ0FBQUEsQ0FFckIsT0FBTyxRQUFTLENBQUEsS0FBQSxDQUFRQSxFQUU1QixDQUNGLENBTUEsU0FBUyxrQkFBbUJoTSxDQUFBQSxDQUFBQSxDQUFLK1IsQ0FBYyxDQUFBLENBQzdDLElBQU01SixDQUFBQSxDQUFNNEosRUFBYSxHQUNyQjlNLENBQUFBLENBQUFBLENBQVM4TSxFQUFhLE1BQ3BCakMsQ0FBQUEsQ0FBQUEsQ0FBTWlDLEVBQWEsR0FDbkJtQixDQUFBQSxDQUFBQSxDQUFxQm5CLEVBQWEsTUFFeEMsQ0FBQSxHQUFJLENBQUMsWUFBYS9SLENBQUFBLENBQUFBLENBQUssb0JBQXFCK1IsQ0FBWSxDQUFBLENBQUcsT0FNM0QsR0FKSSxTQUFBLENBQVU1SixFQUFLLGNBQWMsQ0FBQSxFQUMvQixvQkFBb0JBLENBQUssQ0FBQSxZQUFBLENBQWNuSSxDQUFHLENBR3hDLENBQUEsU0FBQSxDQUFVbUksRUFBSyxlQUFlLENBQUEsQ0FBRyxDQUNuQyx3QkFBeUIsRUFBQSxDQUN6QixJQUFJZ0wsQ0FBZWhMLENBQUFBLENBQUFBLENBQUksa0JBQWtCLGFBQWEsQ0FBQSxDQUV0RCxJQUFJaUwsQ0FDQUQsQ0FBQUEsQ0FBQUEsQ0FBYSxPQUFRLENBQUEsR0FBRyxDQUFNLEdBQUEsQ0FBQSxHQUNoQ0MsRUFBbUIsU0FBVUQsQ0FBQUEsQ0FBWSxFQUV6Q0EsQ0FBZUMsQ0FBQUEsQ0FBQUEsQ0FBaUIsS0FDaEMsT0FBT0EsQ0FBQUEsQ0FBaUIsTUFFMUIsVUFBVyxDQUFBLEtBQUEsQ0FBT0QsRUFBY0MsQ0FBZ0IsQ0FBQSxDQUFFLEtBQUssVUFBVyxDQUNoRSxtQkFBbUJELENBQVksRUFDakMsQ0FBQyxDQUNELENBQUEsTUFDRixDQUVBLElBQU1FLENBQUFBLENBQWdCLFVBQVVsTCxDQUFLLENBQUEsY0FBYyxHQUFLQSxDQUFJLENBQUEsaUJBQUEsQ0FBa0IsWUFBWSxDQUFNLEdBQUEsTUFBQSxDQUVoRyxHQUFJLFNBQVVBLENBQUFBLENBQUFBLENBQUssZUFBZSxDQUFHLENBQUEsQ0FDbkM0SixFQUFhLGNBQWlCLENBQUEsQ0FBQSxDQUFBLENBQzlCLFNBQVMsSUFBTzVKLENBQUFBLENBQUFBLENBQUksa0JBQWtCLGFBQWEsQ0FBQSxDQUNuRGtMLEdBQWlCLFFBQVMsQ0FBQSxNQUFBLEdBQzFCLE1BQ0YsQ0FFQSxHQUFJQSxDQUFlLENBQUEsQ0FDakJ0QixFQUFhLGNBQWlCLENBQUEsQ0FBQSxDQUFBLENBQzlCLFNBQVMsTUFBTyxFQUFBLENBQ2hCLE1BQ0YsQ0FFSSxTQUFBLENBQVU1SixFQUFLLGVBQWUsQ0FBQSxHQUM1QkEsRUFBSSxpQkFBa0IsQ0FBQSxhQUFhLElBQU0sTUFDM0M0SixDQUFBQSxDQUFBQSxDQUFhLE9BQVMvUixDQUV0QitSLENBQUFBLENBQUFBLENBQWEsT0FBUyxTQUFVLENBQUEsZ0JBQUEsQ0FBaUIvUixFQUFLbUksQ0FBSSxDQUFBLGlCQUFBLENBQWtCLGFBQWEsQ0FBQyxDQUFDLEdBSS9GLElBQU1tTCxDQUFBQSxDQUFnQix1QkFBd0J0VCxDQUFBQSxDQUFBQSxDQUFLK1IsQ0FBWSxDQUFBLENBRXpEd0IsRUFBbUIsdUJBQXdCcEwsQ0FBQUEsQ0FBRyxFQUM5Q3FMLENBQWFELENBQUFBLENBQUFBLENBQWlCLEtBQ2hDRSxDQUFVLENBQUEsQ0FBQyxDQUFDRixDQUFpQixDQUFBLEtBQUEsQ0FDN0JHLEVBQWMsSUFBSyxDQUFBLE1BQUEsQ0FBTyxhQUFlSCxDQUFpQixDQUFBLFdBQUEsQ0FDMURJLEVBQWlCSixDQUFpQixDQUFBLE1BQUEsQ0FDbENBLEVBQWlCLE1BQ25CeEIsR0FBQUEsQ0FBQUEsQ0FBYSxPQUFTLFNBQVUsQ0FBQSxnQkFBQSxDQUFpQi9SLEVBQUt1VCxDQUFpQixDQUFBLE1BQU0sQ0FBQyxDQUVoRixDQUFBLENBQUEsSUFBSUssRUFBZTlELENBQUksQ0FBQSxZQUFBLENBQ25COEQsR0FBZ0IsSUFBUUwsRUFBQUEsQ0FBQUEsQ0FBaUIsZUFDM0NLLENBQWVMLENBQUFBLENBQUFBLENBQWlCLGNBSTlCLFNBQVVwTCxDQUFBQSxDQUFBQSxDQUFLLGVBQWUsQ0FBQSxHQUM1QkEsQ0FBSSxDQUFBLGlCQUFBLENBQWtCLGFBQWEsQ0FBTSxHQUFBLE1BQUEsQ0FDM0M0SixFQUFhLE1BQVMvUixDQUFBQSxDQUFBQSxDQUV0QitSLEVBQWEsTUFBUyxDQUFBLFNBQUEsQ0FBVSxpQkFBaUIvUixDQUFLbUksQ0FBQUEsQ0FBQUEsQ0FBSSxrQkFBa0IsYUFBYSxDQUFDLENBQUMsQ0FHM0YsQ0FBQSxDQUFBLFNBQUEsQ0FBVUEsRUFBSyxhQUFhLENBQUEsR0FDOUJ5TCxFQUFlekwsQ0FBSSxDQUFBLGlCQUFBLENBQWtCLFdBQVcsQ0FHbEQsQ0FBQSxDQUFBLElBQUkwTCxFQUFpQjFMLENBQUksQ0FBQSxRQUFBLENBRXJCMUMsRUFBb0IsWUFBYSxDQUFBLENBQ25DLFdBQUErTixDQUNBLENBQUEsY0FBQSxDQUFBSyxFQUNBLE9BQUFKLENBQUFBLENBQUFBLENBQ0EsWUFBQUMsQ0FDQSxDQUFBLGNBQUEsQ0FBQUMsQ0FDRixDQUFHNUIsQ0FBQUEsQ0FBWSxDQUVmLENBQUEsR0FBSSxFQUFBd0IsQ0FBQUEsQ0FBaUIsT0FBUyxDQUFDLFlBQUEsQ0FBYXRPLEVBQVFzTyxDQUFpQixDQUFBLEtBQUEsQ0FBTzlOLENBQWlCLENBRXhGLENBQUEsRUFBQSxZQUFBLENBQWFSLEVBQVEsaUJBQW1CUSxDQUFBQSxDQUFpQixFQVk5RCxDQVZBUixHQUFBQSxDQUFBQSxDQUFTUSxFQUFrQixNQUMzQm9PLENBQUFBLENBQUFBLENBQWlCcE8sRUFBa0IsY0FDbkNnTyxDQUFBQSxDQUFBQSxDQUFVaE8sRUFBa0IsT0FDNUJpTyxDQUFBQSxDQUFBQSxDQUFjak8sRUFBa0IsV0FDaENrTyxDQUFBQSxDQUFBQSxDQUFpQmxPLEVBQWtCLGNBRW5Dc00sQ0FBQUEsQ0FBQUEsQ0FBYSxPQUFTOU0sQ0FDdEI4TSxDQUFBQSxDQUFBQSxDQUFhLE9BQVMwQixDQUN0QjFCLENBQUFBLENBQUFBLENBQWEsV0FBYSxDQUFDMEIsQ0FBQUEsQ0FFdkJoTyxFQUFrQixVQUFZLENBQUEsQ0FDNUIwQyxFQUFJLE1BQVcsR0FBQSxHQUFBLEVBQ2pCLGNBQWNuSSxDQUFHLENBQUEsQ0FHbkIsZUFBZUEsQ0FBSyxDQUFBLFNBQVNtRixFQUFXLENBQ3RDME8sQ0FBQUEsQ0FBaUIxTyxFQUFVLGlCQUFrQjBPLENBQUFBLENBQUFBLENBQWdCMUwsRUFBS25JLENBQUcsRUFDdkUsQ0FBQyxDQUdHc1QsQ0FBQUEsQ0FBQUEsQ0FBYyxNQUNoQix3QkFBeUIsRUFBQSxDQUd2QixVQUFVbkwsQ0FBSyxDQUFBLGFBQWEsSUFDOUJ5TCxDQUFlekwsQ0FBQUEsQ0FBQUEsQ0FBSSxrQkFBa0IsV0FBVyxDQUFBLENBQUEsQ0FFbEQsSUFBSWIsQ0FBVyxDQUFBLG9CQUFBLENBQXFCdEgsRUFBSzRULENBQVksQ0FBQSxDQUVoRHRNLEVBQVMsY0FBZSxDQUFBLGFBQWEsSUFDeENBLENBQVMsQ0FBQSxXQUFBLENBQWNvTSxHQUd6QnpPLENBQU8sQ0FBQSxTQUFBLENBQVUsSUFBSSxJQUFLLENBQUEsTUFBQSxDQUFPLGFBQWEsQ0FBQSxDQUc5QyxJQUFJNk8sQ0FBQUEsQ0FBZ0IsS0FDaEJDLENBQWUsQ0FBQSxJQUFBLENBRWZiLElBQ0ZTLENBQWlCVCxDQUFBQSxDQUFBQSxDQUFBQSxDQUdmLFVBQVUvSyxDQUFLLENBQUEsZUFBZSxJQUNoQ3dMLENBQWlCeEwsQ0FBQUEsQ0FBQUEsQ0FBSSxrQkFBa0IsYUFBYSxDQUFBLENBQUEsQ0FHdEQsSUFBTTZMLENBQVksQ0FBQSx3QkFBQSxDQUF5QmhVLEVBQUssZUFBZSxDQUFBLENBQ3pEc1EsRUFBUyx3QkFBeUJ0USxDQUFBQSxDQUFBQSxDQUFLLFdBQVcsQ0FFcERpVSxDQUFBQSxDQUFBQSxDQUFTLFVBQVcsQ0FDdEIsR0FBSSxDQUVFWCxDQUFjLENBQUEsSUFBQSxHQUNoQixhQUFhLFdBQVksRUFBQSxDQUFFLEtBQU0sMEJBQTRCLENBQUEsWUFBQSxDQUFhLENBQUUsT0FBU0EsQ0FBQUEsQ0FBYyxFQUFHdkIsQ0FBWSxDQUFDLENBQy9HdUIsQ0FBQUEsQ0FBQUEsQ0FBYyxJQUFTLEdBQUEsTUFBQSxFQUN6QixtQkFBbUJBLENBQWMsQ0FBQSxJQUFJLEVBQ3JDLFlBQWEsQ0FBQSxXQUFBLEdBQWMsSUFBTSxDQUFBLHdCQUFBLENBQTBCLENBQUUsSUFBTUEsQ0FBQUEsQ0FBQUEsQ0FBYyxJQUFLLENBQUMsQ0FBQSxHQUV2RixvQkFBb0JBLENBQWMsQ0FBQSxJQUFJLEVBQ3RDLFlBQWEsQ0FBQSxXQUFBLEdBQWMsSUFBTSxDQUFBLHdCQUFBLENBQTBCLENBQUUsSUFBTUEsQ0FBQUEsQ0FBQUEsQ0FBYyxJQUFLLENBQUMsQ0FBQSxDQUFBLENBQUEsQ0FJM0YsS0FBS3JPLENBQVE0TyxDQUFBQSxDQUFBQSxDQUFnQnZNLEVBQVUsQ0FDckMsTUFBQSxDQUFRcU0sR0FBa0JyRCxDQUMxQixDQUFBLFNBQUEsQ0FBQTBELEVBQ0EsU0FBV2pDLENBQUFBLENBQUFBLENBQ1gsT0FBUUEsQ0FBYSxDQUFBLFFBQUEsQ0FBUyxNQUM5QixDQUFBLGNBQUEsQ0FBZ0IvUixDQUNoQixDQUFBLGlCQUFBLENBQW1CLFVBQVcsQ0FDNUIsR0FBSSxVQUFVbUksQ0FBSyxDQUFBLHlCQUF5QixFQUFHLENBQzdDLElBQUkrTCxFQUFXbFUsQ0FDVixDQUFBLFlBQUEsQ0FBYUEsQ0FBRyxDQUNuQmtVLEdBQUFBLENBQUFBLENBQVcsYUFBYyxDQUFBLElBQUEsQ0FBQSxDQUUzQixvQkFBb0IvTCxDQUFLLENBQUEsdUJBQUEsQ0FBeUIrTCxDQUFRLEVBQzVELENBQ0YsRUFDQSxtQkFBcUIsQ0FBQSxVQUFXLENBQzlCLEdBQUksU0FBQSxDQUFVL0wsRUFBSywyQkFBMkIsQ0FBQSxDQUFHLENBQy9DLElBQUkrTCxDQUFBQSxDQUFXbFUsRUFDVixZQUFhQSxDQUFBQSxDQUFHLElBQ25Ca1UsQ0FBVyxDQUFBLFdBQUEsR0FBYyxJQUUzQixDQUFBLENBQUEsbUJBQUEsQ0FBb0IvTCxFQUFLLHlCQUEyQitMLENBQUFBLENBQVEsRUFDOUQsQ0FDQSxTQUFBLENBQVVKLENBQWEsRUFDekIsQ0FDRixDQUFDLEVBQ0gsQ0FBQSxNQUFTNVMsRUFBRyxDQUNWLE1BQUEsaUJBQUEsQ0FBa0JsQixFQUFLLGdCQUFrQitSLENBQUFBLENBQVksRUFDckQsU0FBVWdDLENBQUFBLENBQVksRUFDaEI3UyxDQUNSLENBQ0YsRUFFSWlULENBQW1CLENBQUEsSUFBQSxDQUFLLE9BQU8scUJBS25DLENBQUEsR0FKSTdNLEVBQVMsY0FBZSxDQUFBLFlBQVksSUFDdEM2TSxDQUFtQjdNLENBQUFBLENBQUFBLENBQVMsWUFHMUI2TSxDQUNJLEVBQUEsWUFBQSxDQUFhblUsRUFBSyx1QkFBeUIrUixDQUFBQSxDQUFZLEdBQ3ZELE9BQU8sT0FBQSxDQUFZLEtBRW5CLFFBQVMsQ0FBQSxtQkFBQSxDQUFxQixDQUNwQyxJQUFNcUMsQ0FBZ0IsQ0FBQSxJQUFJLFFBQVEsU0FBU2pFLENBQUFBLENBQVVDLEVBQVMsQ0FDNUQwRCxDQUFBQSxDQUFnQjNELEVBQ2hCNEQsQ0FBZTNELENBQUFBLEVBQ2pCLENBQUMsQ0FFS2lFLENBQUFBLENBQUFBLENBQWNKLEVBQ3BCQSxDQUFTLENBQUEsVUFBVyxDQUVsQixRQUFTLENBQUEsbUJBQUEsQ0FBb0IsVUFBVyxDQUN0QyxPQUFBSSxHQUNPRCxDQUFBQSxDQUNULENBQUMsRUFDSCxFQUNGLENBRUk5TSxDQUFTLENBQUEsU0FBQSxDQUFZLEVBQ3ZCLFNBQVUsRUFBQSxDQUFFLFdBQVcyTSxDQUFRM00sQ0FBQUEsQ0FBQUEsQ0FBUyxTQUFTLENBRWpEMk0sQ0FBQUEsQ0FBQUEsR0FFSixDQUNJUixDQUFBQSxFQUNGLGtCQUFrQnpULENBQUssQ0FBQSxvQkFBQSxDQUFzQixZQUFhLENBQUEsQ0FBRSxLQUFPLENBQUEsNkJBQUEsQ0FBZ0NtSSxFQUFJLE1BQVMsQ0FBQSxRQUFBLENBQVc0SixFQUFhLFFBQVMsQ0FBQSxXQUFZLEVBQUdBLENBQVksQ0FBQyxHQUVqTCxDQU9BLElBQU0sV0FBYSxFQUFDLENBTXBCLFNBQVMsYUFBZ0IsRUFBQSxDQUN2QixPQUFPLENBQ0wsSUFBQSxDQUFNLFNBQVN1QyxDQUFLLENBQUEsQ0FBRSxPQUFPLElBQUssQ0FBQSxDQUNsQyxhQUFjLFVBQVcsQ0FBRSxPQUFPLElBQUssQ0FBQSxDQUN2QyxRQUFTLFNBQVMvVCxDQUFBQSxDQUFNK0MsRUFBSyxDQUFFLE9BQU8sRUFBSyxDQUMzQyxDQUFBLGlCQUFBLENBQW1CLFNBQVNpUixDQUFNcE0sQ0FBQUEsQ0FBQUEsQ0FBS25JLENBQUssQ0FBQSxDQUFFLE9BQU91VSxDQUFLLEVBQzFELFlBQWMsQ0FBQSxTQUFTdlAsRUFBVyxDQUFFLE9BQU8sRUFBTSxDQUNqRCxDQUFBLFVBQUEsQ0FBWSxTQUFTQSxDQUFXQyxDQUFBQSxDQUFBQSxDQUFRMUQsRUFBVStELENBQVksQ0FBQSxDQUFFLE9BQU8sQ0FBTSxDQUFBLENBQUEsQ0FDN0UsaUJBQWtCLFNBQVM2QyxDQUFBQSxDQUFLcU0sRUFBWXhVLENBQUssQ0FBQSxDQUFFLE9BQU8sSUFBSyxDQUNqRSxDQUNGLENBVUEsU0FBUyxnQkFBZ0JPLENBQU00RSxDQUFBQSxDQUFBQSxDQUFXLENBQ3BDQSxDQUFVLENBQUEsSUFBQSxFQUNaQSxFQUFVLElBQUssQ0FBQSxXQUFXLEVBRTVCLFVBQVc1RSxDQUFBQSxDQUFJLEVBQUksWUFBYSxDQUFBLGFBQUEsRUFBaUI0RSxDQUFBQSxDQUFTLEVBQzVELENBU0EsU0FBUyxlQUFnQjVFLENBQUFBLENBQUFBLENBQU0sQ0FDN0IsT0FBTyxVQUFBLENBQVdBLENBQUksRUFDeEIsQ0FVQSxTQUFTLGFBQWNQLENBQUFBLENBQUFBLENBQUt5VSxFQUFvQkMsQ0FBb0IsQ0FBQSxDQUlsRSxHQUhJRCxDQUFzQixFQUFBLElBQUEsR0FDeEJBLEVBQXFCLEVBQUMsQ0FBQSxDQUVwQnpVLEdBQU8sSUFDVCxDQUFBLE9BQU95VSxFQUVMQyxDQUFzQixFQUFBLElBQUEsR0FDeEJBLEVBQXFCLEVBQUMsQ0FBQSxDQUV4QixJQUFNQyxDQUF1QixDQUFBLGlCQUFBLENBQWtCM1UsRUFBSyxRQUFRLENBQUEsQ0FDNUQsT0FBSTJVLENBQ0YsRUFBQSxPQUFBLENBQVFBLEVBQXFCLEtBQU0sQ0FBQSxHQUFHLEVBQUcsU0FBU0MsQ0FBQUEsQ0FBZSxDQUUvRCxHQURBQSxDQUFnQkEsQ0FBQUEsQ0FBQUEsQ0FBYyxRQUFRLElBQU0sQ0FBQSxFQUFFLEVBQzFDQSxDQUFjLENBQUEsS0FBQSxDQUFNLEVBQUcsQ0FBQyxDQUFBLEVBQUssVUFBVyxDQUMxQ0YsQ0FBQUEsQ0FBbUIsS0FBS0UsQ0FBYyxDQUFBLEtBQUEsQ0FBTSxDQUFDLENBQUMsQ0FBQSxDQUM5QyxNQUNGLENBQ0EsR0FBSUYsRUFBbUIsT0FBUUUsQ0FBQUEsQ0FBYSxFQUFJLENBQUcsQ0FBQSxDQUNqRCxJQUFNelAsQ0FBWSxDQUFBLFVBQUEsQ0FBV3lQLENBQWEsQ0FDdEN6UCxDQUFBQSxDQUFBQSxFQUFhc1AsRUFBbUIsT0FBUXRQLENBQUFBLENBQVMsRUFBSSxDQUN2RHNQLEVBQUFBLENBQUFBLENBQW1CLEtBQUt0UCxDQUFTLEVBRXJDLENBQ0YsQ0FBQyxDQUFBLENBRUksYUFBYyxDQUFBLFNBQUEsQ0FBVSxTQUFVbkYsQ0FBQUEsQ0FBRyxDQUFDLENBQUd5VSxDQUFBQSxDQUFBQSxDQUFvQkMsQ0FBa0IsQ0FDeEYsQ0FLQSxJQUFJLE9BQVUsQ0FBQSxDQUFBLENBQUEsQ0FDZCxhQUFjLENBQUEsZ0JBQUEsQ0FBaUIsbUJBQW9CLFVBQVcsQ0FDNUQsUUFBVSxDQUNaLEVBQUEsQ0FBQyxFQVNELFNBQVMsS0FBQSxDQUFNRyxFQUFJLENBR2IsT0FBQSxFQUFXLGFBQWMsQ0FBQSxVQUFBLEdBQWUsV0FDMUNBLENBQUcsRUFBQSxDQUVILGFBQWMsQ0FBQSxnQkFBQSxDQUFpQixtQkFBb0JBLENBQUUsRUFFekQsQ0FFQSxTQUFTLHFCQUFBLEVBQXdCLENBQy9CLEdBQUksSUFBQSxDQUFLLE9BQU8sc0JBQTJCLEdBQUEsQ0FBQSxDQUFBLENBQU8sQ0FDaEQsSUFBTUMsQ0FBaUIsQ0FBQSxJQUFBLENBQUssT0FBTyxnQkFBbUIsQ0FBQSxDQUFBLFFBQUEsRUFBVyxLQUFLLE1BQU8sQ0FBQSxnQkFBZ0IsSUFBTSxFQUNuRyxDQUFBLFdBQUEsR0FBYyxJQUFLLENBQUEsa0JBQUEsQ0FBbUIsWUFDcEMsUUFBV0EsQ0FBQUEsQ0FBQUEsQ0FBaUIsV0FDekIsSUFBSyxDQUFBLE1BQUEsQ0FBTyxlQUFpQixvQkFDN0IsQ0FBQSxJQUFBLENBQUssT0FBTyxZQUFlLENBQUEsSUFBQSxDQUFPLEtBQUssTUFBTyxDQUFBLGNBQUEsQ0FBaUIseURBQy9ELElBQUssQ0FBQSxNQUFBLENBQU8sYUFBZSxHQUFNLENBQUEsSUFBQSxDQUFLLE9BQU8sY0FBaUIsQ0FBQSwrREFDMUQsRUFDWCxDQUNGLENBRUEsU0FBUyxhQUFnQixFQUFBLENBRXZCLElBQU1sTyxDQUFVLENBQUEsV0FBQSxHQUFjLGFBQWMsQ0FBQSwwQkFBMEIsRUFDdEUsT0FBSUEsQ0FBQUEsQ0FDSyxVQUFVQSxDQUFRLENBQUEsT0FBTyxFQUV6QixJQUVYLENBRUEsU0FBUyxlQUFrQixFQUFBLENBQ3pCLElBQU1tTyxDQUFhLENBQUEsYUFBQSxHQUNmQSxDQUNGLEdBQUEsSUFBQSxDQUFLLE9BQVMsWUFBYSxDQUFBLElBQUEsQ0FBSyxPQUFRQSxDQUFVLENBQUEsRUFFdEQsQ0FHQSxPQUFNLEtBQUEsQ0FBQSxVQUFXLENBQ2YsZUFBZ0IsRUFBQSxDQUNoQix1QkFDQSxDQUFBLElBQUlDLEVBQU8sV0FBWSxFQUFBLENBQUUsS0FDekIsV0FBWUEsQ0FBQUEsQ0FBSSxFQUNoQixJQUFNQyxDQUFBQSxDQUFlLGFBQWMsQ0FBQSxnQkFBQSxDQUNqQyxzREFDRixDQUFBLENBQ0FELENBQUssQ0FBQSxnQkFBQSxDQUFpQixhQUFjLFNBQVMxUixDQUFBQSxDQUFLLENBQ2hELElBQU0yQixDQUFBQSxDQUFTM0IsRUFBSSxNQUNib0QsQ0FBQUEsQ0FBQUEsQ0FBZSxnQkFBZ0J6QixDQUFNLENBQUEsQ0FDdkN5QixHQUFnQkEsQ0FBYSxDQUFBLEdBQUEsRUFDL0JBLEVBQWEsR0FBSSxDQUFBLEtBQUEsR0FFckIsQ0FBQyxDQUFBLENBRUQsSUFBTXdPLENBQW1CLENBQUEsTUFBQSxDQUFPLFdBQWEsTUFBTyxDQUFBLFVBQUEsQ0FBVyxLQUFLLE1BQU0sQ0FBQSxDQUFJLEtBRTlFLE1BQU8sQ0FBQSxVQUFBLENBQWEsU0FBUzNSLENBQU8sQ0FBQSxDQUM5QkEsRUFBTSxLQUFTQSxFQUFBQSxDQUFBQSxDQUFNLE1BQU0sSUFDN0IsRUFBQSxjQUFBLEdBQ0EsT0FBUTBSLENBQUFBLENBQUFBLENBQWMsU0FBU2pWLENBQUFBLENBQUssQ0FDbEMsWUFBQSxDQUFhQSxFQUFLLGVBQWlCLENBQUEsQ0FDakMsU0FBVSxXQUFZLEVBQUEsQ0FDdEIsWUFDRixDQUFDLEVBQ0gsQ0FBQyxDQUVHa1YsRUFBQUEsQ0FBQUEsRUFDRkEsRUFBaUIzUixDQUFLLEVBRzVCLEVBQ0EsU0FBVSxFQUFBLENBQUUsV0FBVyxVQUFXLENBQ2hDLGFBQWF5UixDQUFNLENBQUEsV0FBQSxDQUFhLEVBQUUsQ0FBQSxDQUNsQ0EsRUFBTyxLQUNULENBQUEsQ0FBRyxDQUFDLEVBQ04sQ0FBQyxFQUVNLElBQ1QsQ0FBQSxHQWdMT0csQ0FBUXBWLENBQUFBLEVBQUFBLENDaGlLZixTQUFTcVYsRUFBVUMsQ0FBQUEsQ0FBQUEsQ0FBZWpTLEVBQWEsQ0FDN0MsR0FBSWlTLENBQWEsR0FBQSxRQUFBLENBQ2YsT0FBTyxDQUFBLENBQUEsQ0FFVCxJQUFNQyxDQUFpQkQsQ0FBQUEsQ0FBQUEsQ0FBUyxNQUFNLEdBQUcsQ0FBQSxDQUNuQ0UsRUFBVW5TLENBQUksQ0FBQSxLQUFBLENBQU0sR0FBRyxDQUM3QixDQUFBLElBQUEsSUFBU2QsRUFBSSxDQUFHQSxDQUFBQSxDQUFBQSxDQUFJaVQsRUFBUSxNQUFRalQsQ0FBQUEsQ0FBQUEsRUFBQUEsQ0FBSyxDQUN2QyxJQUFNa1QsQ0FBQUEsQ0FBb0JGLEVBQWUsS0FBTSxFQUFBLENBQ3pDRyxFQUFjRixDQUFRalQsQ0FBQUEsQ0FBQyxFQUM3QixHQUFJa1QsQ0FBQUEsR0FBc0JDLEdBQWVELENBQXNCLEdBQUEsR0FBQSxDQUM3RCxPQUFPLENBRVQsQ0FBQSxDQUFBLEdBQ0VGLEVBQWUsTUFBVyxHQUFBLENBQUEsRUFDekJBLEVBQWUsTUFBVyxHQUFBLENBQUEsRUFBS0EsRUFBZSxDQUFDLENBQUEsR0FBTSxHQUV0RCxPQUFPLENBQUEsQ0FFWCxDQUNBLE9BQU8sQ0FBQSxDQUNULENBRUEsU0FBU0ksRUFBQUEsQ0FBWXZTLEVBQWMsQ0FDakMsSUFBTXdTLEVBQWVSLENBQUssQ0FBQSxPQUFBLENBQVEsYUFBYSxDQUMvQyxDQUFBLElBQUEsSUFBUzdTLEVBQUksQ0FBR0EsQ0FBQUEsQ0FBQUEsQ0FBSXFULEVBQWEsTUFBUXJULENBQUFBLENBQUFBLEVBQUFBLENBQUssQ0FDNUMsSUFBTXRDLENBQUFBLENBQU0yVixFQUFhclQsQ0FBQyxDQUFBLENBQ3RCOFMsR0FBVXBWLENBQUksQ0FBQSxZQUFBLENBQWEsV0FBVyxDQUFHbUQsQ0FBQUEsQ0FBSSxHQUMvQ2dTLENBQUssQ0FBQSxPQUFBLENBQVFuVixFQUFLLFdBQWEsQ0FBQSxJQUFJLEVBRXZDLENBQ0YsQ0FFQW1WLEVBQUssZUFBZ0IsQ0FBQSxXQUFBLENBQWEsQ0FFaEMsT0FBQSxDQUFTLFNBQVU1VSxDQUFBQSxDQUFNK0MsRUFBSyxDQUM1QixHQUFJLEVBQUVBLENBQWUsWUFBQSxXQUFBLENBQUEsQ0FDbkIsT0FBTyxDQUVULENBQUEsQ0FBQSxHQUFJL0MsSUFBUyxtQkFBcUIsQ0FBQSxDQUNoQyxJQUFNcVYsQ0FBU3RTLENBQUFBLENBQUFBLENBQUksT0FBTyxhQUd4QnNTLENBQUFBLENBQUFBLEVBQ0FBLEVBQU8sSUFBUyxHQUFBLEtBQUEsRUFDaEJ0UyxFQUFJLE1BQVUsRUFBQSxJQUFBLEVBQ2RBLEVBQUksTUFBa0IsWUFBQSxPQUFBLEVBQ3RCQSxFQUFJLE1BQU8sQ0FBQSxZQUFBLENBQWEsV0FBVyxDQUFNLEdBQUEsUUFBQSxFQUV6Q29TLEdBQVlFLENBQU8sQ0FBQSxJQUFJLEVBRTNCLENBQ0YsQ0FDRixDQUFDLENDcERELENBQUEsU0FBU0MsR0FBZXhWLENBQWEsQ0FBQSxDQUNqQyxPQUFPQSxDQUFBQSxDQUFJLE9BQVEsQ0FBQSxvQkFBQSxDQUFzQixPQUFPLENBQUUsQ0FBQSxXQUFBLEVBQ3RELENBRUEsSUFBTXlWLEdBQWdCLENBQUMsd0JBQUEsQ0FBMEIsd0JBQXlCLG9CQUFzQixDQUFBLHFCQUFBLENBQXVCLG9CQUFvQixDQUUzSSxDQUFBLFNBQVNDLEdBQVV4TixDQUFtQkMsQ0FBQUEsQ0FBQUEsQ0FBYSxDQUMvQyxJQUFJbEYsQ0FBQUEsQ0FDSixPQUFJLE1BQU8sQ0FBQSxXQUFBLEVBQWUsT0FBTyxNQUFPLENBQUEsV0FBQSxFQUFnQixXQUVwREEsQ0FBTSxDQUFBLElBQUksWUFBWWlGLENBQVcsQ0FBQSxDQUFFLFFBQVMsQ0FBTyxDQUFBLENBQUEsVUFBQSxDQUFZLEdBQU0sUUFBVSxDQUFBLENBQUEsQ0FBQSxDQUFNLE9BQUFDLENBQU8sQ0FBQyxHQUU3RmxGLENBQU0sQ0FBQSxRQUFBLENBQVMsV0FBWSxDQUFBLGFBQWEsQ0FDeENBLENBQUFBLENBQUFBLENBQUksZ0JBQWdCaUYsQ0FBVyxDQUFBLENBQUEsQ0FBQSxDQUFNLEdBQU1DLENBQU0sQ0FBQSxDQUFBLENBRTlDbEYsQ0FDWCxDQUVBLFNBQVMwUyxFQUFnQi9RLENBQXFCMUUsQ0FBQUEsQ0FBQUEsQ0FBY2dELEVBQW9CMFMsQ0FBNkIsQ0FBQSxDQUN0R0gsR0FBYyxRQUFTdlYsQ0FBQUEsQ0FBSSxHQUcxQjBFLENBQVVBLEVBQUFBLENBQUFBLENBQU8sVUFDakIsS0FBTSxDQUFBLElBQUEsQ0FBS0EsRUFBTyxRQUFRLENBQUEsQ0FBRSxRQUFTL0QsQ0FBTSxFQUFBLENBRXZDLElBQU1xSCxDQURRc04sQ0FBQUEsRUFBQUEsQ0FBZXRWLENBQUksQ0FDVCxDQUFBLE9BQUEsQ0FBUSxRQUFTLFNBQVMsQ0FBQSxDQUM3QzBWLEVBQVUsR0FBSS9VLENBQUFBLENBQWdCLElBQzVCQSxDQUFFLENBQUEsWUFBQSxDQUFhcUgsQ0FBUyxDQUN2QixFQUFBLFVBQUEsQ0FBVyxJQUFNLENBQ2IsSUFBTTJOLEVBQVdILEVBQVV4TixDQUFBQSxDQUFBQSxDQUFVLFFBQVEsU0FBVyxDQUFBLE9BQU8sRUFBRyxDQUM5RCxHQUFHaEYsRUFBTSxNQUNULENBQUEsTUFBQSxDQUFRckMsQ0FDWixDQUFDLENBQUEsQ0FDRGdWLEVBQVMsTUFBTyxDQUFBLElBQUEsQ0FBTyxtQkFDdkJoVixDQUFFLENBQUEsYUFBQSxDQUFjZ1YsQ0FBUSxDQUN4QkQsQ0FBQUEsQ0FBQUEsQ0FBVSxJQUFJL1UsQ0FBZ0IsRUFDbEMsRUFBRyxDQUFDLENBQUEsQ0FFSkEsRUFBRSxRQUNGOFUsRUFBQUEsQ0FBQUEsQ0FBZ0I5VSxFQUFrQlgsQ0FBTWdELENBQUFBLENBQUFBLENBQU8wUyxDQUFTLENBR3BFLEVBQUEsQ0FBQyxFQUVULENBSUFkLENBQUFBLENBQUssZUFBZ0IsQ0FBQSxrQkFBQSxDQUFvQixDQUNyQyxPQUFBLENBQVMsQ0FBQzVVLENBQU0rQyxDQUFBQSxDQUFBQSxHQUE2QixDQUl6QyxHQUhJLEVBQUVBLGFBQWUsV0FHbEJBLENBQUFBLEVBQUFBLENBQUFBLENBQUksT0FBTyxJQUFTLEdBQUEsa0JBQUEsQ0FDbkIsT0FBTyxDQUVYLENBQUEsQ0FBQSxJQUFNMlMsRUFBWSxJQUFJLEdBQUEsQ0FDaEJoUixFQUFTM0IsQ0FBSSxDQUFBLE1BQUEsRUFBeUJBLEVBQUksTUFBTyxDQUFBLE1BQUEsQ0FDdkQsT0FBQTBTLENBQWdCL1EsQ0FBQUEsQ0FBQUEsQ0FBUTFFLEVBQU0rQyxDQUFLMlMsQ0FBQUEsQ0FBUyxFQUNyQyxDQUNYLENBQUEsQ0FDSixDQUFDLENDN0REZCxDQUFBQSxDQUFBQSxDQUFLLGdCQUFnQixPQUFTLENBQUEsQ0FFNUIsUUFBUyxTQUFVNVUsQ0FBQUEsQ0FBTStDLEVBQUssQ0FDeEIsT0FBQSxDQUFRLEtBQ1YsQ0FBQSxPQUFBLENBQVEsS0FBTS9DLENBQUFBLENBQUFBLENBQU0rQyxDQUFHLENBQ2QsQ0FBQSxPQUFBLEVBQ1QsUUFBUSxHQUFJLENBQUEsUUFBQSxDQUFVL0MsRUFBTStDLENBQUcsRUFJbkMsQ0FDRixDQUFDLENBQUEsQ0NaRCxJQUFNc1MsQ0FBY1QsQ0FBQUEsQ0FBQUEsQ0FBSyxPQUdyQmIsQ0FFRTZCLENBQUFBLEVBQUFBLENBQWEsYUFHbkIsU0FBU0MsQ0FBQUEsQ0FBVy9WLEVBQWF5RCxDQUFnQixDQUFBLENBQy9DLE9BQU96RCxDQUFJLENBQUEsU0FBQSxDQUFVLEVBQUd5RCxDQUFPLENBQUEsTUFBTSxJQUFNQSxDQUM3QyxDQU9BLFNBQVN1UyxFQUFrQnJXLENBQUFBLENBQUFBLENBQWNzVyxFQUF3QixDQUMvRCxHQUFJLENBQUN0VyxDQUFPLEVBQUEsQ0FBQ3NXLEVBQWdCLE9BQU8sSUFBQSxDQUVwQyxJQUFNQyxDQUFBQSxDQUFXRCxDQUFlLENBQUEsUUFBQSxHQVMxQkUsQ0FBb0IsQ0FBQSxDQUN4QkQsRUFFQUEsQ0FBUyxDQUFBLE1BQUEsQ0FBTyxFQUFHLENBQUMsQ0FBQSxDQUFJLElBQ3hCQSxDQUFTLENBQUEsTUFBQSxDQUFPLEVBQUcsQ0FBQyxDQUFBLENBQUksSUFFeEJBLENBQVMsQ0FBQSxNQUFBLENBQU8sRUFBRyxDQUFDLENBQUEsQ0FBSSxJQUN4QkEsQ0FBUyxDQUFBLE1BQUEsQ0FBTyxFQUFHLENBQUMsQ0FBQSxDQUFJLElBQ3hCQSxDQUFTLENBQUEsTUFBQSxDQUFPLEVBQUcsQ0FBQyxDQUFBLENBQUksS0FDeEJBLENBQVMsQ0FBQSxNQUFBLENBQU8sRUFBRyxDQUFDLENBQUEsQ0FBSSxLQUV4QixHQUNBLENBQUEsR0FBQSxDQUNBLE1BQ0EsS0FDRixDQUFBLENBQUEsQ0FDSUgsQ0FBV0csQ0FBQUEsQ0FBQUEsQ0FBVSxHQUFHLENBQUEsRUFBS0gsRUFBV0csQ0FBVSxDQUFBLEdBQUcsSUFDdkRDLENBQWtCLENBQUEsSUFBQSxDQUFLLE9BQU8sQ0FHaEMsQ0FBQSxJQUFBLElBQVNsVSxFQUFJLENBQUdBLENBQUFBLENBQUFBLENBQUlrVSxFQUFrQixNQUFRbFUsQ0FBQUEsQ0FBQUEsRUFBQUEsQ0FBSyxDQUNqRCxJQUFNWixDQUFBQSxDQUFPeVUsR0FBYUssQ0FBa0JsVSxDQUFBQSxDQUFDLEVBQ3ZDbVUsQ0FBWW5DLENBQUFBLENBQUFBLENBQUkseUJBQXlCdFUsQ0FBSzBCLENBQUFBLENBQUksRUFDeEQsR0FBSStVLENBQUFBLENBQ0YsT0FBSUEsQ0FBYyxHQUFBLE1BQUEsQ0FDVG5DLEVBQUksZUFBZ0J0VSxDQUFBQSxDQUFBQSxDQUFLMEIsQ0FBSSxDQUU3QjRTLENBQUFBLENBQUFBLENBQUksaUJBQWlCdFUsQ0FBS3lXLENBQUFBLENBQVMsQ0FHaEQsQ0FFQSxPQUFPLElBQ1QsQ0FHQSxTQUFTQyxDQUFBQSxDQUFnQnBULEVBQWtCLENBQ3JDQSxDQUFBQSxDQUFJLE9BQU8sT0FDVHNTLENBQUFBLENBQUFBLENBQU8sNEJBQ1R0UyxDQUFJLENBQUEsTUFBQSxDQUFPLFFBQVUsQ0FFZHNTLENBQUFBLENBQUFBLENBQUFBLENBQUFBLENBQU8sMEJBQ2hCdFMsQ0FBSSxDQUFBLE1BQUEsQ0FBTyxRQUFVLENBRXpCLENBQUEsRUFBQSxDQUVBNlIsRUFBSyxlQUFnQixDQUFBLGtCQUFBLENBQW9CLENBRXZDLElBQU93QixDQUFBQSxDQUFBQSxFQUFXLENBQ2hCckMsQ0FBTXFDLENBQUFBLENBQUFBLENBRUZmLEVBQU8seUJBQThCLEdBQUEsS0FBQSxDQUFBLEdBQ3ZDQSxFQUFPLHlCQUE0QixDQUFBLENBQUEsQ0FBQSxDQUFBLENBRWpDQSxFQUFPLHVCQUE0QixHQUFBLEtBQUEsQ0FBQSxHQUNyQ0EsRUFBTyx1QkFBMEIsQ0FBQSxDQUFBLENBQUEsQ0FBQSxDQUUvQkEsRUFBTyw2QkFBa0MsR0FBQSxLQUFBLENBQUEsR0FDM0NBLEVBQU8sNkJBQWdDLENBQUEsQ0FBQSxDQUFBLENBQUEsQ0FFckNBLENBQU8sQ0FBQSxtQ0FBQSxHQUF3QyxLQUNqREEsQ0FBQUEsR0FBQUEsQ0FBQUEsQ0FBTyxvQ0FBc0MsQ0FFakQsQ0FBQSxFQUFBLENBQUEsQ0FHQSxRQUFTLENBQUNyVixDQUFBQSxDQUFNK0MsSUFBUSxDQUN0QixHQUFJLEVBQUVBLENBQWUsWUFBQSxXQUFBLENBQUEsQ0FDbkIsT0FBTyxDQUVULENBQUEsQ0FBQSxHQUNFL0MsSUFBUyxpQkFDVCtDLEVBQUFBLENBQUFBLENBQUksT0FBTyxHQUNYQSxFQUFBQSxDQUFBQSxDQUFJLE9BQU8sR0FBSSxDQUFBLE1BQUEsR0FBVyxJQUMxQixDQUNBLEdBQUlBLEVBQUksTUFBTyxDQUFBLE1BQUEsR0FDVHNTLEVBQU8sNkJBTVRBLEVBQUFBLENBQUFBLENBQU8scUNBQ1B0UyxDQUFJLENBQUEsTUFBQSxDQUFPLElBQUkscUJBQXNCLEVBQUEsQ0FBRSxNQUFNLGVBQWUsQ0FBQSxDQUFBLENBRTVELE9BQUFBLENBQUksQ0FBQSxNQUFBLENBQU8sVUFBYSxDQUFBLENBQUEsQ0FBQSxDQUN4Qm9ULENBQWdCcFQsQ0FBQUEsQ0FBRyxFQUNaLENBR1gsQ0FBQSxDQUFBLEdBQUksQ0FBQ0EsQ0FBSSxDQUFBLE1BQUEsQ0FBTyxjQUNkLE9BQU8sQ0FBQSxDQUFBLENBRVQsSUFBTTJCLENBQVNvUixDQUFBQSxFQUFBQSxDQUNiL1MsRUFBSSxNQUFPLENBQUEsYUFBQSxDQUFjLElBQ3pCQSxDQUFJLENBQUEsTUFBQSxDQUFPLElBQUksTUFDakIsQ0FBQSxDQUNBLE9BQUkyQixDQUNGeVIsR0FBQUEsQ0FBQUEsQ0FBZ0JwVCxDQUFHLENBQ25CQSxDQUFBQSxDQUFBQSxDQUFJLE9BQU8sVUFBYSxDQUFBLENBQUEsQ0FBQSxDQUN4QkEsRUFBSSxNQUFPLENBQUEsTUFBQSxDQUFTMkIsR0FFZixDQUNULENBQUEsQ0FDRixDQUNGLENBQUMsQ0FBQSxDQ3JJRGtRLEVBQUssZUFBZ0IsQ0FBQSxnQkFBQSxDQUFrQixDQUVyQyxPQUFTLENBQUEsQ0FBQzVVLEVBQU0rQyxDQUFRLEdBQUEsQ0FDdEIsR0FBSSxFQUFFQSxDQUFBQSxZQUFlLGFBQ25CLE9BQU8sQ0FBQSxDQUFBLENBRVQsR0FBSS9DLENBQVMsR0FBQSxtQkFBQSxDQUFxQixDQUNoQyxHQUFJLENBQUMrQyxFQUFJLE1BQVUsRUFBQSxDQUFDQSxFQUFJLE1BQU8sQ0FBQSxHQUFBLENBQzdCLE9BRUYsSUFBTXdQLENBQUFBLENBQVN4UCxFQUFJLE1BQU8sQ0FBQSxHQUFBLENBQUksT0FDMUJ3UCxDQUFVLEVBQUEsR0FBQSxFQUNacUMsRUFBSyxPQUFRLENBQUEsNkJBQTZCLEVBQUUsT0FBU3ZPLENBQUFBLENBQUFBLEVBQVksQ0FDL0R1TyxDQUFLLENBQUEsT0FBQSxDQUFRdk8sRUFBUyxxQkFBdUIsQ0FBQSxDQUFFLE9BQUFrTSxDQUFPLENBQUMsRUFDekQsQ0FBQyxFQUVMLENBQ0YsQ0FDRixDQUFDLENBQUEsQ0NsQkQsSUFBSThELENBQWMsQ0FBQSxFQUFBLENBRWxCekIsRUFBSyxlQUFnQixDQUFBLFlBQUEsQ0FBYyxDQUMvQixJQUFNLENBQUEsVUFBWSxDQUVkLElBQUkwQixDQUFBQSxDQUFVLEdBQ2QsSUFBV2pRLElBQUFBLENBQUFBLElBQVcsTUFBTSxJQUFLdU8sQ0FBQUEsQ0FBQUEsQ0FBSyxRQUFRLFVBQVUsQ0FBQyxFQUVyRCxHQURjdk8sQ0FBQUEsQ0FBUSxhQUFhLFFBQVEsQ0FBQSxFQUNqQyxNQUFNLEdBQUcsQ0FBQSxDQUFFLFNBQVMsWUFBWSxDQUFBLENBQUcsQ0FDekNpUSxDQUFVLENBQUEsQ0FBQSxDQUFBLENBQ1YsS0FDSixDQUdKLEdBQUcsQ0FBQ0EsQ0FDQSxDQUFBLE9BR0osUUFBUSxHQUFJLENBQUEsbUNBQW1DLENBRS9DLENBQUEsSUFBTUMsQ0FBYyxDQUFBLElBQUksWUFBWSxpQkFBaUIsQ0FBQSxDQUVyREEsRUFBWSxTQUFZLENBQUEsU0FBU3ZULEVBQU8sQ0FDcEMsSUFBTXdULEVBQVV4VCxDQUFNLENBQUEsSUFBQSxDQUVuQnFULElBQWdCLEVBQ2ZBLEdBQUFBLENBQUFBLENBQWNHLEdBRWZILENBQWdCRyxHQUFBQSxDQUFBQSxHQUNmSCxFQUFjRyxDQUNkQyxDQUFBQSxFQUFBQSxJQUVSLENBRUFGLENBQUFBLENBQUFBLENBQVksUUFBVSxTQUFTN1QsQ0FBQUEsQ0FBTyxDQUNsQyxPQUFRLENBQUEsS0FBQSxDQUFNLHFCQUFzQkEsQ0FBSyxFQUM3QyxFQUVKLENBRUEsQ0FBQSxPQUFBLENBQVMsU0FBVTFDLENBQU0rQyxDQUFBQSxDQUFBQSxDQUFLLEVBR2xDLENBQUMsRUFFRCxTQUFTMFQsRUFBQUEsRUFBUyxDQUNkLE1BQUEsQ0FBTyxRQUFTLENBQUEsTUFBQSxHQUNwQixDQy9DQSxJQUFNQyxHQUFlLGlDQUVyQjlCLENBQUFBLENBQUFBLENBQUssZ0JBQWdCLE9BQVMsQ0FBQSxDQUUxQixRQUFTLFNBQVU1VSxDQUFBQSxDQUFNK0MsRUFBSyxDQUN4Qi9DLENBQUFBLEdBQVMsNkJBQStCK0MsQ0FBSSxDQUFBLE1BQUEsRUFDM0M0VCxFQUF3QjVULENBQUksQ0FBQSxNQUFxQixFQUVsRC9DLENBQVMsR0FBQSxXQUFBLEVBQWUrQyxFQUFJLE1BQzVCNlQsRUFBQUEsQ0FBQUEsQ0FBYTdULEVBQUksTUFBcUIsRUFFNUMsQ0FDSixDQUFDLENBQUEsQ0FNRCxTQUFTNlQsQ0FBYXZRLENBQUFBLENBQUFBLENBQW1CLENBQ3JDLEdBQUdBLENBQUFBLEVBQVcsTUFBUSxFQUFFQSxDQUFBQSxZQUFtQixhQUN2QyxPQUVZLENBQUMsUUFBVSxDQUFBLE1BQUEsQ0FBUSxPQUFTLENBQUEsTUFBQSxDQUFRLE9BQVEsT0FBUyxDQUFBLE1BQUEsQ0FBUSxPQUFRLE1BQU0sQ0FBQSxDQUMvRSxTQUFTQSxDQUFRLENBQUEsT0FBTyxHQUM3QkEsQ0FBUSxDQUFBLFlBQUEsQ0FBYSxRQUFRLENBQzVCQSxFQUFBQSxDQUFBQSxDQUFRLE9BQVEsSUFBSSxLQUFBLENBQU0sTUFBTSxDQUFDLENBQUEsQ0FJekNBLEVBQVEsZ0JBQWlCLENBQUEsVUFBVSxFQUFFLE9BQVF1USxDQUFBQSxDQUFZLEVBQzdELENBRU8sU0FBU0QsRUFBd0J0USxDQUFzQixDQUFBLENBQzNELElBQU1pRSxDQUFhLENBQUEsS0FBQSxDQUFNLEtBQUtqRSxDQUFRLENBQUEsVUFBVSxFQUMvQyxJQUFTakMsSUFBQUEsQ0FBQUEsSUFBYWtHLEVBQVksQ0FDL0IsSUFBTXVNLENBQVV6UyxDQUFBQSxDQUFBQSxDQUFVLEtBQU0sQ0FBQSxLQUFBLENBQU1zUyxFQUFhLENBQUssRUFBQSxHQUN2RCxJQUFTNVYsSUFBQUEsQ0FBQUEsSUFBUytWLEVBQVMsQ0FDdkIsSUFBTXpSLEVBQUt0RSxDQUFNLENBQUEsT0FBQSxDQUFRLEtBQU0sRUFBRSxDQUFBLENBQUUsUUFBUSxRQUFVLENBQUEsRUFBRSxFQUFFLE9BQVEsQ0FBQSxHQUFBLENBQUssRUFBRSxDQUNsRWdXLENBQUFBLENBQUFBLENBQU0sU0FBUyxjQUFlMVIsQ0FBQUEsQ0FBRSxFQUNuQzBSLENBQU9BLEVBQUFBLENBQUFBLENBQUksVUFBWSxRQUN0QixHQUFBLE9BQUEsQ0FBUSxNQUFNLG9DQUFzQzFSLENBQUFBLENBQUUsRUFDdEQwUixDQUFJLENBQUEsTUFBQSxJQUVaLENBQ0osQ0FDSixDQzVDQSxJQUFJL0MsQ0FBQUEsQ0FBWSxJQUNackgsQ0FBQUEsQ0FBQUEsQ0FBWSxJQUFJLEdBQUEsQ0FFcEJrSSxFQUFLLGVBQWdCLENBQUEsS0FBQSxDQUFPLENBQ3hCLElBQU0sQ0FBQSxTQUFVd0IsRUFBUSxDQUNwQnJDLENBQUFBLENBQU1xQyxFQUNWLENBRUEsQ0FBQSxPQUFBLENBQVMsU0FBVXBXLENBQU0rQyxDQUFBQSxDQUFBQSxDQUFLLENBQzFCLElBQU0yQixDQUFBQSxDQUFTM0IsRUFBSSxNQUNuQixDQUFBLEdBQUsyQixhQUFrQixXQUlwQjFFLEdBQUFBLENBQUFBLEdBQVMsNkJBQ1IyVyxDQUF3QmpTLENBQUFBLENBQU0sRUFHL0IxRSxDQUFTLEdBQUEsd0JBQUEsQ0FBQSxDQUEwQixDQUNsQyxJQUFNdUssQ0FBQUEsQ0FBVyxTQUFTLGdCQUFpQixDQUFBLGVBQWUsRUFDMUQsSUFBU2xFLElBQUFBLENBQUFBLElBQVcsTUFBTSxJQUFLa0UsQ0FBQUEsQ0FBUSxFQUFHLENBQ3RDLElBQU0xSCxDQUFNd0QsQ0FBQUEsQ0FBQUEsQ0FBUSxZQUFhLENBQUEsYUFBYSxFQUMzQ3hELENBQU8sRUFBQSxDQUFDNkosRUFBVSxHQUFJN0osQ0FBQUEsQ0FBRyxJQUN4QmtVLEVBQW1CMVEsQ0FBQUEsQ0FBQUEsQ0FBU3hELENBQUcsQ0FDL0I2SixDQUFBQSxDQUFBQSxDQUFVLElBQUk3SixDQUFHLENBQUEsRUFFekIsQ0FDSixDQUNKLENBQ0osQ0FBQyxDQUVELENBQUEsU0FBU2tVLEdBQW1CRCxDQUFjalUsQ0FBQUEsQ0FBQUEsQ0FBYSxDQUNuRCxHQUFHLENBQUNBLEVBQ0EsT0FFSixPQUFBLENBQVEsS0FBSywyQkFBNkJBLENBQUFBLENBQUcsRUFDN0MsSUFBTTBULENBQUFBLENBQWMsSUFBSSxXQUFZMVQsQ0FBQUEsQ0FBRyxFQUV2QzBULENBQVksQ0FBQSxnQkFBQSxDQUFpQixRQUFTLFNBQVN2VCxDQUFBQSxDQUFPLENBQ2xENFIsQ0FBSyxDQUFBLE9BQUEsQ0FBUWtDLEVBQUssZUFBaUIsQ0FBQSxDQUFDLE1BQU85VCxDQUFLLENBQUMsRUFDckQsQ0FBQyxDQUFBLENBRUR1VCxFQUFZLE1BQVMsQ0FBQSxTQUFTdlQsRUFBTyxDQUNqQzRSLENBQUFBLENBQUssUUFBUWtDLENBQUssQ0FBQSxjQUFBLENBQWdCLENBQUMsS0FBTzlULENBQUFBLENBQUssQ0FBQyxFQUNwRCxDQUFBLENBRUF1VCxFQUFZLE9BQVUsQ0FBQSxTQUFTdlQsRUFBTyxDQUNsQzRSLENBQUFBLENBQUssUUFBUWtDLENBQUssQ0FBQSxlQUFBLENBQWlCLENBQUMsS0FBTzlULENBQUFBLENBQUssQ0FBQyxDQUM3Q3VULENBQUFBLENBQUFBLENBQVksWUFBYyxXQUFZLENBQUEsTUFBQSxFQUN0QzNCLEVBQUssT0FBUWtDLENBQUFBLENBQUFBLENBQUssZUFBaUIsQ0FBQSxDQUFDLEtBQU85VCxDQUFBQSxDQUFLLENBQUMsRUFFekQsQ0FBQSxDQUVBdVQsRUFBWSxTQUFZLENBQUEsU0FBU3ZULEVBQU8sQ0FDcEMsSUFBTStCLEVBQWFnUCxDQUFJLENBQUEsY0FBQSxDQUFlK0MsQ0FBRyxDQUN6Q2xDLENBQUFBLENBQUFBLENBQUssUUFBUWtDLENBQUssQ0FBQSx1QkFBQSxDQUF5QixDQUFDLEtBQU85VCxDQUFBQSxDQUFLLENBQUMsQ0FDekQsQ0FBQSxJQUFNNUIsRUFBVzRCLENBQU0sQ0FBQSxJQUFBLENBQ2pCaEMsRUFBVytTLENBQUksQ0FBQSxZQUFBLENBQWEzUyxDQUFRLENBQ3BDNFYsQ0FBQUEsQ0FBQUEsQ0FBVyxNQUFNLElBQUtoVyxDQUFBQSxDQUFBQSxDQUFTLFFBQVEsQ0FDN0MsQ0FBQSxJQUFBLElBQVNzQyxLQUFTMFQsQ0FDZGpELENBQUFBLENBQUFBLENBQUksUUFBUUEsQ0FBSSxDQUFBLGlCQUFBLENBQWtCelEsQ0FBTyxDQUFBLGFBQWEsQ0FBSyxFQUFBLE1BQUEsQ0FBUUEsRUFBT3lCLENBQVUsQ0FBQSxDQUVqRnpCLEVBQU0sT0FBWSxHQUFBLFFBQUEsRUFBWUEsRUFBTSxFQUFHLENBQUEsVUFBQSxDQUFXLFFBQVEsQ0FDekQsRUFBQSxRQUFBLENBQVMsS0FBSyxXQUFZQSxDQUFBQSxDQUFLLEVBR3ZDc1IsQ0FBSyxDQUFBLE9BQUEsQ0FBUWtDLEVBQUssc0JBQXdCLENBQUEsQ0FBQyxNQUFPOVQsQ0FBSyxDQUFDLEVBQzVELEVBQ0osQ0M1REEsT0FBTyxJQUFPNFIsQ0FBQUEsQ0FBQUEsQ0FFZCxTQUFTcUMsRUFBU25VLENBQUFBLENBQUFBLENBQW9ELENBQ3BFLElBQUlvVSxDQUFBQSxDQUFVLE9BQU8sUUFBUyxDQUFBLElBQUEsQ0FDOUIsWUFBWSxJQUFNLENBQ1osT0FBTyxRQUFTLENBQUEsSUFBQSxHQUFTQSxDQUMzQnBVLEdBQUFBLENBQUFBLENBQVNvVSxDQUFTLENBQUEsTUFBQSxDQUFPLFNBQVMsSUFBSSxDQUFBLENBQ3RDQSxFQUFVLE1BQU8sQ0FBQSxRQUFBLENBQVMsTUFFOUIsQ0FBRyxDQUFBLEdBQUcsRUFDUixDQUVBRCxFQUFBQSxDQUFTLENBQUNFLENBQUdDLENBQUFBLENBQUFBLEdBQVcsQ0FDdEJDLEVBQVlELENBQUFBLENBQU0sRUFDcEIsQ0FBQyxDQUFBLENBRUQsU0FBU0MsRUFBWUQsQ0FBQUEsQ0FBQUEsQ0FBZ0IsQ0FDbkMsSUFBSXZVLENBQUFBLENBQU0sSUFBSSxHQUFJdVUsQ0FBQUEsQ0FBTSxFQUV4QixRQUFTLENBQUEsZ0JBQUEsQ0FBaUIsY0FBYyxDQUFFLENBQUEsT0FBQSxDQUFRLFNBQVUvUSxDQUFTLENBQUEsQ0FDbkUsSUFBTTBCLENBQVcxQixDQUFBQSxDQUFBQSxDQUFRLGFBQWEsWUFBWSxDQUFBLENBQ2xELEdBQUksQ0FBQzBCLENBQ0gsQ0FBQSxPQUdGLEdBRGNBLENBQVMsQ0FBQSxLQUFBLENBQU0sSUFBSSxDQUN2QixDQUFBLElBQUEsQ0FBTTZDLEdBQU1BLENBQU0sR0FBQSxLQUFLLEVBQy9CZ0ssQ0FBSyxDQUFBLElBQUEsQ0FBS3ZPLEVBQVMsS0FBTyxDQUFBLENBQ3hCLFVBQVcsV0FDWCxDQUFBLFNBQUEsQ0FBVyxFQUNYLFdBQWEsQ0FBQSxDQUNmLENBQUMsQ0FFRCxDQUFBLEtBQUEsSUFBQSxHQUFTLENBQUM3RCxDQUFLcUssQ0FBQUEsQ0FBTSxJQUFLaEssQ0FBSSxDQUFBLFlBQUEsQ0FBYyxDQUMxQyxJQUFJbUYsQ0FBQUEsQ0FBWSxNQUFReEYsQ0FDeEIsQ0FBQSxHQUFJdUYsRUFBUyxRQUFTQyxDQUFBQSxDQUFTLEVBQUcsQ0FDaEMsT0FBQSxDQUFRLElBQUksWUFBY0EsQ0FBQUEsQ0FBUyxDQUNuQzRNLENBQUFBLENBQUFBLENBQUssT0FBUXZPLENBQUFBLENBQUFBLENBQVMyQixFQUFXLElBQUksQ0FBQSxDQUNyQyxLQUNGLENBQ0YsQ0FFSixDQUFDLENBRUQsQ0FBQSxRQUFBLENBQVMsaUJBQWlCLGVBQWUsQ0FBQSxDQUFFLFFBQVNoRyxDQUFPLEVBQUEsQ0FDekQsSUFBSXNWLENBQVcsQ0FBQSxDQUFBLENBQUEsQ0FDZixRQUFTdFgsQ0FBUWdDLElBQUFBLENBQUFBLENBQUcsbUJBQ2xCLENBQUEsR0FBSWhDLEVBQUssVUFBVyxDQUFBLHNCQUFzQixFQUFHLENBQzNDLElBQUljLEVBQVFkLENBQUssQ0FBQSxPQUFBLENBQVEsdUJBQXdCLEVBQUUsQ0FBQSxDQUVuRCxHQURZNkMsQ0FBSSxDQUFBLFlBQUEsQ0FBYSxJQUFJL0IsQ0FBSyxDQUFBLENBQzNCLENBQ1Q4VCxDQUFLLENBQUEsSUFBQSxDQUFLNVMsQ0FBSUEsQ0FBQUEsQ0FBQUEsQ0FBRyxZQUFhaEMsQ0FBQUEsQ0FBSSxHQUFLLEVBQUksQ0FBQSxDQUN6QyxVQUFXLFdBQ1gsQ0FBQSxTQUFBLENBQVcsRUFDWCxXQUFhLENBQUEsQ0FDZixDQUFDLENBQ0RzWCxDQUFBQSxDQUFBQSxDQUFXLEdBQ1gsS0FDRixDQUNGLENBRUYsR0FBSSxDQUFDQSxFQUFVLENBQ2IsSUFBSUMsRUFBYXZWLENBQUcsQ0FBQSxZQUFBLENBQWEscUJBQXFCLENBQ2xEdVYsQ0FBQUEsQ0FBQUEsRUFDRjNDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCdVYsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6bG9hZFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICBpbnZva2VPbkxvYWQoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuLyoqXG4gKiBCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBvbmxvYWQgZm9yIGFsbCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGl0XG4gKiB0aGlzIGlzIHVzZWZ1bCBmb3IgbG9jYWxpdHkgb2YgYmVoYXZpb3JcbiAqL1xuZnVuY3Rpb24gaW52b2tlT25Mb2FkKGVsZW1lbnQgOiBFbGVtZW50KSB7XG4gICAgaWYoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaWdub3JlZCA9IFsnU0NSSVBUJywgJ0xJTksnLCAnU1RZTEUnLCAnTUVUQScsICdCQVNFJywgJ1RJVExFJywgJ0hFQUQnLCAnSFRNTCcsICdCT0RZJ107XG4gICAgaWYoIWlnbm9yZWQuaW5jbHVkZXMoZWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICBpZihlbGVtZW50Lmhhc0F0dHJpYnV0ZShcIm9ubG9hZFwiKSkge1xuICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQhKG5ldyBFdmVudChcImxvYWRcIikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGl0cyBjaGlsZHJlblxuICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ubG9hZF0nKS5mb3JFYWNoKGludm9rZU9uTG9hZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vLyBAdHMtaWdub3JlXG53aW5kb3cuaHRteCA9IGh0bXg7XG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMCk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwiaW52b2tlT25Mb2FkIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEs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WCxDQUFBQSxDQUFBQSxDQUFXLEdBQ1gsS0FDRixDQUNGLENBRUYsR0FBSSxDQUFDQSxFQUFVLENBQ2IsSUFBSUMsRUFBYXZWLENBQUcsQ0FBQSxZQUFBLENBQWEscUJBQXFCLENBQ2xEdVYsQ0FBQUEsQ0FBQUEsRUFDRjNDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCdVYsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6bG9hZFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICBpbnZva2VPbkxvYWQoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuLyoqXG4gKiBCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBvbmxvYWQgZm9yIGFsbCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGl0XG4gKiB0aGlzIGlzIHVzZWZ1bCBmb3IgbG9jYWxpdHkgb2YgYmVoYXZpb3JcbiAqL1xuZnVuY3Rpb24gaW52b2tlT25Mb2FkKGVsZW1lbnQgOiBFbGVtZW50KSB7XG4gICAgaWYoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaWdub3JlZCA9IFsnU0NSSVBUJywgJ0xJTksnLCAnU1RZTEUnLCAnTUVUQScsICdCQVNFJywgJ1RJVExFJywgJ0hFQUQnLCAnSFRNTCcsICdCT0RZJ107XG4gICAgaWYoIWlnbm9yZWQuaW5jbHVkZXMoZWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICBpZihlbGVtZW50Lmhhc0F0dHJpYnV0ZShcIm9ubG9hZFwiKSkge1xuICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQhKG5ldyBFdmVudChcImxvYWRcIikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGl0cyBjaGlsZHJlblxuICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ubG9hZF0nKS5mb3JFYWNoKGludm9rZU9uTG9hZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vLyBAdHMtaWdub3JlXG53aW5kb3cuaHRteCA9IGh0bXg7XG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMSk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file From 7d748ec7e67505c68766780fd9fa1b11e82c641f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 14:12:20 +0000 Subject: [PATCH 056/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 9cc6c416..7cbdebc7 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 + github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index d9ed9a13..fca70de4 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index bb38c9e3..e3c94d01 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 +require github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 9a23ac6f..1a34abfc 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index f73ab3fe..2963a68f 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 + github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 46d18dde..721d503a 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 99b97916..581b53df 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 +require github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 9a23ac6f..1a34abfc 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 3d52620a..35bad926 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 + github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 3f3133e1..61c08ee5 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -12,8 +12,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index b1a5ae46..b07e53c4 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 +require github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 9a23ac6f..1a34abfc 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471 h1:C6aC4nxAG+SiL/vtQMLS2o3cMfjaiejzMGu8fCIxoho= -github.com/maddalax/htmgo/framework v0.0.0-20241011140801-879977263471/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= +github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 8e4a63d2246936fb215f4860afb8393558ad5065 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 10:25:41 -0500 Subject: [PATCH 057/145] add html-to-htmgo tool --- cli/htmgo/htmltogo/entry.go | 119 ---------------- tools/html-to-htmgo/go.mod | 8 ++ tools/html-to-htmgo/go.sum | 8 ++ .../adapters/services/formatter/formatter.go | 29 ++++ .../adapters/services/parser/parser.go | 69 ++++++++++ .../adapters/services/parser/parser_test.go | 33 +++++ .../internal/domain/formatter.go | 5 + tools/html-to-htmgo/internal/domain/node.go | 127 ++++++++++++++++++ tools/html-to-htmgo/internal/domain/parser.go | 5 + tools/html-to-htmgo/main.go | 22 +++ 10 files changed, 306 insertions(+), 119 deletions(-) delete mode 100644 cli/htmgo/htmltogo/entry.go create mode 100644 tools/html-to-htmgo/go.mod create mode 100644 tools/html-to-htmgo/go.sum create mode 100644 tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go create mode 100644 tools/html-to-htmgo/internal/adapters/services/parser/parser.go create mode 100644 tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go create mode 100644 tools/html-to-htmgo/internal/domain/formatter.go create mode 100644 tools/html-to-htmgo/internal/domain/node.go create mode 100644 tools/html-to-htmgo/internal/domain/parser.go create mode 100644 tools/html-to-htmgo/main.go diff --git a/cli/htmgo/htmltogo/entry.go b/cli/htmgo/htmltogo/entry.go deleted file mode 100644 index 94069397..00000000 --- a/cli/htmgo/htmltogo/entry.go +++ /dev/null @@ -1,119 +0,0 @@ -package main - -import ( - "bytes" - "fmt" - "log" - "strings" - - "github.com/dave/jennifer/jen" - "golang.org/x/net/html" -) - -func main() { - // Example HTML input - htmlData := ` -

Manage Patients

Name: Sydne

Reason for visit: arm hurts

- ` - - // Parse the HTML - doc, err := html.Parse(bytes.NewReader([]byte(htmlData))) - if err != nil { - log.Fatal(err) - } - - // Create a new Jennifer file - f := jen.NewFile("main") - - // Generate Jennifer code for the parsed HTML tree - generatedCode := processNode(doc.FirstChild) - - // Add the generated code to the file - f.Func().Id("Render").Params().Block(generatedCode...) - - // Render the generated code - var buf bytes.Buffer - err = f.Render(&buf) - if err != nil { - log.Fatal(err) - } - - //// Format the generated code - //formattedCode, err := format.Source(buf.Bytes()) - //if err != nil { - // log.Fatal(err) - //} - - // Output the formatted code - fmt.Println(string(buf.Bytes())) -} - -// Recursively process the HTML nodes and generate Jennifer code -func processNode(n *html.Node) []jen.Code { - var code []jen.Code - - // Only process element nodes - if n.Type == html.ElementNode { - // Create a dynamic method call based on the tag name - tagMethod := strings.Title(n.Data) // Capitalize the first letter of the tag - - // Add dynamic method call for the tag (e.g., h.Div(), h.Button(), etc.) - code = append(code, jen.Id("h").Dot(tagMethod).Call(mergeArgs(n)...)) - } - - return code -} - -// Merge attributes and children into a single slice for Call() -func mergeArgs(n *html.Node) []jen.Code { - // Process attributes - attrs := processAttributes(n.Attr) - - // Process children - children := processChildren(n) - - // Combine attributes and children into one slice - return append(attrs, children...) -} - -// Process child nodes of a given HTML node -func processChildren(n *html.Node) []jen.Code { - var children []jen.Code - - for c := n.FirstChild; c != nil; c = c.NextSibling { - children = append(children, processNode(c)...) - } - - return children -} - -func FormatFieldName(name string) string { - split := strings.Split(name, "_") - if strings.Contains(name, "-") { - split = strings.Split(name, "-") - } - parts := make([]string, 0) - for _, s := range split { - parts = append(parts, PascalCase(s)) - } - return strings.Join(parts, "") -} - -func PascalCase(s string) string { - if s == "" { - return s - } - // Convert the first rune (character) to uppercase and concatenate with the rest of the string - return strings.ToUpper(string(s[0])) + s[1:] -} - -// Process the attributes of an HTML node and return Jennifer code -func processAttributes(attrs []html.Attribute) []jen.Code { - var args []jen.Code - for _, attr := range attrs { - // Dynamically handle all attributes - attrMethod := FormatFieldName(attr.Key) // E.g., convert "data-role" to "DataRole" - args = append(args, jen.Id("h").Dot(attrMethod).Call(jen.Lit(attr.Val))) - } - return args -} diff --git a/tools/html-to-htmgo/go.mod b/tools/html-to-htmgo/go.mod new file mode 100644 index 00000000..5025aea8 --- /dev/null +++ b/tools/html-to-htmgo/go.mod @@ -0,0 +1,8 @@ +module html-to-htmgo + +go 1.23.0 + +require ( + golang.org/x/net v0.30.0 + golang.org/x/text v0.19.0 +) diff --git a/tools/html-to-htmgo/go.sum b/tools/html-to-htmgo/go.sum new file mode 100644 index 00000000..613920c7 --- /dev/null +++ b/tools/html-to-htmgo/go.sum @@ -0,0 +1,8 @@ +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go new file mode 100644 index 00000000..f6cc02ab --- /dev/null +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go @@ -0,0 +1,29 @@ +package formatter + +import ( + "go/format" + "html-to-htmgo/internal/domain" +) + +type Formatter struct { +} + +func (f Formatter) Format(node *domain.CustomNode) string { + b := []byte(`package main +import ( + "github.com/maddalax/htmgo/framework/h" +) +func MyComponent() *h.Element { + return ` + node.String() + ` +}`) + dist, err := format.Source(b) + if err != nil { + return string(b) + } + + return string(dist) +} + +func New() Formatter { + return Formatter{} +} diff --git a/tools/html-to-htmgo/internal/adapters/services/parser/parser.go b/tools/html-to-htmgo/internal/adapters/services/parser/parser.go new file mode 100644 index 00000000..3583d46b --- /dev/null +++ b/tools/html-to-htmgo/internal/adapters/services/parser/parser.go @@ -0,0 +1,69 @@ +package parser + +import ( + "bytes" + "errors" + "fmt" + "golang.org/x/net/html" + "html-to-htmgo/internal/domain" + "strings" +) + +type Parser struct { +} + +var ParseErr = errors.New("parse error") + +func (p Parser) FromBytes(in []byte) (*domain.CustomNode, error) { + hNode, err := html.Parse(bytes.NewReader(in)) + if err != nil { + return nil, fmt.Errorf("%w: %v", ParseErr, err) + } + var findBody func(n *html.Node) *html.Node + findBody = func(n *html.Node) *html.Node { + if n.Data == "body" { + return n + } + var e *html.Node + for c := n.FirstChild; c != nil; c = c.NextSibling { + e = findBody(c) + } + return e + } + + body := findBody(hNode) + if body == nil { + return nil, fmt.Errorf("%w", ParseErr) + } + + var f func(*html.Node, *domain.CustomNode) *domain.CustomNode + f = func(n *html.Node, cNode *domain.CustomNode) *domain.CustomNode { + if n.Type == html.ElementNode { + cNode.SetType(n.Data) + + for _, attr := range n.Attr { + cNode.AddAttr(attr.Key, attr.Val) + } + } + + if n.Type == html.TextNode && len(strings.TrimSpace(n.Data)) > 0 { + cNode.ParentNode.AddAttr("h.Text", strings.TrimSpace(n.Data)) + } + + var i uint + for c := n.FirstChild; c != nil; c = c.NextSibling { + cNode.Nodes = append(cNode.Nodes, &domain.CustomNode{ParentNode: cNode, Level: cNode.Level + 1}) + cNode.Nodes[i] = f(c, cNode.Nodes[i]) + i++ + } + return cNode + } + output := &domain.CustomNode{} + out := f(body, output) + + return out, nil +} + +func New() Parser { + return Parser{} +} diff --git a/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go b/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go new file mode 100644 index 00000000..5d2de8df --- /dev/null +++ b/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go @@ -0,0 +1,33 @@ +package parser + +import ( + "errors" + "testing" +) + +func FuzzFromBytes(f *testing.F) { + serviceParser := New() + f.Add([]byte("Hello World")) + f.Add([]byte("TestSample")) + f.Add([]byte("
Some random text
")) + f.Add([]byte("Invalid HTML")) + f.Add([]byte("

")) + f.Add([]byte(" 10000 { // (10KB) + t.Skip() + } + _, err := serviceParser.FromBytes(data) + if err != nil { + return + } + if err != nil && !isExpectedError(err) { + t.Errorf("Unexpected error: %v", err) + } + }) +} + +func isExpectedError(err error) bool { + return err != nil && errors.Is(err, ParseErr) +} diff --git a/tools/html-to-htmgo/internal/domain/formatter.go b/tools/html-to-htmgo/internal/domain/formatter.go new file mode 100644 index 00000000..35c47092 --- /dev/null +++ b/tools/html-to-htmgo/internal/domain/formatter.go @@ -0,0 +1,5 @@ +package domain + +type Formatter interface { + Format(node *CustomNode) (string, error) +} diff --git a/tools/html-to-htmgo/internal/domain/node.go b/tools/html-to-htmgo/internal/domain/node.go new file mode 100644 index 00000000..d0fdfa46 --- /dev/null +++ b/tools/html-to-htmgo/internal/domain/node.go @@ -0,0 +1,127 @@ +package domain + +import ( + "fmt" + "slices" + "strings" + + "golang.org/x/text/cases" + "golang.org/x/text/language" +) + +type CustomNode struct { + ParentNode *CustomNode + Level uint + customType bool + Type string + Attrs []Attr + Nodes []*CustomNode +} + +func (n *CustomNode) SetType(in string) { + switch in { + case "head": + n.Type = "h.Head" + case "thead": + n.Type = "h.THead" + case "tbody": + n.Type = "h.TBody" + case "id": + n.Type = "h.Id" + case "path": + n.Type = "path" + n.customType = true + case "circle": + n.Type = "circle" + n.customType = true + case "rect": + n.Type = "rect" + n.customType = true + case "line": + n.Type = "line" + n.customType = true + case "polyline": + n.Type = "line" + n.customType = true + case "svg": + n.Type = "h.Svg" + default: + n.Type = fmt.Sprintf("h.%s", cases.Title(language.English).String(in)) + } +} + +func (n *CustomNode) AddAttr(key, value string) { + if slices.Contains([]string{"xmlns", "fill", "viewBox", "stroke", "stroke-width", "fill-rule", "d", "stroke-linecap", "stroke-linejoin", "cx", "cy", "r", "x", "y", "rx", "ry", "x1", "x2", "y1", "y2", "points"}, key) { + n.Attrs = append(n.Attrs, Attr{ + custom: true, + key: key, + value: value, + }) + return + } + + switch { + case key == "id": + n.Attrs = append(n.Attrs, Attr{key: "h.Id", value: value}) + case key == "tabindex": + n.Attrs = append(n.Attrs, Attr{key: "h.TabIndex", value: value}) + case key == "h.Text": + n.Attrs = append(n.Attrs, Attr{key: key, value: value}) + case strings.ContainsRune(key, '-'): + n.Attrs = append(n.Attrs, Attr{ + custom: true, + key: key, + value: value, + }) + fmt.Printf("key: %s, value: %s\n", key, value) + default: + n.Attrs = append(n.Attrs, Attr{key: "h." + cases.Title(language.English).String(key), value: value}) + } +} + +func (n *CustomNode) String() string { + str := "" + + if n.customType { + str += "h.Tag(\"" + n.Type + "\"," + } else { + str += n.Type + "(" + } + + if len(n.Attrs) > 0 { + for _, v := range n.Attrs { + switch { + case v.custom: + str = fmt.Sprintf("%sh.Attribute(\"%s\",\"%s\"),", str, v.key, v.value) + case v.hyphenated: + str = fmt.Sprintf("%s%s(\"%s\", \"%s\"),", str, v.key, v.arg, v.value) + case len(v.value) > 0: + if strings.Contains(v.value, "\n") { + str = fmt.Sprintf("%s%s(`%s`),", str, v.key, v.value) + } else { + str = fmt.Sprintf("%s%s(\"%s\"),", str, v.key, v.value) + } + case v.value == "": + str = fmt.Sprintf("%s%s(\"\"),", str, v.key) + default: + str = fmt.Sprintf("%s%s(),", str, v.key) + } + } + } + + if len(n.Nodes) > 0 { + for _, v := range n.Nodes { + if v.Type != "" { + str = fmt.Sprintf("%s\n%s%s,", str, strings.Repeat(" ", int(n.Level)), v) + } + } + } + + str = fmt.Sprintf("%s\n%s)", str, strings.Repeat(" ", int(n.Level))) + return str +} + +type Attr struct { + custom, hyphenated bool + key, value, arg string +} diff --git a/tools/html-to-htmgo/internal/domain/parser.go b/tools/html-to-htmgo/internal/domain/parser.go new file mode 100644 index 00000000..e7c15978 --- /dev/null +++ b/tools/html-to-htmgo/internal/domain/parser.go @@ -0,0 +1,5 @@ +package domain + +type HTMLParser interface { + FromBytes(bytes []byte) (*CustomNode, error) +} diff --git a/tools/html-to-htmgo/main.go b/tools/html-to-htmgo/main.go new file mode 100644 index 00000000..cd0fd251 --- /dev/null +++ b/tools/html-to-htmgo/main.go @@ -0,0 +1,22 @@ +// Forked from https://github.com/PiotrKowalski/html-to-gomponents + +package main + +import ( + serviceformatter "html-to-htmgo/internal/adapters/services/formatter" + serviceparser "html-to-htmgo/internal/adapters/services/parser" +) + +func Parse(input []byte) []byte { + parser := serviceparser.New() + formatter := serviceformatter.New() + parsed, err := parser.FromBytes( + input, + ) + + if err != nil { + return nil + } + + return []byte(formatter.Format(parsed)) +} From 980afbc5ac5b0b5443e6382c17826b8e6431bcb1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 10:28:34 -0500 Subject: [PATCH 058/145] fix imports --- tools/html-to-htmgo/go.mod | 2 +- .../internal/adapters/services/formatter/formatter.go | 2 +- .../html-to-htmgo/internal/adapters/services/parser/parser.go | 2 +- tools/html-to-htmgo/main.go | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tools/html-to-htmgo/go.mod b/tools/html-to-htmgo/go.mod index 5025aea8..6320b14f 100644 --- a/tools/html-to-htmgo/go.mod +++ b/tools/html-to-htmgo/go.mod @@ -1,4 +1,4 @@ -module html-to-htmgo +module github.com/maddalax/htmgo/tools/html-to-htmgo go 1.23.0 diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go index f6cc02ab..295a0afa 100644 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go @@ -1,8 +1,8 @@ package formatter import ( + "github.com/maddalax/htmgo/tools/html-to-htmgo/internal/domain" "go/format" - "html-to-htmgo/internal/domain" ) type Formatter struct { diff --git a/tools/html-to-htmgo/internal/adapters/services/parser/parser.go b/tools/html-to-htmgo/internal/adapters/services/parser/parser.go index 3583d46b..0fe45e3a 100644 --- a/tools/html-to-htmgo/internal/adapters/services/parser/parser.go +++ b/tools/html-to-htmgo/internal/adapters/services/parser/parser.go @@ -4,8 +4,8 @@ import ( "bytes" "errors" "fmt" + "github.com/maddalax/htmgo/tools/html-to-htmgo/internal/domain" "golang.org/x/net/html" - "html-to-htmgo/internal/domain" "strings" ) diff --git a/tools/html-to-htmgo/main.go b/tools/html-to-htmgo/main.go index cd0fd251..8e51ab73 100644 --- a/tools/html-to-htmgo/main.go +++ b/tools/html-to-htmgo/main.go @@ -3,8 +3,8 @@ package main import ( - serviceformatter "html-to-htmgo/internal/adapters/services/formatter" - serviceparser "html-to-htmgo/internal/adapters/services/parser" + serviceformatter "github.com/maddalax/htmgo/tools/html-to-htmgo/internal/adapters/services/formatter" + serviceparser "github.com/maddalax/htmgo/tools/html-to-htmgo/internal/adapters/services/parser" ) func Parse(input []byte) []byte { From 8b9e536f14904d49874423fbce380397aaec53cc Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 11:19:32 -0500 Subject: [PATCH 059/145] add converter to site --- framework/h/tag.go | 8 +++ htmgo-site/go.mod | 7 ++- htmgo-site/go.sum | 11 ++++ htmgo-site/pages/html-to-go.go | 26 ++++++++++ htmgo-site/partials/html-to-go.go | 56 +++++++++++++++++++++ tools/html-to-htmgo/{ => htmltogo}/main.go | 2 +- tools/html-to-htmgo/internal/domain/node.go | 42 +++++++++++++++- 7 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 htmgo-site/pages/html-to-go.go create mode 100644 htmgo-site/partials/html-to-go.go rename tools/html-to-htmgo/{ => htmltogo}/main.go (96%) diff --git a/framework/h/tag.go b/framework/h/tag.go index 23fd3b4c..611fc554 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -182,6 +182,10 @@ func Input(inputType string, children ...Ren) *Element { } } +func TextArea(children ...Ren) *Element { + return Tag("textarea", children...) +} + func TextInput(children ...Ren) *Element { return Input("text", children...) } @@ -462,6 +466,10 @@ func THead(children ...Ren) *Element { return Tag("thead", children...) } +func I(children ...Ren) *Element { + return Tag("i", children...) +} + func TFoot(children ...Ren) *Element { return Tag("tfoot", children...) } diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 35bad926..a71ecf1d 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -10,7 +10,10 @@ require ( ) require ( - github.com/alecthomas/chroma/v2 v2.2.0 // indirect - github.com/dlclark/regexp2 v1.7.0 // indirect + github.com/alecthomas/chroma/v2 v2.14.0 // indirect + github.com/dlclark/regexp2 v1.11.0 // indirect github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/text v0.19.0 // indirect ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 61c08ee5..904edc31 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -1,19 +1,26 @@ github.com/alecthomas/chroma/v2 v2.2.0 h1:Aten8jfQwUqEdadVFFjNyjx7HTexhKP0XuqBG67mRDY= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= +github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= +github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae h1:zzGwJfFlFGD94CyyYwCJeSuD32Gj9GTaSi5y9hoVzdY= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b h1:326OAhrxyoDbq51MBB0DmN0JYPcCFcg0nAkeHuS1uws= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -27,6 +34,10 @@ github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+ github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go new file mode 100644 index 00000000..0a9231af --- /dev/null +++ b/htmgo-site/pages/html-to-go.go @@ -0,0 +1,26 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" + "htmgo-site/partials" +) + +func HtmlToGoPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + base.RootPage(ctx, + h.Div( + h.Class("flex flex-col h-full items-center justify-center w-full pt-6"), + h.H3( + h.Text("Convert raw html to htmgo code"), + h.Class("text-2xl font-bold"), + ), + h.Div( + h.Class("h-full w-full flex gap-4 p-8"), + partials.HtmlInput(), + partials.GoOutput(""), + ), + ), + ), + ) +} diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go new file mode 100644 index 00000000..0d6a8447 --- /dev/null +++ b/htmgo-site/partials/html-to-go.go @@ -0,0 +1,56 @@ +package partials + +import ( + "bytes" + "github.com/alecthomas/chroma/v2" + "github.com/alecthomas/chroma/v2/formatters/html" + "github.com/alecthomas/chroma/v2/lexers" + "github.com/alecthomas/chroma/v2/styles" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/tools/html-to-htmgo/htmltogo" +) + +func ConvertHtmlToGo(ctx *h.RequestContext) *h.Partial { + value := ctx.FormValue("html-input") + parsed := htmltogo.Parse([]byte(value)) + + var buf bytes.Buffer + + lexer := lexers.Get("go") + style := styles.Get("github") + formatter := html.New(html.WithCustomCSS(map[chroma.TokenType]string{ + chroma.PreWrapper: "padding: 12px; height: 100%; overflow: auto;", + })) + iterator, err := lexer.Tokenise(nil, string(parsed)) + err = formatter.Format(&buf, style, iterator) + + if err != nil { + return h.SwapPartial(ctx, GoOutput(string(parsed))) + } + + return h.SwapPartial(ctx, GoOutput(buf.String())) +} + +func HtmlInput() *h.Element { + return h.Div( + h.Class("h-[90%] w-1/2 min-w-1/2"), + h.TextArea( + h.Name("html-input"), + h.PostPartial(ConvertHtmlToGo, "keyup delay:300ms"), + h.Class("h-[90%] w-full p-4 rounded border border-slate-200"), + h.Placeholder("Paste your HTML here"), + h.Rows(10), + ), + ) +} + +func GoOutput(content string) *h.Element { + return h.Div( + h.Class("h-[90%] w-1/2 min-w-1/2"), + h.Id("go-output"), + h.Div( + h.Class("h-[90%] w-full rounded border border-slate-200"), + h.UnsafeRaw(content), + ), + ) +} diff --git a/tools/html-to-htmgo/main.go b/tools/html-to-htmgo/htmltogo/main.go similarity index 96% rename from tools/html-to-htmgo/main.go rename to tools/html-to-htmgo/htmltogo/main.go index 8e51ab73..ce382c16 100644 --- a/tools/html-to-htmgo/main.go +++ b/tools/html-to-htmgo/htmltogo/main.go @@ -1,6 +1,6 @@ // Forked from https://github.com/PiotrKowalski/html-to-gomponents -package main +package htmltogo import ( serviceformatter "github.com/maddalax/htmgo/tools/html-to-htmgo/internal/adapters/services/formatter" diff --git a/tools/html-to-htmgo/internal/domain/node.go b/tools/html-to-htmgo/internal/domain/node.go index d0fdfa46..29464a00 100644 --- a/tools/html-to-htmgo/internal/domain/node.go +++ b/tools/html-to-htmgo/internal/domain/node.go @@ -20,6 +20,8 @@ type CustomNode struct { func (n *CustomNode) SetType(in string) { switch in { + case "textarea": + n.Type = "h.TextArea" case "head": n.Type = "h.Head" case "thead": @@ -61,6 +63,8 @@ func (n *CustomNode) AddAttr(key, value string) { } switch { + case key == "autocomplete": + n.Attrs = append(n.Attrs, Attr{key: "h.AutoComplete", value: value}) case key == "id": n.Attrs = append(n.Attrs, Attr{key: "h.Id", value: value}) case key == "tabindex": @@ -88,6 +92,42 @@ func (n *CustomNode) String() string { str += n.Type + "(" } + if str == "h.Input(" { + if len(n.Attrs) > 0 { + for i, attr := range n.Attrs { + if attr.key == "h.Type" { + str = str + fmt.Sprintf(`"%s"`, attr.value) + "," + n.Attrs = append(n.Attrs[:i], n.Attrs[i+1:]...) + } + } + } + } + + booleanAttributes := []string{ + "h.AllowFullscreen", + "h.Async", + "h.Autofocus", + "h.Autoplay", + "h.Checked", + "h.Controls", + "h.Default", + "h.Defer", + "h.Disabled", + "h.FormNoValidate", + "h.Hidden", + "h.IsMap", + "h.Loop", + "h.Multiple", + "h.Muted", + "h.NoModule", + "h.NoValidate", + "h.Open", + "h.ReadOnly", + "h.Required", + "h.Reversed", + "h.Selected", + } + if len(n.Attrs) > 0 { for _, v := range n.Attrs { switch { @@ -101,7 +141,7 @@ func (n *CustomNode) String() string { } else { str = fmt.Sprintf("%s%s(\"%s\"),", str, v.key, v.value) } - case v.value == "": + case v.value == "" && !slices.Contains(booleanAttributes, v.key): str = fmt.Sprintf("%s%s(\"\"),", str, v.key) default: str = fmt.Sprintf("%s%s(),", str, v.key) From 8ed4121f38c48195435aae4afd8b17f5c398e9ab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 11 Oct 2024 16:20:24 +0000 Subject: [PATCH 060/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 2 ++ templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 16 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 7cbdebc7..b9cd36d9 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 + github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index fca70de4..08c6b7c6 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index e3c94d01..a2cde1ad 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 +require github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 1a34abfc..827e6bcb 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 2963a68f..d1182fc7 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 + github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 721d503a..c82089b3 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 581b53df..4bbb672f 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 +require github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 1a34abfc..827e6bcb 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index a71ecf1d..a53e15a1 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,7 +4,7 @@ go 1.23.0 require ( github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 + github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 904edc31..84cde1db 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,6 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b h1:326OAhrxyoDbq51MBB0DmN0JYPcCFcg0nAkeHuS1uws= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index b07e53c4..647b7230 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 +require github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 1a34abfc..827e6bcb 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 77ff5dbbd0a20d79801a4b4d1eefe153ea62ca42 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 11:21:53 -0500 Subject: [PATCH 061/145] update version, add to nav --- htmgo-site/go.mod | 6 +++--- htmgo-site/go.sum | 14 +++++++------- htmgo-site/partials/navbar.go | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index a71ecf1d..45cf1189 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -3,17 +3,17 @@ module htmgo-site go 1.23.0 require ( + github.com/alecthomas/chroma/v2 v2.14.0 + github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) require ( - github.com/alecthomas/chroma/v2 v2.14.0 // indirect github.com/dlclark/regexp2 v1.11.0 // indirect - github.com/go-chi/chi/v5 v5.1.0 // indirect - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/text v0.19.0 // indirect ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 904edc31..4ae460d6 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -1,15 +1,15 @@ -github.com/alecthomas/chroma/v2 v2.2.0 h1:Aten8jfQwUqEdadVFFjNyjx7HTexhKP0XuqBG67mRDY= +github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= +github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= github.com/alecthomas/chroma/v2 v2.2.0/go.mod h1:vf4zrexSH54oEjJ7EdB65tGNHmH3pGZmVkgTP5RHvAs= github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= -github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae h1:zzGwJfFlFGD94CyyYwCJeSuD32Gj9GTaSi5y9hoVzdY= github.com/alecthomas/repr v0.0.0-20220113201626-b1b626ac65ae/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= -github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= @@ -17,10 +17,12 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b h1:326OAhrxyoDbq51MBB0DmN0JYPcCFcg0nAkeHuS1uws= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011152834-980afbc5ac5b/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -32,8 +34,6 @@ github.com/yuin/goldmark v1.7.4 h1:BDXOHExt+A7gwPCJgPIIq7ENvceR7we7rOS9TNoLZeg= github.com/yuin/goldmark v1.7.4/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc h1:+IAOyRda+RLrxa1WC7umKOZRsGq4QrFFMYApOeHzQwQ= github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc/go.mod h1:ovIvrum6DQJA4QsJSovrkC4saKHQVs7TvcaeO8AIl5I= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index c384b88e..5dce0379 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -15,6 +15,7 @@ type NavItem struct { var navItems = []NavItem{ {Name: "Docs", Url: "/docs"}, {Name: "Examples", Url: "/examples"}, + {Name: "Convert HTML", Url: "/html-to-go"}, } func ToggleNavbar(ctx *h.RequestContext) *h.Partial { From 2476b9a10683b84e7673d85526724d2f759f7e85 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 11:24:54 -0500 Subject: [PATCH 062/145] update version, add to nav --- htmgo-site/go.sum | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 4ae460d6..79ae88a0 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516 h1:7nky9p/TVkRZOgu0xQ/t+Z23ZeRLGjZc9PpH9xJgEjo= -github.com/maddalax/htmgo/framework v0.0.0-20241011141133-d0c272e1e516/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= +github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= From 80d3538d87b12d14b738d9aa1589728bb3bc6194 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 11:32:32 -0500 Subject: [PATCH 063/145] update docs --- .../1_converting_raw_html_to_go.md | 239 +----------------- 1 file changed, 1 insertion(+), 238 deletions(-) diff --git a/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md b/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md index e31d6197..6ac69879 100644 --- a/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md +++ b/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md @@ -1,241 +1,4 @@ ### Converting Raw HTML to Go In some cases, you may want to convert raw HTML to Go code. -A tool to do this automatically is in progress, but in the meantime, I've had success using an LLM such as ChatGPT -to convert HTML to Go code. - -Steps: -1. Open an LLM such as ChatGPT -2. Use this prompt: -```text -Using htmgo go html builder, please convert and html below that I send to htmgo code. - -The builder looks like this: - -package pages - -import ( - "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/hx" - "github.com/maddalax/htmgo/framework/js" -) - -func IndexPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - RootPage( - h.Div( - h.JoinExtensions( - h.TriggerChildren(), - h.HxExtension("ws"), - ), - h.Attribute("ws-connect", "/chat"), - h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - Form(ctx), - h.Div( - h.Div( - h.Id("messages"), - h.Class("flex flex-col gap-2 w-full"), - ), - ), - ), - ), - ) -} - -func MessageInput() *h.Element { - return h.Input("text", - h.Id("message-input"), - h.Required(), - h.Class("p-4 rounded-md border border-slate-200"), - h.Name("message"), - h.Placeholder("Message"), - h.HxBeforeWsSend( - js.SetValue(""), - ), - h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), - ) -} - -func Form(ctx *h.RequestContext) *h.Element { - return h.Div( - h.Class("flex flex-col items-center justify-center p-4 gap-6"), - h.H2F("Form submission with ws example", h.Class("text-2xl font-bold")), - h.P(h.Text("example test")), - h.Form( - h.Attribute("ws-send", ""), - h.Class("flex flex-col gap-2"), - h.LabelFor("name", "Your Message"), - MessageInput(), - SubmitButton(), - ), - ) -} - -Imagine it has every attribute and every html tag at your disposal. Make things as reusable as possible by separating elements into reusable components. -``` - -3. Paste the HTML you want to convert to Go code - -4. Here is the result from pasting in example HTML from tailwind components: -```html -

-``` - -```go -package pages - -import ( - "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/hx" -) - -func WorkWithUsSection(ctx *h.RequestContext) *h.Element { - return h.Div( - h.Class("relative isolate overflow-hidden bg-gray-900 py-24 sm:py-32"), - BackgroundImage(), - HiddenBlurredElement(), - TopBlurredElement(), - ContentContainer(ctx), - ) -} - -func BackgroundImage() *h.Element { - return h.Img( - h.Src("https://images.unsplash.com/photo-1521737604893-d14cc237f11d?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&auto=format&fit=crop&crop=focalpoint&fp-y=.8&w=2830&h=1500&q=80&blend=111827&sat=-100&exp=15&blend-mode=multiply"), - h.Alt(""), - h.Class("absolute inset-0 -z-10 h-full w-full object-cover object-right md:object-center"), - ) -} - -func HiddenBlurredElement() *h.Element { - return h.Div( - h.Class("hidden sm:absolute sm:-top-10 sm:right-1/2 sm:-z-10 sm:mr-10 sm:block sm:transform-gpu sm:blur-3xl"), - h.AriaHidden(true), - BlurredGradient(), - ) -} - -func TopBlurredElement() *h.Element { - return h.Div( - h.Class("absolute -top-52 left-1/2 -z-10 -translate-x-1/2 transform-gpu blur-3xl sm:top-[-28rem] sm:ml-16 sm:translate-x-0 sm:transform-gpu"), - h.AriaHidden(true), - BlurredGradient(), - ) -} - -func BlurredGradient() *h.Element { - return h.Div( - h.Class("aspect-[1097/845] w-[68.5625rem] bg-gradient-to-tr from-[#ff4694] to-[#776fff] opacity-20"), - h.Style("clip-path: polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"), - ) -} - -func ContentContainer(ctx *h.RequestContext) *h.Element { - return h.Div( - h.Class("mx-auto max-w-7xl px-6 lg:px-8"), - ContentHeader(), - LinksAndStatsSection(), - ) -} - -func ContentHeader() *h.Element { - return h.Div( - h.Class("mx-auto max-w-2xl lg:mx-0"), - h.H2F("Work with us", h.Class("text-4xl font-bold tracking-tight text-white sm:text-6xl")), - h.P( - h.Class("mt-6 text-lg leading-8 text-gray-300"), - h.Text("Anim aute id magna aliqua ad ad non deserunt sunt. Qui irure qui lorem cupidatat commodo. Elit sunt amet fugiat veniam occaecat fugiat aliqua."), - ), - ) -} - -func LinksAndStatsSection() *h.Element { - return h.Div( - h.Class("mx-auto mt-10 max-w-2xl lg:mx-0 lg:max-w-none"), - LinksGrid(), - StatsGrid(), - ) -} - -func LinksGrid() *h.Element { - return h.Div( - h.Class("grid grid-cols-1 gap-x-8 gap-y-6 text-base font-semibold leading-7 text-white sm:grid-cols-2 md:flex lg:gap-x-10"), - Link("Open roles"), - Link("Internship program"), - Link("Our values"), - Link("Meet our leadership"), - ) -} - -func Link(text string) *h.Element { - return h.A( - h.Href("#"), - h.Text(text), - h.Span(h.Text(" →"), h.AriaHidden(true)), - ) -} - -func StatsGrid() *h.Element { - return h.Dl( - h.Class("mt-16 grid grid-cols-1 gap-8 sm:mt-20 sm:grid-cols-2 lg:grid-cols-4"), - Stat("Offices worldwide", "12"), - Stat("Full-time colleagues", "300+"), - Stat("Hours per week", "40"), - Stat("Paid time off", "Unlimited"), - ) -} - -func Stat(label, value string) *h.Element { - return h.Div( - h.Class("flex flex-col-reverse"), - h.Dt( - h.Class("text-base leading-7 text-gray-300"), - h.Text(label), - ), - h.Dd( - h.Class("text-2xl font-bold leading-9 tracking-tight text-white"), - h.Text(value), - ), - ) -} -``` +A tool to do this automatically is available here: https://htmgo.dev/html-to-go From 72e3383e758462b99da76777b05d9208cf6ab158 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 11:39:47 -0500 Subject: [PATCH 064/145] fix script tag --- tools/html-to-htmgo/internal/domain/node.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/html-to-htmgo/internal/domain/node.go b/tools/html-to-htmgo/internal/domain/node.go index 29464a00..a90e52e0 100644 --- a/tools/html-to-htmgo/internal/domain/node.go +++ b/tools/html-to-htmgo/internal/domain/node.go @@ -103,6 +103,17 @@ func (n *CustomNode) String() string { } } + if str == "h.Script(" { + if len(n.Attrs) > 0 { + for _, attr := range n.Attrs { + if attr.key == "h.Src" { + str = str + fmt.Sprintf(`"%s"`, attr.value) + "," + n.Attrs = make([]Attr, 0) + } + } + } + } + booleanAttributes := []string{ "h.AllowFullscreen", "h.Async", From a414a5b3a90fd1c9b2bc11f35f3206afa87e682d Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 23:33:23 -0500 Subject: [PATCH 065/145] Create CODE_OF_CONDUCT.md --- CODE_OF_CONDUCT.md | 128 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..7edfd103 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +maddox@htmgo.dev. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. From 56e76f88d87e1cfc09923a09bb487815801f4b4c Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 11 Oct 2024 23:43:27 -0500 Subject: [PATCH 066/145] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..6cffaafb --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: [maddalax] From 186bb7d14cc1cec8cfb7d892a6f949f8c53a8968 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 13 Oct 2024 06:35:27 -0500 Subject: [PATCH 067/145] add tailwind intellisense notes --- .../assets/public/tailwind-intellisense.png | Bin 0 -> 128333 bytes .../1_tailwind_intellisense.md | 53 ++++++++++++++++++ ...o_go.md => 2_converting_raw_html_to_go.md} | 0 htmgo-site/partials/html-to-go.go | 23 ++------ htmgo-site/ui/snippet.go | 34 +++++++++++ tailwind-lsp-config.json | 12 ++-- 6 files changed, 98 insertions(+), 24 deletions(-) create mode 100644 htmgo-site/assets/public/tailwind-intellisense.png create mode 100644 htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md rename htmgo-site/md/docs/8_miscellaneous/{1_converting_raw_html_to_go.md => 2_converting_raw_html_to_go.md} (100%) create mode 100644 htmgo-site/ui/snippet.go diff --git a/htmgo-site/assets/public/tailwind-intellisense.png b/htmgo-site/assets/public/tailwind-intellisense.png new file mode 100644 index 0000000000000000000000000000000000000000..962c0b462295cf8a6da7a2308148e1adaad467a0 GIT binary patch literal 128333 zcmeFXby!qwyEjaSfRuoUgaRT`64K02f^>J?fRxnGIe^kqN=SEicMM30baxBGF!azh z@Ay3X-FqMV-rmRe_jkN2X05r_73(_Vcb&1qRh4Cl9z1z~hK5EY_fA?J4GkNFhK3%7 zhl48FLH{v;hDNAtBPFFOCnd$8>g;G~V`qVe_AWd@2Uk~PfHK2C{TUXXw7C3^63JIG zad|wB(`bfQ&+tj)Bk?7Aqd6%MGYfR$ZcAPY?@3x6k|m+D7; z+RhFLZ4h*GadQ1aJbwQTZvG7L25CD^_W2hE+867v$zW#*x}H$#t#} zEro<8LNi)wSCWk<%p;oXl+4OH>uiDi$JK^mnP}qLP=rM?n)Rtfh8Dw*AYs?X9H3ad zUb3(|hVy~J)Mr7Sq&@s&I3sd8yS0;$iGkZx%j>WgnVCYLw5kayoda|^hqp$rfRo1% z1>*`c&xf|U)3xuPRsT#fUCH=0gr{NV7Pcxs!I;Z1gM-%F`(46^+0v3#l1%fwC`x=J zSO`-wjAg)O(^JZ~>e!_pN6%7o2%Wx6;A|6@lRyz0&t?LfWSEE}X=;R+ zQ%OZc4~Ge<6M1_)5Eg-emuEmWXEMQ8U_}vy9-4{%rv$YdaSR2LPgNO|BZG7?H{N+E z8_s=E`d~^a;5;W&5T?~;R3ufEQgAa+SL@vK+wY3#8~J;k1eDk+EbrB5Oj+@_niFI z9I9dk0tJnYNd!b280a~b69C5S!!gl1SK&IA2&r7H`?VVh!L?6lofr>vC%Xv05cTZ0 zN3|a*Pm^O^isSHn#1kas?q-a|@nJf8g8QKBkR&|7_k9}juS&c};`fs;wFkmw1*fOc z-xHp(YB_gmgdxNq{|LVLEWtbwh8wT%*7t>=v@6huV4&uxoD zOIHP2zXZZepty~nQYxB&2Sn4^JR?0s0hk9E(Dk(rkfqKK=g?bi%iuTiH;$yfXF(x* zFO?s~^Mq{3R#S_qcPn?hNxw~oS0Zvx-hi1_m%e6I3b-vn(<@>_rKpIf93uWX3R*1L?b%LD)-Z9_za> zj8O@CPa*&Vo}{ET9_F~LB8fr|os-O57%^E`5M%W_p4gE0&&i}e4oQ7u$p4|AM>Zca z^&Iz0?hl(^&nG@ENzgqP`;qy>=aJO38toKby<~r`U3_3j_VJD;A9;E>Wsbslf;F~& z)PV%e*yIlLDb7MTK=y_^px9J#=#fk3++(VU@9I^AiXj}G@>R}dPfGh!)?GS6+|1hN zMAE`|L6iq*Iv~7^0D`0BOAKFZhiMmrO3tP~)P^Ae)j`#PPSNA}Qd8A4>#+Cm z_}#r}n_1Z8^o-lM(o}l6LB5Y+V_Z0Qd6K9lrwavw0r3KH_c)h3jXQ^XuzxD1S$I2Y zMOO?c_SHCi1<+38eR!sK{qb7p+V+&@?2u*+#~p_or$2TWptagDGE7l2Rhr zciH`_^K@%CYS{&JGa7x(E$kEC*AJD9mn`a!rdSzS8(D!zLo7FKc_#}Nwp%#HzuBjn zx6Yq`ru_i@kZ7S};W1BF?@>#&=-6=hSoSfLTbZZAdx-FN@{<B@We*l>6})s+zHG1WnIrBa7|>TxIJpgZ;0w;QIlklk zi1vsd77>H?Iw7_}aGqK1Srvx^2cAanMmi6I3%(1bgT^`GJ?rxa=h(!bLLvQ))UckG3~=`S1XHcB4AyB4Pf=g^*ZJH1Y8QHze>Kr zzjMD9+njT*5%Lk_x=p{exRZBQR$wdot16#4Ajj@6p(nmU;#n8tkH|8B89OlmD{-P020^Yz=; z*dKi_NqQsnsoa1I!rqpr)sM{-T@|&4CgD$I-U+oZ|1CJ85AfLE!7#K(D`g)8T#IF*e{Mep_a{xL4ei6gieTyy_)Zk59Z+p!X-gRWhoUsV=*m;iEr{1-cXH%_7kfr)qu zey`kKad6!=NmgwX9=`C^IbQDk8JVzOx}X2X=`%Oi8KNwNc>TZS?mnGy= z7p~i|{_;tK!;EC#?d$oZ+I{Hv5u;1)oqk@Z5LCtZsAJ4|9I-K;IR|`W?A$svw!Pr~ z%W5_=rmnSKz|bACD?3feAjEn3ltFr9aAWJ? zuNAK=g)T1o1I`xNCLL!Jgx?irH|{iK;l8DEvK(>Q9S~|Cvq85EX7{|k4Zj`eugF)i zQ5nok7A@U(KX8EI?>3(-#;>+yC}jHYaNHZgFO<0KjGx|jAI3Cv41kTeEVyv*4UgrK z(-jcI`w#mu2mVLGhi9Pz%#LTPGi~M&5hMV1S4&(Ahy`f-*4$0q3hg1X(1ojdIcwef}PZA&<9MG%$ zanZC@Gcz8D^AQDj5(g-!395&VItN0PEuMX^?YiL3oIp%;L0C(8VLE;>4jO7tXA509OC=?=SEzeDG%WNdXxOMbbkqqzr}@u&8T6NEnExurKtl_) zLBslwI?AZ)@9hif{N3i?SIpQDG+fj_GSumrh4FuDV}r6V|L;9|80s0Cgoc!y9O|lJ z?rdS<;9~9QIx?1OiYmYdz0-3+L!)H=eWJ^$GaaG&pS97{b=6f;6gGFX=QMrqXlB9b zX^(Q1P@AZyFzVLc!qt?))85X(Mc7m9`M+uiqwaqfb3JGHR~1)VvFEx-Q5bZqC8MsT5|u7rvL5H|7@z|V&N?1Xpb7x74TpD`j2t{`@{ceD9ZJF>i>-t|EBZ5 zN>PLcJP_sjPo@DLBvTMap!oRIMp{J^bwx?pzqTIK?@QGA`-(b?{6fjzNui;Mqsd82 zXnLaWrQ`Y<_BNlJ=nXg6=?%aA*2>|r`H8I$JJndS85S>&$GpYZOofM^_eFsLU9#z! z??)zajAvI44{T1ijXU`d+NqiqYAj0i_ftJ&4l{(TM)eXB$`Z~Z{a0)b>yXL3tv7qt z%7&{Q&GlHg7z}8CK1f`!HW=3WmflE&ilbru@en5u2#5&(hknp7xaH9>93qV$yAu4l z8#FA2HM55SXn21-#3RW90%&rnaF#L9Nzndy;58*-{^PWAQ6u&31WPpjaZ0~ui@~}5 z5ATA8*Ygq`uZi2+bd2L4-h~838lnG3n*Wtq|Bp0(6rBHmlEy(K15+x5Fgq>nseTj4 zRHPsvJMd2`CcgJu*IQ=`-gCqi*B9SOU5A;?F>h2$gO-+W5H>5Z<#jeUUE(5; zNZiBb&))Cdi7cGNM%ykWUivj)vak3dZ&q`AdZd?K<>c_&kG@CLc^+@nE>qO~!*Vc& zhhe4E*?w~Ek4$MrJ$fV-FF0v;}Y{L#{(9@GCuzR*3u-PY4#snqDnN4 zbQ6eYtgIhftlYEF!8KFS)1K+t8X5}zU@!%TNqeb;%Zq2vGWrMyv;DwR)J;AyeJcuxAj4}-ID-F8R{xhXO^ z3-=A8$87x#C0JDA8(y}A;599MbX?*O4I$jgzBw7WjXE9q6jkAO%uTR*)t6Ag=lH8$ z0FXVr`#6|Ez~dU!@|SbP2tZF$9^wn@X3$9YgGSXBS;c758aJ5Xf}31REAMv3b7AYD z{zZt(y~R|AmgLKIJJ3J8s(qk%DPB`+1AYF%a;y3WZz~h|-ol@-M3puLuN#%iZ2?&` zDeR?DBi`@=B|c&_gBmlIyZvFUitVeRB^J8tI<{dNuPd%W>*0dCm0zm9b8E(@(*~BI z8!7-KC#~on@OVMFBqD6y(<1 zQ`s#h3OWaQkdAdq5c!74Sj<6dbZqPp=IDF0G|uO?U<}Sgugeu%R*w2O&ik$nj?+F| zc;2f-;D2be+rof`#p#g-(s^s~D~gI=D_ReP(@(o_>5DcW`Po}B68-~RZDQ#wbuL$* z;k94xNeY)szjF_lM{D02A+Y)W>*KTcz?<>ZI;+`Z)ixo_VdgcQGuVAAS8kde0<8`u z4w=o~&y_Oyq;))YcI3P_bPg}I!K3?BD4f$19#v6oAOPRNO$sA8Q_ACv{jMy$@6H7F z?1CizY$Tec{bq1N!u09nAu=`k=_}`TIoQNkzssJp_z7mcLL@BTqRzF;JyFT!t(j8i zmW%sUn~@XH>)c-0duf=3qn`I}4OoevPJO#~xII47-kV4$=lXgX++Y1>*bUF(0op_%0dsvAY!PKwca{A#H zoppK|q2p&dk+WC9EDAf2Oh2R0Kx2kAoUanXe_V9xh_ZO1Js-|-^xHBMJ6~AP_dZP) zV1-oa_O}+eY7z_IJnAhC&8@!aC7>V6z`PQEdWwNA5JouhN6uy0qb%6ciplF?uhWUl z#7kptA00a|F;Oj>^`6vF-rhxr7lnm|>-4w)Kv$NYeI=)xssuL;tS`0`Y2>$VbA8OU zGPVAWt0Ca#W)-67*!D3r>Fq|a=pPNAus0Ye#HR>nM!#4X?3;W`ML3CgKYH(b-5ar8 z6yEBXq0}9kRQnOiwJ3x1_E2hffo-Qc7T8wa#W(mM?=E1okb9+ei@*K}-9`R|?xb>^ z?XZwyKBql2aPJf6gEGT~f`iWe)HsQY6|drof`S5VVA0-C@~i9dyIFNJ$u?zZtQ-%rs0&>t4bbU53mAH3yF*_cr zF!UAY%&5EIL6hO32XZuFikD4G;5epnR#oqc`g-F`!}Zqsp7nZwYjtA%+PE*0S_*i( zPF$zw`VeZZig%B89oO(&nA5iu3pdzyS{uR`)9ouXK28$^FsF+NfSD)uLMuOz0!erM{f_O zLgf)MyX2t4XnJWKwrBMU@->{^hGK$y<2a&%iVNW~ox`vMY12S1KAHnxMXY^G@g9 zhd^M`05Q`#u^Vy3xx|v``w55eahB5H&!6#GKJ>IA?qwZ0KmLd^=p@z_zwxX>uQ}29 zatmWMd-XH{#%FI?G2(N0c6M3`sW`8X>q$#nK`8;TS`3|-D;YstjMzE(&%r@*aueXY z&aF`2gl}5vIky44T1O`X=+*>*W11Rwm*BmGWP= zm&dNF;0twBR$(%c!~JkYsSb5`ghFf|0}J+Xn5XB+Ph56i18}uxU?}qgi54n|H1rV7(2ih@3g&Wv7oVw?Dzj7;KPxGDzVZ6$|2B^J4HIevu(3yE3oXezMW)X&j<}fixKd>mFG|Yn za4~yH{#StgjwjwpB=rf4#QFvcW#U#WHUP;Y#qo|DmUyk0aFBN7bJd&VI&sa-(AJHx z|0TjFuJBu!)!(ae;nk6$@3q-8A6aGV?e&Nee8EgXMFP-p2L4W94rNqWF@jMBlL2&& zcO=v}Fkn?FR_A(-uc^7FxKyi>j)&o3t16rN_m+yk!+Yp>X;N5KH|I}VlF+5PIG4~~ zbEFZXHwL5UdjAb1+9-5Vbs@4w-Hbs{Ek)lxO?Tk`CBve zP&6#VP;5ztv2A?Uy}9ks0Cc_paW5~-$iF7aP=*LUo3bX(->i6)vrPh`K_@6+7)!yz zA$syoNN67Aqt|pgpolE(qHH1FDRz@sn~$|b&C8h;h)XpEdS(WD-YB9tAFj zFI;Qd$==DyWfO3v$<$hn=K0-SkA)DW?i2#SuSjsQmc;p>nmAZXwf;f|@||}h9tZi{ z<}%~=cevJFpL(xxQzj-RYJuW)cz=6Yl3LU}`u6fA`WHk#0>I8Yi>vo4KZl0!vQcc4 z9IwD60gc{oIohD>$Y|<%exmcgg~lg(sK&1SJ@!-Q@>_7e#LXsJ_YEn_HvlUT0sQlb8+x?eqQX1gx_JQ zgl;I9#l@@AO0^Au-e?=696u!_LB$2sl4B0u9$U(b$J$+Jk5jHJFV6pdcYk3b=`89t z$nSEfXhV?>(59S9aF07+S(6z|UN>?bS8UlW8Jun(W9y0aSOc6*@z%M)&sCrNje2Mp z`-v#Ef82bYXe^e-32~1<7%p%N-RZST?3W%@Z)KWHaFH2nQWJUv&F$T$`ZfkxU6n?8 zuO4R}Lr2E0lSI(giMFrUgB}x$h(@otMX+yAnCWRJ=7qXh4(Xb_y!_5qBJ!O=qMs&L zY6H{SLt5b=9O8q@ev~-%YZ~rxy_gZ%ako~@3=p}2H73flC{v{ZGlp%WaElAxf?7t zCytG+bjpbp7#LlHUq5LVpHjaB8pS%y2OU?wnfcPh@`1@x_!_S_r%|z^^y)Hsc$L->=e7VRgQ~0gu zLiMjNbQfP>^L%E?CbWQb6B&Yx#kE093sfW44W%;?oV-}obb%VkZ2{{8Z+Yd`z}kWaymVu9hyetBIza1^!xP* z+S8TqKdkuu&UdR_@4divVpxV$%DuwTbUu5gyR)NscJLYdES3z<1$#{uLJSA7fRV3z z*H}x*9+3qO?L*WJsQ^Lo*2GlWrNDyo9JR#L$w!}~zfI(<+MP0^yw9f*nE^B$&?9Zd zpLZAj5q(i2DzfK?KyhNg$L35eW#PX<&HqZ)rUFXYKLWX1Oe8apLUU*h-AgAU+yapg%SIk&{oF`v#!;wC4Zff zix|RY`I*8FVq$V-0KgNMi#HyWl$3-EhGY#{!v}_jvaB+$^op(>{coNLdsdmsvb@U< zdC)YlE8*JQ9Oza(F~PIY?o+8ry6vHv@Q~W9!bwh!b$`Bg)S`R#RGUbWZIvI)`Z&4{|cHDZ^6dv-<3>C~6ZxL}MphhLkU& z4i9q0*rIn!_G|4`=s2@`x$I8tc~m>27K;ZaZ0;5^P2gkPQ$N@~) zZiMXaC!cew2}C95Mfv;hJ5R5d3j1Jf-Tlhr$hNAvS!J?Z3Q!!`rp?0Doy|m(U;Iir zIdhN4n3j&#tm=3%&-MFm3H{S?2a{^O>rTImp+_y3-?RCuOmN(k(3U-dzVoJrzo$^WIr}n)mthgO zQyY_Bv9Y-=u22DDJmy|Ao*yjK$22&uQuDx;nt7vWMLthVs7u+bbgp;HqEZq{rsnu$ zpk~KJ6M(Fa%da2Y`n7$?(c7Ez;q39;P}^3m(ixlTxkYz~AK1Dl%+L)yEPA|6F9-_b zw_kWNBT#AN(%&CLpNs8C*`rggU+R|?E;`z_Kg+Ua3>pOe+;glLxNbZj>rfez!nuh$ zR5q{VH}f@JvC+S7OQ#T%2oI zc-1Qtc$;>)=Pg_W z;qEMzw{T^7IfVjKsE{SVD1`7CVlJK&)6GSPyY9xgu&hq^SW1Ro4v;AF8hbv}M6bYO(iw#?KV|h%Rq|GNN%RnCYVG^#97fmVv%#&Z> zK0OdY3C?q$`L+WxGkZRq#Ldjaj-2Q3m+(a0+(Kg=X%31ZZ^=D@zBd<0Qx{XmT{=b2e{2@8kmQ z5PaqfROpFFJLJyD^WBu`uj&)<8OG9xG!uQz?A`ei=}}%cH$9wJ`MC?#BKzCxQ_Ssg z)VxTBe8msbKsx{8g=2kvRf%NG__eZK^DZyslSva5=#$58jfWh3a84J%>qf}UCL5Q2bzM(7`Sl#}Jv zS}zsiz)m-P?gZhxVB@q7r|Rb2cPI=esvOrv$&cTr!ep_dvVPG( z&B-fa*SdH6#$|cNVlC?0A>CGk(YdELkctQM@&VXTT;!n7Y|+|#{CyG7r+UWS zRe@z@lFXN{^85Yk8JL#dWp9_r?wTVJnMgh(m*E6qoBP|~)9(aai}OSe1Y|mul$7#e zlPoZAf(OcDpD9Ya7uGg$El1KyCa(kow+3koe1{}fJKEjo4jHzLs(O2SvxRkw()euB zR_=bvV*6gMo7FGQ3T5OlV=p-@tHVAK49%fpYf?1)cKPQ0L!6oi4D?r^6)(nOb6Lb@ z_s;}dRv?67>f#$=UVbs|t&*6DK$qlN2$2CsOnB8z*G4v8#8+&?obb%S{Jm_L_e#ap zET?c&*Pivhm?VA^GTU9FwAs&Bg%o_tg5)jL>!fwF0Z#j-eb7iQZ5WN$Rx>r`*3!|| z(06~}HsC6KB$Z0A6F0kr(S8bEa>Fb>Oga#L_33aRu=i1+`>0j1(RaD@p+FJ~U--&j z=(Ek*>ME}EglYPgD?$sRYr|w8t_1M`!q1fVr$+W>6Ue5USJ;nEE_LoLaA~zff*T!- zvY|XCm>K=uAxb%Nne_7QQx#?hA_QAr@ZqOF>AotH1Jg?~n% zl~)kt-HW@cQUA$1CmAxOqWkl1TSxiiBYj1AjolCO)OCj{S*+}->V1&2g5^PL6J*Py zpgJ{}lIeUrk3{+hc_Ss(!1FtNzF-TDpO=l%H;~_zac=*s2%t54dE!I##(IiaXC8atS4iT`V#lB@fp`wbR^^{N9B z@zy9o;2D`M#zAKXwd=+3HJ=BKsy1sqK z!7eIC?|&OkST5Ir_eH`{Ss6e|uQ1;36S7j>X5PtUD4cR7Dh=`$bztQj1lBMe@Uamv9BX~T!qKldC?+K*>(Fhy$GwLl!Wzdo4Myt zs!)yDp=j@0>>K6r8l8p`+Fv6vRKE7QonpwzKvo~m5YE=!dRkXc-pc+EM9*ka{Z7(C zSKEfa-b>*b;dbyFq(?34LGO+aGsmvWWeweH3yBKYIGEPgMkT7TAjsJETj^F8=NBFmmqBdDYC z)?25Xzr^S3xs>e7B6@`nCE=8!kP+eM*(18(m1M7e>)n~jCC5_afCzZ`Lat%q*r#LR zc<{n9T)5Gv%Y{aAqr7gh*nn*KYQbwtV*f|E+Tkynl?9qAOdWY?=-@*`%EES$P>Wl! z5Z7E*lg9<4-CODXhhptAnIG9iet3yWg(~M=3&qiK&5o0>?APw+CywN&I^KV>Z1gXc69a0dFIGH8o1qg1M2eQG1)DdagruQKS=c z{k|I|0$e3;nLdBt2jAJS3*$9KG0#YzHw5^+JY>4tlfBXL(Kgnujofyp5cd3;wgAPJQ0t6Q&x^~7%XfE7=3CzXprGsN!wp>SFU&RiVn zlv29Z;u#Xq)icZ6*Svm{+X&l4E)(kASa6SIUTApmgCg-lW!h=#+VuL>e1*>|*{SjG zqf2$$y)kLUc10hRDIKdbVhjw9kFE@Z7;DURH#Xwxo2tE>omkfGBfPcGcXA zhQN9s=yB8Fxt=Ji?tRGlfd)(Mi1fh+=*g6^Tk9tlZ z+PMsVtWbg)?F1DeV9R7j1%XxWhkTtZb^C#SS}-_Qfz~>wKm?UZ~^N*XsVP zY5FN*Gw+mgUTO;)&J^sY-I0b{%%qza*~UaKWQ?MXth&f=wei`7@!g^mFwr5rr z5ZMAIEQE_(oSQiSlFy#7n7?)lY8=Hl;Ar$!YwVSMd3)Xn(I{AVSK5~X@3+De+Vs2t$L0XVqMc^Q4d zrBn2Fz;-t6?A>xX^O~jAMUK;^49vl9wIkJie<8QK)=Fho#OCVRU%tK=Tulw|q7mC9 zQLi?DS(h^O^&%z86?qRZPh6fS1K|?WW!<-ds~l>dah=F~mlZt<97!X7L&Q4Fe^T(m zPgUqlm)(M_*bf$=QP{{i8N#t9Pkr3ZthiJ+ynb|^?x#SD`Qj{VJn?LH`Nv{>rTfT1 zap_F;R!}ytk4A+st^j8R=Dwa+5Pv%y@X5TV7aSQ-`gvd1JFH=36k+dwdltxQrCG2d z)+!O+d8318L!0Wj zO>kcz2-xU9z%0|Lr8T+HI|z?f1tFj^c}B-#M6+*cRy$rh&4!-08wRyrIvA5-`WxTO zy>Y$w5lWp%@;Bz>IqVTgYpeV%0hY>Z_XxiV(99z!o%6(!hq`A=Jn5=E7xxm%O#vaf z(aV6k{_nN;I%*4qZHwY4-?PEgWqjp4ZobZ#EbP@o!OJ zIA|2ri=)KlYqq-@^nT?UCYQZj|FvAn0TuIFU`_`3?_Y|O>g;agDzsm%Q|h;TsAOus zMfo1D>amw}Ozup)Z}u;kO1u2bM?1GZ>qTzxntKWC!zO#{-VgM@rai)^4~xvo#a0h~ zRQN-^ap2SGc<#z_nsDhsub!(Hv^ve{g8^1(dQBJqz0j>CBj+t<)WETiR4gAQh}qDp zT-3|l`W+4^1HJqz^eK34YIwgkK*a9b!pG9s3%~CoAiYjEyU2h+ zV&T&K^udRdGhQ{Av&;8Qa2)kaHN6(Lk>5reOfP21!MnqGaU&^nIA>QeVL{7Bzoy%l z64YwxHU(2aRs}2XaXqZ%#y>ds*t?V#v#Uti*xali6#=E&S}iWD2b8>F9EgLzaN0ES zyJB|TjLMwcG-?9LElUlhwd`{*4lSE{q$@|lNujG9{$kc92UJJI3thj4NRv(10o$3~ zSQnYy-ydELGqMn&tS!hlUu5r1rc0%eM}Az$zd^w3(EWe_>DJvGs2H~2D@RL4wOYX| zN_1gjyX5aoJ9p6vaQ7PweYVyhx`|Vd3Tg5bj2gPpDLu7~jxN&n=Wllzb<(drW}qGL zh~Uy0rj}^NOd!cK{1U*%akjgnb+|pOc&JEilg^rs^ngptg^zHfS-mQS!B#o*zQ3|ykQE_%ZAGH>$^(SZRE~%{gG1!o1YIdSqWgigTwN;lTlAeDtv7_UL>Rc}nt=?puY&Oa<5+6(#A; zX}$VuQ^0Te-JC*q-zc&1CgY>a(1`p>J2erIN-Nf1-JjSz8X@3T7k12;7<#j9cOu(W z$6Mq3Hu!nNqJtW+Y-k4fs_kl9+k@-H+=0GLN1o$`;Go` zI#noV&HHj)HjoDIhfN8JuNk*%m1${q8@Oo$(T0vL%Psj6*i=cp;ui;E;sy*U z#hgaV>0rB&t~@i;)04x-X8FEwR14+18H`3^*mI4%7_yj~H^Eps+u5t40@5g#7JU)G zZslNgC=}YSeQCYIbUU$EBaL}UxTJ7{&=D7|YgXOw+`2lvQ&m@J=5?{2i+pP28ME-Q zRc^nt{zeoeukysr2?*x-70(k@@D)~x z$O|J4+0LVg5LV~{^@Sf4?nvtPrpq&Eo7_ScmR9Bs6c!uGC(KdEA=-~hs20KB7&eP{ zFI><-V6+h7edHQ0@x+&Bfv0Kf^e)?@CV2=i_5MdT2&|^XNW|Q^V)l=+!8jQ8k zr)ffrrsr@xSZePOvw1%(B(=JTcZzff7|MJA{Jn%+-H{&p?MOsNEw;Wx$gpXDN(oFnPhy1L(<4jq2GeCWP= z>F3%mocPU%NrZLj5xM|lIl0(Ty^uQg-45)csIH9XQ6r|uGG7$V+2EL*5-BLZBDEq@ z+*~GUIh}2WE^Bs0pGz<5ghpeuNR1KJg?l)8mYAqBrqglq=I+I05>D!?HD{VyOC#}g z5jN97eTGK+MLG5zZ(1a^&|&A6QRM9!mmgZv?7S7++1MOwX&{b8)zY%1!WnrVc#Vg9 zKqW#sIwIo8bhbBd)PL1W2@(RB^{761-MKdh0If0DFVrc;3`RzAY{b7?R+#3MFRTr- z%|r}t?yf>A54uqid>Cq~hA)2!yDMrFd(w!@$%Xe|oQIRMzya@41cIifD)>Nu0hyo9 zl0+O+P*}O@QDf30##%j8UcC}l67e{2H?s0_iG?$CAhw?rx~~a4DrPGe2l$GcYHkOX z`>Jx^#h%YA@48KB60{hm0VF@ti}zU#Q_=}44H~bMd=R)D#-*FQPhz{)fE;fN?-}|f zH4Ha;%#oc9DHVoiQs=;n*(3@=|rRJUv>Y}Fs?b^tgv~OzTF1ayGRILW0X)NwfGh+BISN$uabT7^lW3r3Mhot5j z_5|f2$WnyWfCTncSfHc-S&r)YCL{&wlP6Ia9WKAq9yVtMZFD(bP>`M6S+@*5_*s7g zYkzw$B3s#HEjXNENf%V_H)wjj30%UkaG555693@6g~bGy-|_pGu#OwLyzWrOL+gjs zv)DPLAg@Lfhl5Vlgf_vEOb8PbAcSWZL!&@3E0U10=48IncZNOFKQ%sH8s!S((K<40 zJz-p1fX+Ez#j&WU`T1q9Xbrm62K$v@^UO8R3 zxYnl?X4H3lOnaK>CG9d*L{Wnj#>s!^%EsO*a|*%F&8^RJcVe>ZThO+!&R23NSi# z&<3A&E%+`w+HkSH#lKs9tU^nslzB3Z**$aTLzR%h2kfl!6gdtt+)evh7I9QDcjkCF zjZxw2wGF7M-CXfgfIJm3>bWMd+prTrC_@Pi4<8y*0~>7``}42xutx;=oq8}THd7M) zD~;QCtbji3t}hV&_fX6aiGo1Y@nN9)4e~D8CO#>PuBngMQv=yRD=GmoXp*CF0$h3t z$vlA!cN-{Q_ug^47g&A&*>gGVtGn*%zT!Owh_L(|J9>+91Eih+kY0YK_u+Vhd~>K+ z%XR1({UOj3xiw9a3FO1}8-JJyIl3aq1Tuo}w-@|E-utdMy=!PlkH@P? z^lcJfHbZ?0Ig%k3c+j-TKilMYv$$FeR4~~?eH}|Sotf#6G)N4JCY@^*$h=<# z&Z;^U&&&NdCzpYaSyfWgTz|js!%ek0{w%gqVt7ozLX>CA$xWP8QdW|!bKmf};cy$l z$=Di-gim~VJt%o>vZ7nqL)2^eLLhv5JnNuTCivdQMxjW?=)rTYbHPIVa;)YB8BO6|BdRct1&w4W14!?@=Bu~>uU zL-w=*OaGO1C@OyUlGHwI1QjVyo2$3gN#V08ql~Zr>U~U}sOxFm=nw}_3SRGa3HLav z5%Vuvr|oMS)LyEyA)jt)+4a4TyCw!2mi6*CC@CuD3Au0*h7YofRvI?Td@f;RZeeqP z2KQhCauc!Ndu5ysg1w_oA|>BcZw|P43--j_g1#3i z+ypNGo089{QdoSK+Nf5A?K1L7`KSxvRhE(F2+HJH$*YDX7zS^cIv6x_r?!w zTwE&qLrArELkWQSvlckhZu&}aM*IGAF-l6ud2o{x@NT#LETiMPk;_fNV8f+_)_u=a zxpo*>Xbkb%J)N(Xx)~NiKCM_AwM`d;?pJl={|4=Ygq>M`D`UCzk(AIYXcb8CcNCH3 z;=uv%hPP~qaibN;CVUYq=TRG1FXIbNWRV)`_yF6Z^`+yiQi`a*KPOA9(0ML0Pbb z?#20#LPSE98sm1yzjFW3L0&`R2j=MYZQsFtuo1DV)58m|#v~{9k!YPy)q(&?(@^g( z^Z$psw~C5uiTZtm1>3kK!686!ORz?Q1$X!05Zv8^YjA5icyNct-7UD&xVu}!ZT30m z>Dy!6mpkqqckt9}71gV&W>w8u^`F0W9%v-JpIPcQ<0{AAeAm;b&_Vi_JLsg%viMn~ z&-LkRZHp+KrJa5@ZUA05x#Vo2+lSr~p)Bf z-tRI4GSLskEf&CoMxsx%V zSM8@EfYySC_-wW)^3+-gdIK5P4f)Kj+zr#_A{|boXg`dOGfISmcHd zR9dF#0apx5$sN_-|+RQ+9Hb^0sq!N(e! z;kEC-I7n=1ePQ-)FywKY`#H_6nA5)5ZNpmox!*>$@-`83iPcw^%kEhcy?B{+T&|rO z|A>$0Xs*p>b8al^{nUPWa~nx|Li^M9<&PNfi*k0``S^!lqL3CNZwq;+jCOBx=Fue+ zS5F!8r^Vft-_C`Z^%3sTvI5FoceD9(sKUpH`7$=w(GVLt_L?j})tW<&&u(P!s7%+| z_(v+vNy4o0?bH{JpeS-@5K_L3<%p0#bLF$A-KR7Pm$o!I`J6d^i!9g;xl}({_(KB~ zLBAoANyHhkixPy(aZqGsH?+_^_H-HNo0;zdyZ5ur(F5x#xpK@V${|^hm-)lO zG6ue?S+B*VDY%edY(>6P@IG|oEc_>jaW@JDkNYUTh4HrcMGr?>dOuO}c3CiJQaSnz zcc>DciH%%E#L>rmO`q4CXEdE}p5Z--?%f27r`4*uLC{Wde|ct_(9L}JbOngFJt?^L z)O#111@3SCZ3s+_(|Y~o^H|PD^!TSWHo^83w}I+UizG2=d3mWTe@#tI%YoGxWuWn+ zA2rZ z7>X_LOLYG1*%w)5x&oKY#Nm;Tty&|SD=Z(_sSH2&78F`}U zk@!TS*=@eI_~kCN)!1_2&I8$Y?u67Oc=)+880|JAm;H#a<=T-99jq$^XiIKEn6sLT zyJmk_0^|y;skFI+90K4}UWpk^n29qr=**@k#oNxMB`eyaOpTtI+Wph0fZKao8 zlfy-n)~}z5o;(D)U>gbOFKgc+3a;~Q636zU)-b;s3IQloK7WVyJ`f)s+TD?CKh7U7 zb2)+{f!^HPk9t1D(-1YeR4Y_mHlrk&(}*Lj0mRaz3_5GXu7tu>4#~!Rn5~`V)TX_Qy!Cx%W%w zF>4OFj?oAx8xS-WdHrO`)4$kYUymFxNU^+}RZV^N zTfo$ASb&}}r2LBbtRdjqYTOr<^LY9~ShY7${$~##mbQF4Bib>$Xx6qqi)-%#n34{E zdV8QR+emFDob22XJ*DJvX$mkl9{PZ8o=pg#r@z6qlL9TF35j$l<$AAv-tkJP(#HZ1>2ScEmQkiMH^_}F`+3~q94ZY=Uzg! z`xtH!`xoA~esxBWM_&ap);Ik=%y$T6fk{1EoVa1?CU*g_T1jRN4>4eoglY+?)8#`T}HX|M> z&3?%&HLl*kw!lkYq>VcKpIyxAewe$`2s|D+)%vzReVqfJzl^7tDMO-EIhoX)pLYl(VRPY_>}w{oBNqqMcYzi`}7@W8WQr8p=txai$Y zKCWEBYj>712I*ZLo5xBPqRwG)b=C8!xOZL>{}DUhyFS&pY&eBr#>y>juuT-m4PWaT zo+rEY$Gmq6kdF3!x?Q=IQ=9uF;JdmoVlFInzr|{Cy4vb;&B(fyr_lKX=yCZi1UO)+g6kC8P7={I!P1l<2n&bevGanI_+^Slk)kDJCp5Y`8IY0 z%bc)LG#=)|FB&c_vg%FFnH* zQuODE0{porqoYr0QjXG8rm+LRSq^v*So&xpFNZBB?6^~ZWK{X6WH*2~+M0Gm?DC$C zzr&>fb+L9)knCEmXH zp!Ri2@1K!U7=Cq^)K!;@Qc&gGEs0`LYa4?h2kpFSeL$_9O3zcuJ&q-2V|ZF>;-=>7 z#StNHxplno?B<{0Qvd5o5d8k{ub^+RUQ4#=jn#gtxM(%-w&Uv;uQbJ(`>Dpt%-oe& z^=K2y%PsOK8X}8rrJ{gm&}=>ntkPZ+Y_1HS$$p38?=S9e_XJaVs+gJ4GHciN3^^d* z_aN!ZE=HmopisvyS8+$?^eos#IT0SM_0F^lR0pw<8z$|<~HzK;{>Mjlgtel*X40AEm_9;YPDdtoKV`H1lvv+SyGz@pZx zB<3Co&UbX`lgW3PR-uO@b+9w5sLFjViM!)$r>7h`FWGkIYswQ1Ox&*gw{rQ0!z3`M)y6z@ zL7ilg2zQOuNp|NaX$sra#aRBoKMc^r{t`^eiPINv)=x9ys-GGv#HmkxYlxy5w<)R^4!X#5PAM zKjf&p821^#VpxAUOJHKRv|v~+nwhu_uBEhe)$Ow0En^&5t*`0U4dtO9cCZwkJOck* z7}L>+dwtkOOb6xU&B>7e>H-WY*v~Zs*y;WM;Xz$Bhu-E(c~qg_Xce+UX4DQ{X2Si4 z^LgZI5pt(^Tx58=slgZkWPrWR2b7?%#B_0~1G`T3=fa<@ZaoN+#FL0*=*C7<#i#YH zq21PpJSw4h4WjY8H#Tsy^<0s4D0Q^`T6e&N6+6=;>B;Uxiu19QdY2 z!u0Q*0tP0z;tCBtzkNDaTRSKs_WgN%uVn1P19BxWV;p6n}(9~YC z7n$)x1&ye~3bWSq+v3oYTasKMrd3=^u%UYGNknCYQ|sRa^dabajtRZ$_I|uZ_X~Z*tx(HLUF>ap6YK8>mh*B;+!UR#QR`um{=7_MuJ-?85Y)XVu3p&mAx+jz0zc%3pC>2pdjZ6hVP zc~=K({d3Gu2yqv_=DQ~t%{YmX5!N!v7dq)pSu&>cv41cobZVA258w{00n)kHyO@u~ ztp+n%9yv8xQu80phsTZ5_YK~yn06n-f8tr2BX4~ON zhCg|gfkP3~zj@SRbMKe9p{NyeekALz%MH=Qqwm2a2Ib$WHJzop%-+^-|-m+FiQw<(4BYnSO@B2L6T-~XI5z0!6C>ROq;<_KtRMfwbnEj2GFM>x z;$3xFvNZJ;Q5O!L9B~W=C%9qJt>NLik>(XCW{Mfx_@J87`X(~^5usA+r$-gnzFBA8 z(nhd8p=D97Af!T%UPVt&CMl_aw5rCZKH-LECB|vK-W1@rOkzi2y6llTG`4;^x(lxV zj139Fy1pqe*H^*%1JL&T4n|{czZEKn{p|>y z_+86aqy*mF+#?^7&kB|LX}*jlU5}TVkCk|*aBe0Xj`+rvJa(1T^a>8l<_&v=Xr`UU z7nGJ!&fliZe}JrDx~?_tQ@n-WMGVOMD5!Il`A$0bts!fmYbxU}p2rQ7hJc=KpWDFw zF}EHqozhE|$rFwf&C0S`#o}Jkha~U%7jyv zes;U8s!D?i!FJYpv5!ngJq>9~hIEj`+D%u@1DD5tz0nh|E+2B<+c=*J9@s6t7~@rb zW5ag7>-i#*c{%WW_eL9X{W8FM$8ZjgD|a{FQ5fw&5$wWsSI|hPVz`Ou1XnD#Ow|pf=#h^|s z^TXo$S^RbWyxrTFGE0RGGdDXqxy(fmt0m;%e3D1&&D(F(rZzeiz%8k!yG$~ArtNv5 zhD8I|0!c<9)Dbn_xlIaQXR4K28E*XI>m=Y|aeVn;{8Vkb_JBN&wEThzSL%0CH`(mU zm)CXtQQ_pvd8>>26s+Pk^0Ap6)0$$|m9bd-`a?v&vxZ%?aSS`%9T}f}SKqwK>3+c- z10K5!;AnB1GeAgrz8vq#II{gw6XB6FQ)3{h#9}gfj3TETM^(+z#Y5cx%MCxPHQgLU z3f)%XIYQ$gi6frHY0Osi8XdmeKM)IkmkdsyZTd3#%2rp)eXLa}9Vh(nkJxeMRmT`D zY!^wms>@@?)ylBq>M*ZMIeza>SHH0M-nsgO%JXA(d(Hiy4*{l~(8S=C3JG5i*L2dI z3tV#$>1{YLFC+D_uF9jnm9%~dcA`-=^PK)A5(fH(fcs-XMGt$VK_~7jkp@{nv(Uz{ z9+*?9v&rpq(IyRQ-6y#nu9-Tjv>D$&V)O0p93IT$VjeFa#&oiIt^1A`v#YmfxgvVB z=J=Rxj=|w(A)tMoLRWSKx;W3jw2J9e_Ww$;x{rR%7|nX-DyiOc<||@d1qQ{1%DTAV zhT>-VrgvxWjvj#UtDdHusW`!;0KAI|WcczFybV}>l1-++R~4SpG-IGAks_x>bLsau zq}0ue$kZ)f^aiH20#f?TYoOy;mu=w;QSw8JtMI;lv&H7?-l4=24B4#+5Z+(CnCJ^y zM3s)M7qGkk?HV}Qx}6)1T!)uPX5+Pb@mkbtSb`Yq2i+%u#haGx*P^${v0P-+@`|3d z#~#D4MNgQ?ZTSBHe_vTFT_(R4UC|L-bbqaVqJEc|99Fcc!MpbSwf0<_aUDTeQD?jR z|BoJ|h4eQ0ysuY%vK8PS{oShV7QhvAHnM%}Tr_^C5ADRUZ%q$uz?}G`dORO+7!m>V zj=$vB;mpAsJ4nzUmv z4b3OCOYfn+*HvGA_i>~xv8sFZ^O&)D%5CJ5r4eHrkk0U?)h1lvF}?!fK>Q+bBa?+o zA2OD}_Gkfl&ewVt8vyoY&ZDZ}p~o(9{qORfkWp>-DpqgjudR~$ikVZreTPdPxMt)} zoscZ6o0ebqoq~Wt&Z;x84R!s-zjt6~BeA<-0If8*5Ke;hSNiL z;Mvx$pT@dJuPD+-g7uG;>Kvuv(&W`JPGE5CyyW|d_aF5}4N<`G2rwGaS8Lo#A{M~W zNmQB59UG*J^CQcAl^C@NxB}mB9rM#N*OJQV9H$$1--4 zmT40kqPgh0%5}sKIGWzqkZ}L7s9_>{iSp#JnxRGIq+--*&GzDs$vXyH0eZXSISmaN z+p21h?O%{<9Go1-b?nFz>ZW8h4+zPhT47Op;BJTjsAaju;SQ#qluz~Rbm|85 zAAw1^YS0crqdh-^%kEx%k;YTJQlZY<5Fa6r-DvJ{A%g?Lc86Qg?PBWWsz$kvmS@`> zaS0fVsotbANf_T)nuaIemSE=h+;9oBcYiGAx;B-WT)>4d??$J@eiOj;tpi6ce{%<; zgE_OwZS8|hJ9k7ANvmXfuSO63Zge1$;k`j_cZ;M<`V|!zqtNe0#5%>PZ!2tkCpuub z+9|ew+Sn1?eo>Mq#qQui&3^y%?YkpTFx5A$N(`oD4QhXUj!!e&A=m-A`SOr&*}t4G z2Ex+OSXcd0->mw5LAnkcCx2>0g9&lWS0zD|XZKT&_kpLBnV-A1;jY;+qp&VC4kmN4+0`{)``Axem4L@V;FoT6>uW^-*$hsl@!> z&2JfB7JIj?e*E}EEfC4U>7_WwvY&_z+G9AGBTj*%`k!f{uM=~iKg8{+_&}OZ&pQwe zEk?!APY@i>Fixg&JsPReOp}VkYB{LkF&F%t*x>D4dr0p zFAV?9eOp{!Oy^YOormJL$|Qr<5hE>`nVA`wf-+^%V<|R10iaU1=%AygQ{cAxtsJZI zKf7R;0d6&%n0!tOs*n>ApCx+T(FZc z#|6eH*$u{j?Fmr|i}g)s^SLsnz_H3BM_euumKW)Q@#fKi9Ki*I!=5F_;$r3*fFqC( z`#*`!7O^mT%?3SXdCh9{FqQ4 zgPIyVykAI~LRu?tYcENtP#;$En1HAZu=BXJA;2Kx3FP4P+&9K6{t;Pq$@T7|<9~2~ zey`xN0UVn5Hu2HWV*i#4=m<#Ar?z9d#;8`hL=DW3*y`2?_!Fn$JHh}wMp^!u$eTwU zUjj@0`j3N^yS|NVUwAu)y{&@r1H(n zhquXpuzz6YiUnU(q&LGJ1>6^#U|+0qs=>A2JnYe->1_I}qan5%9@FXi4V=`D@5=Q@ zxWk705+xTgfJ^?XZy6fdTl7i{C!_wz0+QwqUuKu1`ClPeqzdPxxO*n&!o{Tww`JA! z)iAk+6(;TNm#_bmkn>8?YNm{XDX#YSEgv-d%9iF7%{=|CLtAH@&;HuR`ZG#K(NY4e zX=ZMs&#Vv)P{3U8Us0DvS#QwG99^SOm-Lbiibg8bX9EK${%fM~r;W=>F5n8GQOUx!*_`PfohRk17JYm&La%PgW|C}4 z0)h*oa6HG0{Q*|9Ofa@uu3odN1Nqvk2~jY>V?bOOM+YX*$3T<=EV_jDPN7kg{dD*# z1d5jTsPtQR2O~=doIoIt$bWV@#c!0nygbDpb1X2r>!zx{I-XG%Re4zTx1J=Xnr3w) z-?p$ebF~f_@1|YCxIZQzCO4RDfjJB7UE-?Bxa)Ajz5)^-U@Zvvxc0czMG)CZ~#8a(>EZe!^5^YPKgmpA{7BoB)U*m3}Qj15d^V2Esp_$CBs64rC>9 zy%{g;e_k9J*wEo^5<5^nGlj8)Qe*@LjIpg`}#_ z%Zm^G@$pfd>m#!6!)>3}mqbMkKM*2on~l;`BKVIkQ}p)czuwCdpZS3>S7nSuN#)=$ zbMPs6B|DcyJQ3qPBI4bhD{Sv^@d=NsX9dqR5f;k3i&>735ua%VLA^S@9N zicJ3}1{y(-@geKjL&}$;b#d6>QBxCFp&MQAPgi;#6ezac9Vg9eJBVOm(0l>$gtZ<= z`e$UueI>;kdq(&>R8qVjKH5*Qwn&6z_&-=RFn}K|JQMilXhAfb;EVIt-nn9#g99ve zW@R78o(53eM`3iTMPQ$AHC3ok2spVzbJ_1QLQyg`r4hIoh^5>>qqu|F3=S&nB;(}+ zL6!fQN%kzshm$byw>LWv#l;Ls{s0XfGCV zgkM^p*|bxt%j?~T+a-B(O7*4}vWM?uNDBezG^h2!{#H(+ z|ARU7I#zyHAqFDp-Uf|`<=P*(eMXbQ!w7<^7TH}YS9sxO(-wp2Q3$Jv+E9O!3OSAR_>Z7IN{elkKXm;2}cG`a;VBA;`ZiXTC0 z4w+H9nCbSms;=&bvs`;G%0P#}|3m2%6Q$7XfbByZMJd9(Cx@6eN{{&NHfwz=HMkVO z#Vhm>6_3_F4wm{Va|?N~xy~L$;pD?%eI2;iRNs3vwWzn|{wUTnuAww!lGK)_Ho-c6 zuUfg;WHF}-b z-Cre_0u|p+Wb|y-^AtlP(uK9Psy40{Tl5SALc&Y+$1$o*Ot9o})RK3o$MJ6>U7r%a zyTV)t81q`KdCOlI&(y3yiMy^ZobeNnu(GW~s9c!oIBl}w`cOIBQ$rLCzv@NZNSvFf0Pk0%3f4dTg%sd&v%izRN>| z>~qp8sjG)n==u6mGHbO2-W&<8Ww3^is>Mztx9=m~UFM^l>!L@VpVZauyMT`4Ve8uT zvh3XGMU2cNeW!Udt3`zi>RGG_Oz4#@4+A|;t#^-!N{GCN3vk+RLwRSUIygcn(3)X& zyoTlh{lvr+QG8OPcc-hz&F69;xv;SEWh^3s)A{W8<49l4==p`$fhuWQhM~)N`I@dj--$~0cAlMKzgXP7#?H4oeRwF z?hi`*P=LXYXWc?M(Zt+*0%9nybJLXr>JJwcc|^S%YQW&G;|`ozOzT!!VtTqZ&DsW~ zS=TND&6@mAe?}hdm6uXndnawB4pLr@6qZ(R^}W!_jn>{O3)AiE^G;cx^4CWl^0eh#IPW%$pp$WegH6 z%Qu$VS;S}lRa=|b`$_3zY7h!7I~*b$yjbR&k$>3Ur$)6J%&EG$w4eCetsWBXtP^4u zFkY7xS2UjJAO$Ra8)}&ZWLQsI{L(rd?$~V^5*56BbOjj(2 zfH8=+Z3h^X_M-q!zYUSKK7AQVdt>%rnO78Xp8_Ih&&k#?+25;^{w3Fu0Q%QJDP3-1D|!Iou6^5yV^xO> zL|3qPIAp?;mxy5&X7__^Ai%d8FNk}5{XJdkBTS-D6H6<#z?uji*9EDTp|3u zGr#ZeU$(=Xb$Ym83gf+rZ^;TdoZUscnOrjz*K|}+bPY7CFp=;ieh#oANqbcnMgr_vPA~}9D$x(OW_(6t`pV6J69Tt#gz1xy>vQ@ z);X4(hzRYgJTj&I7u-gN5!wK+?Ifa!_vXMKZ~?o!_vQxq%sQ?=;cH@6XiK%cX193p zu13fWvSWo@b>_1iha4Y{zNDN*Mm$vd?Uvo{&uBng2cxB9Wd3|q7J)Sc1Esx66Ty}V zLV&j?OO#oB z%fVY=lx2#(_jl+hj1uP`Ul5dW+%~4M(;@86>C!nzJ@B6kNSoedfDAy~6#g()_6euUJ zi-h{IukYL5NxqtD_tn~jWnqtZPtP@If>1@I0oV8bZ;_8kt2GZ5m=J)~C;kzV~6h*1LpI-%W)C^&! z?6Y}m=Iu>I-}2o7g%Qm8;Q;l<gp9-nQv}gBHyKEjFwf*_hk>+}c*4lv}?6k*g^oz!nM*D+W ziGs-5fef{T@K@}=$<<>_iO+9PtGm>su?N;^P*}wn%3~7fISpr2SY@lj)86)dw7+#d z&DRk0Nt*>a(=-3klN3)NOb|5|o$mX1#JL12hzY>-DL!>j?`3Lw*s`+Fm%~dUC>q75 zwFq4FT-r-osrZ{FXFi$pAU@l8TKklyzj_^Ck@<<^#qn69s9e`aRdCb?q$U_Srf-iq zGos1@Kd-}q5%bUA{?Pg<6>=ehhC!z>E%A~up0pJt)ie3_A0D%7Yf1+@a=6;si^mVbODu*4|IA7@clNstu2IsAyK}=$=KFH zRZHocO9JBGY*FB64%}ngYZj^kzqlCZTV(;eT2&=2!xvY7e*sVDur<6dWar^neAw#S z+ot^c+1^4yiu|5esix;Dy?i3E1P_Ma&r+jBo2X1pIg654K=_w$^_mp!z~tM9Q&USs z2MirOl)$G4s4MvmSq4yYneWX6_^TmgaQpZ!1*5)wu2e*O;+Z*i$iq!(s{Ng)6l z8k(C6@9!AA^Ks=V{e)sWIeM-1CfFx`o$T|m@pIf+D4Ls^x?B~44gM|AXU_5DzZ82o1#cB zVz?8Qvq$#iEfblqw+J=4v&4-Tx*w(20>5VsX8`Hr1MbM251lb|@gM9lA*Y^B!cTA4 z8VbwHXU9Z!?l8~}f=(g@3v#fs8-Dyq#Od$opm1?}RJiH}xzfCZP<%BPDNO4u(NGeM z^y417a}zxjCqi)kj8avyL8EyXhhWhI*h9mj4-G@~LoPvX;B|iFap`tzWnnu;~ z6nfV&&g!Do$>0;+q>3)oTq;(_DjRPw22YwkuprQ&UyS zNhb4fASV%!jDh%=j6<5X+(oZ89=O zjMy1m*whD>SBcr2F3U5TSM;?yXR8C!0%d4(pi zA`wjGh+pn49{AFqfXusxO zk)LvhW#_J=!zYGqU~4furu$~U;Ax$5^}c0v;htp6)}}07bD^Ok3AJmh)bO~EA15J< zcjzNt7<)n{S4sC|N!e&s1otpDGVkK_^gBnvgaTQXz>mUjgu{0E^x(+f)DRz(h38jt zy#-?d^(4FpGV98g_>Zl{T7IQ$!B3>P zY-B9gyZGmhzU8oSg|W^cAfdylMhO398%FVFik%?Qr~a)FDcXi}s8G*%fWey^bi&UI z;${4u-2D7M3R`jHey86{xKriyr+#H0&WY&`hR^bG>UwLFC%xv$of$M@o8^s4HLXZy z$_9!|y#9tMKopJ()}&GGGogfc=AbQZZQ^C{;Q?vDS+?g>h<*t;a1(G~#(Z1q8zDlT zJ`S7GMD?DS?t|UMU}=(HE7B9J^gU9)TH6TVgQekkxVgC(OY&NFML|Z@<(YJ%I2^)j z1;wC=@lWMMTd9<*F6@V%n@ZPo#g7X|AP<9sC)op!+V?ZyoJryjp}IV8almEAAX)kO zPrlt-0`~1iwHa9K{nUu%;UPUpaKaQ4IA`(Y;m#_*z*S#Xwpa&r#MdH_%KL^s+Pkct z-J!T(xM~j*95NpKDeiHgbMRlGf7)R7%efqLI?WSziL8D1frK=#8$qHJt66Kih12EN z5>Sj5Rd=O`T6D$P`e)htokmTS5f=dw{yvqb@9yQ*V%FSIZA|IQ5g#A)D#0b*v&ri& zxUFBByHebSStoq2()h9PYMNaCuhiT`t)nm(FO2Em5zUuM zKB>*M_`z&=7?tc@pABwu<;Q9D-ljIeu1TDqNthJg!jcHAnry~LW|G_ihtNMk*K8;z zU_WHT-|P~gn99`yL&qNCf(V6o0r2tJ)0JCq$EaIyHh3yNzbUf9Z8qfTHmVBGs!a}T}H~%>}s!ki^5StEnd)gIzS!!jxlabm(ZJ+DO^4FJBAwE%FKHh&COMBaY z@E_S96#ihO0AfP3nrr^jwozA zB5R%?A4p13w&@NK_VJ5}Pv&(!%4n$7b}&t zd^Wd^m)x{6e(vXQxToF2eDX$=NLg$!F_*s7um)3IAHvJuGr7n8!biPLbQwe(@Z!VS zJHI~^A7$3$)#Nn|@~wZMtU)Jh^_OdQzy2eHruDl!;-h4AR{wqarR+vRS} zH9>-xCKaijWurmH`9+J^KZ^k%`70&liaPSr(W}d%Lw9ECs*i-^Lk|teTg+LeK9G$T zXIyXxfjTgK{!PGiZvvaA?pe|tTS=Cl_@}P-3byj?z7qj3xY=of@NN$=UJHd+fu zEuZfw>3_qUB$|>B-~~ zYyESTU6h;i(cUl^y*0v|9IgqG1!qLX6k+bT0Q;5O6b6k`^=D5<8ExrBq&(I0SGaRu0O4%Ps z)5FspqLAH%N-3dNKPZu1-zjB9ylJSUDE3o0R(n?{JFtREY8 zWvfuA&PWw@Q&m^h6n+1W*jqB3n>wX@@Q1)i+ekw0F+$Hhh?{us1 zIEQ!p7|@v=DFxxt{i6RLrTuPaZ1C*X`xkw8x{|N)o3|o|i0!CoPP%8jkV#ytU#HL& zDY^jSq}R!A=rqLxiz16DfY{V82PPQa6yaO)6pU~XFXDb;8&cQD4mhlb8Q=5)S4+wM zt(f?-ZD3OgT0fjqZBxqdgY+VS%5=HJw=%X}j?#X>F~()(=}th)Arp zM-PkWR)`w+UoE+a-#um)?cR?mFdMp?ZEDZaGIdesi0W9eUwr%gUZp2TaL$W=EF%~C zoD1=)Ij-GDxV`qt*k2&cIN~4;Fg=?ae`%7Rj5WAtzy62*7GK_07^mcM)s~1)!!O2v;tXR1rqyd(=DLD##)ZTM@xt7pqlu!L>@h$+}krR`@g)n+= z0VZ&&wnb)rG-%p1%Ww_>gc=B4r4DQCN|W8z@%#SF&NjZf1PT68XoxlQ1Nllf3f|2c ztPF0+R;ii0yQlizu(nG_bjW>+S*fxlgj0GmN<{d3p+%6k^*T2mq0t={I(K}Lisic5 zN2ZeU!|tAWgBX;@*M&zVAOKBPXb(nDYFE&VeXyBLJOGafdguXC-=)jox2ntkDeMn$ zk5l_FBpb*!0?$3;kfz>kxYZz)cOT8j;LUa;7U-H5(4?og!k+Px3PsgX|A#937k8tG zKOl;tJyjiPGuFfB3B@G$hwSHtT@iGSK_nqYkxT91XuaX#?Ofhu6VzqvnDG`Yl?meT z7)q6K@pl1MG4G+6UV^Zxkd_@kkJIqJ(PF}zSpKv)4mJt$mj7Y0?>-@)nyUn55IgA_ zmMh7&5`J6T_)vJ!X1Gdi$j6ZNzb(*5RQ8)JX$ge0#pP-8f6ajvu?u67M!Gwf1ifCW z_3RVJ$T;B24)KoWAUsu(U3v};4K|N|1noKlx6{|{$HwiCkcIBx%5)pMeq6&|I$=!tbuu7e7Kieet6d&Oyzv=2#Pg@QK>c%G;%F)!N{JN zm3~W_jB3-Z_fZ*^GrHT~49$1xu0W?y?a0cQhD;Z9;G}y50mRjU70 zX?P4@qW>=7v31-#_I}VF-YxL`P&?%6Hkqkih&JHy>ZWji6l(XNMqN|p=XD9OxyAY8 zeMrQme7P0B=C z8*K6l%<2$%qdK5B5Z@$&w_WF*t1>{jA$^!(%(6!_Mya`J-1SpoW7y7un>F z)2FOS8HCpQaFaDN^e+mB>>V?>LBU@>PNn3+k1=2IXb00mkYn0vL#L$lU;@RKa zVSpxlJ=Nwo*{3~LjprXj7C@?3PO5XmOSdqC{`82~3q2y$V9CpUm*VmA6Uy>2huaYj zZzUAA=-LDv#?=mel>?TA>FO2G$S0d-bcjokyRT_HO{)L6-aCacr(n4ogl?=fG$<(W z9#Q_ZdO@Lknv;QFC3}KJ6iGunf{j#r$`^ZNbwBakWgwokoj|Y1?I5T4AF5#9oUFO* zL#JGDN9*NsvwJS5xQSVO2ei9h=r4fz^c}ThPD6QHQW?%P)@}{RI;T5G;z%Sxv5s?7 zYy$_pDJ(=x=q%8rZ+M(GAhIp(_|P2jp0?_31FAh}O;$R$ z?+R_dEoT24wE+nIQV_iho5iS76{0|X=!Dza7QQE%@Gj6!N3-w|skR7VK(@w@c0D0N zP!>6W_@)^z*8Z~tCbhj>CiJSfk9h{7QX^FGJb8g9@Xe*Q<+!(dO2?ou_ecT%w&p~G zg*5k_M$T=lhfrv%#5S6sFrqC#y6#ioX6qnoIil$bd_!Ynn(svd`4aSThx-M&ecp9( zUySPIDxa|^Pjgf@_qiTH@5&G4#r;bqKjwAkoC%&nX9W#i@5|uweEB8`9S=FLb~1z8 zE@PU=8XtI@A;9ZAKGH^cX1@%;#m6pfcjVO#w9J!5UuJ`!LAst4zft zet)KSdjc}1lRA(0d`z*e{;~1i>yBID!i*v`ic{^g7CiSiZ1a!J;b|J`{Jg6VQ#2St zvFBZg%{_lJx{zj~r7^eYWY#v8dn4Tu7*_wHn^1C9Yqx0LgM&>8N}G2^(rj>4?72Bg zvbY`AX@Fn@SbrKwy67t5uq*kw=kb;Q5#-73LY^ZOWTbs8 z!v$Fz`TD$lSY+Xel2;cO37X#f%D9B>c2Q3pW`qew1-^rY%sYU9k_x-(eppxV-z({{ z+5uoOHBLASX|GfI9yB3rHO$teNCu6{eq99aR1{MxvL0Wlgcq|=77r}%S1rBv`pQ}7 z+ZDH^*2di|@(I}6B#)h`elf}$$U<7zsWfK1vbLfv1(%P95`MzQhpagw$p#@BOBO-7 zdIY9aN&kt$iAa{_+K;GZ#FOU}1m~Bfc6+qw`Oza0L$xsU;6wS9uU0!CV<66s%xwkh zJ=aX~tmbtALV(pnhtK2a?S9?dDwm=ZfBL5Yt9qgx5z6yqW2b?S!l^1j6ZCLm!bEe>97H!mOIcyOQ$rVf#DzkU0gt`BYUIFr(A z9|Y~8TnJM>K}+~|T4HC!?N+)+)VFc{66MKwSmehH2-n>Y#@e%)VTdee>`?tKWgq+R zaUVQf5aGjgu)$LTA0M)_N;XI4cDp{>kB-*;zFbGpI4nOucNmta*)Qm5QD^a1o(@&Q z7A?SF-67pbcjrrY z$KCwC@5H_5+`o8y9^C9b*I0AS7-KGQZhunIEyap?H5pHr;(eIl<|-*LUb+QH5Nr2i&ReKV`_-Jwj`wN~hXDl(N$8S29$@l_$taM4 zQ@Ri|5be*Q*;3KWXfUCi4{DMZ*Eqlv;2G_a*%-*k?@)UC&Jh`)*C5Vn8x0=pukJ*Z zMQ?R0wcr0T3=a$YyCP9i7?=>HJnm5XUYqsb2?e+)# zW*k6aqoN}uo<>JM?9qUXJi|DeF{x4yi2GALyNPud?s7WZ7ga{moS$K4svNPq90+Y~ zTAtmKm%jHO*nIxudEUD>*|b+AwaVct_UwnkWuBJvDnu$e9Aj_*mn*P7TP@-5)@G*s znpsDUiy3%)oTl7=70S*M40?oyZrezT3%-lE|3m-%`{p4dv{W*|wpaV}2+|zik8Vl= zQ6?AGB5`t%hK`P4UEPfGr5?0PE6NGQ**E=!FNh0{fyn$XzvZk?nomT(C*I1;!)kwv z*?!>hlQD{X_Y2yJD7<;WHp|Cp^bz`$Lh#8WHjYY#(kpR26^yyL;@rfO4s3s4I899y zOAa<0?HDVX+3^P)juAScB9t7$!0gGO{PDBOIHG*~OA^A-N8s+RIb4Yj zhXWvNuVF7&^y+B6HLixXj(z^M>2(uMg*6EjBPiQIYk!lNB<7Xo#IqFJ7;)o?VhRAXLsqQ8!CsUR8)4rv5wL#niQ#?Hw#yz zHeP;Z*wZ7t#+P1q-QJlfJhpUn%$(StUe_`@{Ao48)O$;FGZH!-tWH~TnU|zGZ$Ugf z1cipE+#g2eQNALcK#kSpEm?65D)3;2yJ zWse!(OC;})mRfC?tQM;VKM7u1>`keRwZ()OQxNRn`K4W5^~+48lem|;Rjxjd3|%X# zZK7^XfjYIE2i4Voo+QnF*3~;7e)K-XZjjdWx`%0%izLoooF6Zk3+N(ED9`&jOTq4i zSr`db(o47O;UXjd9Mw2vjyVsXxQc!7N*DdC1o7^n2mGV&g^AeYG{u@J^yb7 zf!ngmu9Z&fAE*9GXB71Lh(`FM!tFa2+9WZebyC}n49ph}bof=QD*>|G5tQ#%u1p*p zeJNlJHR7oz!{w*QK;{JqC!9@E?Fsmp`AZUQe)%z-zm{}Ad7UihiPM>B?=np-Ei3z> zlf3LB34{xaDH}>th^R))70`DJ_e5hwK@m-^c#8|;!101_k8^K}R_Vjg!wp)0!yQT` zjNFL{jHx^rI^fHV|Lh;Dz7frpKs7Qw==(t`~%RdBrA2v6f01sdS$2G@MeL^=tEIY z&g3|7c%7~qr%y#Os^_s1ZI`fHC*TOk5A>uqu^o4(e*;R5s-?3Z6m&6BOH zK8A1rML6_T?i^%2=<<}@85&O9V1;n5GYkrZYoSsRNG7G>yO1%idv77fTLeU?H4n z^nSIKtFCb8eVzl#yr2z;mQ5w9*(u>ry4oojk1Oc5xrg+$S+uE9$P2Q&wZ9bOKK8BI zs>cK2t&lH4^muT~G1BTnI5w&_GPIT}&1vbLyGkXm596+TW%-D7+Bq>-V;ZMZB^AwD zG>Np(vgc_HyqPLGuERXA1d2H29nrhvHuaa2!t0AjJ-@zI|5{ksE6tXm<6MisdU4kP z_hK!dMA3F^LULGKgPqb6w3j7M+gfI%Nk0CICGfkmD`1o>E0YYk=u-b<_e9;FO*`Z< zW~B4X`7j*BzLCSbVSaP8G96fjO)-#OD$nvwVU z0m`>UfAW>4&&JEpjOz^4;N#h2{=u$oUE&MQJ@{R8-mkJ($25|lmZBh)W*n+ zqn{hcDQ4h;;qVLjD?f;Gb_cvuG;~^uR}ONa)??T_DdOJoZ0>z7rnTCT{^u5( zHHbM+-PtgX^ooD#y0>U#SmN_2Jdjty7F1+%`e@azBp!`wVgiGaa>9oS^3YpySsydng`MGYMaKjafmm=)b+fxbzbx! z3VbS13ai1GhaDVD(Z7_}0^Fy(K&PDIhW;la9Bt7AfqVqn)hd3YV#WgBMp;{u9a3Al zMb2pnE6=jo;r-GfweJn`R($@9sY%$IjPzhDBe0LOVgyc^TSk zYF7{QWo-Poe{xboJ-It#wVpPJcW4+Z^Y*0Hu(H5CmZH(INS+Y_j=On&Q(X_ADCGH1 zI~!|UV2i;oakwk-xC)|~QJ!5&%Eg0NKm3@Z>se+dVO?V=c{eT3^-ToHrkUa8P+iV? zOQGN(RfTh@fEHLY5_MBh9&y)5^hfu5j>-Ayf-)&J2STg&hXzTW56O**J7)}`td3Ih z`G*Gl4QA1X15ojmlLDO=0v@pky6XIgT(~)1{a=>|v2GFR@$tT736M2Z`OC?`W#SSA zo1S^CZ?sR%l@wM6v+^sPyeEV@u4QC6t{drzRy}SNut7YLS9V_Y~siM;2-9bn&r;h&M)tpmM5R}k?9N^UZ zb;(Yr;i5-8U!a`_>l{vV9r5<-XiSO>F`ff2;6ihV1GE1IeXekhw)20MComBF4!vG5 zXqEf?v_`zv>Mc)XOH}e}t!e~mw{lZA@%j^_1MUDf6Es+FY`#?tVwq}JP+z{Xt(8+~SDYY@Q!7a;BUtoGb z_m%nLRYgmCS-L92Eei%APax8@@&Ofj$c-S5h05%vbT9ik<{R*tw|l<~eonWGTs+}h zy(Gw|zBNETl+^T`q%X!|{||Giu{qXM4Qold`h1 zOVGA>H^Szx{&e^!-3amU5;=fA^^V$V_dF<)Oz+7bsnStC2xVbM3*Y)d2nLj&(7~T? z_HAQMq}X*g==;C|pq%Ms0F7AK@P3+;QHMbf-r3oi4dNPu0K;Zj-0=pLNe+{jNlrh6%%jEJ$(#TOlP z7Y1ihToLuXf1diD;5if@aHzCD>{sgjl&*I9A{N&P!yk$POZLr78)_f9Rq$X91oUj= z_D!yMiw}+TL5*t%?``lpZo>;7&}W`4Z`haI@I8OIX$~GBNoE=lV?dm~bLkNB(ep{? zVqGyw>>$BA3WOaum?oNsyhShh#>FIUOG@@jE6v0nw=|RyEU=LsN}Ju@uD#fNO%h6P z$C0Xelsq%MUs1t5&U4?nq5WX<`rytrAj9NKo4@lR(`vedAnmsOMKB1(3hev|du$!EWc_I-IW--z(Iu z9GJA=G=Ib6xNEkaaB=L!8eul+g`*D_Y@D92@Y-xd*xdG68FTkk_1slc(dIr3h7CEe zKW(<3Ke*Q({Eoxa3w*LfZya{LtVe47g(DD&qFEC8x=wl&Eindg_vq>e7}6s4kO)?S zke#Y50_JG!B@*uOa-z4$H7=qB-wENzZ*1id!~hpr$vTOm@~v;~sB08GsLdx!EJkZ- zr|k!ipqNny9UmSxly>W7nZJ+xP8j!hP0_dMHyv6uWnBGL)17WvQBgRN3`6|tDi8i; zW;yoH@8^H6k6?Ie4$R0}zR?R3-|61l;mJ5DDJk_WQxS3^6M*X<;1RL?U4)=CHTcr! z?6LgeS?EC5DRY#Xw+mlI9kq%3U7%?VzdmZZEV0rYMw3#2kXYy^WBgqDK`^eUw5vS1 z$t_mQ~oUgTm0BGlV?79XQEM^p*np}N*!{Lwq zM#4Ede=yQiSddsxN>4f1TnN3z#fHu28JD_2#jA`g150wiaCQQU}*>((}d1D!)zLC|rezJp?;LvZPobU~KiSOYW<6_AyvId@vYtkS#xRm-k z$`z1>O+WtG6!^o>KwV$D@wFJJ)RQIpSb!H~@SxK4X3%LLZ%EhjljV1YpYm4driNRz z#qX9ii-OaFa9raXdUYzq%)6% z1bMFehY?Y->skF+_!ah!CwL|ZkJ?n!AbyfOG~CQH)oc>J<5#jRge%UAMzM(LN2L6` z#6DPbhDaER1R=i@SVPH5$Im~6D?Go(0sOT7J#}v%iFUB-??JkrDV#*bKjxH@0!a|> zS>Z@XPWB+tRVw9W=4x;x*C`P-ui$TEh;6Q0VlTov(@|B1GG zuh5R9lNf6I6Q!oSecpf6AQC%EYnFT|*?&!>I)bZ*_p9>~7Q67>fR6dhbx~S;F!1N# zAgAy^;!bHk@c4L>bz4>O1icKwonZp?18^dpnjaA-F`&z#VIj~7P;UTw1ZTj<6ihft zQBO7+pEzj*pjXi8FpcvEx;z7hmNvb2S6xL8t-%=I1yP9>x*R6z2@N2pFAD-OTd|FH zN4;?b^OuqV?a@(z`)}FG-?*d}IqqYkdjovojknKT>n_0~`AnMj5}^`ib}Pii`mfC# zx;eGpUOO3%^8d1pBo4IhJqW33B=d4))T;7aYWO?hj(;a}h2icdB9=ZzU^V8@boAax z80~fZ2x;v+?iuPMZEU1Foau_mjpUw`sHbVT;3i<^NPOtpaQeK%R&XJ!FTAGeI%PUZ ze4$aY@&xAl4<{dpY>`aAQUbPV^7SFJ!C*iXn00VnUz1Q$Nih4UlGkQb1(sA>AKON$ zk=G_p0@L@jIKEERhnK3ZYgavqt2b6P|HTH)wnF!^+JWX+kw&_sV}4(@1q#iV)44*Y z9o)SvtnNkzw~YdMpAWqAG9G5dhW8GaVcF=eZ;Pyv!1@CTIqm z9A|G7Lb7|3~EH@@#mx51YXZy^?1wi zRxY`ofDb^0jus$X4TANk)>HUWfl{A~J=`fKux|X$PzHUM%zKxNI^CSy!5;rnVQyC} zElq1`*Og;}Rvmax^y7y?7Z{KwVWf>)cSL6z!xmdz?XjT?Mu*;I4d!|bGz~%Rd2+dl zHVTog)c3EnfMwW!`8au^uClYr;TVDrx2byJdlUD`jL}IjN@WqdTF_)U7(k=i)eV0@ zCzvb?loYbVOpe;k5yK`GgqA+Wf$;69o=1!uvakOzLDat5{qz3$c#xF{)Kpa0S2!;- z{bf>NwyDw(DPFPh#pl0&|31qnB$+CDoT{$Cz{qQ@X?yU*$Hx9>Z?CQ`4E~Nf!0Jh% zq68RWGJ>xijO6`BHPJMwz~Y5eA;D85gDw~O@rKCADY&m9oBD7e1CGJ!+|)tqN=C*U zRZ=725u@8_H9t+D=(!o$5#EUUZyW9Z`N4OCc1B{Wu~Y^6()FP&QHYfM(t$X*Rk#VY z5u5bwfANJAzSEx>m*VHbLO9?;ZIg9F1|6c-x%p@_-nsauBu< zhJyW~!wVT!SyQDw|My4y*T2^NMLWORntZA}T~f9p%>O;mYFPe$gviPfIb2{p+4P4d zU;uk$2-I?MIWsCvBO08FoW)UJu}Ml&vve@24^aFOh*#ZA4i;vQDJ_i0(3?9FH<4FQ;7)tv+jOy6nS}Kno_L-3*V^JYlhYTYkd32^Xe3-y!Vz1pGnhB(v@lM?^W)&G~($lpQEN9?hUrcD`!DWNqAr>f{i ztXO%5TCxUZHigf-X)0(^%(ICLy?xeu2&ujUck(}! z`FaGUA{N#0|6uID0k09wv{b{`=nkzhx$;_l{bA2<*|8Cg$aaNILj3LVkPv0L%c4fV zaD@I+?!3QHrVfbq zX1v6mK_{|}X(P5z2jFjr3L#w2;cuxrrOn$|Xc1lapvfddZOcsg|9|i{D)8XF!ph2E z1cX{dn4nh2596Oeh|zO{OiPZznt=Dv{FnC#@TpH!O7j&^$fYvQeHzfLX>VEnYH^Jk zRS>(=(*qqA5itQ{QBjS+*?dhK)m;9@cl>WF{@-B$CrXG93a!CI)TG+^NP*c%%l4HB zSi7cBA2MYn6pU{c(GAjEP9MC4Xw2_-Qe68NU{8P@Rplf8)p|E3Q$r^OR!Z>!<#Ap@8}&6gqDPyI~IWOa~x1-b_mL>6K97X>mqVZ zv$xC2M2&evN2DKI;%vj>xic5zT*tD+Ix&)P;RRFGuZ8`6iWP2eS7o`E^VNujUv6j^ zSXd@?1e1;b`R~ z?Rh$$%pi_&`g(?b`8ti!Q~E)R!W6QhwlP?IKFT$}8}9M$xj#+AzjO5a+2k8w{)aU? z;r)D4I%$lnm1C;3qcJ1*8DS!{X2jiw{5zEh2X)@eCRd#xB1R=h;igo56hQfZSDZNu!$*@>u)Xb|7@|KmGATtb<;B1B5D zDpMnyjM&&;a{uH!KPfXs1(C!N!T-l$bRP!TbcXiRcd-(-a6T%H^1!$r=_Vc-xaFsI z3quFr&RUUoAxIDi65rUR{;Dsudtb2^{~Zs26xXM*C7*{>fzw0+msX3Y%Qtk1Bmcgc zycwfu298EPaky#4xxd-M5|&?JQR)>$_lP+0FxA>ENk@}s_?VfQmFrelwK+T*L!C|* z(VWyJ)fDaZp(O$dBcUM)kHy8s%a|CV*f>~H{Xemj5}+1VBuOa6UEjzyyQ9djb)s?7 zM46&ee51_s?Gn(KpTDE%fC`@ngHZ=n+VsK^Pew&VBBX+bi9CP%@#*O?U|_|m)`{G! z;p~~vc65KBOjE<>5GsAb#mUfiBX{7F|Lo_J&EUr3+BfAL|kYf78 ze|Uox8DzM<{jI=``!5w|yf^_o3ZbA@;dX+m!|e@RyR7w0*XxTEQ>jZ~<-V8Im8+6l z@7+)0lBho*K!>c$e4$twhGOs3uJ2+Zxwq7F=+Pz*ql+-$} z;dkhB(owS4^ZhbJ1AS4{*jYy5e%4yX5-l*PGElH?F3t`=ut+Jrd>?Tmui|_dYcv3V z590f|C8ns!HHAO&_lywlV9}&tOY~x|DVTTG(0nAb`CviOY9ILr*ywp;YA)(`XK7kY zg}{|u`oJWgKA+uF-{?=TrKgI`uSOrIly+^#)Q24tRg=A)!I*sV*lZM zg@TRXA+kb~0uFSj`COv1ENPKUTg&L*>1Z3JY7Up$dZDQ9J!5i=6(3P=m9?ki!lJl8 zNS-0CqE(fSfPic9tplBmtPji{U+4MA(xD$B9$sNPIKl>L+0BQzm!{v)(s6BIYR}1? zMm&RYt*F8|cTf#n28KD)mG3#twI7@6@AHC)a69P2})2L0OnEI$eVHT&+ zj}|e_b5IIaL(m5S)Wj1YL&g-zp*F*V#0nX)QaZ$|iH-_}DUYup)lG`O>zpw~g$Et# z5>>t7ls0S0rp2##Apo+glaGM=>JZk{h0UeO#Z?W)b7OX?u)2DY1NQ4NIj6I%yL(HV zwYhmV#<0rbHm%{y11riz713?oD;%3p-dY<{wwzM**EU6W2n%vfh@{1i$hIcbyIGxg0&aOTI|-V~)y797U{imG zQ4CI#j^jRo1zz)%%-F4V2tnmb?6>UM4I$i*!1fMH_(vYlk4i75;V>%3xov5ifEQ4} z>+)%%Od+ACltPxNPWJ@2EX%tt<-f5Erbv zl7G%hr!(=Vq`LPh<$0$c1Y6R`9jhzE0UM>*KZ-z z0Uc<`F2_LOqrUK&B0nsLhTd|8z)RV3G3}lnNGu9Aq5;T;#>~Xz608d{&YWo$)RTtk zsNL|sHhSVAZwKq32SHsCii z%bs1wPgNwtbs1V-tWH?H%{!O(k+#W&deQau`4dB(LY{k3m=*@5%?Bb&Sk{2lL=W_! zg(GwE#nFwUPL<>Oy<2qI9&sA9_4I@7`@?DhuZk~wQjuyBGRKh8v*GdtWHX?|7-Ly9 zbSdDtGd=?+oP;jMys=qR{r_9_=5>sPkG!&$T^Ul{#$S(27LzFQvUH$MwL*aZ8ZSHsb|X2kla|))Q{YIyL?wWZtR#?ez@sk4NSGMVI^h z4ew-tF`O(dMvYO)#h9{cQHyaH1gBP>u={nM;}gYA7N&B?@`t6)8mv=P%i7IdX(b)P zbw)MR=P6D+BG*Ppwaxbe#Ysg2Dt8mOxOkbzX#|r~oCIM@VNBzyQUz&l9CViz+j$j6 z%FjgFUA*-4x@w7DXB+NzMk5&=kz?E@NTca1126YOM+7dYtdTRbt0JeZmza15aQ$D9 z%6JZOIi72kmNO`|^Yem#<%q)W0}^v{D~l}FwMEL4 zsLHA=$e}3EPbYXd2RSG0(#6|hhF7Y35Du}IQ+VR82H6KgYO|Aakx+1iadw^$?~!Xt zeExLOCf*r*@PqG6xUqYH@4{~>Rwp!`h&2_&+GfB91h2Oq!(Lf9HfZOFkkQB%_bki^{g^E{^p(~ zHY=xRNcWmLuXe9zzm*rfZOuq_r0Y>db$PRyFW6r)%Sp<_Vgx}*FrQ2zvBs}APMjX^ z-}(u5OS0qWlO8rC>-c?*jKbR@Wvuo)O+R8gVg7KzKBRhz6T3Jz13DC-(N(kHt3l^} z%CX!PGtuk6_TgtYps~Hav=R4)O!=9YjZ#J35#sm_(j))&;xs^~FzE@2KWUBWV5S7h zuWdH*O;sBsqVT*@RFc#!0v8uZyM1eRVt{gs#?j(?{Xrm~g+W4?R|7BYDQ4)Jafc8e z29#p%o!y?nP;PnXdPRh{<-4rto6@PoV_V17>b~A4*x|SDLC2b%A#KO* z(b<38By`jU8~L^0k?g6@-NtDITek``oL&MI|7+tJG@maayiew%V=HGguL~Ad*47I6 zlYCEFZe-J=41W}dc&v~QA<^INkE>Di{;WM5)U)9k3wE5V$FJ=pW5uP(2M6gV2jKKS z!@t1dDr$5c#coRXGs6k4hqG2Z{2%`bXb0e-Gs7=7#qBr!l~r6dNipjV79Z2k;troH zQEr6kt&;ARm#MXESEZF^S!;Eya-NdX((-IdS0vx!eFb?;qbadEW=3wYSA%gJMOD=w z!otE?kD6^eWQ!ASS;bS#PO&>>IU(6Yot}MrePETAlYBqHQu)^h_qN$gXigro5)+-HiJk0yeW1XzU zMGmE%iGFV>;1U$%(ssu~Ct#kEh2p~58S0ATZHLQ&@Jx7toES9~BuyB(f*69^PdDRe zw+9qTwaZIHGp$2R41$c$S)eTG0u-mmsZuKU_g6fHvMPZ6l){QnCQjOFE9p;~yDoUe-)6c_;4fnm`UCB7~SqZ3Q+yj*pK|j4XeOi!=4~ zvMdbkBMW>p7kYDDdwm=wRqa^V-0u7xJrc4rI&Tw}()lJ+-`%JF<2Bsd3g>my(NUN! zKZ{J5yH9b{9N}pU!;iODc)0=S=i|%|N=jMRF>MuiL0q0tL1s?Yi(|@mx;5>dkJ%oa zIj8ezUQWLk)Y2P0SKJUjem#1GR0_RIw$S()QlldCN|cP+(*K^@HA!4CR_XGxE;2mAJ;G#dj-($5*=lXXh^H&13yoHE zVQWG4@gy#%p;uQTv@2Lfq!`m9w-j9?BcB{^3E=!|n)J8rneRL~SUIJPjFgI9f{pO6S0eZy z^I{Upz51$h*mPcazH-pLJUDSsx@I@0TP;+V?GZ_kJs90G#JT)T^HOfVyFfR8N=rx} zuz0^UhCU(&9meaJu917V`1B(kwXrA_c|jDYG%!ZIdv7mN1!nu9Lcy8hp+y};W|MWN z89i4UP?pd-1BSsr8-)jz{3WV}UslDG8kd>s6rvlY816K5O~%gswO}WF!W!2gE7$(` z@nISi1P;iNNh%(5+Uu{#RcOdK$vyXVf4Z}aD=#gTM=@7uw75M5{~{+~5;M`zR_51v z+Ds^#Cr0ng=SFMnTz=V~;hMT8_Il?b_Z%taXx{Br5C{@Z078dZt#N>X*HIt~E=0TT`C zP`!a+Fh{2p3lnqSw86cMd8Q)A9^YlN{SZ)OC5KpApyW#BTwY#=@NwGdgF-@wx%`bj z^Z!+ylg8L#&i{gMJ3cw`9o>%0lw!jP!2{|FU^LIfAxW;5*==6uP=wZPO)TnTM4{Ec_>!;1GrFgFIBHw;6izdy;RfTunDkm5y0zXtPmJh|ivu8WY$ zD9+WaGyo#hr2T}Ie#K3I@&3c^vo+@f>8xi$owj*XH0#>gXEz%nTdhx|WI)M@9ps}T zmIP`_h(!809a*CeZrY|fIAFw3ko)-|ErOp^TeAmJW$S?4_L1Ce|7GP?o>gOuIQCO4 z{h&Kj+Jr~_D#+Wr{!n^x>NPw@#PDag)59{@dwm=4^P&XGQBy+r`0wJ@_#vley+@j9 z+?sabU3>J#aRSfibe=N{(Y|X*mbJ!XmVWUD@9Kp1+Y24eo#5JriX530ml)t$#*>q5 zlXTCJ2iONiZq$5&mZPod+1c{R&mW#I+JU=?3vPFAk7~y9Bxu_uXa1lpx;&<_rhO;g zJ7&um<9!t%M^SEczd5m=48GgBe{MPbt02RBQuOn_zdUnFW(v?+7d@(`li&q$J7!C3 zx?elinoTLsPzM*n61e#wX+%me2~Z$Ezn72_{Nanr-KSjN zSB!C?OK$;ZvY$7$`kefU0rG-{*#lD}z&F#%NP+{J>mC;J2SExhe_Qy8=RpqXCK=y} zlW?nf7r~x|4^0wA5_*ZEoU&lpwfZZG#W#Op33QDVriJjx;7+Bu(hS8@#P6WXcU_1O zr$TAVw*kVrOr@z;&pvL0fE)@Aa>5dJS+tWTg-8ps0m!jW3mnsFdq_^W;)um_oph*y z2`WxHUx{tAD(nbSB6!bv-UEc?=bpds4)^TpYnl1g9xm#1OC1XCa+01mP_F?VbA5Qo z5G2+Gs1fh;k;B!`$U5@U)aM%bkOjAnnd(&n{No67o zZ|!9{^Iz09VMpo^eI&MW5(!^~e_g@XcLJQx_xvfHX?qaM+%~Tyco$7SeBur|cuzHu zC&1(a6SJf^<(b3M&Em|6!%L?f7ah14v$z&eGIUMXzboX4P(siE2hPoCA9><-$tm*5 z#Qmi?Vsb1jLl#`rB=(T9_d5SgaNGBiE*s_aE_f&<6}Q0s(=~b>$kF`#v^doB29>-kQURsU@*7Tu0#hAjIK< z=)%K{zf?+n<&s~C(#QB=uLf8OIAUA6*L{pyt0k7YHESo>^D8D9c_7E7JTCMbl948i zq?9v~Dfxba`T-59M5UFYn|P8`Kas+EDgVd77T1n@WPz6`o+a`7@oZW$20ivel$-S) z8Ny6!SF<`|Q?&jUElB~K3rttI#LY$HsA2%t432G4WuMT_JbKsHYyy%+@44>wz=I44 zX#CG12m~MK_5S$3`v{5I!4Glw*>(LzcT)8GB9v0(QCed2D3iidR(oIpy^6W#q4UB< zg+)P)@cO1^sg)y*Z$wpS6oV79e$Zw%BiXpLvYJc8!M@m79$e|(u))*{c_Kx~Uiu#% z<@_!1$3_=c;SAd}5}&_tNLu2#f=52Hz(HieQ`?#Y*1Y+@*qswCE@zgq=La(7e z$3NoXB0`+tuFpacnbwOaKG35>Ten7-+?S#+-fiV4HEr->qHhWA^F4 z>`4QpWPp&rQsI!U<3%t3pU9=ltts1MnyJWaCrdFwZ?x4j?GtkI7F=B{16}^*M{fvD z;X1?Qpv7#&Cb`D|hy=KT@8~}D*^7qeYmq>Q!si9P>)oB5(y7!82x3v9DL3An-_)VD z#rS^EPi6~S5I*7TeT!wCh0$_6;w^!5SSvH={IHt&==3^3N!skSM01tJ%&EAVwQ&nR zX?R&xu>Pp?I^do6AkSS1=U}SNtaZ3rbKreroBiI5q*r=zGMmR8;mU0% zonJCZWJ-8SekZoa>zU=B4b{~WHEaKGHz-di zYdRiQ!0Zd1M`!2CxKJlMhEavj9k(cJQolN-^3vF3OCOHRg$0tZ23%ISqy82cDIW9r zD#B|H$oBVO`<`E#z3(~m3^kFqvn$$S`ddHN8*8uXelOVkT>a~_BbJ8p%MJL34{&BW-^r1UgRS78%T#BB7+m^WR5UYfIwOi4*DCcA+t zGYRUc2^7(|`APn}Q|h+KK!*gpzgIYx@Mpr(3J+&HWq$h7=3h>iPKP%4XO#{M2*(

wkuey${Ye)qI5(}c8k!3fShEyfYv&MlANbw3WHTl$iGkwu7jNa-V z>)6Ycb@0nMIYIklY%f;4P0vmoZE6~k?W~QVC!YNl{BDp@C9k@c5`;g^tOh+5%-ni@LaZyDY%M?f{ZSuCZ~)8W(n z!!$0{b9^5AU=a}!GgH$@w?{Xw+yaFOtfu=ZYMGMshlc};ioYe6$2gyyDre5ZfAW@w zG`lwga|s{kGR+}Ik&Zvxe}lAe{jW_cotsP*HIdCF%WyJnltm=N1SWffJ0XpT7ke0Eyz zM&POJLA<$_QXyFEkxhI=(J)E=f-lluc%?@Mw@mN7c2gQh*fo)EhI+Fx!es&yjnrml zTlk#J^~!SONwRQxVl$Nye&BJxBo)^gCZA4GZsOfxPm~t=T>ZvSx+uUu^yC4iR_+eB^D;W|95Z5KhoPKfFBbXgk*U!P!=;Wx=ej^8uP z9-KelPN8ZLr<^6F*ksLOw)u>v*tAQJKi_;&*j~_fI~N6))_mtVhnv!{X-Z4RPT_t` zg62_`l$Ms&@g_K4Y2iE})~@F=UK3h!xd3LQ!YvmMnKwUQ>KIZj=#vVd+J(Kj9#w3c zwR)|(Hj{Dd#RhL1@qeAVUhljo@npXYWShet=ZUX(Mc`rrI+)zBb1-}~+SEW*7c1uC z!GU{5!Ey^`i)f2W^Bw$Ff--ZK*W_`6R1Y*-;_i=|O}Srinp3Pb6>W8}zQCb-4B;M0 zS`t+R^wVf~HIx{GGs6%FaNq4=L77TAvk2uzk(lBLeV>Qs|2)QjOd69Q1w?0c->Xqp zKU!s3-HxXx|Gv!|OTVRG`<6tzW0)qH(J$%jR=0`;_yQEc#$fOXH)>(TD9>Q}n&DNJ z)Q8^3$e^v+^BSmeGXISzFBbCkBJnCzKuHV@sJ@rQgxD6LPw2hB`;WmPu#EA$%^by? zTz+4;v<}Cz!I`8Jq-{+*XsN6ZNxW-7@qP$hKwUw3+%O+O-BijXy&30D?#3NIT9#9*;dr9P9ObJ zb8FgSx5=w`Ct7D@M^O{?^HM`fc;Jy*V0w$*2l z`w9CVyE5(hV$v4G699(#!p0^$q!s(&Jtdx#rHq#+?E^gv9q%7;o!1S14wO8$3TEV{ z87Kny9zA3TjXclo0?&^^Gsug*gzRy`BbBGkvsUIr@Tz!!5S+Chovg#AA&u^jIH3{I zH{k7Ju|!HrcEHbE0R(gICgVIu?G(976@bhbxKjRxj{|Vj4LWj2Z;Ee))Rg<>_?}V= zth522--OvjYN=4k5|mU+(AGw-G|barl-R|DJ$LF`_-ZW||E8WF#WC!%-=_8$rnEH6 z-m+0z%;hdfZ#|-g%aq?dlJTDrV#p~y8yDf19Wpov({C$(22=xw!7Cfpug>e?^g}Sk z$yDLvXJAxqj;l%IeVL8buVqFeTdRL_QbPIcztZ;1ZI>o=&fE|9WnaZK5)$n0?(X|u zIu*a%A|0zNQFt4hn1FFCSQQ-2zR^A9m1$&K^2%wD9Ic&uAG!L`2Xx<|hBe3lzGLP2 zv=T9Z6AI-%?q|E$vC^TES|W_~`k2JX2s7kdaEI5kSgqH}`{MHAT=9DSvckf3v#}j~ zDuxgF-Y>%$G{izykPS68egy@to-D}*^BUC2H;acA^J-B&&(PK;CTD~tg@yjJr4#Kx z5;mb&fBYb_^^;XwaRs9`_I067{oI(tq)H~y9kSr}BBHx+3=wy})TgfOqoFENq;eo9 z{xB{5?MXzeCIrDwLl4|Ln0e$o zsHsI@L@O3bo5Zqma(@f-P0Q0=gC`F}4LZ)U_RsQkC0& zs3g*@aE`r_kkuV3a#Ddh>paKWuWwSWj(*C(Z2nxxOPC58o96LtY2l1xHrMTCO9I+~ zS9&)Z?hjxS%1ykPRj)l7x7`JDZg-DB&-Hq2g2toQn}CG$+gLi2E;8E~Zfi#96Lc9a z@s^ubocZmdCFz_r%iiDgBiq+n&aa^b>BpxmX--^WZ#}?VLEx?;fsxkF*kEIeZYPTw z+xjD`rF`w`Dpe^dMd9|+eqm#S&Zun-`q zT15jQ?BXDBySA%#q=nXvH=76QVQ9~)p0zjCu}v(l^8@QBh&}H1Pk1vosqV=sv&l6+ zmjZ_)Fqm#mUE7kVR33(%$JDthVwbRir4aQkk1$R|45+mDGfSoS(7z>5#z)`=zkKKA zbL`GG;A~YrCqvvd@j{PT+nE2S2RN*?nXe~T7H=In9v0$R(=K;TWr(?+ucbJ|U9%h0 z!!(;}M|-_o;Wh6%cN$cT><=$+D8cWN*a(yYIvwA|yz!d>UV?VlESb@9BUKHN2eV#D zndORn%D@aXZS2=@&;xl7-Y$_Y*Eo3&Qe9E?0>uF9fALF4MlnK z`UlcTweW-9>x<{r841cm$=A4cutG*&-Lc!5$Jx4<+j`a`_oJ5kHMwd!4W-R^y4KY^ zdW6eR0uvf3=y4&%CNCcI80T_EMaNkGp#h}TboLZ#)*pVUsK)z<*uJ;g!hM}>-al3N zwK{~41G=2Ml3*`jn3B@m%-l`0NtUl*gzz1eN4F=WKxP|Z4_r9BWCI!Qo(!U zpLf!g=7QW!V=JII6)%ZR9GNW?mFG8kI~S)@b^<#2Aitv9gF0zwH+x6)Cwy8iY z@aTp}f{8v;1HVeI^06Ktk(luKkQ|SovF<4f{bd2I3p3urjBC(NCq@jCmGU`tpQ{l0 zQl|P^@);OyYZwtD*#-noQyH3zA`^664WXeDruv(W*LD;UL-+Tv8K*JkB0jrc*5iv> zTSIuwrKd)Y3<*EI)dgqH)mMD~);T+(2OioEmsL9+vRHgO@+5uZC;RfvqWPFJ4vCk1 zvn@NPu_dZ38FSDYlY=fhk(5nel+dIw_0jKO0dcm_OE|ZmJ4?1Yxg8Lm*F`*GnN!Tr zS<^Xk3Cgsdl2Xhm+hi_{KVW0*Zj_M7xTfr9iLO49;^BMg&N|jpMYyP#F96vwJ!@N5`;YSZA2=jx!t#R$fBwxpJ+7 z=u?7u85y4I#%~vv70a&7R!dIBLx=lp;vIK0GTb}$T!MmrSKS29oj|gipnbs*FKV!| zvXX{|g#gSPu07wD+KsepsH>|RYW|F|skW}|xKlUOL340*b@Nxo>%l+>D`4Dfm&N>7 zlL4Cpket4D(gDT7e`C-mqqEmnTy>r-X&rBV{2ME2y^M?j*th6fIH0$9@TA?(PUmk7 zyRj;sJ0Vhu?iJ}k@kpZ=p9X)A1EyO6(xM&8c?Gf)!ewx(v0% z)r4J{O#%hFOBsJG5Nm?o%?iqZZ&_77AiiJLrKSBKI zQByY_I@ryrD2hV2yZ1=1JG5nWdFh&o^HYL>p%-e4^n{>d#o@v#n?&iY^p{*rd3{9m z;Uog-;u+IcE04sa)l;E`uKBM0vs3a&?^`w+uwJJm<)OpO?zxZ0R?0)q_ND4a?7t5y zRe4Qm8Y%K3?P3(iwo-48PzzsGbB&t82?PGz8qa6Ic`H|^_fuo~n>o$QGQHzIMT#s) zyEgaoYNs6d`Znz8)y@ed{F9M0HQYH{j=m6RPtKqZ@uoHx-zUMgHG6WLx9(mjrzxH zet`VEZ6*u@sZ7OY6@^2aU2f2>4*o;Dc#e#1C69Id3lWB{m<1FXO+o^@zjyi)*=G{L zi9u&FtWHg7+y&+CEnsuqY8gE?>r~?-`N5%Jmu%)s5k;x&bz~5TsY{&DR))un#B;M5 zCk>Xa)FQ*=Ym^ZK3F`7g=9iI@P8bu@#8&Ij_y#hE^{Mk721)uD)W5P8LpYG{vsx8=?sjhT}z? zmg*nxT+xawKSBzW;h*}LCnzyK_GY9u1gy`|BVBziOo406f$P54G!@7<7AnOw$x*9f z6-_DJMo_cG7w|hOv}WEe>j#cR(6h1L+mHQGV&IgsUvxj;^s1Io?6R)8VBiE~wwl}Y zX@m?7#Tg04vAC^vn+McK+@NUkbD$F9!Ztc8&C#{4yqrCY@uOJC=f1a04@t8}obV*d zONYQE5cvyaKGV$8TvP{=dmNnZ$yXSWGul|IFbhk=LOVw)1B}b~)bIVp`14Gdx~pH% zyj#7UD_%N!Aa}vq{_g&{g=nKnT#Gz3w6)c!eTNBP;D8xpC|&pCSP<&t&(o-q)$oUp zNvk&8k-Rv-C>QL=3qr>&y-FuDlS;tL$X6rej^WALdjofl(TOtWp?izIx_CspTCXghNoWpkmnJL`rtHx(w_ zpsk~iJb8#R>CK#Yf%SyIX2soTC{%}e-e2#|gx&jay_r{C z5PVtH=zxG$G@1Q)zWDS@_>(oqzL#y9X+>ok$o|+OHW!%EO7h{yD~8r@Iwwhs9tBGd!QQde_$x46efx4PMk4+k-A6DagY z%+)Iy|1E%h>h@Njc}ZfIVuv#J8O(jyFSdPNs4grt)4`X!FHSKS9>h_FK*@@vqEx=C z38bW?$oIcf*xKDy_X%F69Hapj-^Jpr@(^KTJxcX&^?{;V46H}tNc`{_Yp0)9BB3YF z(AjC7cJGC$k4!9RNfZ^P0z0jbs>7hkTqJw`6>mCOV!*JOc4xdkZ7q`T938f#9vFDv zv&^v{m1TUv=(8pvA!huh&a8yNGWpaL*cLunWbBDTkK^X{C@^$z_})eFdZA(^@2FHy zS(tPS%Rrzn%)xLd(h7_F`5r-}#SxJh?6%WLj#fqZ+w3NG7n0$2_0RS(WBI<*5K+da zh+_0N&aLKpd{khs!R9oXTt`R(FYFB5Pscvos*<;g?=z=Dz1B9}3{iVezz9n}!O*fu z{1xF?u~eQMB&4K;9fFo*eQ{-lJNq)RY~161?&6=C_Nu~Md1^~C8-Mg!aJan6mRQC5 zU3Xq8*{HEVK(BEaT$Zs~?kC;vHnXEH2E>(22)x7JT24GGL-W`lT}f+8RIKU;4qdAL zc=q<4WJVgD1aOczAWX%F_9qD((zy8~AN9*77~q6RA@=kbVxAZ5PLr|$C}vsKEIWJc zK&PBuy&73kQ4nN5GGTXCQGHcY?ehg2U`$|xt*bC*1W|sJ2;{NIMBCNi{Q~(35Vd0z zi-=a;E7!y@4W=w#a#54gy(A5P$Nj$1`Q?;zVBcIF6B)AR4-+5Y1ER{uJ9yOIr9-LY zsmcM8JmmcLo6q7!UC+Zg{RW@s(2{xSN>f~csFZADA{3`@J+pe=c0;*Jh(|5+$gQ$; z_JxI(Tj*8c&=Nb$y^@|MPXszuuY5bgXx($sl1^Th7+he2D?L$T$n5IP*%8&=0#nVb zYroeb_&D8*aveLZj9pyf$V5Cp8}uagN3r z7(sb6SeD?EG9bj0ya7h}h*A3CWepYPQS??Cwa+(J>;6}6T6Gnr>v>o)*3MJa;)P=6 zc3fa!U+{s{mU86`i;Yxxfw4><6-%%4u0tRSvV<>oG>9HRxX(9H&99Mjj84_logz;~ zz|V#;0Fe zPSz0?_IX?Me6ZeTmv{Z+VzFP##W3Kab;h@t{^bjUi;Bhyj5K(hLsWnUP%@m9J*>OT zl-v5I%3Jy@kP__g;5Z9rIZ zu$08=ZA%rSOmLR$rj{8*eluuMXjOG;t&QFlQ1%QRy0vs-Y!Z=}Ph`s~ladm1*Os@mU{07d-h@n>J9|u)LMGha&-xlRycPM45=bRLOM}b& z&K>s6wicMA$ zhz5W24)U)P#LErv_}2$w+}uy2^?49E^$Jo#vt7W}blPU+ZC7pBg~&*1f!$$9`^aHbs1Kd17WH8DifWvIm`TlFi0?H! zLt+=lQ`XPU-&I8p1H9<$saOERB1~j$i3cBdjGkpnjF`Mcmk154ng|+k+^y$F-()>X zcl*Nj+Ai0!$&Tr2yA0-a-8s{*rl%vz)8y~I0?LLMf6VQ_ixjjwLdlAffnAbH8%oV+ zRR`_#Qp8G34lf73f=|?{e7tYsbc%z&fLymYJr0hHRbJH>*{G>&sLII|zBN-);!`5j zyAsB;dBwwBt6U6a?wsmCnnMnc2vSC!XYykfJ*o*Ws1Mi*Zi%Ynuoc7yt9=4)Hx-j2|jgT*}SC|~~;9xWg5N5jI z#j3+pYAqPuYZiPOz!p_jAAd7}uEqO&7De7u>Ql9jYuWyqtYC9tEFR9%_v8T=jtjs! zV>QqXQuNB3+{xSDtrbHaRjba-FZW?Gf4iU{@6W%&1a%CVMt$B(lhgP?2>S%U z7I3hF*G6zPN3yNwty%>SuNlCn2Rt&U zLRX6|!X$*ssm_6FhR>oTH8`(^tvkzT$LC3~`ZgtLWcLP`18y-Lev)5D zHEL4_tOX}WHQpPd*%+kNsCN|4K4AHFz8`;^o16OdZ!+tv)B}+6%iadi55o*~eGO=l zxPqM4Wlk8`WbYZkE4U0Od-j=i?Tbu}ZSP6P-~5uqtNuyVg) zn8lnzWix{(O5{h3b)Kcl>_QoxTa33pv}xCf7i$4#m@)U6XeJ~`OfNJ=9;+B=C%tAV zUOm`|t97?f*<{Z}vwg2ZM}p9(Q=F?lwfYGQI)*e|DC)2gzl&WlrYy+_oA4HJa@7|~ zJ(zXI-{0|Ns7NLL`(n3Cr3Zx0bb3to^5!w71`5hAX`cYATx37jzhxi+K<3J9@#4gejdNl{Vu7aY%Kf?8H z%T3r%$SNqVPUOCMN?E@bcwOW~ccIeX&hUrLigk+X2j_V(4&rd5F@ z>3c6&RDWVZxDn-TEc`c??61;}%B2#=XJ{-;@7}#D7EfL7n9DI|)cAV&@|_0Dkf}yh znprEPyNAS`Lc&7QpmJO6O+IjeVIK&N9@R(;NC^>CFVVir&2Yz#$*pD_JXMdWQasD{NIm zJaJW5VR6k*wgG=$9Z^}e|N8NCz{l^pW)RpRaZ{qZ5^~4?f#rE+|12Ubv<58Zfq2k9 z>sFp7Y_z=+s8fIZ%lXW{^MK27(~Sf`^xuKZhw0lx^q+tDdypBpLScGL?d8A`I=Bz0 zGChERnll;n8w0+_-&Ep3dx3_IvKH?$1!J(>L?$UFm@4^`?94|Ft~g^tZq|_Nzn_o) z9bL7QfCK7oEN}@)alfktAR#pR1a1qm|9%PAgT{xS$`NRVV%GHbylfn}ASzjS`_}Z+ zA}yd5+6aqd44U@_Ot=XWzdpZjME(z;`=5X7pVbMJUSbmQYB2P+) z{y}1lF>6eU73Ml!GYobR^Gr3rx6&D1qBqei*innaLfZf1jRgMDVEg`oB<1Yu>#H^+ ztCuuQ?B?+b0)5$ii}XHzO8rGCe4O^Lb2kxE$w*O@Iwy#i`04i%^}qh`B>q6>{qi#rC`{LpxZjk#NtCEg z-v{u^3XHY>EA#>u8~cSat%mn^otA~df`^R$C}~w9tn%Vsi;Ok*rf#Vrg}L6&qFL{W zjF(|5nJhRVG7IWN@uHhO{Tg`|L+LHFr|G}lY=iq1$dHW~7Q!hy>UqDef4iT(6+J-3 znJ$pvF@XZA+nr!K^FS6S=f~$C0F1N*(hbHVdstpxehRf)@NY9^y`H|iy~8XtASEF& zRX~3O`_Cl+(;EQeen^ z$@wv}52hknb%QC%;`0ELh0HI@;t4B&J1x4xpLh04Oh2`=x98`G%F1UvsLYrQqfXdm3as0txRWY8*%BrKjM>LPAbA+yAgh-HGwTI#Y|M}ei z&+F_(aQ_?IW9z09i7!x$&2gy%d8;Vlf9@&*GoeK8Tm$?wahzhc4=~BlYm2HW{btT5 zwwCyF{mB0%YOx6TzdWMw9dS6Ly`jI{w-QpL$wu5VxI}1Vk+Zx5E+0K0%oF-cm?sWr zVs^!T$D7A{TujT0?q#=;Abm(zdZl-p3vY!29&*OD*6h~Bus(Lv*IdI zm;2Y1)}4cj)BA{vzrT#@3ouP^)?@O^Lc=E%U)d38b5HQ7f&t!Bl7G4Ph+$fEp!;8w zmbZv{gwD8;*1TN=yS^dg1Y@xgQ}iZouhp?W+$fzU1a#Pn9BW_eSuiWAq1nN~lFmiO zUFdn`g$xW`tn7v93c1#;nqRYKLKe65>K7HXTz}<2Wp625XaYF6xJ0+QJP{X+bDGSU z$SMpEMv7}{)Of=1UCSLuRcJ(Kz;u{nlNHM9ri~2yL(=#WUvS^P4;2p-b})RgPDcDX zqQ8Ieqz;8!(c_u8M&SYs5#+l3eYz*s{;hZ?Dkd>8v5JaeX#r2)#f-qBV$}C`qMJ0Y{>F20qu{|WYVI#!|xtEU694E-+<`cbX+4GCsZWy$z{3yKm3y*|&6zku#*-kcg~+?pp1( zhL!_w>18&bAiJx9vxVq|E0$MLu6J(;;vDI_2=o2`>R|Ql%XUm)j?4rE6bc$ z>kx?SW@h%e4uNk%V;xOvgG#YG@CE(9sW4f9T<>6{%vV}GePd~7r5U3C0`;KECU<0@uO$82 zYjTGfvpy)u-D4%c>pd{N73ugI&wzRKkxgf@X+C-bP{do9Ja7E^7oI+wDNc&)`Yfe( z%M=Q=%%or>SI{azJFu){$3a)IF+`ebfBH_wPkm1Isl6spETQal0AF!czBqvK1nS@YS z?gfgch3;f_HVG$94bdwe!4|EW!-t`M+6osEnN4ij4S$IA**y4%B!fd>=Mf?4vI@9K zk=@Bt-2_Sk1}Sj_MI1Lswj`fFSM)svgd1B$sZPaBlkPxVDOwGqJ?=TJlfn})pJ5GN z^&B&}+Sc*Jj@bqA*V01!15=piv1#@=am|DYDQBQo9a~lLXYAfl=Z+v`dkzuc{U&Z} zT`sbOhjTg_d3P4_0?D4PUSZ1Nz}*s}RV{Sh{-eV6&{hcyd~WVbSN)C)$EIH2vG zATrjEPf5%7o*8^OV<{1t6JOd#l6?EU)Y=8k6yP_Ry&0)LO; zmY&o&C{;On6an8yrS_-Q@h0$rv?er97;cG{%le^B;+00d#}K@^)J69Z8Dci8SP|PF z`-wadsYSX@rUE|m&_6YgtLtoqaw~vuZRAY(V@YFG2aoX*6Z@#b`szkJ3fS#(ZjWs# zQmBu^Qq<}yvm-V(H}dV$`SPzsVkcfzD;ug1o}D`V$|Q0u=#>Rz(Dmo&Z%rB4gFBa( zT5e9^Vi$!qcbiwcw&^iS6K4xTN7RC+M<}<?wwTne33WvCMZpQ2lrD96hR+z z51n&FI%|s<(lwj+A5*0zg2LX>Z5xPm4%;#%^9pt;Q8?9EZv=)NZ4BszLEz1U?k`q$uz-ef+nF8+9#sO5+zm}s~* z894e0)BV|wu^|s>#G$LUZV8C3P^^$Za)7y$DKEkbN~T+EmE`iX3D~*OW>oX~ds%sPdvH=2CNtG_u_$#zB)EX?m47wD=+bv2V+qxfG7a*G)r!K> z`ysVm9g>#Lt>ZEjJQHDAGRY6g+Prl8{tyB}+-1*{p^sl1AKrZ4>7&@*tHRFD5obS# zr#-OnatS{_ZB~eExaj+6lvZ+r99HkgoSKszip6rk^ZK=TiXPQzeLO^dO48dK z#rt$5@}24^#W`7CuE(-OQ(n z*owp-9Xj^WPlw8|UK$nA9UYr|unZ5D^dNdkm#O?tcK~EXnO_4N3*^xt1#sD%;nhHgP^#|X zx{Yr`VoxY{GPfVss9@r$%#m3aKy&*GEH1?*9 zCDkl=tIBQsieu_K*BjysVTXq}{$Yr#DdlR%yDYh-fEt^kO?r>Aq4!if>73aN0$z&8%)&x1z`citag6hJVDQ_j49ft} z)@`r2W}e8#Jo*l59SloXCh`nUXW60#GVe-{3CDA}d~C_B>a#(vJC+m5j}bo3Y5do> zy09 z{|u-KfFYGeb}1#zVc6T9bzz)IK$?1j`A=yoAu2~yIm!3Qs|hBa64=2KdvZgEzO7#D z3j3ntwZz@MFp?1wd|qhtP3Y*w6|muNLAjwQ$RB4{SE)+NgGMhKUbPARR`nrdTZ=bP zc-1)za31xYU$|o8kFic4_s`hAyz_;I|*edIYa<3<5_e_px4JH_b%STb~0&*Qw* zc=t|pQqK_us#l1`T-Z(2v7#F(c>L-4pkfiE-oLo%isHO2FVvIHKu-fQTY%XL zGY;o;5PUsHC7tMT{Mgv*^XfT%mi-}|PNE&13V%`<`{)HT7PHHVaOdeMl~Xq;7ydaN z(m*Uz_75)r5fC1f`E%9*G!!&UnVvOoa@<1>ko;C2ZHIvFP^uNA#v)GmHY8X$mu2b@5T3$vJu-a+_WcpLvoG$ z!Kxi`jq)qghHl?9V}(El=B6wMjqD?%l(oQ%S8mD3pD8K`bI3}s@sPa^@?#{#rk|1u z85qF8e@_uQeK^i|ps^qVJR24u>2&XVuDS&sJM@$2;Td<%l{u*Rw<$)`5Y}-je-K(n zMb3K^@Bw;rpIF*JzoM$PcC4kx8_YSUGj7y~6|di=@=p5KXZucSC*sb6vt>XMxmaA@ z6-m&-(E?<9+njRKX%)y|Sbk$9Q0&Yk$auEFfIlZuB+p{c+VICfR9h0xl)D72YR9c^ za&9*H?qPvVr=$?!+yjY;^biFCgicEomJ+YGf4`?l*ixThJ2O>K(=LMGs4Q@Ld5}Q23IX^6*E%HL|5iJlZp~nU%4Foa|pw%L( zY^NnP_1vM%M96#unMJ0>h9kHWuWXkx!hP)2v~RU>a;QHs6L>Hd*-ZCNh@h=O=DqZG zc^Tb}R1su<=;sLd3@jNVmAu{MbdOs>qN);d`ZxUCR-Rr{^HWSKm=N{+m3jqQt1CLT zVQH)mR<$w9kDm@)z-fDjR70DQh2vk)GsQ#)tn(}+d(|-+>)Vf8Gqt+xO` zC|ar#$l^*v=R>g=je-M0$+e1F0R%88h{#gs7Rxp_3SmmL1>-t6;3qZ+O_H(#^Kzrl zRQkQ|tFo05Uy^i&EKTw9(vC&qx;~B;04LR)E=r|-E=9FR)_1|QS}cz5aRcIUiyFh9 z)kkyhExdBhoMF3Z`lQ4%vq^no`m0Gg7=E_soA8*k1pv?K00@alY=gY!JT~ls4_+*> zrkj(tfIHv^@}1URA?+xyy=3Jb%iLGn9MAf4^xxAT_c8qOujibXFeWSmzKA_ty2ssb1uBnmwMYF}hoCcZ+!c~MESvFBm60P;DwJCKcqiSrulZto{Q|_Wm6l$8R&PC{58!Sk(Rb!7c-C7u$o0U4K%Ppu2(d#-7$jCM^HQu zvRAo19&%nUFTid{Ex%|lX0H4@>Acsw+-Xz&Mx*W~rt!2f{%+=lR92%mmG@3((i8fn zi^C={CBd7T+<|qPdeK@9VaD!a!~p`0YWwwGe);ydey4q&Nq%?Fi~XG3G@q}bST_5U zV^i{)`VN)!9~H9K>FxWEf0BA9q^24@at%K}^o`W_IeVsBVL=%QXMH(Nni8Wrb5TlA z6PDgLjiZ%0H4!HD*0oT?oZcT-1t|b|q5=~}ZE5Gg`Y?KOx_q&e*U}0kLFk!4pJHM8 z=3LM6sCjGkHEby${OwvaV}AuD!P;L4b8O(^=SQP6oXWh#4>+E|@(rQf>y-N@U*SO{ z*epE#50E}?aaNV_fRyR*(aTBp9wH%KIGG>%L@tW2Tgkna=@?@*B`~^k4^Th^I6!ol)%csH>p~M z{U)sb5wv`X8Q=R%Zn~(+&^tSDoE<60T*P~xJ-Py*>|F9 zS8o9QLcE|lGT$Hh_RUQ%njnotbLI%8%C@=Cz;=!v@&(qJ$l{ht*VnjOZF>?nmBPsz zhhNrMy7Yhwfs!l~`+kZ*mp;!}qX7ZNg~;^yz5O&Cv^-~x>$awRi~Vg&Sdi9xo7OQ# z`%QOg_rcja=@2irM+Vtfhl7YXF{i6gP6pm-#2Se(4*ntIt8cQ z#}H?)UAE``o+fLw^Jg2b;Y3aAfB9y+m=Qn%OVXt4{^Fx8*)5 zdksb{W+htj_HH~qDxon+iwPt1!u}V3JpR+x<>ftp{28s7X6%V#uB_VhD02iqs#rUG zhvbTaG@6aDP26FYcVJNU78gS*Ah$3FCH5vW(p-`(Cc%S_#jfx#_?Xd)A|PD?{ug_! zVS0j}Q&Xj#WeG^R{PzSX%`)1Ivu#MCO=RWV!l|(%QQg*`^g}YJy3wulj z^HcZ6E#cMAKZ7osN)0(E=vQItCWlo*izSXqGZbA)mdA5DBuwQ~Q;Nhp>gA-AKCnp` z2tufn4nQs9DhUuspjb{dfF6?{Wh&JS5DIT)*j@ed>+Rk8H}v?h=ikv|FS|>Wxi@eq zis+Da#9v6A8_gh0ScB4c?iDxR+-ByiXFVjrW@y|M&KllvJ(wa7*@IR3zr6(@86q?h(PYOaEcZ!jjn*7oW`z0ER?G{Q*NT zk##b*<3FsP!x`=7FOB?5OYqoK!YYIo6$;-Khm)ZL-ncG+@cXrMcoU+&c?hj(adzOk zx}sDOQR9_+h+AiO5h=h^yy$}MZPAYx8`3d!;In%uxXyTd7J02%z;2`5!-0J9w(6>b zxD@91VhDd9p*_c3g+E6Y2@+GHcC%NR=OM8<9jChM>A5?X^Oa;6J;>yo)b*yaS*TEt z4fz`w)=4ecp#phD9eBd)nP${A_1m6qxTyP_ZqZ#m18<`TvHL9F87}sC$XWvd&|hC6 z3A7&#sSdh@nmGP+mM8T+E$dSlDQA5NWEthU{skb;uSDcI*Sv=SKf!ST1e>QeuM2aJvr2F;^m4< z`zTyu7m)VPZFl)-mq{#%;w9-~meE%Xjz7I_!432OA)pWcV^0-6`u zUUg+jVlSxT6VgcsSI53Nfr`9e9mtbm#R^N*RD$BJoyT^Fp8e|4?SAw8lts!piHoLR zgQ>x`p#8oI=&@65b^V>q)$ihZ0igP_%bP`Z3zRhOtFKw_T+=#@Kyk_F;ZB+mB28g5 ztcuqkv2}~siXB*FDG0UMk;@J98O-In4SpaLMf}ito@@jz? zVh^{xlN$m32=%5`)oy2*^#%yTAgJTAIjIL3U^4VcXUaK%j{L|FjYew)4RM`Q2zcKx z{k#c*a`)rlGeG{bRY+*I^PG?+Shg5^g^92?OD%^pNS9C~TjMCC`cj@ZMen&^RBtOu zIX7MJ=lpANtBv}S3F*-n3SIcYm7O-)G0kXy%;E|}fSBH79yT3%Law7DJ=ybgfyZkw ze2*O{EkgPSqT}iYGtUC7g2GUq(L0jGTYc3y41=ILKG8#`x3pCR@D}R^kbPwM69Yb! zMIMRN{fJpRW1*VOyasX912#r`U&0Xh&5AZ8_l(DbpgtM(pbg=pSmN5ewH+hl=QR*1 z$V0Q}D}-D6tPG1c!}8>j4H4nJ7fogtweM5d_rDtKqaPgr3sTI=G^?R#Tzz=P->Bch%ewMz$2;jlrbPEa>`(@C)!_`ALJD!5t6~;Rv8`h%AJF!g)i|YR9bP z{cV5VItp3L`pc4_J63L%=_+>b%os8#a;T!Rv&qB>cxuvO>z=vnk5HG2?S|8?OmqX$ z1%C^UO;K_3EyD~?Dui^u!72W!Sh=+f(xqw$q;3=<&YG6eWg^dlRkGSUhQb@|=evmM z4ElB=2U8QW;kS=~-PpuEM>4Sl<-Q!^(gVquBMzG38uyEelBMVQJ0tZkJ`kjYkYc zcC~78+rJXFn*g|<{xLEcHehbr42#nS5&{+C|@RQL-_!vq`$tZL7NyBeo-r0ds3fN!OBNh$G z9=dwq6U%w8C)>UAjMWdP|B1|Jzxm8eQenx(#pUSq)ufQEfP4QszhhSA6eTrX9Y3Xf9596xLzj31Aq~=c@b=Wyf&8iA%l~jZ#9}m!^yNXl9WaqnatLI23-AG^`*nSl7hk! zvbimF5smpqjzA5x;-h!-R9xrFY??ohhc3&b*E~GMiZVVT{^f3uxdKSX$_7)seMZOc z!-E0*WL$A+W|Jef#(QD3wgfOix&;9PI;p31PQ(}a05bK14+tw9&iDZaTztFQ-ip!4`uy?!@1{oPHQbfWAW3Ayrngg2$SbGC)`M<@vp=@+ zw>lT`yw`v%Kexv(!wx!}>QKDy+)pznduU$h6onmR`1&p~FDFZJ z988GHhJf4ffb3CpF<(D;_Q?%vZhlX6dD7o=3gp_R%Y=H+@KIjtD2|w{Q1EcEIogpJtR6m5O%2x8f5WYoi^;1%gQD90n;M6$tmiuRr=v1Y_ZY;;m zs>2JSbo@qCTQ4E_x!{wvdfw^X=Y-1^zU0{8r-S!=FK(Od3)6G&lrKJ2>k6A*zfF}s z<~BFUNd4KXN571(QaJ@8d!zSmOxcmiPxZ-on*M0O46egGBexA5sZe-J;b)moU)+oE z-XbSD;gTA2(orr3A?plj)NS;|+N#D>7kv9s_wxzS*_n{OB0HcCp2-FjEDJoXi__EE zR}*}P2H535pBWkfTVG40_*-o8OhEYa=g*?9fHlHD*kJ!NJHcOzLob|X)wH7`XR)W& zTe|r4b9-|)bGJk6ZUxW6o!w^M8u!;awN-(SaNn($pdw$)6bgwX@!F`I989-0S*2l~ z>+Nn^2(Kg-mZ&xvsyJO9iPRnXL(s?QuUhvZ8~N*J1uQYB2Q*&mfJ<2hD_R<2zuZBO zb?zvXa{H3K8)Tt5{Gal7rPFz#|^o?l#) zx|s8p7as<7ap9vB#P96gA8lsn|n^%4tCci$@y*Eyrrb1q&x`EfRpYc zxf3j-HWzDgJ~8z1Nv*p&Ct{h}Q`S}MB<*_6uML=J#862;FCaq$!HR;>^0AJuAODyu z-?_5Kk2rBQ2(i>(D=IdN=zR#j#?VUgC~qJjm-aIeWh1ERkZ4HI{>epk__RjI-ka_t zt8~2l-G}Ti-t%blO11Rn0&g^Sy$RFc&-9&Oud1THOQK;b8IejT167r1j{GHt+20Cc zXV`9(>A~AVxgpy+VJw201w8tzDAjR7A6kX@MW|FBM+cz-CK;zvME)*}7~-%-UhAovkWN*t$9 z6C9c!Tae$P&>ldf^1i|bL%aQ_WSiB$vB57LcC2WAvyUkkK%PQ&+=5fx?nIPQD#t0e z&dZx5gWQ9dn|(7wsNE0ao!l|G<8|MbcEmw5LIW5!u)|6J#W$g^cwGyiRXA#f=0*=RGoSEwmr( zA{wThXDBld>Ggk!ygNa*>HLhGH49fJi>aj`i~108W|ac!uzD^(k^N2m+av)@d??Nd zv3Uw;4M}hJ%G0RJ*k%aLtjc!yk2U`nLzpx$84b`3;pv;iBA*U8c zaCD=xee&YJEJ-V-X6*evNMl);FqJnk_=6*}qZ#rS^4t96+?~_ZO?`W7x#QZ423_90 z!Nv!K&th!*f-%R9wyynVwK7SuNx=zd9mK_JsH$hDLIYb)OGTO%k&6qR*21gpEH5O; z7RlNaV`|+XKqxdpLsdcOVIgBK{^b$6-X^}vP8-vw44_vbhpFrk_zN5-ob*{453!NSgMbF4rQ+$$kDC<>_eypKz+nM4?#+;!g|X-h+w^t8qxr zIopTrqxXZ;L$YiE72QFf-%$fqsgaowm2F(at?XH2anz#F>~D}HECR=x0TmIrlh}#- zCF$``MRqmvGEUMVKF)Xc<5pdOPQyjT}pM^c4Z%Wxkumn5g>qOejmS_ zy3#;!NZg9y3kd_P-k_SwZ27?3c(%q%uIGpU1M^)w2Qc3QzJFo9YNB80hZf3$<|()E zv1koKB(E+(E@xH(rT+o&l^^+j;#74W2AXLxpg5WGF2%6RBZ^e6%3aN%9^wGzCD4=C zqgu*SHyS~Nx5OlI$}bT_6D1eKj$*@uQXHF1k(S>-aZZ4{_wmS`fXL{XI4E9525W~0 zi#7*N&p#kvrhh=b9Ale>vyR?=CM^cNIDmf5Pn@aEH>)-K*#k|IkKt}I(b3&&qvOcj-u$X&DmzZ(EC zqB-OUOaCM!O}C`?*hC`A=YOO{8}a%Nv%*A!gP`vE4`_Z)z;D9*T%UWvPGTDV)a!2A z`0^blhC788^-m{GI_Z+cGN)>l?fXh?7CNVoe$99JfK!lrxulAT>aSWwaugYq8ZTiw z4fgg$DpXt8-HT+X(fH!DuK}CA{chu`4Y0l<3sYe-4cf+l!_nBJc#-yM7pVRqX13wi zR-Fsg03l6{zVM%BNNvD_;CP*Ak?6z+>*l!%P1ISLpk@sRXC_c%(tD}u<%i zY}7u;WX~8z+s1f2)Cgg?rV3;4w((veo_lV4vfowC`jG_M%~Dn`%I;d}jtnxJeYi}2 zt9joPnFfkAD1B1TQ!u4$_*u4r$n4^x9GdluS>?sY%pc*8alJ-S2*Om9#lM>yN4sT|-v zG>oW#lU}*_RZeduOa?q!2M$W*m7gXyrDy*ld?)C@Xj&^SrLn3x0e2EKUEfVVU~44R zfDGSY7t#~uO!bQbQ{I?UYY|c2v15bp(9D3=k7cs!+pg8Na{P571kIcWQc&G1Fo|o6|Pq*+dwzp5{|C#L- z|GR7-C&yjsZ$3jzyX9NOTNd=_e44n;t83a<W7eJ#}`s9x_pg6p+f)-0!hdXb?L9DwoMzxwym&|m*AO@abO9!&o z^Rh-JTeEg{z>Oug*u}1n`_j_UD(2}c+kEIb4_T9e{14U_mik{O`8_{A~zAV{MAqQPptZkRQxsvxK#JPfs3ybG|P+PXYmRij~W=ayMo`2^%spo6>g zJ5e48#?G@x%0!0al=lTfj^PHJ+97YDtTw1L&9Sk?o;ZM`8o(f9&@@CcGLps2x(J4v z(;yLWxEb<2m5&lXa^NReVi*<@yk-JVCB8p`IlVXTQz2rU-htVLYJ`|An%u9U-P$!a zpC+FRQ2smc`?@rJPRP$d91(H0|0VW)L;SVLnqm$fx+nnry6ZsPEu6c@`RqS#4|Zq_ z@B%s0!WJPbql1?mFLv>1pDs^U!j!@Eh`#7fN3tmjWM1lFKYSg9h~2#Kp06;!O^?M= z27lEC%IUiCDp_o+F1DnU6tla|nf=HVyOr%ZvK-vfx``yK<98~GG*@ZC4pF&e`U zPM5EXO1WvSO*G4-UANOCeCFGYvwPwB_e;I!- z28Dkmm(`@nv>OttOL^$4DYz}e=!`%&;B0pLX$TPlh9E}@4Z-to6FgfOP@f+;kc`&$ zJJP1=pB=_qzI}KTZY*_t{ctC6zw3406L(%t^BwU&p4QRWvwze#&dtDodVUjI;8Vu@ySlvtA`U~ z?a1blhs}`-G;_vf?`C|~lkbH0)n}0HvH^b!3(lBivNEAL8*ufD+zXdY&P$NTDM#b& z2IbhWLpz%eF{IfRMbBlsE3bIKsuERhZn5#?QHsyZ_pyZ>2s1F&7p>vxXGIliwz07h z5N0~+<`)!{00zC;WK-j9I5B;ONNi+mOC2;o@)GZ!YRO}F&alEcA)fUQ^Ejtvu|fEtS3a`U~B3@#^P~6 z1pdHtmIA~5n1>+RLQAVecMpg8Oe?fCj-qiG=9lk2$)7Czvbl?eR#RI~kp{1@s0DCK z(PAA84SRo1FiI)tbIpnaZ*ghhEl#soRU{Xi&cecE_Q5H1a}GGcK<9URAV8s(bz<;h-qw3-TWF$%wElRv%Z8}~86eIz?bb%T4H0g*z_H6j zV>dD4i{f{)zT4E>Ksib7$KK>ToZkS(m;aLl?{Yxroe1`!Cv2hOhH4f;chKy!!iugr zh|Q}}swfV-u_?gW#kg=s8T`!o6#Amo-JjiIF2u}Cn!eHUT){O7IH^ZcjRRt^cIPjS zWQT!Sf;jr<1e}bE49TQkL6*;F8|Sn@!k*W_yf~5`A!N|6B~1o$|F3L z|5}T?c$ z$Pe($%*-&0@s?KTVuxBuYx^5$X9bkN{9bDu5dh&EtFTU97D*e0hfGeeywJ9al$Ej= zVpw1^`@b=}=fd4p#N3xGM<~Qu=kJdEgW}4Z%&c?;?Ea0}?KHroK^;oHk;k9q)9mxJ z^9<7$M&ok1C|jI)(6?c--c{lH(XG(<`K)5`*spq>ZMfg}o^5LkM@UvCAL!FXhwNyG z$Ryb(YA?9BU$zx58P=;h0u8TAt(XIhuJl_rp26;K#XgGbzbnje}G5{c*Vqs|w60Cq5Vo@BQ z&vx+3?RQlNJj zveUPH`l%i0uXf7)!EH=YTV?cCMO(bSpFFfW+MSI9_9y%kh;3$gK$Ayest*~24KcG9YG`Ciy0GL8cZ6B3dk`S= z@tfy0nwGDg(^~I1xn%X-s_eh0s4{i?|0sLQpt!zm-Mevz5E5Jh!9BP;fdmaMjfLRW zI0ScsCc%QcyETnB?(XjH?&Nmz-{+h<_wHS9y;XeS%VO1J&N1d1WBi`yng$Qe8c`!z zq~?M4uQVqne6hM+CmpD^t8|8H#;_O-*r91|%$vNiN(!qH`2GWuvLITUHoFaptU}FT8(kEwf#%C_aBplc_TS7n_j_&B*k-ca}TTg^(v?1-^QF3?pfS# zi2lY%yH@Ybk$99g;h^m3;n9~QD1C4Vd$ z+A6G{Se&9?e>EwXee_grOzedXb>S5R*P*44pZbLRTIFV&*=gjPgvceQj)S=m<%D@` z$V5bYHJ>MmWruoYz=xEh@8SOo;u_ zP3&eUy_vaYyG3X70n4lq=KME+)70E+FlxCw!1n2wtTOlPOOMYR{GWa+;%N0DP|Jys z`j84)YSa=D#6K|3Up8z_C@E+VsMx+~kr17t(o`z9T-4kN?|QX_IQ~}L@CwGNmY(6W zUEEC5I4r${-Qv9-A1rL?x6OwTdt+WBEFco`r5+8-mqZLqe*^_8CdX!=9@W&Srw_9o*(zMsYQ;4>~KOsxd>=YKGxeS^yU8cx*jpaHgXFvzJw zJEz=(FW9dRjsI_5-0mxJ2uMGRCk?4=_-0x!N_w!}Bthjr@se75e?$QqT%-I-Kf>mb zZ4m#X!0WvgKB`e2Y$6cpcroP`iiH1{xp5K5t|Tge(h}3MzlDW9o)?rWT3E) z83$1^g_S(XkGnpgBXvRzH~%cLq7*a8M(rP;=Kx>1Wq;o(bVc3G;BfO2mq-kxi72_l z&pyeMQx=q<4*R(O_^*@=ge}X}1GE-Zo41G$hcJbb@VSH5PQ68ImCO zjkr@9r9IXeG3?Pdd@yk1|BKX}0YkYrO9YMGa6b&>l%?@oS2n(T*NI|lxg&Y~5(bS& zz}RfZ=IOdKG$2dtox@fb;X`Z}QNy4@b`-2Yq4M%S!swGPP~U>Ej2dV4{AsP5?|L2U zVP4&;f)rH=utWO=@vmUd{L7i|6<~m^*Hi7s1ejI%k>CuCPi1srf;#~^#svmfE4v+b zVy%t1H{2EhA%&1Oo+LK&zlX?61Q3DnH})`sAgW%fqS1ow^EQpeC%G8NXFsdA|70%) zL`*ai>R4J`0^Mok8E)z_-4$A^ArTk-ZM4NdeUy&!XFq;74Y1GI&B_LfEamIhdvWa5 zRDq=bf#=uCMTNlBY}J&NW$*5~efw*xxKo0_y;BFz5O*GS)*pY+(f^hQ(fclsk;`I^ z>so5wyiSavx7n}>(+7FIm^M*xn+-07iaDn;Emgq*vJY?-|_+u7;heO6b$7zUsK6_!|^l-=7Yz zV{uWICv;q$Q<#G7 zmFr(Xn9eL;BqI5#hXYX6HT~wM>$aKH|A=Y0zi_vT${tWm(GsD6J-Tc@TvOnWClYMI zPT{29h?e^@_7@lC6h!2ic3XI^^ZAhL-vX#8_3-}-+eL(fR* z>#A8=y9B}jCSw9Q&qQ2vJ6$;}tjPU>o+vD3GtHi=4;Ahc8jMU#j#0cq9P%bK zQlrS5yk(NB!w64qcE6XuxVY|1O+`&)NFn-hy#QEf0)a(3zBpHN^?O`8F?yOD@K@X{ zYUY=xh#=_v?=0`pT!33k zzq5~;Z`9c|>_62q_jT)mY3fNT?5#h`qQXh&Kl_RKo(4b0d=LED)I^$X$j^C^x+5fmI08<~ zp<97@EhgHKQlCP-DDwLI`?9ugu3P06z;;pYOe*e~&APTa3e{$E-^&>hoxJYi2-Mkk zUAiw5YaF(m)wnRzQxoCrU0YfL6w~>)uGar2}{7m!v@+$M-g_c4D|1mn{k?H%PbbaTGlo$ah=eLuQ~ z`z2NCj=w85JCba+KCUMkCL)3xi}$+(&v{W+X(;DsmW2e=%S%{o0>ts$&chO_1226S zC)6lbwlKEXPLU@-cOAm;B!o@f6hHmd@(5ZTZvP&>jV1#D=!1toJ5%V#Bwo5sI;%5` zPKX7RW9&AgHl$`prp`dnE#`L^{b}*oKym6tfo4nG;DB;Sha&9(M?b^-+4RFh)WC7R z$yTvcARHtfxW47F`ixRom8GI4N(`v0azO7`&}Cp_TPYt{gI{#Nz#lE;Ezb)?l+*1m zXOAKzCeBgN?t)b;C>A4mOu+{+6o?`odOufAd}=d(j&##tfY}$BrZH%cTLgwC zJQ`Yz*1($|FWu4c6d4~9{6KQ=?mpAN0X{-|+uFqUPbj|dagggrJfYCaiEv9+(G8&s%?CHM4ztco&#$~s=QSD zgqegQ{Ml`uwt{Ab;xkJRix z#HOT>-kk{wcH0f{l~0UwgxIXQd{VL_aP9tjjXG8R%}FnC|3G$}bG%A>pjo2H5prY( zC`(pb$1?-idTx>*=&*77Ca1)H9R2Ak@Jn4*F`hOC6YBi2ClKKS6dUxUKo1z4*G@vR zd_7PxUdx35Lio1WDM<4@3H>x?GlFOB9kbu_Gu-|W8DR$t<|3D`I=}gcQN~u04`L)= z*mQq(c^$E-2)yXVHpS&kp6vwy8->=%h*^9aExVj+tmhmITBku}O(L!{ z`h7zz!h}X16mn%UrpwL*X`;|_3WtQD=j^?S{kBsd57r5;{}3BPGgLw7dk|NX&DH~0 z+%@6DmxD|KY%`3Nq1853?$cN)a1g(oFYBoJ7UaWL_5bWyH80-G63T8F`ph9FRALt{^PrLz^N3PY`1u&r1)8k6Dl0ND;Vzr}oS z{@rZPFXf6HBGgq{I%-wvVKx1d{PZHhVI9E;sAjzS2a7%;wFP}?VFZ`R0o+#`?$eJo z@Ql6mnZd)vmIpSG1&^?nATcRn&V6@7=yi``E{#cSC-Hb~EqBQWHqn*{d}#C0v|wN# zd`)&^W4Ozqr}{4*t-5X2ByJ{8-$vV`B}`AVY(fF&eLmse>yGUwkM&kdOI*gmgRbkF z@4lYp?$~HI{S(X7;qlPakPslht|K4%N0q-&C|ABwmXLsFi}io9{~g{c_vQ|hPfGF= zFRjj91{^&C>%6pcP6?j&v{nk8NEP|O4ALe7uamv9wafus0;P?^CY(in2tEp2h6eeTJpEeiyH zug120H@jzaz*q37$ce7e#4Puy(^xqI04DQU6GQTK6-T2uNp=w?G$u9|iDJ1tV^BOx zO;H=qZmTCp)vef|xQwz)+Z-pk=Z6fjY1EpoNQectf->c)b5fe|EZG+BoL%~M={^Da zTlb&0$aNnHViWY~!&X3tIBMVZrNWssKG_xlbNoig_YY4pI~sO#SE~&T3)UFKCOKQT0OgJ#N1$eT@6J>-R;LqK+0g?bxt9SSqop9k!8360 zcrRmny5TzjlZ^zR@rwtWMUv0c>G0ShdmD`0zaI2O%^(wQvg@qU#iEJ*lcGlEF9CEu z07^l`#>BL}p8}E-vb8^}&t+z5cH+6V2+?A+>?T5QVq79!O~y|*btm=UCZC&6GMb#V zjM|O2KCUfZ3>gI~G<&gUuO2r+Sd}?8 zGiyG<=}EApXaL!RqH}@PrK!;d9%j`Z2>kf$`2`vN<0@5BX=yFkmev9k??}dE3-p%jFhdJ^tKrQ83XqmTo65l-S9>8xXrP#bz{}^G36rwfd;>v>B}dK6m*tl zw>Z$8+zl_)OUulNjJn=h1Im=-yEkazW}Ak3D>SB^2aMOdLl7GpzV=io0Fks=wAXXx zeZ)J&g2h=YVoZ9UQrw?hr9`%ZgM&K}qAUHFXtJzUHC$7SA&E+fedjcaeeyPfC<1#p zDCt?MLp^G-Hi9g6_)D#;W4;frI8L8*4VdCgd#4s%)tf&iD?+TS=h36sPv>6y3_Sh7 z$qpe|$*-4AxHua3Hdd3?tWC{KKYB<*p9dEf7S`AfEpfS5Aj3lj zk!%l%O3FbU5$#9CGoglZa-70MK9@@lG*^gUY*X@*UqXo9SoHe z`s{hJ2DFdEUG10W9v<%L@9S|m4l;ItL%1VtG1#9QJm!h8b2zMB>d3H;h8u!8F-4dB zYJLCU%^6Q;63e`!l6!>?q{wd$4Mz!?Lf%!rDF*`D4V|6XA-0x<_Ca|rcTN?aD)84h z%8;@%u8~0d1e{?%j$SiD5oAj|LwTDg28u(+fe`QdIljq@Ea9t2Ghn9Zmu$Aq{FD60 zD}rHkPZy+4|HFYP(1%HzN%J z5MW5b;kO$Bi^~MpT${gglWW8dUcxPcqu#IdVAlnN;~LRG z%Wza&GkJP?ZNp*&;OiB^S-D6(X9>C7H_gAQR5lUF#*60_Id>m%;-o z)8+`=g+zWO^R`F#=7&1!Kv(Oo2&5YQ55?{HF zPu85+!YI28f_uXT{LbbZ6!hr-%Z$YzbUADE)#OR8rKw@3gW?f2F7AU{?m~dqB7rJg`}>L6p(Aag9d6;j%(MWkmF*%H8R~#!8xx8XB2JY7o@Tx&M;h zWEa_nc;Ku!;+mA$TppzWepJ=gVGcNr{gHZSe_OSG2Tc{BHw4Fi$Fjr`Yd)Chas6Au zY|(sn5&Z~E*szB26-KDU#Y=Fys>-+xl!NfiXntW9Ghju8Ik0PIhoq*xAHdn3 z2`JN?LE0ZTLCEmV%q1T4Rzyh{KImoRlo3<>o^b3RSH2UTE2`s*VZ)Z&S2j;{IIrg3 zG#~ZYfQpHKWgLCob ziQr0RWsfF89Ah|;dO9fjAGSF@UnFX60!8Tc##!1c-LsH=Jh z=Uc+CGK*>kyf6HG4QQ0Sh`E{z9oMzx8ltpNko6@V0Hc`6EMXKgS)rpp;UoeUYt5&I z57e27Ty*{r;%S}($6pR0%TJ$m1odO%7y$BU%&aMg$>)&{pV2^>UGNGDNYrprY!&gP zReoXDt0p`#3Y1VIPeB7$pad@NTOX>J=vEDSfDOOZc-xxd@-DoW6Q94QI=9SIUT5}F z9DLKqTjspsYT9bslXslLn)2l`M4-2D_$FN?Hp3NUtgoQ26Km3C%Q0U0ZTJ#s@(B&3 z?6fq_F=)&noCjrpz<7Z;S|SLP`K~LZR|6oR{TTZJe=1sRRWaA2KJu{Pl!CW=-WeBt z^>b6Va|z&mMl_s$REQ$`WbcL}oz*-e9oO}2N&rXoXa~j6B~A$JuH{w`{Yl?qHOmW7 z*Iv_C5oyV5qh!u6sDPSVaou8zo)s8AOL@XK8>hX$@k4r7t~7Xbg>`4n6dme2Ce;K1Ot(K z2j%hJ4AS&TMRKA6EL~i#BQiBMC@E8-5gv(|(&^gG8wYpOR~W_ew2fX_0?PDi1fXP_ znr$#?UIV9jBPuwZBA=E=Ig!yl#7ufz7e~8a-i`F6Np+&j7i1Jo>fDM0=?WC}=XfFu z4cTZQSOq7GZsksC>eY%%S1ifibfRk*yY-W|$IgtW#VOR5>9DSyyN+vYB>g_|RM3aq zYx7tA>G681hg111$WkQL4o<*Z|T3~%`x`3wpyS%b4P7Q<*xZpuJ01pvoyH1Wb0ANxU*Gf?AHL+TH+tYNOq z9S+7I>yLi79=NY>sR)g{ap19Q(`~1_9-(7$$ ziut608rov@_Qf>_s^oyXh2c z#wn$GhN-4blJ)`De8db>$@S#3@~gqJ@}H6=b+F5-kZYC_-^d!^a+LSZT}-O$(kx4# zAQQkUg1kx`i17ucjtbjz_p=LKGg1f!B#J1G*z5;@9Uk3|;xl%90PkoIC-ZmpHVWRU zL9Bxo^DF%m0#g#Tne>{MAzs4|ip+3jnj6*2<>to*ibhiCpl0i6f}QGW1JoXml$$IA z{U{P!jxeraY)~#1P#xcpwaiFxQo1NL5+V*n0L8sxYdboetJaPw`3bgLA+Na6*1p~w zg5yjIw5Rloih{{iEJ-0(SW-YPfrPuO?7y%)YQK0H&|Sto7*TM)D5_EhJVM4uNFXXH z0#KX%da>x%yOE?6mXi+6C!(Rj1Te$R%t^Kx&QtrxFDrT%)368V}a@WuE{b(Y}EtYCfG_5bWKV#V$tKh z8Iutm4kzg=ENKI%~!Pru(Z(;kpc%G=#yh!A}o+rWie zlnv8a?3SKp7Y;ti1zm zw5v)b^#lo2`!kQWoW`!@P~QD=(c!eNp3#mLk^W@K&plhU%d;y`pBf352TiCBrW@pd z!YTn{*Gz1UQp~48Un@ctRRM-NP+I)SETPhp<{%_HCxUODi~VB*nA>bdF+}|uZx7D} z2zJLuGRuyk+r)sEvG17%nGln_53S{z0Ic(w9Z0+^5>Hyrjw=TUzluQD7RQTo+nev0>AK|=;*H=pe8$Z~B|YxcVs#q9n(_t8jd+xFzIL z&dn;MsfgK{rXtRLi!EaX3iXA9bV!WB9oK^=E~Nku;G1Eez%qJm>T7{%r|;g)zw;Zk z_5u<_-(Q54y|51aC<3r0mofEd)TC6{QvAYJ{uzsn2u`Skjz zZVK-Beq&@j?LzSJ{EbBU0iB)KjF||$1%>CTcoBVqs>V%AZOHYp7v7k+Es@n8tM1p@ z(DK64ycLlrCf&5glct0`rF4dMLpm4X1$Sphiu+YbHGSG69@t+?e;V9rhhJQI82P=S zp#bG$1C+JA(bn}Kc{=!Fy+Z`gbOU=P#KxL%dx4b&$?-nf5HzPycISY3VSF5|{ebrTOMYEE0aW9MSaS)C3@ALM6A^ zgm?5sS;`fM%z88(RN=#CPP`J_Qqr1m6wf??oS|jIc{j_}vx=!`W9slZkx;K}*w0)d@i z5)3!zE3W;$z0B!po}$7tZ{iI;QReLV$1^z4YwNhIPZiVHUzR%aR+(}9gpk+8+Z;5+ zx{C$AG`-6-{D3Y(wwh)m+-HhRUS~##y~O$32prHT6(|9>7=Q`#p#ZFUJB{UASeAL- zkt+B;jE}91EpXdGuCY$}jc$+Y&u$$j2a|gH_r%n@g64zaAuxxB94rz8dzNj#2a242 zbhL;bCTLLi`J=na!tLprq|@c?k5GUu^%eyE>Sbueb$s}z5p z{ye%jZ}WcaY{iELfr}25PN`_)yN~NF(^y5UDU@HaKjPW6I=$FHW>?p{U;hNV)bA(H zYp(3G`NK+s_ZW@Iw8fUHE~X+@-u*~~OMp_%b8#=e7B|0cCo?1}b-_ijZHBl{8wRae z-Ff@Ba5|Xed4Jd}vR%>S==4Lrl0x^Zvy0jut&^UwwCMSE#tcd&(Z(eY0-wq;$X1bm zQp$HuPNq7MMNf&Wk*|QdCCM<6?!Sk8y|`QU^S}ejSp^IQ*Jy4SF#~KX9u(m1KBR3#;^puafc=ST_ma?!?qoM^qP*4C(qDa=YrS1?d*TP}fLENwWfa z9yLQ1K77ck=iIu4zL38Ci86bqmxPF;GDP>uC*VWPE!l zSv_`z=Oq@<)1>)+pGHlED&Mp~f`o)^v`o)KZPa?>jh`}rH=ip;rCLRLph5R*!G=V_ zX})QmvZ8kUDGnCqSP}$?JWfDbL%`M*Gc}@PaGDeMCq9YwY zpvX@tuSndUkJ?`&1-4le*0hiy#d(X=`kP0kwITOx*AvG@nnyo$WM`mQ$e>!i$0p;~ zf0`wW`CIEVyKA9v-hMtisdex)joluZeg_&LY93f1>aj_eqr~R;P2^!l}(Z*trZ znV>s|yx^KG_lO0rA5M7WZStQ3r~2M~XPEAJH?5aaFeA+etBL#punk!kH%PEU(Fib+ ztfDnH)}&A%W6Q4X!pCh%J04!p9K$ZYC5q9+G9=B^)cYUn!RyQYRTz?AyS?%?OvgD{k{_1Ki2{bT!5y50ggCP+7onlY7G0 z;oP(ut2u8w86PP0NUUG|@Jb*eot~FhhLpm$6N7-zyt_9D9%9u3Vlmmy{Wg!&`ZaiY z1q8fhGY}5nUSZd}ZPfAD&9ysv<-MaMp#s13`zkqQ41C%}3BLPjNOb)CG*kC7qhdlF z-?BeW-f_Nm>PDFzA0asoCm?-t)x`R{7}w5xq3r7|@+JG=BR{J0#~zG7l}8g|3}24| zBhh4KHwjU5k>5S>k2LD0O0U-pi6JdyS*LDTppo?QbqkYtuSGEhD;t~4x@E8rbXgt~b1jQ2l>ofP8C&x8QAUeOmzGTyy`g5&toYad|nO$*Pd&onZOHJ~!-;d}uR6f#lByw)@O;VulR zX_45(HkG@nW@`CZUwB8g0s%m*5$b?*P?Lwc@)L*O8EcGOEaTW9oJzEygj%(M;)O*l zQ;D|u4qXE-fa^rwmDA}d+zc|yFIWDhuLnm|r9qUpF-lK$Ea|o*@g;MX-X9up`>_v)QB6CX#p3WT>PgQsXph3v2Y{|VNg+<8TRM&Uvq~L2= zxkM~O$vh(8fvnK?2(DxP3?f*1p^JMj@$k&&+V@&^x2IX}AACH92{g#bR(Wcj#w%l- z85vf=)s4|<3#W=uCu*SA6$el1DUCte@B4C!iTkSquQlZ~Sm2qjtwX~C%r-C8Sm+io z$_vODmH-x~eCquj z@55KVDgc1DaG*%!GG|mL--X#FG11wla*eF*hhBA`kJaZp-w1h0>X_y>+gLbfzFjW2 z>EGW8uH?^0F_t1`G07#2FI|wY>;7zFh(z&iyp9rdkM|QA!J#l+s7+q9nVA>Zf2jrg zhV)m^gm9WEj#ZC{Zu|`29g`v7U|1XH>T?4?D4thk3QFXMfpd+nya>lLz=ztu?exSH z_wi9>rPjwQRj}uO_r_tN>)Cg?4L&1`);#$}k(m5Mw-OqP6m;jOfW?S$^gCu-MTrSi&^)m228HoIjN?Rr$wKdod+p zBeQ`nBTW{r%)12%Aw2VZ&zJWX1DY49Bf|IlJG@A&MWN?jw1-1b8-6?!Q_?Y~0qiP$ zFm+41&ld`_)P~%tJ~ z;2;g`sn68N?|tr1uej{MH8vPAD5CdWE&|RP@XW%k*r0$~nH9QN3X~_^m3vx+bP>HT zOLcY>PZOeEZzpZRm$2R3;9M7uSJu+v=W^mbppk|K`MaHUMXFQI2Xe13Jr1Jr1~H*+ zm(X@@2e`!edF=U13cCi^P8yfBh5_^8eg>+oS(2UIC4!|R-1`$tEUh+fyQ#EZJAO>h z_-d0W9o=H2+F_Z)ca5Jw?k&!D` z_TI6uzW$r{b9j2&!A{w4s6xveY6br>S0-qwc4p#d*FdMYEpdS?JtHHnul(Isytxoy zaluZP35MrCSRGjI@wPruxIHa~h+eYC#q~dISRl`i@B_e_Tes@gRO_^GbpP_@CN=XB zqj(Xny~iUQmj?s%>F9DpsjT*ukUT4}^M?)HF9|FbB}WN(OF2yL;Y{lNW)Q_-zT65H z+JFXb9?c8k5B*5WWd(*+heR{ymCnTwUbzcmuc@HhF@J5jrqM7RpSc`)q$tTw|zzayGI zFko8oz|dY#D}`;N?cv_^FVZ`at*{zX)c*rPx9sqPI91kKEW)2V2eC zMN#GYvCe~xw<^BLKjJ0lv>m2#^!wSk&aSo{^ra_;#U9?f=&4;e8w|m3FXrY%0yl(*J;q?2<49_6+mg)#97Rp+(KwV#oXlM53D0dK_F@2qXDTZn zG_L+g2Lfn}$B4yu^-YdVk_{c^bmrg2|c&f@9q;D)>&UshZ!vr?a#q zJUMFEwjY3kgC~#3rzZ|q{$=oY1wwLK+A!}=eM<|A*VhgY_lG>glP%iXiCm7`n7Be7 z*QCxaE|uMy-?aEx1O>w@42cJMp+iaBlFZA7#PPE9qRPB`b!eq#3c7onpSVNMmm+AU`x8v7OHW{f z?jW>^S+zc1rEVWudf67(ycggh-GTmk(*jWG{<-Ox%SHsz{NZO8gYIPQYW(mphMUJ9 zE2E9I&pSc3rf}|O?TehFEFdw{pOe?`N%f&?-3ZWBelPq|UDrAs2q_;VoyTsDe!krM zpK%fUQuOiVy6e#cyTj9EE5>o4i=gA_Td$jJ9W3`linbH!()80?!< zZm5JXhjL46KYR`@>!~OB^EPWNU@ORNrwxUPZgXlR9hTf3H9{`llFqC49<|96Y%O-H z$KfAM7sDR0v2_^TB1;{GB_eit{lRv1usGzOBK$JXZ4a!|qu!cD#tZw7GQf9FVbOOTROPZEpP)FWZ-=*-0&bNw_A0$ zg*o^oTVS53f~+Wa<>@nTEmuejy&B5fxo+ZB5ziCu8qYJ#u^PWN%CF~j4GpAas6hLWZj=bRtrt?W>LMRwNIaM>=r98ou{N$mi&xg7F1H3as$VKpUmxMr=l=d`xC1A5)#J!r#SEUaMdX+b5uQw=K?#J z8Piqit>@MkcaIM9lip%E8NO{*K1F$RCy|dY^H#@U#IwJ6voN5dE?jN-%XU7-9nRUa zUg@n$ceG;4=tww*3y-VvIR71Y18nkiwr3#y`PuvaK)E`DVRQP>~T@J^@_eLpTb~_dcUW zNK+IgdK~NU8N4e!%gd}xE59>s3AzYLt>Tz|S(Sn45=8?=a!TbM*pIQaw$x!1-OLSp zlZU?Moz-}QbC@q|jiKe*aEH)o02!r!w&%uwjemy1QP}5ObAK;ze{|x_QnQLXovOLD zYx1WXryOe_o=7y^{PJdna{6+HtY&Cl;E*_0HeE$z0vqbc1+prv4#kv{JQa-$cru0N6Oi zWVs|qAmu=d$lYW7&vuG}5bl&8_~ts5n&)E*${8Yq@qQ5x?(bNeE;oSf>u(w`5Q$UR z+(!Rc#QV|%w(id)gaPr2L-O*%-A*6#URV3Sp{kizJ?I2I3DM>j{ymaFs)N{ z978c`L9fpFQdN&-U8~m)7e|WOebKnmQ?QdX_T4rJv0(3OG=ewZ-j;&BaCEH`aI~c` zFV)N{0SA;FLBqNtdez|6OpMbEFA1Be*-gKAn+-9zbP3&Q=F)fKbid`ta7XYG8vhe0 zSocS{QE|H=VK`hF9E2FJt!0RT8TRUV?|&b3-9~7*IX7LBuRSZnXzuGrzlR>_o{~V; zcq2L8=9Xf!qqBX_X%d1HdvcqzA_G|Yz(sbXUv3KKj~-Tw^yMl#Qyp+d?wY&vhG8^H`X1lWdqUxb*L>x(2 znfIn#TVkdhB42|~oYwl-kzBL0G$F1_0W07Pu+)v_i(KtwEgSbljU}``#%0)m}+n$V@PGTW$uwdCL{cJIgA4+5UI1+z*| zy8r^61_lO)25K&STw6;^BP^i%8iVh`%nTbV7nBJK6hrmpQYW~!v9co2X>!Z7wz0tj z;V9#SBi1so8l4Y{c|c+3wvaUe$TL@LS^^#nB&cdsbg_0KNwe z3`h!6t4-9#-<*iP`Qk5>pvR;8*nv}LHA9|h!7RD<1S_mlxLM=I4ac)voN$KhUh1ll zxXrISG~D|kW&I3R9jbYvvkTFr+#x1{#&r#w#$afcCbImpe(IyGtRUvHgELxVFDMKe zZJ7URfl`-Wjl`Bf_`)O)$J6@VmgaV-Cn2*vc99pdb^yQM(I{XO{Q|9oa>XSx6&btV zaR#vXV4;1-7@7nyb5wC);QnN(5Gs3wLW{32bguigRpgf6erZzI!g5)@Uyf~)VBNc6 zbV_!IaGAVhMFt1>+|#}YA4bLo;H49URT_7^TU@qKa1^L{*t(l+7V1Vb0T}Lj-8`Vm z?+F|~3>Oj+o}RqcJ5<`(HzR5O4lA243%REXF5oghUbock)}}7lX!j2=qVjlGS214@ zf-yVberdU_1(_8VFHqRN4cFX)Oxdijzl8%33RN(nZcL-kLTsEWf9$4^dq;6wPjR`K zH>g!?7dR}HIBSVYluFjx@##KE6NB)TIhE5v>2OV0xy`7ksl&f-4LLf&b4Hq2zPMWi zuhs5rpwt25m#Xd(HmR!1KU(9~%;f}YDveK4Dwr0DJL-AzU; zC&6ypz0e7`^!^QXk0yb1^~Q?GzvH1x<+44IgHAjYT_f5cH)PaYzhb6WTs)OTg~u9| z<$442IX42?Ks}o(RgIfdFqtYd(buD2m zY|OFC#4a_h&%(-N{92N~Zw#gn=7g_$&{xaq?-(1NkPnb<_XuvgT%r+O+5}!;_&)T$ z^^v++_9!oKnaESHR$L2dOIl6BXN69=YVd##_V+DD$XyFKJ+9@EkzP6=gdHzEfB|{* zD0J7GeQ{1x>IoR4>&tG&bvVdxVZ$teaJre_FaQTm=&MxZyxFeHb4uLYwNxa~lPZ(& zAT*R(ib39{t7(z+J@{YFzLE2T@^@4h*9#}g&b5ma4;iVd`5#Lu#LQ=(kltuuZxd#) zV47pGEMt*?X94WzLB9W%#RAJn? zooWSNCK(f$&-^~z+1BbHx>wOkWO`E?5l2fnYI=y^HX!}&2!OD7jX}oc)CmCg%FIB8 z=R9MVix=c5et9R4EVG;@m$ttY~}*t|7gZ>cvU(6hf&SJS4X zV1#`y+SOZdkAy+S%e^wGuB)z(4jNtVO$KB~at_L#09IGS+c;|HZ%H`XzMyfnA7~r9 zKU|lVTp0}wo-zf#g`o$f)_4RIXt0q1E}{t)PNKnFL;AXUF@WZbN?`oPoxszbk0eMcj*O~ci60fZek%uWNGEng@ z52)ttjhXcb8X{*5!v)|?;}V81BN>`Y<_s1R$bFX{qO^rR*^`m-Q@!(j$Fb}k5FdZDM!LSeb=B_gFxf?$|SitsV5;t z*O4wHL$@U}M^k6x1D)%>Q3maE=5jgkOEc`S-MDERI#(r*berH~+`~55};7rA1@YNUzCc|GZ=>Dcg%t_Og zB2{=rO7Mm>|0$$cZRQbN34o;E4VvxdCELDo7C!65yL`N0yPYCoq=F3_adQVPI5&^- zA&f4zJaJPnPc6Xwjl{zV3}~{PVo*az;aIsW47{A_tR@>o)%F25qnU55#^UM#$q%~%6DdA!0gpVyuHCt*)^ZM>vTU<6th-wSq z=I$+BUjp}bILP>Br;yRe&EuV=fCta%UCzFX1RJ($4kFH!8+$ zf{7y0pFLUkvTvK8FI-clQ7~oTK|w=H&W=csE~u7k*0<%ysfYGSIL4&TYipwz*ZZI7 z!IhHjJjcN&M_EzbtZ*h%noMX;?^e&KOfdsyyuL+Wu-8lxyyN5nA&`scwhulI(2F+9 zng^#^@pl0<(&1ww7@+dBWwG+KxfkLLXG^&?IT0V_KHhDnbn1L$Q8Uma zcquQS3;aF;?qp)R^JDy$N70wfRu1a}SYPT_?IcZX28LvV-v@y~y*v(8>~ z&enF@?OdETZlG?UKIy%W(cky!OU}RQtG=7FVKgQ4b8~ED&y|e7w|#p+#xlyVkaa;} zy`!MYsOElb#!F_OUlu0S6E1t)NNB&7wQ!AO7=)Dw9(4}iq7JZPLR9MLO|}r>Z9I3& zaVU}>ix`PoY?GLuj#{U%K6tl4H_uD4?H)wT^9P$NSmfmVS&TAacy8x&R^D4N(-``2 zd6{#h2G;|)8A}8WgsONAQ9WEXzFl}7I{OPif##Xe;UCsl;S^mlG|Z2kjJFmGB$A)&x>3PuW}*c% zm+6_ytrZ&Lb9KP!>-K)G8)lHcjp0N@;9V|D1#%uH*zY7JV|0ME&A6B&Rg?*i1z$j? z>Qh$1!(`!vGfdR*poPT#4oPF0@UZgDjb5L5~|Z89A!vktw6oJ*rXJc&H@XS0zg zgOQnS&iTpkUpHNEl6>IAm-jkqK^SIw*V)+fmeU!O<3fN5ojR4=1+tSWd-R(q0{o!8 zz1^SfzI@E=0p$Uca@RiscyogHI#3|fa9k-|V1lx=PS()7E~SkRdf`Z=ktB)XYmD-s9F|D+9OFsK_i44M#dqG;S;+d5;d0>q zv75N1y;m!4#wHx`JFr-gP(S5tRQN3SwU(uuFSMGhAT7*L5-3vo??q32@Sq1RMXXya zxSdy!yk(ThV1KTJH1uYzCjqf%&7HTE#zxzkhV7WgHO{^V zH&9`{)4zs8;O~`gyWqQKpW!0JA$%DpU@_dx9#wZ7e1GI81^EK--T8QI|q)%M!C$OZH{aCpnjRbW~IaRz`Fe4 zWB}o|rheHsEJVbu?As7m^HG9iB;23w4zryd%h;hXb@_DNmFkHmwqX+2s^8&x$D+xs!{w;_e3GM%okt&vQOI4Bn`dC2ok1U5dp&^3#{ z^B=Wt1DDdnQ(ooTALURzxFeWzf`bW-FI1zr;>s8dtQbX@-^Aoq$}jH6k{Sr&%iR7h z^E(R;@0EfA3#JkUXOn4`w_q#r{ypO>vORcB?u*Jl@?5NCT+?YF$T6Q-oT-zy8P;d{ zvtX*gP<(aL=2HgFj-vwkdj9Uc-5-5mKT<2 zC73W2=ntDyy)^YWle{d2?Z|mh7shZAJnl5HURmDh%fPuEuLc8ie_7TmeeY>2XA@NI z7@q%Wu!u@+d>j@ys$}l7ipoLIWm0#&aW*80L4$R4!E=I_bO9MQ`ipnfg!lbJL)e>C zi@WatKj;Gm8aM)q8EJuR+pPHXx&K9@Q{8jgZ ze`Xl8vJo5TW4OQ|ut?jtA!ezjMpob3S_s@CXI)cjyj9Ehf%u+>`mgfgcS~+P8fOu;=XXGAL+{9D~^!gy(Y7nC7=%r<-uVCR$>LtuTM%k9}O+%8eQ-% zYqY=AkI99)G4kL$Aj5jZirNQ)aZ` z?tH4e=}eqNi#4Os;p7jmK(9cGG;Gs780av&^-FvGqjm+;hLIa;Ggm3}fM5GK^Skih z!jKRDAuTz?94Eg$-P_q!;}9p2M2C^{tG^fVwrXM_$asv2TogUslA0w%g^Iu1c86y{*TM+yyWmD^~j0LN0@{ey1!vGuDidSgQXU+-(i^bU(=m!$4-t-{(u4-h^5F^l{yz!XWtW&&#m{xAAS%7v!Mbawa#j8&NKy1`vuSABtczC>t(Xs5Aq;?=p zH{w8BATz^r_V+rmLAYPefGD05AO&6jL|DwY-$(Ua2`1=Roao0#CxK|_x$w!SF%X=6 zZqb@e!&nD&oH81^m7+9l*PHrQ78ZC9fJj=SwDAiX+B&?PkB`qsjTuUt#k#t>&{oi@ zLXwI!Izj)`65yFf1eaFB!MUwyCn`aHp%+d~r00XcxyUSzg&_NtMn29{tHMfW@Bk|R zATh-8MeIDCdMGh;gFTHFuYwRw-A}LKPQ6mr=hVSkBhveQpe_n449`B{7xKK(swwAE zYR5GvhhJG~Kh>9QTOsC;Gg|WbDd8CWDPXz3B207)9DX0T3=vb{PauM$1M}=2sUjwN zKu(@n2<_#uv0aN#z>E!{;yv+zZ8yB0mFcZM@&mF$#Kuq4d3-r|TwB5C(;6{m0MP&z z{&c;uNntYGT;0q}s1}*(?xhv|CU7jW#+-16Ke0-3ay8^}9hYm?UbIx~=(#-a;s%bQ z$0R9oy$&06V%r?nByLu){6767`Ifb2&gj^;yyxO_wf)qh=b!GM0p{N)V+6|J+9D%g z5W{g=nqH0577KirOJfp;`RHdP977_15;T~8j#g(_;%hmX%!#Av(ck%4XxnHFV$*OH z;IPBy?`BNJ{$k8zi?s6eA&3t|!|bH7+~64uYZyO>r32wEnpD=mc;2*50{-7GTvd2L z0rY%UdXUR`%U%UkI9>wJ`$aBc5aGBVP+CNX;K9TS7!w9_f)L?eXQz1~SRV*EKB8&Y zfg69^Zq8tiosyVffi=ooqaGF^&Yd2CS?JWleUu7Wnuoou94j4tI+alq@YnrO=SUS*SNS zDRCijd)wQgYGa@QvN>uq!W`PM{Ww)k1h)vdYPPJ3Tb}Wt&($~-&eq&_^m(>dzOEh4CMf?!|b&n^>=qvhx-W( zsA&>lILPw3E;sP;$N74o<-O*`s_bKu5?y6`I~TbuR-N}U3}Qah_Fl(8#6~tU82Ka>izM=?P_kCYY<`E;*gwS?U0olv8=bM^ zVx^LRNoC(7C`7WNgE91G$AiNF%b~>Z5Nr|`6wr!9H}S#QAb3ub5nv|(2iawe z8*df&LxOII57Hh>#v;H$%F|u=dN&dnD?{c8%3d0Owp~hSt#Z%2Fw&vi9FkM`DnD5!o$P+OQoXvx!ri66wlPwu|P(4pss_f8_( zfz!hY>mz}hhQ@8jin}oq7-W_eSCmOQNIy9}jVsE5fBShZD3$b$#_X@9Mi-Rw97Zm> zvBS#jfUr8z6hiH8@cB7LHbsRWI>zeBiOOME%@_mwpU4#CGP^y3`(Qz2WMrgSa?)5= zRTqIqdh6SZw8`IxSe|M^b_{FlQ=LIbbiL z_iI4UyIVubhKBS$#7k0H`f+Ur`zTcUoSdw~&U^8}x%2~7*w zYR=WA-y=`5pcZ`BQj^;RPun%K!9vGz7trlI?2Dtx?}a$>qa z>bEEea0N@#2g&OK!YcO%n`%3dS&+F*ao&OE#ohEIfT9O2lM(JPqFOg(5+ZKN-uANf zoV6@#QjX6*eO6WcYkfK`R2RTyM7JCh0ma|HTOVjafE+qSNi<0TLl@QR<<>Jqhh8D* zeM;MPwBoILC}4Sf1fHOx&t*F0aCQzx+&&L6_0_Jn(FG{U-n|M_sybfvY^7{oW^YW* z^KRz49ikh@PsG~@2=28J-Gmsl4C!6QMGHr z@b!Y}=UZ->vkDpE=doZ1fHdI6d^6h+oEr>k1b{he{`|B#<9q#Dd_U4rV%Hc0jH@|t zzNsjE+f!sq#8(&_O|{}`pdsQ?dyWSC=KRZQ;L?rbLoFp^Sr%V$-ng3eEHX>ytkcm` z-p*}~%0uSbZv!upCf9mb!PTPFSD^+Um@5^Pd#^_+#J6piHE?cx!%?PCzdSr5&pEsx zC*CH>jM!9=DUG5K*iDHnCL5amtM-4&&i`srGNEn*TV=6#TjJ_QnDRRB!0l|L$EtaQ zmA^u3>$h5KFPXDl?y&0pmbGr$+nNGvdLQmQ8$GAwqU;A4QMTP4t0k`x?gcMqO`NyV z_H6oCTh7?;&+TiK})_OZ4&vY-!v3kq+cLd=FN=GZz> z(i6Yr`=qi`gxhDVtglsfoBRG_cZJX55IJDFassMUtheTUB3e7Z@U6aUTv4};EP4J;hy-hGmf=L(hqxB??HD-JlXo#6E zKty1LcV6%D`LyA9KE0PiR-}1h?T;={effBl64Wwhh=H8g-C+V(KXTWp-dJD>GZvYJ z>d|w8wbriFh&}g+fLU2Uj#d^Gw%8fg)<X0`XH0vL^As>+ z;opY`H(|C3koJRhn<|bNRsl)=iTx+vwpwu^_A_>(aRym5Eq13XIU+1c` z^w*L0^T5qSfBla^_`B{?F-dI}L;L!fIC};y^BQU&6J9>>+@(0$HQT_7dJ=8DU;ju* zkmXtSMt@wE1GG+fXfQLgJd6yBW83;dAx~68|Ly(#(ALbvSi^R0wdTp3IE17&_0s-a zdsCuAj{_*a7gdI1MX&%buOTNmPIT};1sKCFoKaAj6E=rh;$+7ZsI2<~Q;2nd-ac?_ z5qHK?$*d61SO!T2=2=Lq(K+3V`+w9cpU(*+fLnwVaLZ~YCuw996q3RBjd%i+ zBj_&Y7nt8C%4Dw?NJRSbgsfeD^&^180!CD-YR7*p!#6n|jR9wjM@RW>H!uWsr#0B^ zX1TBY6?`H<4Es7SANTK{bzB|b*2&Arm~k6{w3ohrJ_}U)<=o9yvVY^7Ixq`Oo265z zX$ibwt^tRWJmUC2{m>gxja&q?Z7c|wh4CFE*L&(0FDtl*=>iVx2^AH3X4|v!!t`|g zo5zg11`y=N(&+Br|9Ns5fDiU$-fh;N=*4u2+V!t(%^Wd-E5pg2Lyq?!>%d@2IgV!c zt+5Y$uV-4X?vqqCV6Z%c>hl`V$2ZI>#^v5sa%W|7f=?Z*-taIE{615DR_p3Ks^NQP zf&i9$H=T#}bVl(nR)DN3d;o~Wa9{kZL|JqcVy)|ePMQM%w|o7j8iOj}>StKj55kq#}lS=>VuR#GkU`Nh}{=r{alk3jA zJ9|09Wv;%vgv5_z970bAK>u7JQov0=H|TmUUKBitms7in*ZU(GBAm=PZvx9sdhzE84#foJa&Q|3FQPb{E096&|TpuzjwN+d! zk&BTql*G6T1gDoK(mFbfT#om>krZUg_fBRy8-~4r07*cJy5n8v25!S>9YteIyNoQZL%XsJlity#%7jFF=OT;Oi*cPX;mFnzHPq~F|ZEw9+J1=2_0AA`0R>(6owGE zX1$0yPZdMR0Te3)VIhjiv6)l3uu}Y7%N6bK^6fg^9|&)g#Rr|Uh@Osnpqf!|nMF$# z^%G^Kzg3V-HVBxI>~m?$xL|X&9vi|Tog(^B4VE@FJndy~UDie1M|butaBu3Zg;sZM z_OiK-;&{xF;9=-M>Tm3za_Cgm93B-0`;&dj{$!k}AY zwVC)_@FcM6t44Pe=Nn?aGb(a2_DdWeSrhHBwk*w`#uRJ{i*J1^j2D}m_l^5ap#_UlTwuC!m#j~)DSTr8?&nb|dNr#(ub^oK zYhN&1pF_`g_apuI5=f!)1KH6Xh3}B;;p~)-6F7z93>Y zW?w#6yhhiGTQHN zVPwqyDQR(lAM}a}Fdg8uAnOWwoFH;l^e~IscxVyHC$SIZ6D?2wmS}r8XDw*z6;@+^ zB@{#M`R7$^_eOgbssHcfWMXUf{DD739~4dBGm{u?uu?cN(8f_DZe(O^8giby`@4)8#4bq8o-=y!s_H zU8`>e$HVs~F7x$~Gh6YGR3>?#4%&;2Kt+jus$FRDm`u6Qw~JJ0X4MAY3(N9mmW@Hx zI@oo9$Q@Am8q|FE3nZH){Oq^z?SKj;hAxr)h&BG(YT4=kfOPy$-S?Amk(%Bn@kup6I_3EpQ$L4UFV*Qe5 zlj4Nikxo;v7P3&xKUIPN88Z&(PzWW^svH1c@y{;gQ{I-6asVe;5c~1|^tk!}8&9ZX zRSpq8khr5=&o&7CNm`!w8lxrMIy4cekWFqN#) zwLw1v_F`*LpE?`grBQ=W9LAhc%@5!-dR{5ach{bvQoPR#0GS{VRQaPLf@5%_3#rW+ zSf?ixr^w7rH?be$P1RJi9g(N%G?YjD^_-l7#66OQL`wb9*kuZ`s=v&8>bzoTYA*SV zjDlR)TFH`qUkL!9iC({^Q?<1XA4QW~v;ZyM&P^Y#8|gG@8t!js=zlo(JzV)po|{e0 zr+4*h?EQ03gSri^`U|^cE~mN>fxqF8bKEqd1TFXCTFF(NHa0dRiz_JHKF zBr7W*WIY@y00#%hJqvH&{t-r~96-Jw3srrDeYs-QCMfk*66yC3b5$mLv-csM3x6v# zvZVLK1#}I?&?CiL7`y2+l}bs_p)Tsoe)qoPp)xSxENd`V07_o$jP|nd(`o8 zGkeEioJiA9!8DH_8Mhv>5iojV>KeB-qYoH=7A$dIANPh+`DV1ETuJG|8{j5x6hsyt zBSZAVN5;rm%RzQE2V;@tbX!iTJsvF-3Vt>BC!UMoI@Z*Rr&Ag;wjv+q(`T)O8`#Yq z1mI*fApgc&d>;XJxRk$flvow7`VrgCYf+6*4e3G&OdjL=@7yixD487#*-M2|*$A~i zBg3>$0DQwvJZ{a}Ao2~gW{Q)~4f!?3@;b<%n5e@}@PUcTc}iQL=?ZQ98xh*F?8clb zy^wU-A=)#gCD#ajf$GpQCLM{16SHqZ%fgSyE&b=+{X%tDtn{pUEW@=cvlIoCEg|?C zCE1G~8>A5S9b7NmMpwREZpWF71ljbgip%bN8z}$e1ez0Uk%12`E5o$1vdTN1Qajr` zyL#TH z)$1;IRErw1Flx4*+t{Zz`grD0;th|Y% zsr!egOhOGlSnz(%vPq@XBK(V?nl;bN^71QxjB&QyN(lJdujzL5f*Kdiu!8lsgMEhb zLXfgU?uE}1M3#KQaFgH_(wQm76OVHfgtuwTlZ(Hh=ru3HkPIf@^WpdI{|h+e;weDR zD`+SUsB)(wn$oau4-I#4OKyDpp?u33LlF-i#+dm zMdZs@IM;BFW~Q5{%mp<1FZJRAZm;1oB+2xKCWl>uOjP-}UI*Gv<15RkB+E~0YBg6E z2hY!^KuFyx0$pPhhS6s2X>={h@_q{^DudnhbqVN+PL$>g{8_T_6&P6(S9Sgc9x_Kd z?f(J~sbS(4v9s&^$5@cb48xA=pygQX$@_0*LgoQ&-vE{59*0lPbUdcklkN?BtWG|Qb0+qpc)PO?)>CiVHwFSeu+;UF> zoczA$Biy&drl&JUOCZ1`1cZNP>65bNGl`KAnEMLt|0Q2NuX_@-=``;G_RcRX85Z}h z{*2`u=f_&{L*`!(UQVLXPaEZ0TS_4C%)d9ecxtYPgd@V~P8lM#O-gh?wSzP@DfWyyGBZT;&YR4^sEt9iqbTuE*#>3t)iVKfYwGxCi0Eu*KM$Nma4ep%V~dGbS{Ly;@7ynpeo&7oy>*@J>ZE1r2QwwyS9{l>cN z*-Zm8!}h{&$5X3D@AkM>Hn{a*^b@3tiXR3qzJh4kNrhY!^|cJA%z0TQ^Q_^?Xg$n0u@={FM^x!t}SAA8k`?kR!KTg?3sc>cd2?i4q9!lr%lk1f^zbH5SRMJK7g@$DjPGYRM8Uebm68mg)Pc z{`o+$!}|oq8eaiua463CK4NPCQRg?OOxgkaunR6RS>XJRE)MlTS}L&%3lh4D^o%a- zHuPL-8TdYq3>hLYVw+b=$4pYDIv3k1bV`0qokhJa}T0f855tdAbTO<`&iUl{cx&n3mXfjdyAyrwjD@at z^tHZO4gq}c!T9K$TvK64{@X~?RchQyW8}?)W>s$xdB59l?M2AaQyZ@tDs(Eglt*NX1sV5G^f2UlnHUC9{0Qb`;1NAn)EzC-E`sABAt8WR8!ZB9&hmShn zQITGUqBhIR%de)Wjw2qfbnR*TJ;I$|NYq{RUBw|wFxn#Gl0`WHUD`k2uwGb!t8a=g z5`Lz8H4c{cE8i0P7t>JH^FudAP|pS~AHoy_YtxeyeQvkJu~052W>a2raor-$Rq zSZEgVhM=P=p{OmD7XWU|BfqZ^B=g9=Kp~!+36IKvV)id;Qe<^>dFFyYKYd?H?xfb6;_%M@KZkGXGE9ni%iz ze?EyZ$~g|M{>9d?lQav>6r9UXI~yokLvNYG}cLl>;4ILL==*k;OnijleEbnGfeDn?F<2;(@P`yLPhheDx}?f~~=(kX!4 z?=<6p=*xR7gL89E4uko;MT54;bfGhJoz|vJp%3V?38B19UoIw_mg|8HRet$3`^%h{ z-wfIOn<8p`OLyq3>~HaVPr839F1)J!VTW)T?zCWW+DB0Haff-RBvX;;meJtu()Av< z_Cou@Fe?B}{v*VY+s?k}9P>*&`iIuP@gT46cDI1c&eoO6`gvYyulpoz0433W!6- zzIY>BgZqc`J*mDN=m^5{a&juKvFl9x>M&gnbmiWBtxK2yxLRaghVzy~6+`;wLN|Eg zg&UKG1KA6id+V;;$cgXzdXp_5|pB;6n0Wmb%BrH zJf=r;;=m}$%8}R>ByUEq6J9Z}r<*A&^0l!MA;lU_N{P7C=Y9#4Pa&{?!wMWwY=hh7 z!<0nSmliK?;PMz!eTc(Wwn28@UN8GxR=Dkg7Q)6FSw4ew@8{n)EeTf?JOG~8UBh1o zoyfaEn_IDH*MeXF07=D`q6CPQQ}<{t?zsVbHKE~EaTB%}O-T*y#+Dv@j;>OawidCu z%Wj`Rixx)$H+(olPf=3E@uQB~*4EAA&D#kHYhMx^0X^)L6IbGw zrM_ogf~!p2#+={-oD?OhpB@4aSX;UIp~c8_m&~o)CZe4)3{BN1ItEoAh2ym5hifl1 zj(?fkz;;h2|0hw>Rp@V`r03hS_5q5Y9^x7ykoUk?i6cy5OIeKo5&b)&qnzC+lK z5(~}T3obmk$a~;n$kmsnBiarK5jS#yh7`k-KKLhK5{}f2oBBs$buIWb$B^oTFks`Ne5~ zybRFpZ$7-O6s+(_iHhQ{J#%jj(7YO-)aa9;IKGW;CG0z580?Kkh#>Uz8E`oy%4bLH+DwDM( zIY5t#PSDuMY?cDC?Ef-aq31=ijg?mvm5_TiGQf1AM1UL+4wLi>ajC#JNh>cte zBe0NjQ>Vl^4oD@j7&Z9wxsOjNDQk5N6+Bi~MP1jP!oXE?{;;DO^H%)M`{2>~NC>*l zJ8V5hF`Ig7jNqtCLmdd0DE)&HL>q+{C#6;OX&^e?`CiL6o_T)8bEK|}c~0X}UmNcw zGxA24+~*I}&)_K?DJyTujU4W0qs{J=jZUfMHx)N2KDsdx+O3V>Q1I zT-jkNU;PXFqE*Y791n0TXP-Eh2mr@2I8q#Dhcm(=gPsP|r@)|$N z`k5|S!rL0V68qla_U4BY@Kj|?73xjGn_Rsx&ahOqjVM}X=P2WmdVTd0XGV+&kw3=O zo*UZAS}ylQ#VV20jZIBE<>X$m`AoUW5>`c$wa5nYCbH;0YhOh+S^Y=5;#KGFZOKXz z50jz3@Xm*9C`1nkwr4~MA31A!?{n32Hm;ArLaZZzxup$a9Z zT(|O@oo>UthW-2ZLifkH%cqmOc_34@&m;lGCugSg_>h|mE1wF_j}3dasNu8i@MaXe zwPI-t?rK=O7;(_UGDd**miBro-1c)K%F+cWs)*#uO|Q#ZKQ! z8q)&<35c?$TOEdMjc+zmFcKeE8VAzl)4r2tiA z%kDl}I0)fDeh@IQq%sRT!kl|NmdD0=Fo#PxHAP&{orA!2k|VS?=h-^Ml8WdE^`C(2 z&mVwJ7eGc<3LkR(_O0-isTA0$Aoo=s#WJ|}J!=RRP`y?vz;=7tVqNYbU!C-x@cKS% zh-J9gN2~g}`2eWw5VE2-658kGph6=! zXv@_E+mS+?m#R!z6(715Y4E12Cn|G;i$C~MGB1^vcz$EYsrt~M{0>%yY?n0-HN9U* zYg#^%{A7VH5TMhKgJ$2To@srE9IXUi;_d3X21fcF)GzI%lr47P*O#|mpiNCS?m6u? zjiD~er*MxSRnjj*RYyqYs$>S?|RL&x5noEu{m4r_j5^slqR{DNRq{z}5=FqIk)L zAT$&EkXv+o}h{t+B6oNRU5UX^?R@s)HAX#Jd%pGHP%CIxoB96y4@GM`Y0 z@Bj)?nkeCTQ~`D~1DY;3;yIW%9LZ>Z_Jl&Dr1JpS(>+t7vly=x+sZnLGR`l)I02Ir zD4r{td%V2-D<>D}jn$m}11E0$6BqKsuZjk*f}qb$(>pEg5qQ@f)WS-4y9`fj@{wwE+|dUI(s*8aBf~|QB*3;D-YiaxES6-RnmEUb zk_IicEzdH)yh~{j_1nkg@lH4U6c>`1(sN)HF9@-|L5^CUTaacYy%AQco9zn?#*H5f zd`;1NDWPn~`2wc#WSR?`MBOnG=-Pl+_DAFtzP zth`y7qqgULwm4V4IjZOOdo5<(!rD4(=C^w|!yL8_+sbjT@H-@=;Oy;IAFo8%@0G^6 zWHp|NlMP03eR+AV`;!^g`F;IO%+CGp`@2C;aco?{?|`s)CfE-?VRpyR zxa}23C>p7vF@CVlA4h;TkGN0w5ne-N86G<;{%3lOl4STdycV|_h2kOuC3v^ zZ#q?9M1|hV9Q)wSA0HT-1*~II9>u1n_E1O)6c#rvy;Mnqx>Q4v2#l~HMQGQ;Hn{_k z{_gP?5Po9i=Je=jvHB%fk|md!G)~igJOFaS20#VxtC#Uf;AdDlf3mOLP=a3;7Ew^g z(Vl~&)(phnVHWIK$C>(sm3|_henHb022!>)p}|9ByBFaPSXi2oA0fL_q}4Cq7Vo+t zu)ovkmyX5qZyKl@%d0M*>z9+u5L0A&pze+cd%4498+SInBQoCorJB0cpDeR9?HVq( zM@u{HX8^Rta)`OcW(RHTD}eCvT-g%A-5bu(v2O?**E%K4%FZ_S59%1=S?V8dj}PGkiwrfz2ubP?%)2vhIDz(W023N!Saguqo&)4=St@DV8&vG zCs<(co@=DvSe^ay);r7->lh4w zD(gbZ(Y3qyV32V)g7ymlKH^NTB^s;cJUPP7 zCCkEr^o8!k#xt1T!*cJe$PDaRw$ykJ&gyL~X2kgn2ryb1ejYbI`vA*cNwW0t*4wzg z@yD_!+)Hf-js?+;0a7pm2a|1 z$N#`bun|97+)*_j{epo7+~VE{irgWc-`EElB8>6NQpFleIoUP#kNWcsdqM`JjEzBX ztE0bs{PNXk-@FYyY&rrZYcl0Sv*l<|7gw`GYmDvzO+1~6#vR;*0?D#(Olcr%hbKXi4|DpBpB4rn~vO~@*EhkkR(u27?vDdaq0;&!2TI*$b(QnA_Hkk1BC^g3L9{XezK zCQ(o9krWq%j*JzL!1C#ZO`zt&xt#cw`)ctu(l{8|O1<5PSJXE~a1 zxJy1qWTgKBA`^k+)8XRMAn3S;c#-wB(o^rb1Z;JU%nZBh808J(RT|vR3b(Kq7rE!V z=fEEO^Yd;Sc&<7q8WDcot}n=&O$T9y75=x+pZ0#~lc(^F_)madOy?6o@8uIfkKl0p zp8&l>8k}Ba3QGQ_`P6RYuD^%a1dOo_drg&tdok{RB1atOo~VEl%8H*`QonZMY6v0Q zxe!shN;$~Ig&@4fQxY<;ypfMzqmCnh@HA|M-bu%pX(_%lj`?+$lS?-?811d>q3R=$ zCL{!j(Ep@OZ7pv^XD~shV*sCaYh`7*g%T%GCro&iyR0>BKzd96OL41w1{L93Yg#*$c+Hkccm2go+FV84<1tZK zb{5IBh$u&%&L2!bJ@S=ok zO$LA6LPbKddHpF02as!^E`BBV4$6~D|F#qYXI(r!9bl_|t+_gXJ$EWH7Sq+p;^!Y! ztYO_vQP#Xj>P-_H|NK{RSy}e-!^4c&2%dwGyIQ1vz7~ZRqGRxvAi1Jl$ezWxw}kPa0#R&$(aasStLd^&vM3;;ygiegF5uH6ct%rTi8 zspW{F3^0A1(pOSmz@ho1fZxVctrn|efva997|yB{fdT}xO20Ik_oSMxE`4u4A0JC| zTO0aKd~4~DOvn_~$;?9i-ZV!!*g-%}5wqk=ygBId=?`|YQ$&?nK zl<4_=CwBP7Kv%tIQs-$G*H;%k^R`o=EmsEeVVA63=(r`<*P3=x$*k`jybhABDPO9c z1j<(_-yvzEz zH|4(l^6h%Jd&mQy2>Z8Naq}?u-?E?bQyd)d4PZxWQN9mB?_t?OjYw3hgc`>I$Zne7 zgTL8Gl7DVpm0)N^1m0;{X zQp!5zCkpFW_3~17z5VRWQKJWo5co3N|Mp;S&5{d)xyG~?b-wn|23qB5=I{<*$ot4R znM>ZvcE`i&KIQQk%>WkAw&>q{|JCoxD+7~CKgaKGEo0Q{NDE)PNO+4K557L<6Zam! zHVt|S4t4|?qbYhxmQRCQoq0(Q2m5&UF(}mGd>5J^Uw%XOJRr=c^lIBXxk^ew+HM2u zbxOvZtlq%|fk{30kS14D{Gy2DCp~@@aWCJ~ES*ZK+;(F3!?X$Sg;+bj5gz{MV#91; z!z!6yf@$Dx!@S>bB^9yl_1PPJo~9l)PV&uoW%>>3HY$2Y_p*L&Zanu> zCXrPeD#RjP7~a>arQwrRz$UQuxRWBR@XEnqJbPfd71)8U+jx2-zwVMMM&086q3M3V zZokvH3s6FI?l$|ZEgd(V`{nvq2v+SH=hbBslA49|eSVOqJ<=gIAO($y0WDb5(M~KO zv7{tN;=IyoZNy%mg(jVXv#z(yQ`%`lP7&bsTpFAb(uV1!C2>F@9=oJ?A`uN0_oG!z z-n9{f@|LCLw_PrQOwrK4JtJ-_EQ}ZI0U{Y(Xz+}_SJM3aQmAqHuERpTGzk%+C=?c; z7sX~*>fd8q8YYqLPhrTwV>Vf$x>PEawR znQYJ#o5mUEvHLX4d%0Ga>JjcU_W70>!EK4$eG3!f#Gzq7Oq^cCja?BdcKYg}?p;%n zHS2MjTV`B!1Xc*>#XRV^(8xP6)&==R^r%aC__^OQd=!e!OVD1V1@voW^P+TY*C**r ze}__FY6<{;Yp_`=(#b_Ck{sDPJpANi@_2-^qDye&TTxbzJu4awqB&Rk?9?w%XZy*q zCab}Wekw?JTG|y!N11J=C#M5vxd!YyWeR|k;p zQjzWkrMtVk8)+OsI)`pVN|5gE7^`3cmK(Cad9y->t3_s z`~9rKyGjIoN}j;DvTp>H$8b;mnmcYe{q3)_YCf?Z8$0@rxkfLa#TVlGltyd+B|B;z zbvx((m3_r1>xw$FW zy;l5);Wg-b_36mirXTJ0{lxsdtp7Q;u@!MQV`*f-unN)=V7vcOG<&liR-mD!MT5ke z-WxfB4xKz;bD1v17hA|JDhgZivQzKHLP~}alk#UeKG#_$8ZuRUW>7LLxHjh5xW#(_fC!0W;-ZQ;%fs~F7xfmsDSH8vKi?iE+=Jx=2_ze-{iq!Nkx)41(6l0|tLtV* zsk7l%?as~o%^wb*@JCprH6?ib*NN}*GxUm)mp;U?V~?OC?&lV!p;`hSf>S#u7nd5R zK2zuYu~y?9nDALU$xAb?^cRyf$xG|XuCMIuib?>5KlEgUxCHe6n*)<0zv4;Ir;aK6+ z6yC0`G%c!Jmw3hV(7vn_TFJj#6|L{(VECp}hP&A^fWXjVQm*MFgD2Y;byJ174_(=ZO!|2d%T@OBR%p@vIzs#NJCaX8An!QA@?npRUL zPfcfo07m&2n)b+#Y(Q&j*VH|Ii@~zz&8Ee;#R|b3$UP?5G5DLcAFuK{YJL(oz8)(6lyP$Fkj71EBO zUyFSwduHij@}zYj{OF&DET^r?fF`RM<&{ng9BNDVAWdRDhRkNI-B| zhK?>8#9Unh!1Rq<^SZ!vt!pLWI%8QTg$y&9edix8ht8Wu!f6aUV%#%SYcZi; zEo%u?H6@VJveH-7G#Th4qeD5l8)kmlkp+Biv2J@42v+f`M64!JOFnLcGsBZVS&Uj_ zn3*9((7S_T?aQ08)qEoOZpjy{63|emu$MMFQ*3Arevi~vP+8h9ERnqko(CVD4h~b4 zIChiGP_l$Nu!E*ZfJNIFPV%UI3~CRkzK=I#WjS@ zxQ;#qH6_%aCB_68B|tCFLHKN=yh@;-4CtCCpgIM`GJFTXpEB3*B{9PNOT`c3y>`^}PE2@|WLvM^%T3HkhsRJmb^kREc^Y4I(B{zBC zBx0YO^CKEztQ3eF4+=!Uw0;~!9Yc@LDe6ExPG7(HOz8~*Be7-1R)qpElMdPZQ@PBy zP12H7;jMYIJx*F9c_NF?DIXLd3L^tAQ+`SRHhR~A>&s(c>ac3<(RIZ+XxT>!IZ&IT z@(d5Cq~u+?t0ZxwG}GKu4;9tuavlmE4}n>~!;~iME^K%OsR@J0L=yqC^{9KN&HkRz zu%IpOY78SWoaV@?FLT4r`#ghZ9dlrtwYxf4OiYxiH1ponC|`zaLl>`sS`4ODi9Fp6 zC0JFM3cKT};NIgd;6dzaLLbp)k>z=-TU*#YK! zTxUSkD;_*N1rtQ_!}Op_(Hdp@pu3EPM!HTgd3pK#kFj8ZOpHN2S9@eNEv@6lzP(AS zoAgGz=Dz-Zw%GQL_u{(9T4JVjuKSjc*wC>W#Zj63<4U7_TUX&iFTuOJF)F;nAcFmu zvW$ovxloD5j~gEDVUGd|W_IS*58XCI9Tw}~29NMmqtdXx(2Bp)pC0HNP|;TpQ%)cp zz*J9(epM;+QV)MCbp{MBb4OwOr$+9i#!9^F^+Yi6YWcQxO4Lp{~9oMxX~E)KM> zZk8LA)}HnY1nckD#z<=knRG-}AASo*`Uc?nZbZ-`&~LjJvApTRfs)DYj3$ki8I)qn ze&_BSw#Y9~eT|DNe!laITJnak>EP%nug>Zh^2Bs1BIv50C?#sECoFEF-bUTGrB!CC z!v9l?4ZfY&$6B~70#S-8gXR(G-5e$m{EYkY5@q^BxlT>=*;)Qd+(=RzCqEvyn-kOrJ0HGrco%Ll>X_Q&rqs;yc3zadL1(} zESWD|e8TiK7<-E;P8B_gx&A&yI-ZJ+h3Q8@-+@&g6|wiuJH<9r5dO%98~EM*>hqcG z5QALat-Eqjw2vD+%vB@3v;dAZBb$Y^E2<0gGQv1gF}%RjT_NuwbzVTGA9aHOW12yi z5_-{&s-e@p;Mt6f=iaPiPbf?KG2-;pM@ffu(=4p#&*b>H?DO+EEBtov$ieR=_D7)> zn+e00WtPGh7iXu&6Q^lGFNaeV{)sL&0&E%6TrO^XKbh-U;iXB2)HZZ0xwg)hb|r53 z%Gq!XBT|ln9RH{QmxA)Mt#GAblD57c<6LWyUG259eptViOWCt-QqL-1opcCHhX_-% zb7X?d1S|X+)o;r?cZEqG;yoV7kEue|4I=j2a|UCBUI>;XGA1r zR%Vm7-Bhk#d5Es9xXv10^szpL%nj^K7VVup9TWLo@32zpfSRhSVbZ;U29htDi-DE$ zPoy)P%qeW}#4I%DC)7Q-@`88tGwZ z2&cbBLTD2S1B~$>YvU@|=HC-ou*e)mN238aN(bPhuiik&S)7}r3K#iO%g%l#2H`xM zsaSOArQdHoYW(hCp(id5cikZU#b79sFoxInjwwTczDV~a99At-YO1w#y3TAxavX^u z4V!5H;rxfbEV^D{09=Tl+|NKV;>?4*RQf@io|#orXQic~qP;n)@exegFr%L@G_-sg zvYq&WzQ+N#(}t&We>lx%81w3GNI_RmW?1;WcC_Zv&y2*xWU^3ZUJvZ9A9`24pXGj7 zNJ9iNO=Wt%4<)H3Ki&Kc%Oz=puBCV3Xtk6Hy9SXZRGl`*yu{k7xEUC}Dpay9w=INP z%)t0rsvt7hP{-uM+^(LRAl88WbmGco45_u5>g40AbE1;^--BSzABO|Lr_Y8Yfvnk2IrXN)rdT$d=4t{)r+hwu*BkMc&1=6wCl!oCK{-0K8 zpfHXxRu1wztk-s%rWfS)dKOr(y^$mqp@2rCrhFN5lXJw;s5jIWmvC#C=Nx}685R-H z7Jx~a$lGx#kl}S=_AI&~ruP~fqvcfpwtg0`3tv*=2!Yd= z-1{qHtYCT^u$of3jso`*n{hd%!)&FX(EHa;88FFr7K}_zqAa*FB@a^ zGKj>!oau%Zi?p>rUJ($zjCSs_UK>s03<9>L)TMoW&8`RD3da~fyM1_&4W|9EzH3?? z?7r34*irhKTW@d>B+skgeeAPd&A^b{|8ZB4cq~dsHDSW8pU*>w)OJ<53d6&ZhJY^$qKxT#)ES zV50B+-tts`@B6E~?ujtDUa|-e((8hXnuPr-4%6uTL)ksNUtduS4gBSO8C^*e2$tf> zz%`$Ez;E}kdO$~;_rmsQ+WH^2M+)|I-Q@j+h>A<{Afo|j7bDpRF?dj+N6CJZWKSt zDD-vb)bA?mTd`4}%@#wRiX}H-~O!syv;HF@ebg+ zxbpco_7h$^Q|o}-hkD-yYC51Lcp!CpTCyH3`D>L6H=4d#Zd1c?p)f@fUVVtuF3$P! zXnHkl{Pcd=Y2YZgaVOI|*2wp=fqaT7N-7YhC=vVT} z%-8mr5fju`=WD*4sUu5waj8qa5oEG>t&yq6V!)GCs1Q$e(&)es^^01QOf^9=pyySk zxbUemptt&UW?6cdozkPYrj^+tNBXcYE}EDd|3y{j&IDOe|D$j9+)byus!Pm0Z?r>b zAtZ_!t8!d}#x{k0FH%K&MnZpnfzWjPvCii1%uKW`^KlJ@*y}N0rt|1mvZ|XCpZ@gK zxTE6-3v3lknWd?8s+I#(Ml9Um(-1iPi}ga6z{LLSH(7YfQKa7_Q$uW~G#2qxQ4Pj* z&dq@Y^fw-W&+>1D{Wl-|=SSE#Nto;!jTP0nLzX@b6)sFY-QyaR@dz75?P47dY!Emn zP5$_9#q$o%*6xKdUpKs?yF2USfpD8xlD%h9SmKn#-M}aRU^SgV!gWI7W!aNYb;@0{ z!(nwKXpmMDC3e9fDhI95da~W!!@^I(=LFN7GGD=f6d>zii}vF8_fP1}Wk6`JAKLFt zNaix{{4&l4u3p?Y%mTzaF|bbPpHY5&AF2waHKR6(a!;D3~RB^8Ft z1)MinopsEGZ}gI!>uYJyj@7(BQnQ9+8thzsJv{e@F5#ed6}_kBe*5L=Wrj zR#aXQVfHbURudCF`o)C)e|Yo%{VZO8N18)k;^~rS@(qZY`j%H*WsO~zdheGlw3C}X59E%g_c8j5{H*-l(I!ZH3#t!4UmM<7J zT1=h{{5UIiFjIlA2OX=8ZQc! zSqr=8)jqE6E?VtwxjhfCYJdpeLWfB*8AEH-GP%I^ACL@kyLp@ILmTX|-JTx8!PcRd z&F)HhU-gSn4D}_~%-G-~_z!-|a-3Z4b>Cf`jWh5K!n02Fh0|S;QPiKApX+L^y}eBQ zO_4xBo|Iu?-qWKXix6-%fzlA8oGthK<#CnQ9H0)TF+bl=+^jNYA%zOVNDpLdax zl9Hlwfzr&%l90vVOdEk7M2Lf04Rb|Z$AN-(;fKvG7%3?Y2gRXBh&HpR5dAAtPI>Hi zt|2eIYA1DD5nlG%?#-Z@Eg#VWf;e7w{*EJoBw$N0ZJZZ4{}mQ8!(8sqs1rtLdQ7aa zc19NFbOK|fod;=W+L77rRAnfA_yizf`et`8Du>G{gIb_;JGyYx!yn4CBxQ9^?IA?G z=mv-5@c-X@^Iz}dYxsT^5b(c`+U$wDlvpcej&%w?^wVelu+N%jjyK6tLp`_QC8{G& zOqrR;Ts3{gJBW(a{=jcD!6a%Kt^@Bs<8Q(4uqGV*?_$Q4c1!4-uxTQab5gPySb{Ci zm5fif5R{q?Fa6|KQjv5GvYs>%Hcy3xh_hl2pABYXhFYL}NsL&C zG80TgGSHb{@z_MknhIJWyukKqBD({?h7vQEVrxeKtW`E0OWL-&csb0sB_PuINCsKK zApS?b(_=}#j_ve02RdOJ0oO+2b+Ar48qL$S8S?~A160|t) z_S6`8oG8fsRAj?J0onXt^0NpX(my>zioZq2w;yP$Vr!&pBN@*wuLnLr2H1_e_Uu1% zRj$tSY-q>Mjv0xr=`pjxvzR+=dAxbNnB`~E=+-$;gFVjw%FF}SAP$4fk-@Ky(YZ&8 zek2sk&|Q4Y;Xhzi$lyyQ0BDW1!Z#+Q(^E2bKLDxcY6tUL}$oH>spjn-@edssW|2bX) zrA27LAqdAoE+y4eDUY`SPz2McmOnlD%terq*Q?4arR^H&P+KN2{_B=tv3hK%vd}G+ z;Kf)_Zplg8ImY7}qOitK46irHAZ_>E2LEUB(qi!JwIrpeSKx!h*pC%!ay-DkpHeQN(ENGAD8jdI&;pD5z(@xw)69_=$U_m3ZLI?-;7^C2uy+3jzEuEVYrLxKzl(Vj|MSZQ? zEV=(i4n`39{cnTtfBJrgkW;Qvfl~wp;+VmyFw3u3XJMLC29pd>I#IKW+0pt+GIvw^ zSEG5`wykmJD(Gwk&}a$ZmAkLDCwKe_VGTF`e6~gJwO>*+b&B%$m2(3!7p*EI`h^!o z7GR~{1UNVwdjNKq(3r5L)qCz`YJvMZW_ZVsA7A}#2giMQ)Plr0o2r2cKpGplu>}GJ z`2OxLxI9>&*eD;p2)8aiS>*+!btB$Wtf{fy7>+RL^{X~cV(DhMcjudQodIrJ}tX`rU*o2fZ5YRL;Y;ga=f}*JcFB_GR1z4>PJhNaJNlPON z-fk78e*QWW*g?rRC`W~4aEOynJE$ByF_G~3>d>>M($CDy%o?cl60@>szbd8kC|Zre z0@Xr+I2a#wJvhdpI-f3ctq1OFO-roejQ&h!G2Du3#fI+M0arWe>U{6-r>3S38LPBR zXoP+5G{|RFjEvS@b_>sfbd8kZD<@zfhmh^wXdeP7%x)(tOjk@45ZytByY_m~v|71^ zgtA=vRjup@9sJx_U7Oq&WtO4?@$_zQK(-wVW`KMy^8XeVDp=LHP$!P-D;tiWj55mf z1*iDYLk1TOJ8bC7h~=8K-owc(zpum}nF(JUE;hww`adBczJ|*iXUYM%d(x}VPais@ z{4dL%V}^!@eNRoaC?wYczlCTrD70Xc#M6sMOR`& zs7>?FT405j}OsOAVSb`oZq<;{ZaR$*XHVKQDZ2Eu%O0|Ssk&QaLEo`F$jMY5tIBoTH*r))%l`z^)ZXXDVGZC z`fy%+_36qz-4N+@93CVpLn$3;z(`B$B*liAqF6{y65q$((Z3qeKvNS3#`v2j7O zFk`BUYWB7(2IyU6Ov<)26B83H79Dp+1vRv_X(xXFWW*+bmcGcRB@<;&WP6KjaPjH! z*&CPIiYl@)bHz0^)=@y*SCAm*BosoOGd7Ucps-f!Sn);WTY`L6zQH zgL;T2GtyEN;`RWBWxdc&BmLnP+HHC1a6Vgd1^Us(gQ7xgQHP!H)bhMI^JO*cC;p}O zY?hNM8g2)SeLp-VRK<t`> zmiBUet_Jt>(*r_HY|Hr0&5cKm;Qkxi*MNm2GH$epJ_^NW`N;N!T&FWoLes-oKtr_1 zU1#Sd6&^4hpcvFbvmfBj+B~YN2@a$J51a>Z!6M$s)BWL*K{OH~Pyc2b)`q%*7#Cl& zX+0jwE9UYFzH;!u*sT3fr=fa9@kc~C?gt&D>nqtZ`|)t>yNEZWA7DM(NSu9#Gyi*E z_uqkz1~Nza`%w+I^?C%JU#4;^;TQ~hWL6ls7o@U@^Kg+TJ4a3;PsFl2u?G(9TAN}V z?kzv|e=-k;J&srjiC?dFcDYrrdTc7*0qAL4c^9eN3>ZT5WyXom_d=x%hP2qdTjTo$ z;}0)&jt(R31n@w!4Y{I#mJ*i^01#t!R#a2~bZ((Rg7H*hBBGv!j?`dFY3ZV|+UWw) zKpW0jT|K?hFDd~DwIp8%NlB&2^2Cwzl7J^dG26StnNt4ETtzyNHI2W{ktDMaSLU{N z)`h$3tOde|e+4boRP4Y*P#+S5L4Ou+Dfrp>H5s#eMUapYzSP~P!rDE?zN)-9W$e^} zycosyw`r!IS{_%7(X7z$?Jz=1<6hzq`ucvOxQN4<0J^-qd@-#*6V4Sk_3L@5CF9rW zT!7XNzUD-6oCrniq0u$?*RaxNkvjAZ@)h3ZmYldVo}4qEL8aA$u4| z`Z8;Av8Uf5jA3u&c(~jB3x#KcZCD&|#P4myWfG%yq-_o%e{%O%YWdx&=R3PY9mcNN z3g80Wcv)44+(~;=Ps(otcECgvKTaIS0U`3;m3cpFOIUAL@%j~yAd5>mC}>C5vZjJ8 zv?Pub>>{BVKL*nzfTr5lWX7jcd>4rBjB%*AST**Z1S-Pt=J}-m_eABto;(9%Bw&e1 zjWSWnMb4QyarTwh=ACQxh=sm7t>Hn)RDLWz1p)VadjhBz?#SI3);D(Z(CXfwgM)t@ zJZ}D&-WB=ZSs5=in;{v{QsnXbJz_y^!Oq4g!-kz(74McrR!T*cahi)!b5_r0o7xpv zEq1I?XMbiFmVwPaA{j&^-E#iV#Z)np4*W5{y$C)l)2Aa>nKJ#~)7P-wRbsQMUfAe3n zD3i|=Y<>o41yn`qVg@*_pBvQd^gk>PUBrxze$yiQuipYzbzC3(g>?-^#YgKA8=e1LO11r_>Dw+=4O&Y&!+8OW9Xn1zHO z$oDY4tfJz>{^Fi595aR13^TKJP30?r9igNUmI>Ed_l-awy|cARzE4^*r#@_PVp)dPHkL1k>(o>t8){9ly)}r5rCl{Mk#q)o zdy>QDaMnwon3{xt@f#W&>*wJyc2@Us6i{;4$z<=u`lSoGIFC78f{do~W^HEBK{*sJ zCRl`oRP9$57sZzaXE%NMG%osQ+~(gPBqpaF9ccKPQ*$;<-EMsBBZA*B$DN-?<@eab z6l`BUKvOI`$>rS=5#tPx zgR^EM7c$ekV+I@sPH3?*~A zPmw8aR*?={;ggN}xXe`Awt~FmZRH!BOt?%{4W06c%@n>E5h+$2swV%lD@{_gu@PbB z4{(JF9Zno$2Rlx5y;*^E0cwk*K(EmG;iTWNGGO7*s_IB}zW-rmCHe(=a^e%mVjyrb zQrp*FI-pe&5sd}fr2C-g7cBz!HqGvK_HC1Nu`2ly7c+HK?FZDp#tMfR4Sj#=e6JCy zJW@#R!<&Z@huhNKUHgL4g(&gexw&SR(6K#oJYs3xJ7ys%s$0t#fQ+$__OjQZUH(M^xW!Q2yDLDm2Y+)iyy zP1;-iKZj<4qGW8qtb>Tij+b3sznPb=$KJxSnC5)?L#@=|TadOWPh)a*M+kl;avteR zoz-rX>pP^~B2JMKA=D^c{L|KV;qeqs>b1D^pVI1?;2}`~e2Z`SiW@33^!68T%A7GP z0I}wl;Whm6p|rK<`ddf{&{d*Q-ktAKlICsXnvI77^2$IYBk!GM0o>l&WM{aVs;U$& z2hT8|={ZhjMzUnxcdA&T!r%uz=*T5R?c7~?@5#|mHo*-z8bj!eWR-sumXCnO#l+X7 zP9bkY3oQ$`RbSyoGoVd_+<}XeC~#HD)h|ZOap=4H7#ulppysYiV-c)CZg;(k^AVgS zhJ61fcgvdq2l|Ax6!7Pp0{Y7gSc5!W_LnVwCR79dXVZ9SsTkv`4&Y_$Uz^Zbk9`XA zdemDTGB46!Ev?cBif@KHXLc6BZkgCXh0CFEx%YUR36%HvE>+}Ud_2{fcPt?HAHZoK zo80;f*Ml1#8uKEB%>7~8PoMHgAGdS?tpycr!PsAxm7Jm?p)8q=a)yvBpv|B#($SHr zv-)`&-^$Facrk4Jn7+V&sLs+3c!Y-mH5{ZyLL)|#;^Wq@uj8|z^x23A`p36WhpF-T z{*3BO!B+?4IxQ@(4h~e#5^yKyhT6j$;Fg8q--6uftfd;u$-$ISCo+*FkO7J6bkbR~@LVukj zFqJ>Rq)s@N_}hRXV~8imzYE^tp!!74i}eQ|@L1{3-C~Qc$>9xLRMqqn`-WZL)wNyv zM44^Ng~ zAn2+h$R|)YGkCAbm7*#gx4iNGMz4)EHR+q;{Eu6WNj*`;j2QBxY~cF5m$z3*OCv-6 zQO$Vp11K^kDsN~A#Yu_6As^X5;oft%OWNA36N7b2s?l*#Y(QRE;`~)G`T=SFn@Ow4 z3qY+gR#w&dJ{t{(WbO}{;&+o@KH4BeK z?W;g+1DY*69i)exOBh( z((Ejf;0YTVs;MIH`6;IDnEgt8Di5(Y2B9(}9EfRa9{CePpYM*T&fJP4-=u0DxjnyB zZ7Xzlxcs&(wJEFTa?>4F8p-pv5>^PYNuZSnMcfr^?unK-g%HVmij zHtx1!oZoGg{2-i|nn+pde}5sLn2{(iA338U75I7Lh2ZGSF#(^dOYjQcwY>{#;lUxfPrNU{qLHgZ}REF;+188CwB6tJPP! znQjb?G(9F-hE#>$RCNU;V*1_*KXX)_&06AKls0>%UQg2x0bo>0Gd-f>j^pUK%@WE#+6wxIpyVP^HlA(h`F%}b3lcCl;shU3MzP;zv`rtU9_d{1o1tfB8t zZQ(q468m5Q7|dobr|(c!FL7BQs2g0|--W5pn_~i8UO&ENp_n~zqSUL5GC?-L8o_1D zy#CeU^dBzjh&k$CF6x!-8$jrWef(zsEvy5KY5Ut-&IN0Es!y@gk~@PsQ%{IV^k+XiTyBsb8&%**gqEi;R#|h zP#WoelO-vB@88X92qJTqGo`QC=Y2N0lDRDQ8t`OeQR zJ?*^v;jp_MjZhgIs>=;%$Ld=?^UBkK1O zp0|Lln?5o8ht_a}uII2N4R;+KwNgi~Zo!tGoibzl=LbnXWB-Lz>J9bxR%4XsnHR0T z-pWLruACFW7JEN^-RIpFKF=(hO}ZkAD?AL9cJ4e4hK=JkkWQp8-QGOy>B;L(O5V+P z6&aqB(O0i`Alht5$TBq(Y)J6zczI9iKh@d*RqyAM_UjtIT&l(l1kqRA+)ZP_etUuI zG~km~cetNvywV(~vqQ(2ZgZ+J?5YRCxo{B0`3@;mh-YU_Mie5hk3K*Jtl>!&boxAlBC7#YNZQ< zN}fI5(|lau?C(zn3@WzycdQG04-i)?&7YDq!pq2ZqPEqD?*5CLPgB#AqO!=&?_P<{ zbxWA%gZg_9N5n+2UM)zY;?BCF<5%XF5N8qe)2@7a7D3UTHd@0hIlftYNB2VLaVxKr z3ld#YE_6b9zciF%?D#g!OSitLykPv)wASZQEF_cdmp}%lCNPJ_a@W*{M zA||2;*;9SaS^F(1Pt$-_^63>;>Cp zyXB_ii_8tJ>0_(XzC_DV+U!*@wWI}W+FE_0oo>`bW=uNF7m$ld!TdbPYS#jj*zqsT zZQM?X>e#BQlzfG>T2?WQ*Mm{xtXoS)E~S@V8UxHWH1Eq#it`$ewVXP(sR^<2DKzGs zkI@%AJ)$fc{%c9ov_yrgo~h*Atd_A!KX)C%h>awMp;D^ zLRA&Nvary7rxz3b%VTKtN1+FzDSJA6WnG*jUxSzNR7;G9?>#!7=YH@|E%VL@OOESx zIiXDu4%BqYe6b_~jS+jA ztLNmHAqT3-ssK{&~!{)T}F2Fx9Qx(3lUX}TWH8XmE`GIobW;5l32PesX@0SI{QD1Uw z*mX|u4c?;8?rucQ5ei5u5{g~lG~?VnBuJkHAuY0yXs>^V9d+OW z<%y?X@V_L~zeuReZ~Hy}J0cTct~iZ%E^uc|9YN+DR+bI9P^{4pI4J8R zZ|mBD+07a;XlBi#O1+RjLfiYz8};5QBF`uewD9+su6m2Fkr6`rMS#URa#i9}8pGUM zLUM8%NX2K;ypUUYAEL+O8y6;i@D$;|Pk+PcIZaq6rK-MyK5?QzU2pMjLPq>T;Pi})~-({`A@ z$041={9SCt2r#r}&d2`}?sB%B@+^`v#Ii6nlFlAAvw9uCdbCxdw$S4G0T*Qgg_)H* z>$v&e2t;1q4aR|HJx>bn?2S&Sy}Cd7?KV9)qPuHZ1|h4(QyO z=C06(lKCq<@3gpX1dJD$Q{tj8)_lMZP? ztTA8w1w{i(ew^uoG2G6qkumWJqwMU9w7B6g#+L&8NDjZalb0;ZOQ_x=gfH#sq4nN zNPk{nhSBXzdlbj18tJa(`jR<@)XR2CHGFTNEl=CIxqdjGf1nd>ImSwn2`-N@zAB($w>Qv;BFU^3(K6p~cU9Wu}J@S&hd)=%l>; zHF+M^QIxi!Uzzrqzaqo0GhF=OdUf>~(U?RldlBVPEBG!HfN=C>MY!(#N>KI*t$kl7 zc~-M2ZF5e*|D*Ne^v`;qTeVqom>BL%7SQClr~sIba;D7f(j%hjKsh*?clC1AVcFrYb=o(2 z-Z4=yQ-nrr|r4M!x1h{#&M4a}B=U2Q9f zF`j8ronaP232gFhsep#g@Ruc{B>WQL>DkHW3%DJM5L^#0=T3`Y{m!;->AhFEf@I_- zrw0T9akiLSm)uydWgO z3q?W7$X=wU=;;G9HV`2x92lMACP7IgGi5VJ=&JFQQ?+L{^n=Lg%UTR1$2v}c&P6G@ zw$ZV9b&7^j8+o%?nAU8%OjxmU@Yro1bhhuJ_3=6FyaN~L`N~dpPqcZiS!rJbSdV|e zYxDE0z0zLk*Z**Z9AAf|0nTSAiRm&6vt5_GjzI{ObC>$y=cKR#G%dc3eozxBLET@e zpcKx_`|Ob9wJr(Y)UO9Js8dq9Vczo)qTF=?VT?70Y8_KmRSAP89UA^6N=cL*1~=T zORR;e{R((xM2ox^7+foSfqr<$`CYvla{Db7={@6vmx_BaJj=qDzTUTi6So?yy<;7H z?G!>n@!Qfm!(SUPTn`KY*l9z`hu}rljPS1d$w}Cmd|UCC@}xBoJfYju6J}1@vi6UKf0D6+3kn zp%b>jELD@DDSj9Y4fiQ_FXFSA^jcdMAC-jN8Z7~BQ@uDX;Zix$rTO%zZ`Bp0=K7&J zM}H43Sh`U=$AHjrQ>wcCb>#sC7NpGB+q!8HkzksXbwE7hwex*7#JBs*MJ;~nR{CKg z3AYhb%P1yn-!H`1!xC~Z)ho5ku&dYO_?{b_oSe#H6?Rh>DrI=*ON;fFIwvhG4RlQH zd`2kJ4O0U;m+3iYAm)EK87_cxSR?ZvF!UcB0AJ}T11@V$4KLwch1`HzJj~gUDxAX{QdSL9qXn~a z8)ol3>@ErkTqEm!>D00JYB}b4yxUd2wB4<_&C2<@gg{YI{~PJ?>E^uA2mdyK+PF}5 zZ}M*>-p4F<{B%Qr07-@Tai-Njuau;E3VA8U%BZkidxc2l74lt&U+uI1{TAhy>$yDA zyj(F}OV`z>_WDn&h%zKt$#qG`XO@f-UXqr)k5}%UwMm|Tp2BSQr}ik&`D%!Cccz(r zE^6Y`O(9bbXcB9F+r$2E@VXu^uAfpC9bYMa=d*mf>~=t$IIc|N?&>VHYW$u(cm zzJz2TSW(g(;diwZCr$wtFR>bnjTr|eME$nG^gqt%eeGHD0QLUpU#fkX-J*hQknyhA zl9542is4bH&1d7~YxN&V$puD6*d3!vp?_mf_1^Uu?o`1~b#&KX)vfN;3~~vLTfW9G zjHD$oBLX{j8u_v=5qL-Fq|{^Vmx=}uTs94;zPRMbh+!}Pfb4K0mKyCrun zxlZ~eUs$csS9nJsreTF@$$Fq_JwBCnmHD|MGUH*}I$k{$XHKUyBGnQHKqJNm40cD% zmL$WYV)8)AN-D43+*Ai*GCc+Q`ScKDx|-2_c?c8wSo(&f)E9^{pning^F653T0)Zc zEfmehwAvR!6#yVCAqlZLaxN@zf}h~Mmoi-WHvdv7+y6T=R#}I8k5>VZHj}Kpwr)vU zuoI>h&ih(FKZ?fl+H`wr9Zwl`1F7d^;0g)I)bDRQV=W~@YXB!pHz>45{t_;W3LIbf zscNDE2rE0`D_~n&a{6uf?2a2IG zIQ;-GDc321R=EK2#DCB#qSfYn@pIdSxPGhaSNwdA!9Cp%J7Y^YHV!@;67(5-F7K&8 z+=*WHF|Dx_>m4fe#cidCmmzX%V$v9~d02Qhc^rbG@6FzN0#ikBy{3_`mJT{&)bjAQ zfMJ_4sfxzfGp=LjXNvw9n8y7?hBWXxN;^s%E`eU6-_*U%LeoJ`{)gGH@?OAr zO!g%T=^^F-A?w(;VG~!W=EB++3W!kCh za{_Be&dI6iFC;&j_IM3Q+{S#Z*t%6|!9+KCjyRcCP5F*_NY^}T~u{p@xQAlE?CU7b{t4P65wdzyt#)6{IHb(>8 z(4YDIH_^!UkVW5$?^lTqP3|&LdjwDjl7U0Q%d&B~H5UDriBm9J_Fj3-ym%PK5$QMf z;6!ELGi5qjeL16dJkU6|woe0#F)-IMAw2XY6#!%L+e;=$>d@rnS4yP{l^rgl=^!t0 zYH-aFzB*gVzA%A!b`*n>aG}TBm%3H{Xn_5HXv?J-UR2`Ed}(F zZO^nt-V8Ez8GMo!L`t+?De?yo$=+R7l9xqjb^UhEU#Ye!ZFo1PQLD9Y0Ao2c ztjV1N89C-SlVwpg2;WfcSvu+<9v0H3;-<4O{~_TpN)Kx-{2T4nuDmCm63H zT%Pc#zcBybXrUWlqT?b?d0E8+zl$?J&g~6wFZ~C;1}?{i-m#-u8VVn;8_fPqaHPPt zMWVMAz_ykEJRN>VkJ%3t&+sfaD8sXHzFA*~ReVCWBo80LfyIA#>bJkHSWcwfpdM(t|l(jo_4gJnua=Z-CC;{TGoPs{Sm3%y-I7DR>&bIB}|KFIn7yS$RX4eKNZDH z1^J2f^`LTFh!Yc!L#0J@l;rY>MELM5c54I-=ms;L%gy(`L@ZrWfN+Lho~~`LrKGZ% zNJgy7b(0L2o!N6ck|-pEii81lxtD`TnnRyZ6q$xd3FdZKkQq>Z=i<=!A2ewEER5>^ zsqWt2ncm|7fRA*-I>==>qX|1B9{0uBalf2Nvz_u-bzF}0%;gkqDv!>|HRnn0QmAZG zNt`j$Vov6ED8r7i2%#*uWhkZ)Yv)rvJ?Dq>JpF#Y|H9|_exCQ|eR;jtKja5%O7Th; z1O9~}uOjzE;07Iutombhv*_~%{#JW;!Ng=@VF68$%YR|kf8l(iyAq-ENMAU>Oc(ls zu2)tt`SsE74&cG7V8Rm_rLtXD{Z**wcDWtIuk5XOad&oGPUksWA?V`74mYP)`&a}q z=4No-Fi{8A=Wlm{)cCZvOl&dM3>7J;C!H zpgjuM!X8)=hR8Cu3t9B408ky&y!xe5Y|L+8yEM%`U)cWcIK5FMbueK7>D3|jFnhW^ z1Om4Pa!PR$mPA?#Fm&5kMwvT0 z60U%e21v~FI{#`0y$i9aq@(Q{!%y6NYopKgB8?WEAWq= z1WMGry0~Vc(GrO)#9)F{G*y-7k&xXjd*~^X0%;>}rxcr9u(WXUcF$8N6FqM|9hmlJ1-8>^wkt8A!|=UT zmjv5f%GrhN>TDHb^L!~HtfuEI+r%ax(w-h=M4p-&xpuUbgrQN%iIZEN%G3E)CGUL> z=*zgLn`pQ0P~ShbCDua0-&gmzy)y|Lp{e6U>$FtmOwJ@!E~$(VDwUW?E!&M@J1p*M zaZ}4pS1J6QltBTV>_E2PFhQ-3?o#}&$bv_mFRZ;}nkpGucOIc=7|znedaG7I9Misp zDv1M{`yXzf!$JJrD;0p)^16LU=OHyT*Yl201b)mfE(sB&nEFdymqpJzT9Q zJMlAj`II^8petm_YV3y_eJv3d_O^+tE_Lf!+TU9d%ZKj=3WM&-eRbh|nd^%2DGl+n z+pc^Q8GSbQE5)@6G^hXG9Sd*7yhI}Yoi4{!f1e!NJfr4EC{AQlR_YnuBuo7{LLsvE zVMHvfk_S1cYHYuc7_J9KU^d@97M!OY3b<3e*@0CXXd2@fjlxz=qxx^>x#B4ligBW} zi1Tt}Sv`jIWP%;)Wabr43Pj3gIjyW225$->Gu6SFX$(MdVXZHWSfCdG3~vD$2bBuF z=tn-Og=4vuttm$mzkq)t6b5u18Foln%7gKY;bkN9Q4g^CTtQgV&{EnRd;U+ODSQ zt^DGQ%OF&wajR~D{c9mQd2VWR*NxIMzvZvy9FHw$eGT!gjT0`{YG`*uEIv>-osNfzE7p$rmno{cc`dCU=OVd6MbN3Ys)l5gfCV%N6URP3`UD R Languages & Frameworks -> Style Sheets -> Tailwind CSS` and update the configuration there. +These changes are additive, add these options to your existing tailwind lsp config, instead of replacing the entire file. + +See more: https://github.com/tailwindlabs/tailwindcss/issues/7553#issuecomment-735915659 + +
+ +### Visual Studio Code +For VSCode, you should be able to update your settings.json with the following values: + +```json +{ + "tailwindCSS.includeLanguages": { + "go": "html" + }, + "tailwindCSS.experimental.classRegex": [ + ["Class\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], + ["ClassX\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], + ["ClassIf\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], + ["Classes\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`"] + ] +} +``` diff --git a/htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md b/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md similarity index 100% rename from htmgo-site/md/docs/8_miscellaneous/1_converting_raw_html_to_go.md rename to htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 0d6a8447..3669db83 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -1,34 +1,18 @@ package partials import ( - "bytes" - "github.com/alecthomas/chroma/v2" - "github.com/alecthomas/chroma/v2/formatters/html" - "github.com/alecthomas/chroma/v2/lexers" - "github.com/alecthomas/chroma/v2/styles" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/tools/html-to-htmgo/htmltogo" + "htmgo-site/ui" ) func ConvertHtmlToGo(ctx *h.RequestContext) *h.Partial { value := ctx.FormValue("html-input") parsed := htmltogo.Parse([]byte(value)) - var buf bytes.Buffer + formatted := ui.FormatCode(string(parsed), "height: 100%;") - lexer := lexers.Get("go") - style := styles.Get("github") - formatter := html.New(html.WithCustomCSS(map[chroma.TokenType]string{ - chroma.PreWrapper: "padding: 12px; height: 100%; overflow: auto;", - })) - iterator, err := lexer.Tokenise(nil, string(parsed)) - err = formatter.Format(&buf, style, iterator) - - if err != nil { - return h.SwapPartial(ctx, GoOutput(string(parsed))) - } - - return h.SwapPartial(ctx, GoOutput(buf.String())) + return h.SwapPartial(ctx, GoOutput(formatted)) } func HtmlInput() *h.Element { @@ -36,6 +20,7 @@ func HtmlInput() *h.Element { h.Class("h-[90%] w-1/2 min-w-1/2"), h.TextArea( h.Name("html-input"), + h.MaxLength(500*1000), h.PostPartial(ConvertHtmlToGo, "keyup delay:300ms"), h.Class("h-[90%] w-full p-4 rounded border border-slate-200"), h.Placeholder("Paste your HTML here"), diff --git a/htmgo-site/ui/snippet.go b/htmgo-site/ui/snippet.go new file mode 100644 index 00000000..68c9c1c7 --- /dev/null +++ b/htmgo-site/ui/snippet.go @@ -0,0 +1,34 @@ +package ui + +import ( + "bytes" + "fmt" + "github.com/alecthomas/chroma/v2" + "github.com/alecthomas/chroma/v2/formatters/html" + "github.com/alecthomas/chroma/v2/lexers" + "github.com/alecthomas/chroma/v2/styles" + "github.com/maddalax/htmgo/framework/h" + "strings" +) + +func FormatCode(code string, customStyles ...string) string { + var buf bytes.Buffer + lexer := lexers.Get("go") + style := styles.Get("github") + formatter := html.New( + html.WithCustomCSS(map[chroma.TokenType]string{ + chroma.PreWrapper: fmt.Sprintf("padding: 12px; overflow: auto; %s", strings.Join(customStyles, ";")), + })) + iterator, err := lexer.Tokenise(nil, code) + if err != nil { + return "" + } + err = formatter.Format(&buf, style, iterator) + return buf.String() +} + +func CodeSnippet(code string) *h.Element { + return h.Div( + h.UnsafeRaw(FormatCode(code)), + ) +} diff --git a/tailwind-lsp-config.json b/tailwind-lsp-config.json index f6afb229..ae70df65 100644 --- a/tailwind-lsp-config.json +++ b/tailwind-lsp-config.json @@ -38,9 +38,11 @@ }, "experimental": { "configFile": null, - "classRegex": [[ - "Class|h.Class\\(([^)]*)\\)", - "[\"'`]([^\"'`]*).*?[\"'`]" - ]] + "classRegex": [ + ["Class\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], + ["ClassX\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], + ["ClassIf\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], + ["Classes\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"] + ] } -} \ No newline at end of file +} From f39c4d2c58b0335d4a42c7634a8e2e15349da795 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 13 Oct 2024 08:24:23 -0500 Subject: [PATCH 068/145] fix doc page css --- htmgo-site/pages/base/root.go | 16 +++++++-- htmgo-site/pages/docs.go | 61 ++++++++++++++++++++-------------- htmgo-site/pages/examples.go | 2 +- htmgo-site/pages/html-to-go.go | 2 +- htmgo-site/pages/index.go | 2 +- htmgo-site/pages/markdown.go | 2 +- htmgo-site/partials/navbar.go | 16 ++++++--- 7 files changed, 65 insertions(+), 36 deletions(-) diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 92a90a80..c15900bd 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -35,9 +35,21 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { `), ), h.Body( - h.Class("bg-stone-50 min-h-screen overflow-x-hidden"), - partials.NavBar(ctx, false), + h.Class("bg-stone-50 h-screen"), h.Fragment(children...), ), ) } + +func PageWithNav(ctx *h.RequestContext, children ...h.Ren) *h.Element { + return RootPage(ctx, + h.Fragment( + partials.NavBar(ctx, partials.NavBarProps{ + Expanded: false, + }), + h.Div( + children..., + ), + ), + ) +} diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index 6f551737..f85e689c 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -15,37 +15,48 @@ func DocsPage(ctx *h.RequestContext) *h.Page { return h.NewPage(base.RootPage( ctx, h.Div( - h.Class("flex flex-col md:flex-row gap-6 justify-center overflow-x-hidden"), + h.Class("flex h-full"), h.Aside( - h.Class("md:h-screen md:sticky md:top-0 md:w-42"), // Applied sticky positioning here + h.Class("hidden md:block md:min-w-60 text-white overflow-y-auto"), partials.DocSidebar(pages), ), - h.Main( - h.Class("md:flex gap-4 justify-center mb-6"), - h.Div( - h.Class("flex flex-col"), + h.Div( + h.Class("flex flex-col flex-1 overflow-hidden"), + partials.NavBar(ctx, partials.NavBarProps{ + Expanded: false, + ShowPreRelease: false, + }), + h.Main( h.Div( - h.Class("flex flex-col justify-center items-center md:mt-6 "), - h.List(pages, func(page *dirwalk.Page, index int) *h.Element { - anchor := partials.CreateAnchor(page.Parts) - return h.Div( - h.Class("border-b border-b-slate-300 w-full pb-8 p-4 md:px-0 -mb-2"), - MarkdownContent(ctx, page.FilePath, anchor), - h.Div( - h.Class("ml-4 pl-1 mt-2 bg-rose-200"), - h.If(anchor == "core-concepts-partials", - h.GetPartial(partials.CurrentTimePartial, "load, every 1s"), - ), - ), - ) - }), + h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto"), + partials.DocSidebar(pages), ), + h.Class("overflow-y-auto justify-center md:mx-auto overflow-x-hidden pb-6"), h.Div( - h.Class("flex justify-center items-center mt-6"), - h.A( - h.Text("Back to Top"), - h.Class("py-2 px-3 bg-slate-800 rounded text-white"), - h.Href("#"), + h.Class("flex flex-col"), + h.Div( + h.Class("flex flex-col justify-center items-center md:mt-6 "), + h.List(pages, func(page *dirwalk.Page, index int) *h.Element { + anchor := partials.CreateAnchor(page.Parts) + return h.Div( + h.Class("border-b border-b-slate-300 w-full pb-8 p-4 md:px-0 -mb-2"), + MarkdownContent(ctx, page.FilePath, anchor), + h.Div( + h.Class("ml-4 pl-1 mt-2 bg-rose-200"), + h.If(anchor == "core-concepts-partials", + h.GetPartial(partials.CurrentTimePartial, "load, every 1s"), + ), + ), + ) + }), + ), + h.Div( + h.Class("flex justify-center items-center mt-6"), + h.A( + h.Text("Back to Top"), + h.Class("py-2 px-3 bg-slate-800 rounded text-white"), + h.Href("#quick-start-introduction"), + ), ), ), ), diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go index 0924f667..6922abcf 100644 --- a/htmgo-site/pages/examples.go +++ b/htmgo-site/pages/examples.go @@ -50,7 +50,7 @@ var examples = []Example{ func ExamplesPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.RootPage(ctx, h.Div( + base.PageWithNav(ctx, h.Div( h.Class("flex items-center justify-center"), h.Div( h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index 0a9231af..644d836a 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -8,7 +8,7 @@ import ( func HtmlToGoPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.RootPage(ctx, + base.PageWithNav(ctx, h.Div( h.Class("flex flex-col h-full items-center justify-center w-full pt-6"), h.H3( diff --git a/htmgo-site/pages/index.go b/htmgo-site/pages/index.go index 91cde87f..8470795f 100644 --- a/htmgo-site/pages/index.go +++ b/htmgo-site/pages/index.go @@ -7,7 +7,7 @@ import ( func IndexPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.RootPage(ctx, h.Div( + base.PageWithNav(ctx, h.Div( h.Class("flex items-center justify-center"), h.Div( h.Class("w-full px-4 flex flex-col prose md:max-w-3xl mt-6 mx-auto"), diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index 72390484..6bdc9331 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -22,7 +22,7 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { return h.Div( h.If(id != "", h.Id(id)), h.Div( - h.Class("w-full flex flex-col prose max-w-[95vw] md:max-w-3xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), + h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-3xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), ), ) diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 5dce0379..0bb23455 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -18,6 +18,11 @@ var navItems = []NavItem{ {Name: "Convert HTML", Url: "/html-to-go"}, } +type NavBarProps struct { + Expanded bool + ShowPreRelease bool +} + func ToggleNavbar(ctx *h.RequestContext) *h.Partial { return h.SwapManyPartial( ctx, @@ -69,15 +74,16 @@ func Star(ctx *h.RequestContext) *h.Element { ) } -func NavBar(ctx *h.RequestContext, expanded bool) *h.Element { - prelease := h.A(h.Class("bg-yellow-200 text-yellow-800 text-center p-2 flex items-center justify-center"), +func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { + prelease := h.If(props.ShowPreRelease, h.A( + h.Class("bg-yellow-200 text-yellow-800 text-center p-2 flex items-center justify-center"), h.Href("https://github.com/maddalax/htmgo/issues"), h.Attribute("target", "_blank"), h.Text("htmgo is in alpha release. Please report any issues on GitHub."), - ) + )) desktopNav := h.Nav( - h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3"), + h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3 max-h-[100vh - 9rem] overflow-y-auto"), h.Div( h.Class("max-w-[95%] md:max-w-3xl px-4 mx-auto"), h.Div( @@ -110,7 +116,7 @@ func NavBar(ctx *h.RequestContext, expanded bool) *h.Element { return h.Div( h.Id("navbar"), prelease, - MobileNav(ctx, expanded), + MobileNav(ctx, props.Expanded), desktopNav, ) } From 289337b5e44d5887fd22e7d94890aa536e17c90f Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 13 Oct 2024 08:27:56 -0500 Subject: [PATCH 069/145] missed --- htmgo-site/partials/sidebar.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htmgo-site/partials/sidebar.go b/htmgo-site/partials/sidebar.go index 8a38d63b..a2af4b7a 100644 --- a/htmgo-site/partials/sidebar.go +++ b/htmgo-site/partials/sidebar.go @@ -57,9 +57,9 @@ func DocSidebar(pages []*dirwalk.Page) *h.Element { grouped := groupByFirstPart(pages) return h.Div( - h.Class("px-3 py-2 pr-6 md:min-h-[(calc(100%))] md:min-h-screen bg-neutral-50 border-r border-r-slate-300"), + h.Class("px-3 py-2 pr-6 min-h-screen bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), h.Div( - h.H4(h.Text("Contents"), h.Class("mt-4 text-slate-900 font-bold mb-3")), + h.H3(h.Text("Documentation"), h.Class("md:mt-4 text-xl text-slate-900 font-bold mb-3")), h.Div( h.Class("flex flex-col gap-4"), h.List(grouped.Entries(), func(entry datastructures.Entry[string, []*dirwalk.Page], index int) *h.Element { From da82b7f536c42c4651b7620cee01da295691e3c2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 13 Oct 2024 16:33:08 -0500 Subject: [PATCH 070/145] config wip --- cli/htmgo/go.mod | 2 + cli/htmgo/go.sum | 2 + cli/htmgo/internal/dirutil/dir.go | 5 +++ cli/htmgo/internal/dirutil/glob.go | 50 +++++++++++++++++++++++ cli/htmgo/tasks/copyassets/bundle.go | 2 +- cli/htmgo/watcher.go | 61 +++++++++++++++++----------- framework/config/default.yml | 1 + framework/config/project.go | 55 +++++++++++++++++++++++++ htmgo-site/htmgo.yml | 5 +++ 9 files changed, 158 insertions(+), 25 deletions(-) create mode 100644 cli/htmgo/internal/dirutil/glob.go create mode 100644 framework/config/default.yml create mode 100644 framework/config/project.go create mode 100644 htmgo-site/htmgo.yml diff --git a/cli/htmgo/go.mod b/cli/htmgo/go.mod index 6bad2bb5..ba191b9e 100644 --- a/cli/htmgo/go.mod +++ b/cli/htmgo/go.mod @@ -11,3 +11,5 @@ require ( golang.org/x/sys v0.25.0 golang.org/x/tools v0.25.0 ) + +require github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect diff --git a/cli/htmgo/go.sum b/cli/htmgo/go.sum index b8b03a77..87e79026 100644 --- a/cli/htmgo/go.sum +++ b/cli/htmgo/go.sum @@ -1,3 +1,5 @@ +github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= +github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= diff --git a/cli/htmgo/internal/dirutil/dir.go b/cli/htmgo/internal/dirutil/dir.go index 27152775..7063e834 100644 --- a/cli/htmgo/internal/dirutil/dir.go +++ b/cli/htmgo/internal/dirutil/dir.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "github.com/maddalax/htmgo/cli/htmgo/tasks/process" + "github.com/maddalax/htmgo/framework/config" "io" "log/slog" "os" @@ -17,6 +18,10 @@ func HasFileFromRoot(file string) bool { return err == nil } +func GetConfig() *config.ProjectConfig { + return config.FromConfigFile(process.GetWorkingDir()) +} + func CreateHtmgoDir() { if !HasFileFromRoot("__htmgo") { CreateDirFromRoot("__htmgo") diff --git a/cli/htmgo/internal/dirutil/glob.go b/cli/htmgo/internal/dirutil/glob.go new file mode 100644 index 00000000..3e015c28 --- /dev/null +++ b/cli/htmgo/internal/dirutil/glob.go @@ -0,0 +1,50 @@ +package dirutil + +import ( + "fmt" + "github.com/bmatcuk/doublestar/v4" + "io/fs" + "path/filepath" +) + +func matchesAny(patterns []string, path string) bool { + for _, pattern := range patterns { + matched, err := doublestar.Match(pattern, path) + if err != nil { + fmt.Printf("Error matching pattern: %v\n", err) + return false + } + if matched { + return true + } + } + return false +} + +func IsGlobExclude(path string, excludePatterns []string) bool { + return matchesAny(excludePatterns, path) +} + +func IsGlobMatch(path string, patterns []string, excludePatterns []string) bool { + if matchesAny(excludePatterns, path) { + return false + } + return matchesAny(patterns, path) +} + +func GlobMatchDirs(root string, includePatterns, excludePatterns []string, cb func(string)) { + //directories := map[string]bool{} + // Walk through the directory recursively + _ = filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if matchesAny(excludePatterns, path) { + return fs.SkipDir + } + if matchesAny(includePatterns, path) { + cb(path) + } + return nil + }) +} diff --git a/cli/htmgo/tasks/copyassets/bundle.go b/cli/htmgo/tasks/copyassets/bundle.go index a24da76d..f0f76992 100644 --- a/cli/htmgo/tasks/copyassets/bundle.go +++ b/cli/htmgo/tasks/copyassets/bundle.go @@ -92,7 +92,7 @@ func CopyAssets() { }) } - if !dirutil.HasFileFromRoot("tailwind.config.js") { + if dirutil.GetConfig().Tailwind && !dirutil.HasFileFromRoot("tailwind.config.js") { err = dirutil.CopyFile( filepath.Join(assetCssDir, "tailwind.config.js"), filepath.Join(process.GetWorkingDir(), "tailwind.config.js"), diff --git a/cli/htmgo/watcher.go b/cli/htmgo/watcher.go index 0509b3d5..5af47b7c 100644 --- a/cli/htmgo/watcher.go +++ b/cli/htmgo/watcher.go @@ -1,9 +1,11 @@ package main import ( + "fmt" "github.com/fsnotify/fsnotify" "github.com/google/uuid" "github.com/maddalax/htmgo/cli/htmgo/internal" + "github.com/maddalax/htmgo/cli/htmgo/internal/dirutil" "github.com/maddalax/htmgo/cli/htmgo/tasks/module" "log" "log/slog" @@ -13,11 +15,10 @@ import ( "time" ) -var ignoredDirs = []string{".git", ".idea", "node_modules", "vendor"} - func startWatcher(cb func(version string, file []*fsnotify.Event)) { events := make([]*fsnotify.Event, 0) debouncer := internal.NewDebouncer(500 * time.Millisecond) + config := dirutil.GetConfig() defer func() { if r := recover(); r != nil { @@ -42,16 +43,17 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { } if event.Has(fsnotify.Remove) { - info, err := os.Stat(event.Name) - if err != nil { + if dirutil.IsGlobMatch(event.Name, config.WatchFiles, config.WatchIgnore) { + watcher.Remove(event.Name) continue } - if info.IsDir() { - _ = watcher.Remove(event.Name) - } } if event.Has(fsnotify.Create) { + if dirutil.IsGlobMatch(event.Name, config.WatchFiles, config.WatchIgnore) { + watcher.Add(event.Name) + continue + } info, err := os.Stat(event.Name) if err != nil { slog.Error("Error getting file info:", slog.String("path", event.Name), slog.String("error", err.Error())) @@ -67,20 +69,22 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { } } - if event.Has(fsnotify.Write) || event.Has(fsnotify.Remove) || event.Has(fsnotify.Rename) { - events = append(events, &event) - debouncer.Do(func() { - seen := make(map[string]bool) - dedupe := make([]*fsnotify.Event, 0) - for _, e := range events { - if _, ok := seen[e.Name]; !ok { - seen[e.Name] = true - dedupe = append(dedupe, e) + if dirutil.IsGlobMatch(event.Name, config.WatchFiles, config.WatchIgnore) { + if event.Has(fsnotify.Write) || event.Has(fsnotify.Remove) || event.Has(fsnotify.Rename) { + events = append(events, &event) + debouncer.Do(func() { + seen := make(map[string]bool) + dedupe := make([]*fsnotify.Event, 0) + for _, e := range events { + if _, ok := seen[e.Name]; !ok { + seen[e.Name] = true + dedupe = append(dedupe, e) + } } - } - cb(uuid.NewString()[0:6], dedupe) - events = make([]*fsnotify.Event, 0) - }) + cb(uuid.NewString()[0:6], dedupe) + events = make([]*fsnotify.Event, 0) + }) + } } case err, ok := <-watcher.Errors: if !ok { @@ -101,17 +105,25 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { watcher.Add(assetPath) } + go func() { + for { + time.Sleep(time.Second * 5) + files := watcher.WatchList() + count := len(files) + fmt.Printf("Watching %d dirs\n", count) + } + }() + // Walk through the root directory and add all subdirectories to the watcher err = filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error { if err != nil { return err } // Ignore directories in the ignoredDirs list - for _, ignoredDir := range ignoredDirs { - if ignoredDir == info.Name() { - return filepath.SkipDir - } + if dirutil.IsGlobExclude(path, config.WatchIgnore) { + return filepath.SkipDir } + // Only watch directories if info.IsDir() { err = watcher.Add(path) @@ -123,6 +135,7 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { } return nil }) + if err != nil { log.Fatal(err) } diff --git a/framework/config/default.yml b/framework/config/default.yml new file mode 100644 index 00000000..bd7be9a2 --- /dev/null +++ b/framework/config/default.yml @@ -0,0 +1 @@ +tailwind: true diff --git a/framework/config/project.go b/framework/config/project.go new file mode 100644 index 00000000..a3cd1d26 --- /dev/null +++ b/framework/config/project.go @@ -0,0 +1,55 @@ +package config + +import ( + "gopkg.in/yaml.v3" + "os" + "path" +) + +type ProjectConfig struct { + Tailwind bool `yaml:"tailwind"` + WatchIgnore []string `yaml:"watch_ignore"` + WatchFiles []string `yaml:"watch_files"` +} + +func DefaultProjectConfig() *ProjectConfig { + return &ProjectConfig{ + Tailwind: true, + WatchIgnore: []string{ + "node_modules", ".git", ".idea", "assets/dist", + }, + WatchFiles: []string{ + "**/*.go", "**/*.html", "**/*.css", "**/*.js", "**/*.json", "**/*.yaml", "**/*.yml", + }, + } +} + +func (cfg *ProjectConfig) EnhanceWithDefaults() *ProjectConfig { + defaultCfg := DefaultProjectConfig() + if len(cfg.WatchFiles) == 0 { + cfg.WatchFiles = defaultCfg.WatchFiles + } + if len(cfg.WatchIgnore) == 0 { + cfg.WatchIgnore = defaultCfg.WatchIgnore + } + return cfg +} + +func FromConfigFile(workingDir string) *ProjectConfig { + defaultCfg := DefaultProjectConfig() + names := []string{"htmgo.yaml", "htmgo.yml", "_htmgo.yaml", "_htmgo.yml"} + for _, name := range names { + filePath := path.Join(workingDir, name) + if _, err := os.Stat(filePath); err == nil { + cfg := &ProjectConfig{} + bytes, err := os.ReadFile(filePath) + if err == nil { + err = yaml.Unmarshal(bytes, cfg) + if err == nil { + return cfg.EnhanceWithDefaults() + } + } + } + } + return defaultCfg +} diff --git a/htmgo-site/htmgo.yml b/htmgo-site/htmgo.yml new file mode 100644 index 00000000..67500d7d --- /dev/null +++ b/htmgo-site/htmgo.yml @@ -0,0 +1,5 @@ +tailwind: true +# which directories to ignore when watching for changes, supports glob patterns +watch_ignore: [".git", "node_modules", "dist/*"] +# files to watch for changes that are not included by default, supports glob patterns +watch_files: ["**/*.go", "**/*.css"] From 7225b1908b4bb98760e9429c9f7037d9b14bec67 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 08:26:20 -0500 Subject: [PATCH 071/145] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a5787708..b19ebee8 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ > [!WARNING] -> htmgo is in alpha release and active development. API's likely will have breaking changes. Do not use this library at this time if you are expecting a rock solid stable api that will require no migrations. Please report any issues on GitHub. +> htmgo is in alpha release and active development. API's may have breaking changes between versions. Please report any issues on GitHub. ## **htmgo** From 2bac9307c6abf1de966a431023dd86b381900c81 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 09:49:48 -0500 Subject: [PATCH 072/145] more config --- cli/htmgo/tasks/css/css.go | 2 +- cli/htmgo/watcher.go | 44 ++++++++++++++--------------------- framework/config/default.yml | 1 - framework/config/project.go | 2 +- htmgo-site/htmgo.yml | 11 ++++++--- htmgo-site/pages/base/root.go | 3 ++- 6 files changed, 29 insertions(+), 34 deletions(-) delete mode 100644 framework/config/default.yml diff --git a/cli/htmgo/tasks/css/css.go b/cli/htmgo/tasks/css/css.go index 0bdaf58b..1c07ec2d 100644 --- a/cli/htmgo/tasks/css/css.go +++ b/cli/htmgo/tasks/css/css.go @@ -12,7 +12,7 @@ import ( ) func IsTailwindEnabled() bool { - return dirutil.HasFileFromRoot("tailwind.config.js") + return dirutil.GetConfig().Tailwind && dirutil.HasFileFromRoot("tailwind.config.js") } func Setup() bool { diff --git a/cli/htmgo/watcher.go b/cli/htmgo/watcher.go index 5af47b7c..4838d14b 100644 --- a/cli/htmgo/watcher.go +++ b/cli/htmgo/watcher.go @@ -1,7 +1,6 @@ package main import ( - "fmt" "github.com/fsnotify/fsnotify" "github.com/google/uuid" "github.com/maddalax/htmgo/cli/htmgo/internal" @@ -36,8 +35,6 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { for { select { case event, ok := <-watcher.Events: - slog.Debug("event:", slog.String("name", event.Name), slog.String("op", event.Op.String())) - if !ok { return } @@ -69,23 +66,25 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { } } - if dirutil.IsGlobMatch(event.Name, config.WatchFiles, config.WatchIgnore) { - if event.Has(fsnotify.Write) || event.Has(fsnotify.Remove) || event.Has(fsnotify.Rename) { - events = append(events, &event) - debouncer.Do(func() { - seen := make(map[string]bool) - dedupe := make([]*fsnotify.Event, 0) - for _, e := range events { - if _, ok := seen[e.Name]; !ok { - seen[e.Name] = true - dedupe = append(dedupe, e) - } - } - cb(uuid.NewString()[0:6], dedupe) - events = make([]*fsnotify.Event, 0) - }) + if event.Has(fsnotify.Write) || event.Has(fsnotify.Remove) || event.Has(fsnotify.Rename) { + if !dirutil.IsGlobMatch(event.Name, config.WatchFiles, config.WatchIgnore) { + continue } + events = append(events, &event) + debouncer.Do(func() { + seen := make(map[string]bool) + dedupe := make([]*fsnotify.Event, 0) + for _, e := range events { + if _, ok := seen[e.Name]; !ok { + seen[e.Name] = true + dedupe = append(dedupe, e) + } + } + cb(uuid.NewString()[0:6], dedupe) + events = make([]*fsnotify.Event, 0) + }) } + case err, ok := <-watcher.Errors: if !ok { return @@ -105,15 +104,6 @@ func startWatcher(cb func(version string, file []*fsnotify.Event)) { watcher.Add(assetPath) } - go func() { - for { - time.Sleep(time.Second * 5) - files := watcher.WatchList() - count := len(files) - fmt.Printf("Watching %d dirs\n", count) - } - }() - // Walk through the root directory and add all subdirectories to the watcher err = filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error { if err != nil { diff --git a/framework/config/default.yml b/framework/config/default.yml deleted file mode 100644 index bd7be9a2..00000000 --- a/framework/config/default.yml +++ /dev/null @@ -1 +0,0 @@ -tailwind: true diff --git a/framework/config/project.go b/framework/config/project.go index a3cd1d26..688241d9 100644 --- a/framework/config/project.go +++ b/framework/config/project.go @@ -19,7 +19,7 @@ func DefaultProjectConfig() *ProjectConfig { "node_modules", ".git", ".idea", "assets/dist", }, WatchFiles: []string{ - "**/*.go", "**/*.html", "**/*.css", "**/*.js", "**/*.json", "**/*.yaml", "**/*.yml", + "**/*.go", "**/*.html", "**/*.css", "**/*.js", "**/*.json", "**/*.yaml", "**/*.yml", "**/*.md", }, } } diff --git a/htmgo-site/htmgo.yml b/htmgo-site/htmgo.yml index 67500d7d..d60d2ff8 100644 --- a/htmgo-site/htmgo.yml +++ b/htmgo-site/htmgo.yml @@ -1,5 +1,10 @@ +# htmgo configuration + +# if tailwindcss is enabled, htmgo will automatically compile your tailwind and output it to assets/dist tailwind: true -# which directories to ignore when watching for changes, supports glob patterns + +# which directories to ignore when watching for changes, supports glob patterns through https://github.com/bmatcuk/doublestar watch_ignore: [".git", "node_modules", "dist/*"] -# files to watch for changes that are not included by default, supports glob patterns -watch_files: ["**/*.go", "**/*.css"] + +# files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_files: ["**/*.go", "**/*.css", "**/*.md"] diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index c15900bd..b110caa8 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -45,7 +45,8 @@ func PageWithNav(ctx *h.RequestContext, children ...h.Ren) *h.Element { return RootPage(ctx, h.Fragment( partials.NavBar(ctx, partials.NavBarProps{ - Expanded: false, + Expanded: false, + ShowPreRelease: true, }), h.Div( children..., From 49f4067bc516f13afb0859fcde5bb5e40413c3a5 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 09:52:06 -0500 Subject: [PATCH 073/145] add default config file to template --- templates/starter/htmgo.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 templates/starter/htmgo.yml diff --git a/templates/starter/htmgo.yml b/templates/starter/htmgo.yml new file mode 100644 index 00000000..d60d2ff8 --- /dev/null +++ b/templates/starter/htmgo.yml @@ -0,0 +1,10 @@ +# htmgo configuration + +# if tailwindcss is enabled, htmgo will automatically compile your tailwind and output it to assets/dist +tailwind: true + +# which directories to ignore when watching for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_ignore: [".git", "node_modules", "dist/*"] + +# files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_files: ["**/*.go", "**/*.css", "**/*.md"] From 3f502dba8110b6a3d7f9eb408b72cc1bce7e5bd7 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 09:58:37 -0500 Subject: [PATCH 074/145] cleanup / add err handling --- cli/htmgo/internal/dirutil/glob.go | 19 ------------------- framework/config/project.go | 7 +++++-- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/cli/htmgo/internal/dirutil/glob.go b/cli/htmgo/internal/dirutil/glob.go index 3e015c28..1315c66b 100644 --- a/cli/htmgo/internal/dirutil/glob.go +++ b/cli/htmgo/internal/dirutil/glob.go @@ -3,8 +3,6 @@ package dirutil import ( "fmt" "github.com/bmatcuk/doublestar/v4" - "io/fs" - "path/filepath" ) func matchesAny(patterns []string, path string) bool { @@ -31,20 +29,3 @@ func IsGlobMatch(path string, patterns []string, excludePatterns []string) bool } return matchesAny(patterns, path) } - -func GlobMatchDirs(root string, includePatterns, excludePatterns []string, cb func(string)) { - //directories := map[string]bool{} - // Walk through the directory recursively - _ = filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - if matchesAny(excludePatterns, path) { - return fs.SkipDir - } - if matchesAny(includePatterns, path) { - cb(path) - } - return nil - }) -} diff --git a/framework/config/project.go b/framework/config/project.go index 688241d9..72e222d3 100644 --- a/framework/config/project.go +++ b/framework/config/project.go @@ -2,6 +2,7 @@ package config import ( "gopkg.in/yaml.v3" + "log/slog" "os" "path" ) @@ -45,9 +46,11 @@ func FromConfigFile(workingDir string) *ProjectConfig { bytes, err := os.ReadFile(filePath) if err == nil { err = yaml.Unmarshal(bytes, cfg) - if err == nil { - return cfg.EnhanceWithDefaults() + if err != nil { + slog.Error("Error parsing config file", slog.String("file", filePath), slog.String("error", err.Error())) + os.Exit(1) } + return cfg.EnhanceWithDefaults() } } } From d21afa5f6db75f8c4d2f1c98b91806770f447e06 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 10:02:04 -0500 Subject: [PATCH 075/145] few tests --- framework/config/project_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 framework/config/project_test.go diff --git a/framework/config/project_test.go b/framework/config/project_test.go new file mode 100644 index 00000000..e3d8d178 --- /dev/null +++ b/framework/config/project_test.go @@ -0,0 +1,31 @@ +package config + +import ( + "github.com/stretchr/testify/assert" + "os" + "testing" +) + +func TestDefaultProjectConfig(t *testing.T) { + cfg := DefaultProjectConfig() + assert.Equal(t, true, cfg.Tailwind) + assert.Equal(t, 4, len(cfg.WatchIgnore)) + assert.Equal(t, 8, len(cfg.WatchFiles)) +} + +func TestNoConfigFileUsesDefault(t *testing.T) { + cfg := FromConfigFile("testdata") + assert.Equal(t, true, cfg.Tailwind) + assert.Equal(t, 4, len(cfg.WatchIgnore)) + assert.Equal(t, 8, len(cfg.WatchFiles)) +} + +func TestPartialConfigMerges(t *testing.T) { + os.Mkdir("testdata", 0755) + defer os.RemoveAll("testdata") + os.WriteFile("testdata/htmgo.yaml", []byte("tailwind: false"), 0644) + cfg := FromConfigFile("testdata") + assert.Equal(t, false, cfg.Tailwind) + assert.Equal(t, 4, len(cfg.WatchIgnore)) + assert.Equal(t, 8, len(cfg.WatchFiles)) +} From c3be0e92d280edfad79547315dcf56afce71c778 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 10:05:14 -0500 Subject: [PATCH 076/145] few tests --- framework/config/project_test.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/framework/config/project_test.go b/framework/config/project_test.go index e3d8d178..4e832c46 100644 --- a/framework/config/project_test.go +++ b/framework/config/project_test.go @@ -7,6 +7,7 @@ import ( ) func TestDefaultProjectConfig(t *testing.T) { + t.Parallel() cfg := DefaultProjectConfig() assert.Equal(t, true, cfg.Tailwind) assert.Equal(t, 4, len(cfg.WatchIgnore)) @@ -14,6 +15,7 @@ func TestDefaultProjectConfig(t *testing.T) { } func TestNoConfigFileUsesDefault(t *testing.T) { + t.Parallel() cfg := FromConfigFile("testdata") assert.Equal(t, true, cfg.Tailwind) assert.Equal(t, 4, len(cfg.WatchIgnore)) @@ -21,6 +23,7 @@ func TestNoConfigFileUsesDefault(t *testing.T) { } func TestPartialConfigMerges(t *testing.T) { + t.Parallel() os.Mkdir("testdata", 0755) defer os.RemoveAll("testdata") os.WriteFile("testdata/htmgo.yaml", []byte("tailwind: false"), 0644) @@ -29,3 +32,14 @@ func TestPartialConfigMerges(t *testing.T) { assert.Equal(t, 4, len(cfg.WatchIgnore)) assert.Equal(t, 8, len(cfg.WatchFiles)) } + +func TestShouldNotSetTailwindTrue(t *testing.T) { + t.Parallel() + os.Mkdir("testdata1", 0755) + defer os.RemoveAll("testdata1") + os.WriteFile("testdata1/htmgo.yaml", []byte("someValue: false"), 0644) + cfg := FromConfigFile("testdata") + assert.Equal(t, false, cfg.Tailwind) + assert.Equal(t, 4, len(cfg.WatchIgnore)) + assert.Equal(t, 8, len(cfg.WatchFiles)) +} From 55337cde13666accb0dec3521858e49e16ee8de4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 10:06:00 -0500 Subject: [PATCH 077/145] use diff dir --- framework/config/project_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/config/project_test.go b/framework/config/project_test.go index 4e832c46..46b900a4 100644 --- a/framework/config/project_test.go +++ b/framework/config/project_test.go @@ -16,7 +16,7 @@ func TestDefaultProjectConfig(t *testing.T) { func TestNoConfigFileUsesDefault(t *testing.T) { t.Parallel() - cfg := FromConfigFile("testdata") + cfg := FromConfigFile("testdata2") assert.Equal(t, true, cfg.Tailwind) assert.Equal(t, 4, len(cfg.WatchIgnore)) assert.Equal(t, 8, len(cfg.WatchFiles)) From aff426829dfb7b19a7cc93850b2335c4a508dfa0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 14 Oct 2024 10:14:22 -0500 Subject: [PATCH 078/145] fix tests --- framework/config/project_test.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/framework/config/project_test.go b/framework/config/project_test.go index 46b900a4..f015635d 100644 --- a/framework/config/project_test.go +++ b/framework/config/project_test.go @@ -3,6 +3,7 @@ package config import ( "github.com/stretchr/testify/assert" "os" + "path" "testing" ) @@ -16,7 +17,7 @@ func TestDefaultProjectConfig(t *testing.T) { func TestNoConfigFileUsesDefault(t *testing.T) { t.Parallel() - cfg := FromConfigFile("testdata2") + cfg := FromConfigFile("non-existing-dir") assert.Equal(t, true, cfg.Tailwind) assert.Equal(t, 4, len(cfg.WatchIgnore)) assert.Equal(t, 8, len(cfg.WatchFiles)) @@ -24,10 +25,8 @@ func TestNoConfigFileUsesDefault(t *testing.T) { func TestPartialConfigMerges(t *testing.T) { t.Parallel() - os.Mkdir("testdata", 0755) - defer os.RemoveAll("testdata") - os.WriteFile("testdata/htmgo.yaml", []byte("tailwind: false"), 0644) - cfg := FromConfigFile("testdata") + dir := writeConfigFile(t, "tailwind: false") + cfg := FromConfigFile(dir) assert.Equal(t, false, cfg.Tailwind) assert.Equal(t, 4, len(cfg.WatchIgnore)) assert.Equal(t, 8, len(cfg.WatchFiles)) @@ -35,11 +34,17 @@ func TestPartialConfigMerges(t *testing.T) { func TestShouldNotSetTailwindTrue(t *testing.T) { t.Parallel() - os.Mkdir("testdata1", 0755) - defer os.RemoveAll("testdata1") - os.WriteFile("testdata1/htmgo.yaml", []byte("someValue: false"), 0644) - cfg := FromConfigFile("testdata") + dir := writeConfigFile(t, "someValue: true") + cfg := FromConfigFile(dir) assert.Equal(t, false, cfg.Tailwind) assert.Equal(t, 4, len(cfg.WatchIgnore)) assert.Equal(t, 8, len(cfg.WatchFiles)) } + +func writeConfigFile(t *testing.T, content string) string { + temp := os.TempDir() + os.Mkdir(temp, 0755) + err := os.WriteFile(path.Join(temp, "htmgo.yml"), []byte(content), 0644) + assert.Nil(t, err) + return temp +} From 82382cf43f568af09047b0119f3081f47c30a1b2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 14 Oct 2024 15:17:42 +0000 Subject: [PATCH 079/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- framework/go.mod | 2 +- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 13 files changed, 20 insertions(+), 20 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index b9cd36d9..4add7877 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 + github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 08c6b7c6..c07b1b70 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index a2cde1ad..8b1ea318 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 +require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 827e6bcb..531d9d15 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index d1182fc7..bde8528c 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 + github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index c82089b3..34c7ebc3 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 4bbb672f..b84f8e1e 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 +require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 827e6bcb..531d9d15 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/framework/go.mod b/framework/go.mod index a6a7b64d..4e9fd74a 100644 --- a/framework/go.mod +++ b/framework/go.mod @@ -7,10 +7,10 @@ require ( github.com/google/uuid v1.6.0 github.com/stretchr/testify v1.9.0 golang.org/x/net v0.29.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index dfcb46ae..45b0ca4e 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,9 +4,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 - github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 + github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc @@ -14,6 +13,7 @@ require ( require ( github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/text v0.19.0 // indirect ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 79ae88a0..cb6ec6e4 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 647b7230..9c336122 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 +require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 827e6bcb..531d9d15 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490 h1:sAq6xv1l4wgvRwWgXwJuV//yT57r/eOjb/QY6Ehp1xo= -github.com/maddalax/htmgo/framework v0.0.0-20241011161932-8b9e536f1490/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= +github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 0ada050effb71bfcf3016e5313949ed6218a3702 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 15 Oct 2024 10:26:30 -0500 Subject: [PATCH 080/145] add docsearch --- htmgo-site/pages/base/root.go | 11 +++++++++++ htmgo-site/partials/navbar.go | 3 +++ 2 files changed, 14 insertions(+) diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index b110caa8..324d7e5a 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -25,6 +25,7 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { h.Meta("og:title", title), h.Meta("og:url", "https://htmgo.dev"), h.Link("canonical", "https://htmgo.dev"), + h.Link("https://cdn.jsdelivr.net/npm/@docsearch/css@3", "stylesheet"), h.Meta("og:description", description), h.LinkWithVersion("/public/main.css", "stylesheet", Version), h.ScriptWithVersion("/public/htmgo.js", Version), @@ -37,6 +38,16 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { h.Body( h.Class("bg-stone-50 h-screen"), h.Fragment(children...), + h.Script("https://cdn.jsdelivr.net/npm/@docsearch/js@3"), + h.UnsafeRawScript(` + docsearch({ + appId: "9IO2WZA8L1", + apiKey: "d8cd8b6f8f8a0c961ce971e09dbde90a", + indexName: "htmgo", + container: "#search-container", + debug: false + }); + `), ), ) } diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 0bb23455..913e09ff 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -95,6 +95,9 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { h.Href("/"), h.Text("htmgo"), )), + h.Div( + h.Id("search-container"), + ), h.Div( h.Class("flex gap-4 items-center"), h.List(navItems, func(item NavItem, index int) *h.Element { From f62d47e2fb4bc598d5751c2e6d07ca3d6cd0abff Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 15 Oct 2024 10:37:25 -0500 Subject: [PATCH 081/145] fix formatting on docs --- .../md/docs/1_quick-start/1_introduction.md | 2 +- .../md/docs/1_quick-start/2_installation.md | 2 +- htmgo-site/md/docs/2_core-concepts/1_pages.md | 2 +- .../md/docs/2_core-concepts/2_partials.md | 2 +- .../md/docs/2_core-concepts/3_components.md | 4 +- htmgo-site/md/docs/2_core-concepts/4_tags.md | 2 +- .../md/docs/2_core-concepts/5_attributes.md | 2 +- .../md/docs/2_core-concepts/6_raw_html.md | 4 +- htmgo-site/md/docs/3_control/1_If Else.md | 2 +- htmgo-site/md/docs/3_control/2_loops.md | 2 +- .../md/docs/4_interactivity/1_swapping.md | 4 +- .../md/docs/4_interactivity/2_events.md | 79 +---------------- .../3_evaluating_javascript.md | 85 +++++++++++++++++++ .../docs/5_performance/1_caching_globally.md | 3 +- .../docs/5_performance/1_caching_per_user.md | 2 +- .../6_pushing_data/1_server_sent_events.md | 2 +- .../md/docs/7_htmx_extensions/1_overview.md | 2 +- .../7_htmx_extensions/2_trigger_children.md | 2 +- .../7_htmx_extensions/3_mutation_error.md | 2 +- .../1_tailwind_intellisense.md | 2 +- .../2_converting_raw_html_to_go.md | 2 +- .../docs/9_troubleshooting/1_common_issues.md | 4 +- 22 files changed, 111 insertions(+), 102 deletions(-) create mode 100644 htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md diff --git a/htmgo-site/md/docs/1_quick-start/1_introduction.md b/htmgo-site/md/docs/1_quick-start/1_introduction.md index a1b0025e..992cdd97 100644 --- a/htmgo-site/md/docs/1_quick-start/1_introduction.md +++ b/htmgo-site/md/docs/1_quick-start/1_introduction.md @@ -1,4 +1,4 @@ -## **Introduction** +## Introduction htmgo is a lightweight pure go way to build interactive websites / web applications using go & htmx. We give you the utilities to build html using pure go code in a reusable way (go functions are components) while also providing htmx functions to add interactivity to your app. diff --git a/htmgo-site/md/docs/1_quick-start/2_installation.md b/htmgo-site/md/docs/1_quick-start/2_installation.md index a12f5236..30b1a3eb 100644 --- a/htmgo-site/md/docs/1_quick-start/2_installation.md +++ b/htmgo-site/md/docs/1_quick-start/2_installation.md @@ -1,4 +1,4 @@ -## **Getting Started** +## Getting Started ##### **Prerequisites:** diff --git a/htmgo-site/md/docs/2_core-concepts/1_pages.md b/htmgo-site/md/docs/2_core-concepts/1_pages.md index 78140c1b..20c0338a 100644 --- a/htmgo-site/md/docs/2_core-concepts/1_pages.md +++ b/htmgo-site/md/docs/2_core-concepts/1_pages.md @@ -1,4 +1,4 @@ -## Pages ## +## Pages Pages are the entry point of an htmgo application. diff --git a/htmgo-site/md/docs/2_core-concepts/2_partials.md b/htmgo-site/md/docs/2_core-concepts/2_partials.md index 51a14efb..97578802 100644 --- a/htmgo-site/md/docs/2_core-concepts/2_partials.md +++ b/htmgo-site/md/docs/2_core-concepts/2_partials.md @@ -1,4 +1,4 @@ -## Partials ## +## Partials Partials are where things get interesting. Partials allow you to start adding interactivity to your website by swapping in content, setting headers, redirecting, etc. diff --git a/htmgo-site/md/docs/2_core-concepts/3_components.md b/htmgo-site/md/docs/2_core-concepts/3_components.md index 01c4d626..9cbf2d23 100644 --- a/htmgo-site/md/docs/2_core-concepts/3_components.md +++ b/htmgo-site/md/docs/2_core-concepts/3_components.md @@ -1,4 +1,4 @@ -**Components** +## Components Components are re-usable bits of logic to render HTML. Similar to how in React components are Javascript functions, in htmgo, components are pure go functions. @@ -26,4 +26,4 @@ If you are familiar with React, then you would likely place this fetch logic ins With **htmgo**, the only way to update content on the page is to use htmx to swap out the content from loading a partial. Therefore you control exactly when this Card component is called, not the framework behind the scenes. -See [#interactivity-swapping](#interactivity-swapping) for more information \ No newline at end of file +See [#interactivity-swapping](#interactivity-swapping) for more information diff --git a/htmgo-site/md/docs/2_core-concepts/4_tags.md b/htmgo-site/md/docs/2_core-concepts/4_tags.md index 92912ebc..aaeb8ba7 100644 --- a/htmgo-site/md/docs/2_core-concepts/4_tags.md +++ b/htmgo-site/md/docs/2_core-concepts/4_tags.md @@ -1,4 +1,4 @@ -**HTML Tags** +## HTML Tags htmgo provides many methods to render html tags: diff --git a/htmgo-site/md/docs/2_core-concepts/5_attributes.md b/htmgo-site/md/docs/2_core-concepts/5_attributes.md index 75e04379..a0b4c737 100644 --- a/htmgo-site/md/docs/2_core-concepts/5_attributes.md +++ b/htmgo-site/md/docs/2_core-concepts/5_attributes.md @@ -1,4 +1,4 @@ -**Attributes** +## Attributes Attributes are one of the main ways we can add interactivity to the pages with [htmx](http://htmx.org). If you have not read over the htmx documentation, please do so before continuing. diff --git a/htmgo-site/md/docs/2_core-concepts/6_raw_html.md b/htmgo-site/md/docs/2_core-concepts/6_raw_html.md index 3e3e7d29..055639c3 100644 --- a/htmgo-site/md/docs/2_core-concepts/6_raw_html.md +++ b/htmgo-site/md/docs/2_core-concepts/6_raw_html.md @@ -1,4 +1,4 @@ -**Rendering Raw Html** +## Rendering Raw Html In some cases, you may want to render raw HTML instead of using htmgo's functions. This can be done by using the following methods: @@ -19,4 +19,4 @@ h.UnsafeRawScript("alert('Hello World')") Important: Be careful when using these methods, these methods do not escape the HTML content and should **never** be used with user input unless you have sanitized the input. -Sanitizing input can be done using the `html.EscapeString` function or by using https://github.com/microcosm-cc/bluemonday. \ No newline at end of file +Sanitizing input can be done using the `html.EscapeString` function or by using https://github.com/microcosm-cc/bluemonday. diff --git a/htmgo-site/md/docs/3_control/1_If Else.md b/htmgo-site/md/docs/3_control/1_If Else.md index 2e441ccb..34772371 100644 --- a/htmgo-site/md/docs/3_control/1_If Else.md +++ b/htmgo-site/md/docs/3_control/1_If Else.md @@ -1,4 +1,4 @@ -**If / Else Statements** +## Conditional Statements If / else statements are useful when you want to conditionally render attributes or elements / components. diff --git a/htmgo-site/md/docs/3_control/2_loops.md b/htmgo-site/md/docs/3_control/2_loops.md index e3ec62a7..c42e87c2 100644 --- a/htmgo-site/md/docs/3_control/2_loops.md +++ b/htmgo-site/md/docs/3_control/2_loops.md @@ -1,4 +1,4 @@ -**Loops / Dealing With Lists** +## Loops / Dealing With Lists Very commonly you will need to render a list or slice of items onto the page. Frameworks generally solve this in different ways, such as React uses regular JS .map function to solve it. diff --git a/htmgo-site/md/docs/4_interactivity/1_swapping.md b/htmgo-site/md/docs/4_interactivity/1_swapping.md index 6a9cdc6b..d8ba5ebc 100644 --- a/htmgo-site/md/docs/4_interactivity/1_swapping.md +++ b/htmgo-site/md/docs/4_interactivity/1_swapping.md @@ -1,4 +1,4 @@ -### Interactivity +## Interactivity / Swapping 1. Adding interactivity to your website is done through [htmx](http://htmx.org) by utilizing various attributes/headers. This should cover most use cases. htmgo offers utility methods to make this process a bit easier @@ -82,4 +82,4 @@ When the **CompleteAll** button is clicked, a **POST** will be sent to the **Com Note: These partial swap methods use https://htmx.org/attributes/hx-swap-oob/ behind the scenes, so it must match the swap target by id. -**If** you are only wanting to swap the element that made the xhr request for the partial in the first place, just use `h.NewPartial` instead, it will use the default htmx swapping, and not hx-swap-oob. \ No newline at end of file +**If** you are only wanting to swap the element that made the xhr request for the partial in the first place, just use `h.NewPartial` instead, it will use the default htmx swapping, and not hx-swap-oob. diff --git a/htmgo-site/md/docs/4_interactivity/2_events.md b/htmgo-site/md/docs/4_interactivity/2_events.md index 40664b53..ed750d8b 100644 --- a/htmgo-site/md/docs/4_interactivity/2_events.md +++ b/htmgo-site/md/docs/4_interactivity/2_events.md @@ -1,4 +1,4 @@ -**Events** +## Events Handlers / Commands Sometimes you need to update elements client side without having to do a network call. For this you generally have to target an element with javascript and set an attribute, change the innerHTML, etc. @@ -42,81 +42,4 @@ OnClick(cmd ...Command) *LifeCycle HxOnAfterSwap(cmd ...Command) *LifeCycle HxOnLoad(cmd ...Command) *LifeCycle ``` -**Note:** Each command you attach to the event handler will be passed 'self' and 'event' (if applicable) as arguments. -'self' is the current element, and 'event' is the event object. - -If you use the OnEvent directly, event names may be any [HTML DOM](https://www.w3schools.com/jsref/dom_obj_event.asp) events, or any [HTMX events](https://htmx.org/events/). - -Commands: - -```go -js.AddAttribute(string, value) -js.RemoveAttribute(string) -js.AddClass(string, value) -js.SetText(string) -js.Increment(count) -js.SetInnerHtml(Ren) -js.SetOuterHtml(Ren) -js.SetDisabled(bool) -js.RemoveClass(string) -js.Alert(string) -js.EvalJs(string) // eval arbitrary js, use 'self' to get the current element as a reference -js.InjectScript(string) -js.InjectScriptIfNotExist(string) -js.GetPartial(PartialFunc) -js.GetPartialWithQs(PartialFunc, Qs) -js.PostPartial(PartialFunc) -js.PostPartialWithQs(PartialFunc, Qs) -js.GetWithQs(string, Qs) -js.PostWithQs(string, Qs) -js.ToggleClass(string) -js.ToggleClassOnElement(string, string) - -// The following methods are used to evaluate JS on nearby elements. -// Use 'element' to get the element as a reference for the EvalJs methods. -js.EvalJsOnParent(string) -js.EvalJsOnSibling(string, string) -js.EvalJsOnChildren(string, string) -js.SetClassOnParent(string) -js.RemoveClassOnParent(string) -js.SetClassOnChildren(string, string) -js.RemoveClassOnChildren(string, string) -js.SetClassOnSibling(string, string) -js.RemoveClassOnSibling(string, string) - -``` -For more usages: see https://github.com/maddalax/htmgo/blob/master/htmgo-site/pages/form.go - - -**Example:** Evaluating arbitrary JS - -```go -func MyButton() *h.Element { - return h.Button( - h.Text("Submit"), - h.OnClick( - // make sure you use 'self' instead of 'this' - // for referencing the current element - h.EvalJs(` - if(Math.random() > 0.5) { - self.innerHTML = "Success!"; - } - `, - ), - ), - ) -} -``` - -tip: If you are using Jetbrains IDE's, you can write `// language=js` as a comment above the function call (h.EvalJS) and it will automatically give you syntax highlighting on the raw JS. - -```go -// language=js -h.EvalJs(` - if(Math.random() > 0.5) { - self.innerHTML = "Success!"; - } - `, -), -``` diff --git a/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md b/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md new file mode 100644 index 00000000..37affdb4 --- /dev/null +++ b/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md @@ -0,0 +1,85 @@ +## Evaluating Javascript In Event Handlers + +Event handlers are useful by attaching **commands** to elements to execute javascript on the client side. + +See [#interactivity-events](#interactivity-events) for more information on event handlers. + +
+ +**Note:** Each command you attach to the event handler will be passed 'self' and 'event' (if applicable) as arguments. +'self' is the current element, and 'event' is the event object. + +If you use the OnEvent directly, event names may be any [HTML DOM](https://www.w3schools.com/jsref/dom_obj_event.asp) events, or any [HTMX events](https://htmx.org/events/). + +Commands: + +```go +js.AddAttribute(string, value) +js.RemoveAttribute(string) +js.AddClass(string, value) +js.SetText(string) +js.Increment(count) +js.SetInnerHtml(Ren) +js.SetOuterHtml(Ren) +js.SetDisabled(bool) +js.RemoveClass(string) +js.Alert(string) +js.EvalJs(string) // eval arbitrary js, use 'self' to get the current element as a reference +js.InjectScript(string) +js.InjectScriptIfNotExist(string) +js.GetPartial(PartialFunc) +js.GetPartialWithQs(PartialFunc, Qs) +js.PostPartial(PartialFunc) +js.PostPartialWithQs(PartialFunc, Qs) +js.GetWithQs(string, Qs) +js.PostWithQs(string, Qs) +js.ToggleClass(string) +js.ToggleClassOnElement(string, string) + +// The following methods are used to evaluate JS on nearby elements. +// Use 'element' to get the element as a reference for the EvalJs methods. +js.EvalJsOnParent(string) +js.EvalJsOnSibling(string, string) +js.EvalJsOnChildren(string, string) +js.SetClassOnParent(string) +js.RemoveClassOnParent(string) +js.SetClassOnChildren(string, string) +js.RemoveClassOnChildren(string, string) +js.SetClassOnSibling(string, string) +js.RemoveClassOnSibling(string, string) + +``` +For more usages: see https://github.com/maddalax/htmgo/blob/master/htmgo-site/pages/form.go + + +**Example:** Evaluating arbitrary JS + +```go +func MyButton() *h.Element { + return h.Button( + h.Text("Submit"), + h.OnClick( + // make sure you use 'self' instead of 'this' + // for referencing the current element + h.EvalJs(` + if(Math.random() > 0.5) { + self.innerHTML = "Success!"; + } + `, + ), + ), + ) +} +``` + +tip: If you are using Jetbrains IDE's, you can write `// language=js` as a comment above the function call (h.EvalJS) and it will automatically give you syntax highlighting on the raw JS. + +```go +// language=js +h.EvalJs(` + if(Math.random() > 0.5) { + self.innerHTML = "Success!"; + } + `, +), +``` diff --git a/htmgo-site/md/docs/5_performance/1_caching_globally.md b/htmgo-site/md/docs/5_performance/1_caching_globally.md index 8ba3258b..d8c7e9ce 100644 --- a/htmgo-site/md/docs/5_performance/1_caching_globally.md +++ b/htmgo-site/md/docs/5_performance/1_caching_globally.md @@ -1,4 +1,5 @@ -**Caching Components Globally** +## Performance +### Caching Components Globally You may want to cache components to improve performance. This is especially useful for components that are expensive to render or make external requests for data. diff --git a/htmgo-site/md/docs/5_performance/1_caching_per_user.md b/htmgo-site/md/docs/5_performance/1_caching_per_user.md index 5052fef8..0857a0a7 100644 --- a/htmgo-site/md/docs/5_performance/1_caching_per_user.md +++ b/htmgo-site/md/docs/5_performance/1_caching_per_user.md @@ -1,4 +1,4 @@ -**Caching Components Per User** +## Caching Components Per User If you need to cache a component per user, you can use the `CachedPerKey` functions. These functions allow you to cache a component by a specific key. This key can be any string that uniquely identifies the user. diff --git a/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md b/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md index 2e64f895..2a185ab6 100644 --- a/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md +++ b/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md @@ -1,4 +1,4 @@ -**Server Sent Events (SSE)** +## Server Sent Events (SSE) htmgo supports server-sent events (SSE) out of the box. This allows you to push data from the server to the client in real-time. diff --git a/htmgo-site/md/docs/7_htmx_extensions/1_overview.md b/htmgo-site/md/docs/7_htmx_extensions/1_overview.md index bc3faaea..b47de671 100644 --- a/htmgo-site/md/docs/7_htmx_extensions/1_overview.md +++ b/htmgo-site/md/docs/7_htmx_extensions/1_overview.md @@ -1,4 +1,4 @@ -### HTMX Extensions +## HTMX Extensions htmgo provides a few extra htmx extensions to make common tasks easier. Some of these extensions are optional, and some of these are required for htmgo to work correctly. diff --git a/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md b/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md index 9b67eeba..0caf0266 100644 --- a/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md +++ b/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md @@ -1,4 +1,4 @@ -### HTMX Extensions - Trigger Children +## HTMX Extensions - Trigger Children The `trigger-children` extension allows you to trigger an event on all children and siblings of an element. diff --git a/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md b/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md index 4cd5e0d3..467206a3 100644 --- a/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md +++ b/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md @@ -1,4 +1,4 @@ -### HTMX Extensions - Mutation Error +## HTMX Extensions - Mutation Error The `mutation-error` extension allows you to trigger an event when a request returns a >= 400 status code. diff --git a/htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md b/htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md index b4941258..8c958dce 100644 --- a/htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md +++ b/htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md @@ -1,4 +1,4 @@ -### Tailwind intellisense +## Tailwind intellisense Tailwind's language server allows you to specify custom configuration on what it should match to start giving you tailwind intellisense. diff --git a/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md b/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md index 6ac69879..54fb86c5 100644 --- a/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md +++ b/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md @@ -1,4 +1,4 @@ -### Converting Raw HTML to Go +## Converting Raw HTML to Go In some cases, you may want to convert raw HTML to Go code. A tool to do this automatically is available here: https://htmgo.dev/html-to-go diff --git a/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md b/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md index 3e64a828..e9d97929 100644 --- a/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md +++ b/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md @@ -1,4 +1,4 @@ -## **Troubleshooting:** +## Troubleshooting: **command not found: htmgo** -ensure you installed htmgo above and ensure GOPATH is set in your shell \ No newline at end of file +ensure you installed htmgo above and ensure GOPATH is set in your shell From 55bfb4d9974abe50bb7bb70d192a5b8b69b235b6 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 15 Oct 2024 10:40:13 -0500 Subject: [PATCH 082/145] small fix --- htmgo-site/md/docs/5_performance/1_caching_per_user.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/md/docs/5_performance/1_caching_per_user.md b/htmgo-site/md/docs/5_performance/1_caching_per_user.md index 0857a0a7..6ba40b0e 100644 --- a/htmgo-site/md/docs/5_performance/1_caching_per_user.md +++ b/htmgo-site/md/docs/5_performance/1_caching_per_user.md @@ -1,4 +1,4 @@ -## Caching Components Per User +### Caching Components Per User If you need to cache a component per user, you can use the `CachedPerKey` functions. These functions allow you to cache a component by a specific key. This key can be any string that uniquely identifies the user. From 3621428093a79d033f0153f65f44e4f499bfaa47 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 15 Oct 2024 10:43:37 -0500 Subject: [PATCH 083/145] make docs a link --- htmgo-site/partials/sidebar.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/htmgo-site/partials/sidebar.go b/htmgo-site/partials/sidebar.go index a2af4b7a..8387f488 100644 --- a/htmgo-site/partials/sidebar.go +++ b/htmgo-site/partials/sidebar.go @@ -59,7 +59,14 @@ func DocSidebar(pages []*dirwalk.Page) *h.Element { return h.Div( h.Class("px-3 py-2 pr-6 min-h-screen bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), h.Div( - h.H3(h.Text("Documentation"), h.Class("md:mt-4 text-xl text-slate-900 font-bold mb-3")), + h.Div( + h.Class("mb-3"), + h.A( + h.Href("#quick-start-introduction"), + h.Text("Documentation"), + h.Class("md:mt-4 text-xl text-slate-900 font-bold"), + ), + ), h.Div( h.Class("flex flex-col gap-4"), h.List(grouped.Entries(), func(entry datastructures.Entry[string, []*dirwalk.Page], index int) *h.Element { From a466726b702ccf258c3fe9a8c1ea4c0576d2be1c Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 15 Oct 2024 10:51:32 -0500 Subject: [PATCH 084/145] send insights --- htmgo-site/pages/base/root.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 324d7e5a..4b0e1851 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -41,11 +41,12 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { h.Script("https://cdn.jsdelivr.net/npm/@docsearch/js@3"), h.UnsafeRawScript(` docsearch({ - appId: "9IO2WZA8L1", - apiKey: "d8cd8b6f8f8a0c961ce971e09dbde90a", - indexName: "htmgo", - container: "#search-container", - debug: false + insights: true, + appId: "9IO2WZA8L1", + apiKey: "d8cd8b6f8f8a0c961ce971e09dbde90a", + indexName: "htmgo", + container: "#search-container", + debug: false }); `), ), From 907cf86f6a9500aa167fa424e067f49066751be6 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 15 Oct 2024 11:15:47 -0500 Subject: [PATCH 085/145] add quick sitemap --- htmgo-site/internal/sitemap/generate.go | 64 +++++++++++++++++++++++++ htmgo-site/main.go | 11 +++++ 2 files changed, 75 insertions(+) create mode 100644 htmgo-site/internal/sitemap/generate.go diff --git a/htmgo-site/internal/sitemap/generate.go b/htmgo-site/internal/sitemap/generate.go new file mode 100644 index 00000000..8a52fd62 --- /dev/null +++ b/htmgo-site/internal/sitemap/generate.go @@ -0,0 +1,64 @@ +package sitemap + +import ( + "bytes" + "encoding/xml" + "fmt" +) + +type URL struct { + Loc string `xml:"loc"` + ChangeFreq string `xml:"changefreq,omitempty"` + Priority float32 `xml:"priority,omitempty"` +} + +type URLSet struct { + XMLName xml.Name `xml:"urlset"` + XmlNS string `xml:"xmlns,attr"` + URLs []URL `xml:"url"` +} + +func NewSitemap(urls []URL) *URLSet { + return &URLSet{ + XmlNS: "https://www.sitemaps.org/schemas/sitemap/0.9", + URLs: urls, + } +} + +func serialize(sitemap *URLSet) ([]byte, error) { + buffer := bytes.Buffer{} + enc := xml.NewEncoder(&buffer) + enc.Indent("", " ") + if err := enc.Encode(sitemap); err != nil { + return make([]byte, 0), fmt.Errorf("could not encode sitemap: %w", err) + } + return buffer.Bytes(), nil +} + +func Generate() ([]byte, error) { + + urls := []URL{ + { + Loc: "/", + Priority: 0.5, + ChangeFreq: "weekly", + }, + { + Loc: "/docs", + Priority: 1.0, + ChangeFreq: "daily", + }, + { + Loc: "/examples", + Priority: 0.7, + ChangeFreq: "daily", + }, + { + Loc: "/html-to-go", + Priority: 0.5, + ChangeFreq: "weekly", + }, + } + sitemap := NewSitemap(urls) + return serialize(sitemap) +} diff --git a/htmgo-site/main.go b/htmgo-site/main.go index 50b0b303..2ee2dc73 100644 --- a/htmgo-site/main.go +++ b/htmgo-site/main.go @@ -6,6 +6,7 @@ import ( "htmgo-site/__htmgo" "htmgo-site/internal/cache" "htmgo-site/internal/markdown" + "htmgo-site/internal/sitemap" "io/fs" "net/http" ) @@ -35,6 +36,16 @@ func main() { http.FileServerFS(sub) + app.Router.Handle("/sitemap.xml", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s, err := sitemap.Generate() + if err != nil { + http.Error(w, "failed to generate sitemap", http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/xml") + w.Write(s) + })) + app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) __htmgo.Register(app.Router) From 69698b312d25d785d67d4796a79d7d9bb9d8bbc6 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 15 Oct 2024 11:25:06 -0500 Subject: [PATCH 086/145] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index b19ebee8..c4be27b0 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,7 @@ func IndexPage(ctx *h.RequestContext) *h.Page { **get started:** View documentation on [htmgo.dev](https://htmgo.dev/docs). + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=maddalax/htmgo&type=Date)](https://star-history.com/#maddalax/htmgo&Date) From 2f0a5262450b801af626db07bfdc963dc4758394 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 17 Oct 2024 10:10:08 -0500 Subject: [PATCH 087/145] use non dev version of htmgo.js --- framework/assets/dist/htmgo.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index d886d355..73cfc07a 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1 @@ var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} -//# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwiaW52b2tlT25Mb2FkIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEs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WCxDQUFBQSxDQUFBQSxDQUFXLEdBQ1gsS0FDRixDQUNGLENBRUYsR0FBSSxDQUFDQSxFQUFVLENBQ2IsSUFBSUMsRUFBYXZWLENBQUcsQ0FBQSxZQUFBLENBQWEscUJBQXFCLENBQ2xEdVYsQ0FBQUEsQ0FBQUEsRUFDRjNDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCdVYsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6bG9hZFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICBpbnZva2VPbkxvYWQoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuLyoqXG4gKiBCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBvbmxvYWQgZm9yIGFsbCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGl0XG4gKiB0aGlzIGlzIHVzZWZ1bCBmb3IgbG9jYWxpdHkgb2YgYmVoYXZpb3JcbiAqL1xuZnVuY3Rpb24gaW52b2tlT25Mb2FkKGVsZW1lbnQgOiBFbGVtZW50KSB7XG4gICAgaWYoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaWdub3JlZCA9IFsnU0NSSVBUJywgJ0xJTksnLCAnU1RZTEUnLCAnTUVUQScsICdCQVNFJywgJ1RJVExFJywgJ0hFQUQnLCAnSFRNTCcsICdCT0RZJ107XG4gICAgaWYoIWlnbm9yZWQuaW5jbHVkZXMoZWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICBpZihlbGVtZW50Lmhhc0F0dHJpYnV0ZShcIm9ubG9hZFwiKSkge1xuICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQhKG5ldyBFdmVudChcImxvYWRcIikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGl0cyBjaGlsZHJlblxuICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ubG9hZF0nKS5mb3JFYWNoKGludm9rZU9uTG9hZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vLyBAdHMtaWdub3JlXG53aW5kb3cuaHRteCA9IGh0bXg7XG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMSk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file From 0ccd236307905c8fee4886b732339cbe38d7171a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 17 Oct 2024 15:10:56 +0000 Subject: [PATCH 088/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 4add7877..1228e5ed 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d + github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c07b1b70..f5de551f 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 8b1ea318..70f061c5 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d +require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 531d9d15..b5144c38 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index bde8528c..98e4ac37 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d + github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 34c7ebc3..3e244252 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index b84f8e1e..00a62d4a 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d +require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 531d9d15..b5144c38 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 45b0ca4e..60dcf83d 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d + github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index cb6ec6e4..0c17c70f 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 9c336122..debca270 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d +require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 531d9d15..b5144c38 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From a7110576d234cea16596c4c2279caa7e11d6ab32 Mon Sep 17 00:00:00 2001 From: Kevin Lewin <97046295+lewinkedrs@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:29:59 -0400 Subject: [PATCH 089/145] Update app.go (#24) Reformat server listening log message so user could click from terminal or ide --- framework/h/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/h/app.go b/framework/h/app.go index f32c5606..42939f37 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -182,7 +182,7 @@ func (app *App) start() { } port := ":3000" - slog.Info(fmt.Sprintf("Server started on port %s", port)) + slog.Info(fmt.Sprintf("Server started at localhost:%s", port)) err := http.ListenAndServe(port, app.Router) if err != nil { From 1d7ac301abd709632f93892820dc1a740f95b3e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 18 Oct 2024 22:30:40 +0000 Subject: [PATCH 090/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 1228e5ed..b2cc51fa 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b + github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index f5de551f..20c322e2 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 70f061c5..bf923487 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index b5144c38..eca76175 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 98e4ac37..893ffb65 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b + github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 3e244252..33aeb0a8 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 00a62d4a..d0cf210a 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index b5144c38..eca76175 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 60dcf83d..2387993d 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b + github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 0c17c70f..dbf8bde2 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index debca270..52613f25 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index b5144c38..eca76175 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 13f650b28b523698078f8fc19d27519e8889500d Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:48:19 -0500 Subject: [PATCH 091/145] simple auth example --- framework/assets/dist/htmgo.js | 2 +- framework/assets/js/htmgo.ts | 14 +++++++++ .../js/htmxextensions/mutation-error.ts | 6 ++-- framework/h/app.go | 31 +++++++++++++++++++ framework/h/base.go | 4 +++ 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index 73cfc07a..df752a2f 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1 +1 @@ -var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=T;let H=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&document.querySelectorAll("*").forEach(r=>{r.hasAttribute("hx-on::on-mutation-error")&&h.trigger(r,"htmx:on-mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=h;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});}document.addEventListener("htmx:beforeSwap",function(e){e instanceof CustomEvent&&(e.detail.xhr.status===422||e.detail.xhr.status===400)&&(e.detail.shouldSwap=!0,e.detail.isError=!1);}); diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 322501e3..7b33524e 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -81,3 +81,17 @@ function onUrlChange(newUrl: string) { } }); } + +/* + 400s should allow swapping by default, as it's useful to show error messages + */ +document.addEventListener('htmx:beforeSwap', function(evt) { + if(evt instanceof CustomEvent) { + // Allow 422 and 400 responses to swap + // We treat these as form validation errors + if (evt.detail.xhr.status === 422 || evt.detail.xhr.status === 400) { + evt.detail.shouldSwap = true; + evt.detail.isError = false; + } + } +}); diff --git a/framework/assets/js/htmxextensions/mutation-error.ts b/framework/assets/js/htmxextensions/mutation-error.ts index caf9af19..99b16ccd 100644 --- a/framework/assets/js/htmxextensions/mutation-error.ts +++ b/framework/assets/js/htmxextensions/mutation-error.ts @@ -12,8 +12,10 @@ htmx.defineExtension("mutation-error", { } const status = evt.detail.xhr.status; if (status >= 400) { - htmx.findAll("[hx-on\\:\\:mutation-error]").forEach((element) => { - htmx.trigger(element, "htmx:mutation-error", { status }); + document.querySelectorAll("*").forEach((element) => { + if (element.hasAttribute("hx-on::on-mutation-error")) { + htmx.trigger(element, "htmx:on-mutation-error", { status }); + } }); } } diff --git a/framework/h/app.go b/framework/h/app.go index 42939f37..39b480a8 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -33,6 +33,22 @@ func GetRequestContext(r *http.Request) *RequestContext { return r.Context().Value(RequestContextKey).(*RequestContext) } +func (c *RequestContext) IsHttpPost() bool { + return c.Request.Method == http.MethodPost +} + +func (c *RequestContext) IsHttpGet() bool { + return c.Request.Method == http.MethodGet +} + +func (c *RequestContext) IsHttpPut() bool { + return c.Request.Method == http.MethodPut +} + +func (c *RequestContext) IsHttpDelete() bool { + return c.Request.Method == http.MethodDelete +} + func (c *RequestContext) FormValue(key string) string { return c.Request.FormValue(key) } @@ -210,16 +226,27 @@ func (app *App) start() { } func writeHtml(w http.ResponseWriter, element Ren) error { + if element == nil { + return nil + } w.Header().Set("Content-Type", "text/html") _, err := fmt.Fprint(w, Render(element)) return err } func HtmlView(w http.ResponseWriter, page *Page) error { + // if the page is nil, do nothing, this can happen if custom response is written, such as a 302 redirect + if page == nil { + return nil + } return writeHtml(w, page.Root) } func PartialViewWithHeaders(w http.ResponseWriter, headers *Headers, partial *Partial) error { + if partial == nil { + return nil + } + if partial.Headers != nil { for s, a := range *partial.Headers { w.Header().Set(s, a) @@ -236,6 +263,10 @@ func PartialViewWithHeaders(w http.ResponseWriter, headers *Headers, partial *Pa } func PartialView(w http.ResponseWriter, partial *Partial) error { + if partial == nil { + return nil + } + if partial.Headers != nil { for s, a := range *partial.Headers { w.Header().Set(s, a) diff --git a/framework/h/base.go b/framework/h/base.go index bbb80061..a26aa9e8 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -23,6 +23,10 @@ func NewPage(root Ren) *Page { } } +func EmptyPage() *Page { + return NewPage(Fragment()) +} + func NewPageWithHttpMethod(httpMethod string, root *Element) *Page { return &Page{ HttpMethod: httpMethod, From 19638326dd9b95586815c3479e6b66d538f9dd00 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:48:58 -0500 Subject: [PATCH 092/145] simple auth example --- examples/simple-auth/.dockerignore | 11 ++ examples/simple-auth/.gitignore | 6 + examples/simple-auth/Dockerfile | 38 ++++++ examples/simple-auth/Taskfile.yml | 20 +++ examples/simple-auth/assets.go | 13 ++ examples/simple-auth/assets/css/input.css | 3 + .../assets/public/apple-touch-icon.png | Bin 0 -> 3429 bytes .../simple-auth/assets/public/favicon.ico | Bin 0 -> 5238 bytes .../assets/public/icon-192-maskable.png | Bin 0 -> 3732 bytes .../simple-auth/assets/public/icon-192.png | Bin 0 -> 7032 bytes .../assets/public/icon-512-maskable.png | Bin 0 -> 14025 bytes .../simple-auth/assets/public/icon-512.png | Bin 0 -> 23888 bytes examples/simple-auth/assets_prod.go | 16 +++ examples/simple-auth/go.mod | 11 ++ examples/simple-auth/go.sum | 18 +++ examples/simple-auth/htmgo-user-example.db | Bin 0 -> 36864 bytes examples/simple-auth/htmgo.yml | 10 ++ examples/simple-auth/internal/db/db.go | 31 +++++ examples/simple-auth/internal/db/models.go | 26 ++++ examples/simple-auth/internal/db/provider.go | 25 ++++ examples/simple-auth/internal/db/queries.sql | 31 +++++ .../simple-auth/internal/db/queries.sql.go | 123 ++++++++++++++++++ examples/simple-auth/internal/db/schema.sql | 28 ++++ examples/simple-auth/internal/embedded/os.go | 17 +++ examples/simple-auth/internal/user/handler.go | 118 +++++++++++++++++ examples/simple-auth/internal/user/http.go | 18 +++ .../simple-auth/internal/user/password.go | 18 +++ examples/simple-auth/internal/user/session.go | 83 ++++++++++++ examples/simple-auth/main.go | 35 +++++ examples/simple-auth/pages/index.go | 74 +++++++++++ examples/simple-auth/pages/login.go | 49 +++++++ examples/simple-auth/pages/logout.go | 23 ++++ examples/simple-auth/pages/register.go | 49 +++++++ examples/simple-auth/pages/root.go | 32 +++++ examples/simple-auth/partials/profile.go | 36 +++++ examples/simple-auth/partials/user.go | 62 +++++++++ examples/simple-auth/sqlc.yaml | 9 ++ examples/simple-auth/tailwind.config.js | 5 + examples/simple-auth/ui/button.go | 41 ++++++ examples/simple-auth/ui/error.go | 17 +++ examples/simple-auth/ui/input.go | 55 ++++++++ examples/simple-auth/ui/login.go | 34 +++++ 42 files changed, 1185 insertions(+) create mode 100644 examples/simple-auth/.dockerignore create mode 100644 examples/simple-auth/.gitignore create mode 100644 examples/simple-auth/Dockerfile create mode 100644 examples/simple-auth/Taskfile.yml create mode 100644 examples/simple-auth/assets.go create mode 100644 examples/simple-auth/assets/css/input.css create mode 100644 examples/simple-auth/assets/public/apple-touch-icon.png create mode 100644 examples/simple-auth/assets/public/favicon.ico create mode 100644 examples/simple-auth/assets/public/icon-192-maskable.png create mode 100644 examples/simple-auth/assets/public/icon-192.png create mode 100644 examples/simple-auth/assets/public/icon-512-maskable.png create mode 100644 examples/simple-auth/assets/public/icon-512.png create mode 100644 examples/simple-auth/assets_prod.go create mode 100644 examples/simple-auth/go.mod create mode 100644 examples/simple-auth/go.sum create mode 100644 examples/simple-auth/htmgo-user-example.db create mode 100644 examples/simple-auth/htmgo.yml create mode 100644 examples/simple-auth/internal/db/db.go create mode 100644 examples/simple-auth/internal/db/models.go create mode 100644 examples/simple-auth/internal/db/provider.go create mode 100644 examples/simple-auth/internal/db/queries.sql create mode 100644 examples/simple-auth/internal/db/queries.sql.go create mode 100644 examples/simple-auth/internal/db/schema.sql create mode 100644 examples/simple-auth/internal/embedded/os.go create mode 100644 examples/simple-auth/internal/user/handler.go create mode 100644 examples/simple-auth/internal/user/http.go create mode 100644 examples/simple-auth/internal/user/password.go create mode 100644 examples/simple-auth/internal/user/session.go create mode 100644 examples/simple-auth/main.go create mode 100644 examples/simple-auth/pages/index.go create mode 100644 examples/simple-auth/pages/login.go create mode 100644 examples/simple-auth/pages/logout.go create mode 100644 examples/simple-auth/pages/register.go create mode 100644 examples/simple-auth/pages/root.go create mode 100644 examples/simple-auth/partials/profile.go create mode 100644 examples/simple-auth/partials/user.go create mode 100644 examples/simple-auth/sqlc.yaml create mode 100644 examples/simple-auth/tailwind.config.js create mode 100644 examples/simple-auth/ui/button.go create mode 100644 examples/simple-auth/ui/error.go create mode 100644 examples/simple-auth/ui/input.go create mode 100644 examples/simple-auth/ui/login.go diff --git a/examples/simple-auth/.dockerignore b/examples/simple-auth/.dockerignore new file mode 100644 index 00000000..fb47686a --- /dev/null +++ b/examples/simple-auth/.dockerignore @@ -0,0 +1,11 @@ +# Project exclude paths +/tmp/ +node_modules/ +dist/ +js/dist +js/node_modules +go.work +go.work.sum +.idea +!framework/assets/dist +__htmgo \ No newline at end of file diff --git a/examples/simple-auth/.gitignore b/examples/simple-auth/.gitignore new file mode 100644 index 00000000..3d6a9799 --- /dev/null +++ b/examples/simple-auth/.gitignore @@ -0,0 +1,6 @@ +/assets/dist +tmp +node_modules +.idea +__htmgo +dist \ No newline at end of file diff --git a/examples/simple-auth/Dockerfile b/examples/simple-auth/Dockerfile new file mode 100644 index 00000000..8f3a3583 --- /dev/null +++ b/examples/simple-auth/Dockerfile @@ -0,0 +1,38 @@ +# Stage 1: Build the Go binary +FROM golang:1.23-alpine AS builder + +RUN apk update +RUN apk add git +RUN apk add curl + +# Set the working directory inside the container +WORKDIR /app + +# Copy go.mod and go.sum files +COPY go.mod go.sum ./ + +# Download and cache the Go modules +RUN go mod download + +# Copy the source code into the container +COPY . . + +# Build the Go binary for Linux +RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build + + +# Stage 2: Create the smallest possible image +FROM gcr.io/distroless/base-debian11 + +# Set the working directory inside the container +WORKDIR /app + +# Copy the Go binary from the builder stage +COPY --from=builder /app/dist . + +# Expose the necessary port (replace with your server port) +EXPOSE 3000 + + +# Command to run the binary +CMD ["./simple-auth"] diff --git a/examples/simple-auth/Taskfile.yml b/examples/simple-auth/Taskfile.yml new file mode 100644 index 00000000..28f19024 --- /dev/null +++ b/examples/simple-auth/Taskfile.yml @@ -0,0 +1,20 @@ +version: '3' + +tasks: + run: + cmds: + - htmgo run + silent: true + + build: + cmds: + - htmgo build + + docker: + cmds: + - docker build . + + watch: + cmds: + - htmgo watch + silent: true diff --git a/examples/simple-auth/assets.go b/examples/simple-auth/assets.go new file mode 100644 index 00000000..9a76f11e --- /dev/null +++ b/examples/simple-auth/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "io/fs" + "simpleauth/internal/embedded" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/examples/simple-auth/assets/css/input.css b/examples/simple-auth/assets/css/input.css new file mode 100644 index 00000000..bd6213e1 --- /dev/null +++ b/examples/simple-auth/assets/css/input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/examples/simple-auth/assets/public/apple-touch-icon.png b/examples/simple-auth/assets/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d10e9fe56b9576167656a1270d4ab42bec72d659 GIT binary patch literal 3429 zcmeHK*H_cc7X5`#1VIp#UPMI!siJggL5e_t5ITt9M==NyK}w{GfE3|Fnv_VSNEhiK zB%*+H2)!E=A)$m8di~1uHi7E0F!3@00KlTJrwyZW z^&gy}r^Y+I^f##l@`mYZ0U!JL7paA|vz5M!kr5zH&CdX!s7CDY>ns9#*8O`|jMO~iuFIcM`+$DqYyYbERdYs=} zG@Cn2HOG@*am(sCU8YU4lC`n<5GSkiFgm4DCN(<0;*+7cW;6U2dl#+g)$>=`9yCDe z*SxKFdIVPOFVxtohIP8BWJYOV{o+!MCNMy1CZ{@Ue;$H_nO?k1t=WRfOd7$4& z#`VAe$hoRtbV&OP0A7m5vC5j-@BdEyX(8AxEm+*6uhX!=m@5JE9(-Wtf)W?GE@EnD z$6r%hWBQQdTwMAwAFCTbv>M)?rJNrg>6o1SRxkfb)IdijJL?yJqGdL20SuyT9-2+b@-uyScj;)b8vom%KhA>}tfmHQT^{z4g$k z2pn&Fp&(9x+>CYZ54OR2-7trb)RS|t$JaK(Gt}O{yr;vQ+xqe)<}fW@BBw#_+R(|v z0+K^!*CS$B%kV^ibJ|8*%i>R^Y}U`}$iQR5@*vQ z&^j@LY^&2C66f)(3j|1mHIHz6lO^nOP|&E)2FX&eY>%iSEEMIpl9_bZSSm|bb%n7Y z`3Fop{OsXCj!1XWY^2&x{;rOoAV!~5MLG48W`0*g-snQ3Y=0HBs)Htq z`-qlwr@c3Crk9t#;P#gdFmwC&WWGft>;-v^j)`TV!us?B~V9 zXUwLcQN)SU&E3hRH>bG!E_d(R9j+Eg<7kzWf%2Iq`+&L!s+1Q|OLwnjqqE1jS4CCa zDuhEVm_3cKebz9w=d#bHJz^x;%}0l$r?hQT$c}onn2TbhIJ|Qz;+(s0iPX#YkxqW4 zx50SRb7g(glmqe!KSLA;J0K8`5?(3sX5jC)z>ug`zP-gXrEEVfUTibjn(H8nqB_hS z?6+Fzpp_1?rTcaDHa&jwO+;OIA9qFp*<_1qL?~2*$IM5s(br~yM)u=SYaaj*n13K2 zy9F+u?`q^SFLP{X0!X6X`0>18`^f0Ic?(LBv5Gb`{zotCF^Tg(18 zX6nHn)!(yu3E~mN(rmVb5V}SI^LfSKN)TR9+tzhl_EQM1BeK}ft7F%;|3>C7&Hg4N zyT)@iu%K@tr<%bjiI0*@8QuVYcEC}peid!c_TMh9MP>+u?p$(;f@TdsTN+6f`?p;7 z@Rqq*+)dz$Y^bFmnRaeUF8pzdKzL z^7@`_FoIU&IX9VuDEi?bT>0r8|%N1B$=Y?cL?Qn%X3kE|=ul z(d+9`@j2cMT%Pmrvf0wel$qSnFkzQnV!PaZPS%A@;dHUBSRthC?eb1zi|d3>Vj$W~ z=n0H+)bw}>on=^7RtC-ZG{hxdgsVtg;>*a=CWpmH9Km>IWEV!8#TR$e2zHR#tA4FK zHoPut3hNNU_OI>sBPC1g{CPIlElWvMz#%+g>9v3q6LtVQWpQQuomO9V0VSp(X88vb zzRWukPDA2mywGwKi3??Pn`BKw zjz+`+UDUiQV6JIz>*(-;k)qbBK)1qb_vSHW0@XD>aI47Y!tGn~rd3vSzj;{ivlyPQ zOWZVA+xH!WZ&>;=Tkr09e#t&MNpYu)-c%V{0#!$yfBwWb9h{$emRbJGsSKnvWj$#& zQFJZ#u;NB>@fEMax61V2@q!WI1*6|*P*vBf#4g6}8YE!-E?v$jM`2kBicIAq$ziD$?)9^k02kLY4T}&>8nja#e}QpOd3` z*4(QfhVVZ+UeJu#Dr=|`wYLM7`fPlN%B+dTSy+uPsQG7=`=$Kjet@=LmhZUQwqkEeVZBB1ZepQx>oC%NWF zdmo=0@^$&na^HaJYV3|C9v`Sr*q-{Y?$I=W&1L4|UO1qU$)n&eX$oiEt|!5$e%Bc{#~f{N391h{sB|aM6Cb- literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/favicon.ico b/examples/simple-auth/assets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..040cccf58ea179321b86f78b5f0a0817f1ec773a GIT binary patch literal 5238 zcmc&%TTc^F5MGTxz&GO?PsX3&laKxa5?VDrsPP_Skg8Epp+!_s6a+*B?}`GJic-7) zB8Vu0f{KVn1m!020|D?VOqU=FFKnXI9e|XbZK)i!~ZGZTTWi zTSj9-g8rZQtBALpc=W0fo8j(S%O?&OATMu&mKe zdP>qtnj0j7LmFfqw!yZd)Rh>62A?G_s?o4sOTFvGNAbC*3$0Is$VuPwznqMf;^%m` zBKz=0LHWmb;c{Ub?%pm!S4T6d$_kX69w!-R#Sd0pLiv>(lwHh1XL}Qx>Z;K4v6xbM9Jy;a*q_>sNeIh9UtF!AnVWu+_|1-rZ4yRAAQDaYk4Tv{GzEA4G+rkyzxG& z%g-x09iR2t2gPUnrpJEN_)C$Oxf8h=J5Y0{1eMovQJA$`$r=3T7$`o=T`lsd|He6! zcaf7Oe5d*%pJUaRwLtpO?`2~<^a>m*ML<#bnL!)#Fjqw{qI90=JUF4i7m%~ zaW5kKJ?njzwjGY{M41bEt~u13D?gK}8DHP`xybWq{SPrV*XV3>?qu2~_-~v=T}>I? zB}F*x+vdm@!`b3U-po(Fmk0WK0Zb7^o^UvX(zB_yHr2T{i!&y3|2hQy7g2RHAEkMz zXsEr7$%%3Ff9b)A)b(~g=x3^RPMxOpH9o4ulZO?`7T>#kf6Kn5_{@Is|IMqXs1M%4 zub*QW9_$zQv{}p)Z~8n}w$+>-lXKY~j0}Gh_T=3A&Q?rKg;8)K8SG#GmyZjI)T z=H75@bja!Y8J}ZdiyxYtL~r+Ne0bX?*30$9`7i4KE7w27T;Jyp8vCXM| z&C<46{l$i55@WqroXOr9-*#}0H`fO&eVj?(W=`~}HZt>pD{RUhIbQg(KPUXS^&i{= z#k2p4;Pdx}Nq){NZ@T}CcmK^Xi0AhQQkrtwK@C# F{tLVTip2l` literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-192-maskable.png b/examples/simple-auth/assets/public/icon-192-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d6efb61bf6c212e3c466edca6256d9a3000e86 GIT binary patch literal 3732 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 U`U+xTzkh@n(+eiG#@FKh0jyU=3;+NC literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-192.png b/examples/simple-auth/assets/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f5334355c00b1ff31781f93b97b0efaa0e049d60 GIT binary patch literal 7032 zcmZXZXEYp6`0sbuE^DLgvU=OqOAsO~f<^QYy@cqZ1kr*ZED^m0(TUz$LRh^=ZxIoq zERkr@iRjnwfA6{X#eMP2Gc(_3$~iM<&dg^bwY5~pVT>>U06?y$`at)_cm8Kk;+s@= z-kIda0X=n96adv@%o{g_2X@A4Pc=0G{5N?h02uBF0RIMvnxkUdj|6ib{wB*oDqZPFW^7_8O?I)xONP~YpY|3Vx*U0QXiu+74UCi4xvMFLIPnQqM?|f7n#>^c8l%}M?Nz?p#PL+T zM_~O8gwO^MZl|Cg&)>y?Y@HA)S^=Vm?6=k-eqI@}V9Vn{d)PCnkXj7jo_7||@HXX`O4L!^StydI&P{3T1|QW)T;N#<7yE^lV})nZhY!R&BdSd<#VYyjXZe)*o2 z7>FmmUjMmYa}Tu3wISct9*ah8Ar6J%=Pw8$jVUkL=EKH~2Y#mvGC=S%E%>9D$8yAo z92D1l1Zjz%6jLS&cj^IUx_WNYUb&r{?CiTJT{p(9rjbErDuAt}s96MoxCu*kNOj$0 zea0&XIxyo0+wWkiZ_R}t=f+&1O#C?H-QR-D1+cU?O_B)V)F&SArmSEllR zpUo>3aelFeXGA-aK>^l(F1wWvq!-mo%EFFcxN+XG!! z$|bh{akW_l@tj#dw*34=`TTpyXwVtZd0V(IbYBc|w<&2UFzT(eURZp4p7&Pqv8gCT zNm(6dso1#MQQP48sF-SO`8PG_;0?^^@>RM6%Cs6V)jFOmpL=?b^ZI+h5PQnKDd@m4 zfj_NvM7rhkP}*$+9K)jh*$^&>Jbv|Yx)QS?J&eWe;IT0II52jhq4hu-QJ6ykh&r<_8Q_s|wHw*&u+ls0H zUkOE0az_67R(Af}hzWdH))YSV=>tcB&PHHWV>nZ*<5RG|L==vmX*EYD=)=wwBgw?s zsr*PZdE$HeU}rQ+c?An-%J4f42O23n+sKPix8qIZ1;^qH`k-#@R8^MzsVf3QPqG15-Ck>+YT8oG7e9p4lq z6ZaqB1?lSa@fPTnk-r0c-7Xwmvp=vGPUZr*7!9m8Y8HDa9B~jx-6hK6kuco3B*8pe zO_2~EgVRJnJ&d@kesN|Gh})QN9IszmIP64|a~m@>4XL+;<4q<2_(XzU|0oWjZKn6@!Hb<1}b4=cEb?MyXJ!JzH9Cxg_2b zgxec@mUf~z4IsRA&zN0221f)}?fw;NkgL6PErQG*U-iIV)j=mBY(NWCv80^0f$L(* z+;UT&<)O$o7#1E~1xTk05B`jrgr;M_4m`Kw1%f2tKhwL8*jY(#$6%jZ(u~+UyKsgECtsorzF4W2ds*Iut_I2&& z?JQKQSuU+%My$nK+yTX5v2jq3R;4t02rrA741A_-&s|yYU+t(4G$IkzZyFk<12A|q zl=8^g2Ama+eHPcxiv#fs;0_P6xS|wt@AcatvFcqgIE2~#-fuw)<+ z=6GJf=(URd6YH!4A`ZfRaC0cWT8&l*ha(Wz9v) z>(5_fvv|ZcdZ7>C5pFX10L+v6N2_;D>4791@X_N45CQ7e^xE#}Bz-V1_%Xg(FtT;3 zrBqKocarWGdr8$=_5#h=#+*qbnSVt`c=Ora=7qYRd6nE*gVmRP{y|ll5BS19A7FQe zk#7m*R&-sVI;ko-dL}sm8{@TGon884|5{$dQDX%di)RM8I17*Ce);s_{6b~a$V*Ki zIKsTFt@f63rzA8~vW5>(4f;*hDfx0ZaUF{qIn4#RQ6^9fe2+|mC!oi|%dwpXD4t(J z!--VDKUZHdH}TEC`L)#tz6bZfConaHuI@r`D|u9pM{1v1B=*rt`^S>Jh_Nev)r~Bc zJD@RzTpYdzNqe~LGd5(DqAU#ReWgT-JlKf$L)iGlDcp!){XrO^)Y;DJh#fm`6dFx~ z6}J2{W&(wud>~OxmejbN5{8(F#_{U8342w8Hu|C$Bw@gn_I&jnh=+dl$2-jk)Q*6H z6=WioUfK(J)4v1_5k_P{C&Yv+CZG3?GuEQCbq|DT)UaRIHUqn+g7C%2iz|Sb*u5^& zCBE}XJlNuTk%KX@+GEQTu5$JPa%Crs{n}-6kPLnQBjlrMlJ;idJ7E&;-8i zG*SF;I9W&;^=Ak5y`2)%;1uJh-Eb@6_T2asA>D_K0;deWFa6(B8d0)U3ZBe=e8uDZ zuMkGTCdZ&QH{Bx~#?TlOeV?c9{?Q*Qj9)%?dQ#T8^1KhnX%ii9@{6N>HrZO?izycg z#~^(U$;ZZoFo7`h(kEN87tD+E{}5tg;tZthWv04A3?0lQbjMrSU!Ua17jdx=&IE*l zw}hA|G>kfk-Uqa42y}%V)u^uC4_ZW@IBL2%Ua8JE6dw6puBlO5fei(|RKepq{5X$< z9Rbt2))$3$yByR=)V>m2n3 zl#+bAQE(~$eoIg*P2}W^DC}tK1?xrNXQVOy;>Dg#_IxEnbkNR^{y6o_i^+Wp?|oF| zIFZ+8+M0bH>ck!Ou=vC@QdwMOTR*5V@xqFp*zhPsBsFu%J?H8osXvyu+}y;abV0$O z;6nUMEDZ3iAk(IlaaM7l)IsmF#jS;*nD~2t*S|q_Iu5@jlRqigusRWe;%U&nf><(6 zS~+chYt9CN7)JJ>W*0<(`|nKumG%&Wu2x~7X!d^N#Rb2j&iql`Fu{yS`Ue9ni$w*F z+Mzx*0kS861xvJMdh!bTbBh}&GA;w%tT@s)hxG*|TQt&_BTM0$$N1T5@ALRlpf2cVl$(__<6m*HcSdA-|8L?0O8s34Ywthj-{6r_?}}Ny@?T1WTDXrg zl(TXhypE-ETM%`xc7eW>Yqx*3pmz>2fR8xFW@Yl&oxpaRM%U+l4lebL5#_R+R$M1YXpQmiM%>7Fwyoi#M*8Ei5B;^-dUS4~!eR3pa?-Pk2 zP@zPG&K4g_UU$fiv4~nYo`#v5o-~3E#N%xQH=>G$A|kM6k7jt6+ng7jwt9;9?_DW8iAU*G`aky z$`y3@c+sBO_4Zfs)2rtu2}*&CP#aD`tmpztT_cJd^47V2P8<93Pa6Iak<~nLEs)fq zI~&o%(WE?~{wD?hhzlTqwGQ}rmO`3sfd4cQajp+?qv1XO-rwi@`=QNzi>* z%_jBaz{rpZ9=>XA_@-@K9}UT@M@*>S9Qj4DHfO-BYKevlv%E2ug)fiNJrz4GpbbDy zqhJq_Xh(aD_y!s~zs9faNB{WukM-o=U3B`!v_7mP4>-C)DzM^~oxyArOzM4-c=2@2 zW++r2fWA46o-hmU1+^A`n*e3D%lLPioVM4QHsd)?%3!@yuqntF_Urn0O^CZbbGC{C z12Li5Jg!@Ab^gnhGBuueLTOY^?RMapfG<1!v>{d)TE z4>^Z5BLnb4vjgl*jAWTI$KvZh?jDDn-(jyG=iP>94{oD++-EPf=8X#Bl>qTUzB!kb z{`Xq+TB8?BT5pEr={Tz>CObtgPw7T7s+;aHM-s`vPZo3`Z1LqkczmvH`uL46_Fjd3 zBhlNmzw8mNXIYm0oMhQxW4dBYel>H)re(Q{k?t>F_^=Qwv~6rV=WTZJ_UoJv$?y|L z3nZHs%-V(;ynb7VUBusnHC(0MUD@<2pje?!i&TA?c;Ilub!UjDb zCYHiN7jhH*gPl`~?Dw2S=GKxlixCO;qR8AhFjIFjNw06+_deE~FHP0_eY2PXLT_kL zp72b{^s&_^hgY=!Rt1PMpEE>^srpm|TY3)hxm)Nw(VQoDnsP4KrrQwfrz~%8a3jel zP|Q4UJgy z780bySvxu2Q6cL?tfPm)CbOnQ_R-a77aNXZ0$+TvQux|D@-2>1J+ux3iM(S`GpZwsM(*+CT7g@PDGC--LGc_ zJd#Py5KqXCl|ketaaW0ojppM^wSCTa$Fm|rs&pjhEtquY)Hu=GovhD~a_Up4Km?(TfsJbOy5 zWLo=(L4xrtm8s(T`c=^HA9_#iM7M1sg`-?-BrpQYgbbdnSDqSt>} zJDy9KN!~o6Cl~z|rtj>OzYV+i60sk=8&7|bbSthWYsN2_F}JiCz&tZF{w6>*<1<5J z+-sqn?}~K`_{g2-&))-nx~p-pthY5esSGJzg^~Xu>1h3{zW%x>Lg$d3qFZM?af-}6 z$2Q9AieL;Fg&kuwC(Pd2uPPB)atnE=**VCeoeB-vWXq4ilP|k4{Sc`XFC6Pab7yXp z`2-DJUz&&){%^08QI&7cWz~EkMmm(&_V+nlmg77dPU_uJpehZip_RNl)oj~=Tsb#mqL!yT!%f}2t_2xa5_C`4nIi|pK&|)#{1zR9- zfe-^|#$1Zb0XG6u)GI1$R=R5+>pJeLbg_+8F1&iQ-;d%8txVLd1=Z_~aYp~0cx&^x z=P33>_KR{z*;buIHH5e4<)uiUZz9$~{qRI3zDJhxs>EXVOS!RHmh=I&`~AnY^bl?N zvThTP$)#D>yWoi4-N0sp7GB3}9iY&rX?5(um%#T$c#JZE+eE*lrb3RW-%V#kUO(s6 z^imI{oDR7}2f6!w#$b8~cD~#eb$0j1c3kJ+oE~;7V8c3z5xC-8U!f|&+gABQr=3Y< zaI=7=HXGqa0s1IAuumIljkKIDAN+SsXHg&Ul!=4D3GStnk82!2767_tJe~~OH;90= z6i_)o_F*^FDvMKexclY>rP{d-mT}O%@Vn}Ex|q1T@>Vbg8^?irl^LEQCtku_@lRwS zYo7}s)%niz`5L}8D?k}V9E>Wl8GJ-R#fuZaH<$71pLJpGb6ETg(+C)sb=W*-f*4pm6r*bv%jos_81ba{coA?Gc{`Ke1+OkaUL+3CQi8wt_VO^z8NE-;(^$I}7(o z3VEvwtiRGjr*M(KkrM@ZD*_~c7%l~Q>FV+0ej6Lm{gio1rQ?NizM%qPxZbuW5p{gA zLJ;Ey%N=tvN4uek??4VqO0Z!VCR6lYGZLq;PcrYh_jCu-mpo`m5`(jYehtHy3t$&u zd;L65uOra14@#4)$+zsd9z|DWfIH4AiL{|Ig zQD58Td*%6~$a{YzWW@q|pvGZ1eSHz9jh~+4Or(?Aq*&lHgsQO>Czbaw)Rq~zTBviN zmq8`~cHGX>aO~HjuH&(2g%6IjR!F zdaS@l94HIpzu)Ii&ldVy#0(%&6vf>JL2P4*#%z~yH}K*&B4O+GyoNBhMzd(i%lCZL zz-yIOS5(`G<U+qrmKHhUIB95tmWLxzJx26rt9|dO*ERAAtj^H?|nM#yg zQ70877nkB^ziVW+BcLX|kxtHGc@NYpxI*tfT3#!t2T+G|#YAztQX9XMVb;0@@{n;K zRzJ}Dp281+s47v5Yq=_L`3C3A-T`gg%on9)Vz3>l70(q*SO*kr`~KM^`qv7tsc$wd z=&|)TM`MYqJok*J?C)~DP^Q6A$@~wOY}rVie4N6E#+a$FYb$cJ3Ja#Sa3_5+F^4#1 z8&h?%@Y07)m8SlbFgKiKL^q_~h*Qw@Whu*(S{O z@Gl}47nnrfD7Oe;jcfheqBXXN?02Y8_WN1+clgJeIcB}Tc)zK)$;{EL_=s+ELFOtM z^F19g#VFIB-uMOfIfne_4`R#;;%>9y2HPx5E>KqF!o*%k;$qLh;XoB0!Yi>Z$fSxfKE0^{< zY3UaZGb#;oov^z|nR0Nv_MU?D6_s7E2OWqCQ%y`=G4+L!&+qWiJ zPoD3wR1x~4p_?iaqw8TifvwMW>+KopZ5S`;+1hG){yEip9WFbYzSr+6flmBM3u9z} x%cimilvfPSdV(Q_^}+tza4QzW{-_?Ogx> literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-512-maskable.png b/examples/simple-auth/assets/public/icon-512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..db61f3dbc056f541e9b215d4be7ec22a8f436e38 GIT binary patch literal 14025 zcmeHuhgVZuw{H>xM2ZAa5gS1TEVKgx(u0CXN3hUAs&wg{B%p!{h=P< z9HmJ|dH|`RC6quQK=L-8@4k26822x@Lk1by$zE&ixz_BzIrGfOK#QB>BnJot;?};U zVGII6fJ+Dn#s<7mgZk;f8`#%a>pJLD=jjFDgNCE2wv)a-=rV8(1A(JmK+uCB!0RON z0)betU=R!N4nFt}3;D0R5D=E-|6Lypivx!fTki`L9u$KhW%U}%rk=*fvIe*%p;W^ium>98o z9~FMX6pjRep>QN237P!C_0sW!Yv2oIFa&f4{O^Y-2ow|*XV3~mpg|BA97JOI_v*w^ z1n7jjpU%zS3!p(r!T&6U1%U~+IVRGO-{YVlIxy{EE*mQh#C9t4HSh0n2v9fszYmwX zhy+Ouk&5n@9u}FW6DhP0G|7-oi3=)l$hP;@+*Bw^5C|GM5k4);&k^FK#!3HGHLF?BB9E5a6=1 z{F*!-L0e2DH>wH<2;e-@_s)A`A{#6RB{YpK?~p2cVm~B0)`jYOdze_8iwTqGHFtJi zr>CD+7&en`-JfU?94YX!H453K=T#KkH&?35{eZi1GJQ0+xNy`hU4rHt-W7LB{>X&T z_%oy)6bAasUr-P^wx=B(N}p0wXQR%jdTN*B(9n$ zoqDB~tJQ%a7;IJJ?M|ByDQ@B()3E~kSDA=()f^ku?(x(5vRZJxSqHo`KJ7} zU8@hqqd{1!92e042tlr>mIx`Oc)!JdV~up;ANpkNmCSknRKr$JwrD-c^Vmap>rVJB zy#N)yoiQvY_T+Ul_^q30P(tj<>}Q|RXK!VVHCPXbTg-&#{P1Pp(>Q$j+416NQEqmb zje<74KoND8FWm`B7L(V%Evat_1I!dYVYw&ANonbA<*{K~qhI_f- z&}I*KXN5ic!mhWfvn3E~H?Wvqvf*iwmAUM=OMg@DxarfnzJv9V)Z&H)lc}E@sgu|e zw~pfSjcFF2W%uG;kr9`zqn{((BqYSBjk9W7gp+0!esAafBn|PXg7CN9n>^tv`0zyK z3jdt2pzWFl)a3hqSvk=?ZY4FzuKKV$A0wN)`3JT?Z ztnSQxO4!Bb&Y$D-*LP>J}D#%5OQ}FB_g2)f8sG%sD!JEXFL|IalX9EE#)(j&p ztcl8(Bo+vcOx|2}_AIr$tglr2StHAPw?6F4>78Ga6G`;BWTo++Z|$|8Ut>w&kj?HW z1%VMwlkO5YNC-MOtj|37E6(piaME#=^Q&>qXJ4O`ms%MlyCXACWu8sJM4G3cMP~aC z4pP$9ng`WW(p;w%K3Or^c^ZXF@YRN@*Zh9ehp!HJEEUIuw4dXI+~!4qH1hI>y1ZF0 zi=?#jG%}LJ(v+004kk7e7bJ1&hEGcTS$#W6eUp+nH$>?Am(AC$ zV4sDA-gXFT=K4tN^GoYpUgX-9NIJ_w%6z32f4Ar?Ee&Hoy_$q}?UG-<*Q?9+i*C zOpRg1Ts#B^z3Vq$UOK}{wz+1=*!$*;duB)8ej39t(n?}})9tE%BqQ@$2q{Y0F$ugm z_d)!WbjYY<{@*_sAj(L@EMyON3IBL zAgqBpBPajh_8eK97NzgyyZ5QS0-TYH!Cxx!?zm^KMfTy{uvtDL+uK~RNZ zwA_glj{C}f{yY*Cqi0fpTl0%m6W&@3Dh|>vIRg1guD;|lupRNVa7+S?9$i{=a_ip1B+zIj3ujg z-4!xoFa(?%(8sGI&u|(9zSS(#Y7dk5o`vZPBHwnZPEiZGtZmgn7!vT{cYXJkFF~>h zy*skwGRsYbw znTC;0?}n6wC%o(r59>SGgZLT=g7g4biADu+$ZZ-D(p5XoEhUTHnFpMX&jjQCI#p?U zKVdyb9AHquZW-+<>&MGiH0A-9`Hqi4vQH5of1c*zRuzp@1Wsn5-;oH*y^WZNBiJm8 zXtYt^@oay{vVOJDQLX}oubLr-9{i)q-?Rv?NhfgAUJPs*DEKaX?3cT$WAB^(InZC% zZ~`408y_^-yW!)T_qoRCvS>=Z%hM}k8*EOkV;=?HMvN2MG&g3Q>&NjH!;MT!Nd1w4=dAQn0akoowFNh7SCd8bu&Ewx|E1X)U6n+|8 zn}1E?o(Sc>!c_>IaglgaMBW9dkm;vaE34Yyd>2uO_;k;}vPMkbV`VBrne3zUX)Mg} zfqJ7nli?~qX}|*yX|uuyM>~GV`l}=KY`BGU;7DLAx6&i$)2*k1;-Gw;## z)zTat9PTVyqIw2*+2eKMI2A|6Lt5?W{jIGQPJPueE{>*{fN2V@dv{Pp#|{rVXn@$Ai0BG0O>R@d|n#O^uIj0I$N3v*T&z?Pm6P z1q{+qmAfoE+oV?S@ywAD**jF~W;-*~zM3{~e`@enHxHplmrqfUu-bCV^&4@zFNBV2 z-s*U(2pXuDQBgy=m7G@a9jBGb-~3Baaq;_Mzc#goI$a4%k5#V7x=kPV>}@_U9?+Wz z?eZ)FR6^D=<$gfpJll4-_lhb}DQ80228F^Wy*b)ChZe*XZmca`a#ca(yQTf*uk$cV z4J(^f7o=%DyqQ)16eVsYJW*whQ^uy4EvB2#=80AZvuMK-%GzyU zq{(VQ#=5@z$ga*vBWpxi^F+l<|r@?W8kn_o$L$lVv8$u8O;;;DejT=r4fpT`%Qz*LKcT~7F(v@QS&3WecEsv@xHV1ZBT~Tf zEtHgcH9wY(lSlS%jf@8}bfWf1_wnbUx%#QcoUa4H;UUMWUxn!S4b`CaqSHQ-*=*qj zpHYezS4nA{(#jc)>Or&-brlw=VSU>iTG=j+G>KQZ+ed^de2XXv`MMOkiF-MVyftDO zXw5E29!It4i_LUpvh%V1Vu9seoMbZXa%*mcoyM#|pAu&z6hVewyBtmLQUp8ed8by0 z3)!*ro}0(#=C#$W$B7Y{)UFNUatyuuE!GRw*BagsReb7=V6r9!wnJ(;RBJhLBH7AL z4W60+0^44kuF{5$)(7%$ zO|C&EijOO1`h^B|6{}4F`~l)(cv`-lR+AXEuiHAH`aD}DNq)1zl1W+oIn2|iK#<~< zJY(oSqQpu&vNem{hivnLnTY3;TM?B(rdrY z%(1{U^avBoZ!xB8%My?XPA;fl;oqvs*L0m%*1XeXDtenM_1*8%kE)*8=>mMu0v`gD z+m$SP>gWld#G|ZbLD3O{ENHgpW^azECrx=&G!ZQ(Cg=8lQvt+3z0U1_b8|p9jn3ge z=)T~{t0^T=eu^|S&Q%%oXa@lG0z^2lA?k3s6ZG5_BWq)^T9;JQi?e~-BYj5!kj zQV8yhc^A3&Sx-D8CM^s6(1oHmQ{2D~{%_C7L61XBQ?n_%4UlK%3&lwxrx2VFSnhp5 zf2?f=;*m4Z@`?&bCZy&=Wt0~4=BL5ZrrQS|yX@zXGqm?2R)%AaHHg#JH&p9nq5V%7 zLP`V)I*~YO2zXp5_3icA+FFduXMbt1k?pqoP!b?KcYIC6Ak&R6DpPZiNi z%<1YQ6ePkQF#C&7i@+GuLnH+93_HBPmpCfepFb=C$%jVnmW&;h`F0L24#sDTU3;|{ zx_b!3w>E`?UAO}5_FjCK5ZnZ;!h$WqCS$(5#maRA@Ja~-<&&RdM_(ZAAnI)BFX*!$ zGE%uH*Ac1!pSC{>zd^t`F|S_rnD(pl!X8@zinDdxjtQ3%Iq=72&oA*~YypOSsj0XN zy?*6U(;0M>GK^gT^w;OOukk_&Yyi0@jm(50xA{-_^UNG_J+yxOAFQiWJq#*@1i`Ln zdYpsX0TjV!{I~Z&&O%(?6{T*lZ3!f3H8bhhIk*RSe@pGE^bu2D)}3ICM>_X;TWuh7 z{80Jf7zPTZ(($UV<=^M!zL$EhUttB+0|Zb{R{q;LsYXJK5{uM{NeAUw;cwHF3lt;> zlLQ1nm-xyd&?#Z;ATuf>uH;?ARcq{>DCDh!pwZ(*04D|u^@H0^OxoI3L+%-*oxZc+ z&JQ*L@Gg@M{W91Ek?v77L{rljE@;N>zl6J;c`u0kQxA`61Y#7r2e8PtMEB?*#gmmw z1T-^0+csnT9lSmMz6g$y1PE({epTZ|B6I7jB}*;96&2+U^g9wP-8{Uvs)6~$uSJ3w z7>C~$l`Y^3mJOZOmw(eJ&gv$@9ALx4O8(Fn$eU2bdRY+E_YkrG^6692qiK+|@#RzM zgd#v<-1`6{7syZYNdfttM#9@K1kPlW*&xS{9fg(!S3N@u0JX5R{Cp!IaOqw^pZeQ^ zkBRQ06lEAon6&AHSzjr<0m4`Sr%>&>8VH5gTzXXdi{62Erc3q_EkQrn6I}eOob`c& zFaGv{9|L8T7_iY@&1B%kMMZ(QI(3@)-0VCAHU!z82WEZ|FJ=gKTJ8R+p&OW^Wo`Pf&z{3mLqWzc$b%yY(BluXL;TR| zBHjH165=bF81m17N}8^j_igMh;X7|k4sg=(#X9=1?F-#%*DmlcoeVR#@F_GivJwW8 zAJ{A(#DBytybJ-?1c!JYwTKJ9iMRoYx^ctj*P^U|Hy;aY<R=)IsI#K9TFFP!2 zMWMr1Y#a9BkObrsz+>a7=_c4e7PfxWrAn`L_;#s=qS(HnsRD(m>=|(@evFuDQwfz{e%=_n+ zD_XvySl5bPf#6*Md6%JKe53##Hbwuna<3&_N6jwf&$kEa>mlWk2D0^}r*0Vi%jSA& zz1WvXG05kHli1-T?S;50cLXeIcqQ7QHoD_#q6uN!r9?s zp4ARDkG7&~fZU_?v@6a)&xsiY;>`RE&{AUbTmq9ygFGc?guvZVQ0++`UBQb7KrEKdHMLAHI9wxWfNkZH8IEb>&@{3|7+SMRlwz<-u_zFYD0^2_K=$C6$2F_Bn{rY-Rk9c^*>r>lJsQW7EFw*z~jZaBl};*ket=P9-PXs=;Bk1OP4! z3!8Z?mL{)sHF08QcCKapi7zf3IJ@V2Q!6-Qi;2|onWS>#;H|gZ<^C%iJ;5-l1oSv` z3NX_#7B7r>ATCF0e%%CTHTwNj5h}gy2g#5USG?x+?Om|-iEF4@>%-X!KmswC+tgvx zEiZ*&@x0me>lJTLFt=aNbZvx)yl8XiP(qgeMgKnTF8>YgAdFq7drv!;80;T2fXw-U zJUM9C@rRz2gecLjw!Ou)w|n<8X5*Iu96nT1g;eby5G;hPwz)x=>=5AIl>2HKh?Z<= zPka{{cInEcBe*6c3z!pf4@z3OXa2V$@2WZyua4gxz8&04WG`X=Atgya@hgq&5=plM z0)-NeNBo5Q`rC&9ZM}glD6xsy`|e3eqN|L5F99@k24H!DJiI;{d4lzD#M|mL|lbw%qlxWURW_1=Cp@S z8V%7B_is!Z0B5K4VO0hSzh#cZZx0UGB;t1#+HtCz z+3!3G`^OSnSa6@Q_Op8I{NtA`54pZWN$;Q5Ep>d#xAIxNz;okyFfA@T7>XW}|BLk; zya=hQRj_AAV_&Z(AI6Z!8*Kwcz7-GFM=@VUY$_>)Y+ZluHZ=`{N+$5_NtCh!yA1^6 zlx&&v1!Jjbxt&hmmu->5cV8!Fo=GcbXNzvo6;PvZQZ(Eis3Q&o8@~4WoGb#)i_ztd z8?W5(Si09Xceg$FWBGNFCt(wtNlYNgZHbPK*T!=~0C7Li%9P~X!_af*uq>qUp?aIc znTn!3#kDqPi8VLZH+*hX)9Cul{iy8rdh#TSNE~@@sJ6E*?b3Up=f08d>F;-;j?Dp@ zKr06X3U8?)kVxEK-w6kqp^EYLH_@uLzlAx4yI3(rAfES%EnW{Fno87YoyM1MSoO#p zr=6@%&3to=#E7r4;03VpdqDVBbUOP62y6qT27JNqe)Gz6`tCOz1VFpW)#gsMx-8!` zp9s_|ODQT|=JxD_0AOIqUTj9qqlNg1ZM^Sqho2{?3;vsV6JKpYy|Rza&9{bcxH-(e+bMS# zcTY3>OS63J1I;1%*DqeL=XT+)zYf4_pCXU@nU2fi z6*zr1S(Rp%8H&ulGcIgGHSId3E4uhe3oDPoq>ui_Vo^*Hjw?)N7etp>*aOii@2AKbY1E@8%?=61( z;Ym#{Ua;a5gXNwBVr0#iUFXnfGmLm)N^lfU6r=|JYg9E#+P=OTNB}))lQw`UWCNdh zE0`C}jMc(cGgK-an}QA;s8@}}g-+{_x}$WnG5}sg#|7l;Kp}iB0g0L(7S-1S+$WNf z4~0uxrFPya>XN#6MWT(G@8wxii%SHf6RrF*)*EYb^iUT&DEG*WZ;);;%(^AHkBmT5^aBlAb=i{ z6MrHEFG6S0Q4ymo<#ua(=}PZ>=TZBw*fp79p-dsKP-EWu{(UPnT+d@;A5@{O12 z!$zX&z4M}_h=k`LXOMBvbOjLp-N$rXNono##AehxM2xgVZW)76vjlYbP+QK&D0cx?vHNT&qlEb2awOgCW~?8!_WbF$^F==E zHTyj=eLC+y5oGrRaIr3Exa)4YL=z-XRn7Ut<6d4QA{djm;X3oJxym3Y2_Mhd9ku*X znA4%FAR1@Ex_P@%UEGX(QL^0A2kzN2JI=&Sr=6MY1wGH#9^Zh19DIWb_-*ogn zDblz^KGNMo7L~LND8QApd>FaX+c!vQr{f!rsH{p_NDV5nlsPRx(k#u_XRD!fuT1JZ zjwQR^f_amL$Rl@F641wnkwjNGOv5%#$sZ3C`FeWxBg8{)VngUx)9#uHS&a49hpehC zd_oB-d*3stmjWX5q~3f#<7@?TBO{LN-ZbL)B6lovaZm>SEZ*vt%QWBKqs)2=bEATv zIE@nBRv(Wir~nZsjqvL}kX$#SBbEk3>Ha?1eqtfW0VPiAT?NNHcbn?obhhfMPq$r{ zN?MNvK5}<=N$ez_74V)&@Q*ybk1rE$54SE^n4hof+x5Kp)vWJIL)zZ)!8`R!yI(ry z)v8d_`yVFgYAW8}e-0^*TkNPn_>SD_LY482u#N+*hqsTVnp`kplrKOT_{jT@&_){K27t_%xY&TbqFSZ3A5kLXvseLNcCD!tQQl&HL?x? zDTK&B-_m)Jwt7I}M{R$S&5T5z_%b1pxGXfZS(I1hWjCbN;3^LTf_?%C7^2kSfKFKQgr7pW`}51 z@ZhZI-UC&sPw05tYbK$0x55G(#%Swo{}*Y5OI^mEpJo2!G;9S5V6hyzc=zzBiBq98 z-NJMh3@gU(kQ5ujs=SCFbAp3}t#hvSq>|HKJ_vq$Q5(O{4C&JH`Jo^APb5%y0E&eM zRs(TJE>-~h*FmBCsNWN)PTEm7n#grb=k-p}Xir8g9+4mc2uq!VnIz<|qutLQ`YDcN zFNfV{GtP(+eX4xvO>VUWd3P_jVQXB~b4OSEHIL|luHSi16GEd!v3z~Y{%;@Wsr!J?S$s$f8sl_ za21c*s2I!}+ONV+QML*i=0%}-Pxt#8-t_7trk z!)|9I7V&v*vqk)1=rZiHe?UFLXerJ%Th+gu#1drc$=_YZS1^_ni(0Q&S#K>fiQU3y zMxz`}(SLyi*qnWVbmIVyj@ays_L=%ByfZg#;b^`2<64T++YxH~GkId_GnMSKueLsU z9%k_MPIoLEfNVG3_@A>iMP}O;R19SX_ztTb6xgf00snnWC)wcq!$&>4yCs%x>y4X* zhd3b*fQs$oJmDc8sGSH_eNsMDHL0nfvvte=%0b2m#0XcN?vCS5tE}4ivoj10GhXrV zoS`*tPV5u+*f2i;4=e4}d7M}3JXVH%U_f3c+~h?Aij?YZUUsLdsMe^z3`BC?UKkN*B##0E&;NQls#6H{6vc04NJ@d5^X}9Ax_~yxguw8K{g2 z0r1f)PL>c(hr(0aL*4zCqsQ{%Swy=+s<$1FzK#=0$OVBB+SgQpw1@#qssTqu$1DPvNW^3qwDh}bNGGzxY#~R6a!s)94dVQ32K2~O$So5 zP)<@FI%C=WlDI@tM`3bn^3Qf+8pegjFk(X$RvL7Kv| zzrQ%yny3P~LD)YIcMqUvKmz}^zN2Y zuG**u)t2{xwn#diJ+HpRur8FIn^T}wH_?SB2G#ABN z80T#@kofSWmB;j6O&;>_u-WVB@0_t`mMh9dY7a%1k5L)|gHRFPPZ>0I+kQ^ylu8AX zeQjZ%o|7Yih>d?#N^{sj-2?RfcSanOhK?v4Tv~6Ep1OSMxtV`b6q3&RRi$5Uf3t%1 z-wriB-~{#Llr(?0gqs5DX-Wb2zXSmdpSD0L$F_X<(#eDNR{}sEA%q7T@q1PxfD0ye z81($^P9FeJmVr>v=I<3!0U#{ZJ>dE8-u6-e%q$&ec`x{T1wdX14izR>e|M+@U@m&| zEOP(%3L?M?BI%j$e)qQ*0lH8`11)MDw4h4?P_@+X^3k~81OX7NEsott?e_}WzzVHS z1rL7{^lxJxn*Mu*KU@04r9Xmq@LQ2Ty7b39{4wGOKXytzy3G`dtx$9z{i6v2{ KG(KIojr>11q;Vnu literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-512.png b/examples/simple-auth/assets/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0665d887cf19d3a45122767f0d6609ccb1afbb GIT binary patch literal 23888 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 B&S(Gt literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets_prod.go b/examples/simple-auth/assets_prod.go new file mode 100644 index 00000000..f0598e1c --- /dev/null +++ b/examples/simple-auth/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod new file mode 100644 index 00000000..8e15c299 --- /dev/null +++ b/examples/simple-auth/go.mod @@ -0,0 +1,11 @@ +module simpleauth + +go 1.23.0 + +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + +require ( + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + golang.org/x/crypto v0.28.0 // indirect +) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum new file mode 100644 index 00000000..b173b667 --- /dev/null +++ b/examples/simple-auth/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/simple-auth/htmgo-user-example.db b/examples/simple-auth/htmgo-user-example.db new file mode 100644 index 0000000000000000000000000000000000000000..f572cf5c2006e7992f372b29b42617548405ed2d GIT binary patch literal 36864 zcmeI(U2oe|7yw{9X+Bn#7$mA*6-?RGMq5+c$6pB&BW;{5U7GYG+1d)JI<}8XNAFo^1aZX=K;mXUfs0)t?Jt1DA3)r}&Bg^F#1+SO-L$0>h;p&A*HTjZ^!U8zJnu;) zpV;fGm8MI0r`u~|mq*O&49hYf@I1pX)AV(TzQQd=cgDg4`j1&t2xcojXfDHsd00ck)1V8`;KmY_l;G6=x$;9N1DRvlZc5HIc zv=6rN!2M{uPx}34x6|Jq^hs~KX@|#`7T1hI-QdgBqOrlhusUC>^5H4`>|q<3JBj#Y zW{Mpgg*vQqto`I)+8@<9+32V|Q;ySiCs^yKT|Xdc<7Ug-OZ=tH(f_?Ry(50sub%nz z=2&8KYKr{~yVz`za17z!*kM!k!a~J38sYftI8V2x?Y;Y3xmq`F8f*N@T6wv!w#nZ% zHu*xMUMp8=1ItFWe%(LA??-T2ct*8W=c|oMC8#hOWYBKi*rE55oWPIK?u4Qu=!>dfn(vt*(DO znqOi_8()dWC$C*&Hv{#N@;T``O!m zo1V7!ikvvxEBV(6^e4@+)SQ`@d$`}f-|cy`!_P}tDNt?`7t;h``roB>-!aJA%%e|c z{#9NF_q=@ngK03HnTf+0VAg z6$xJvg)7a2yT-zv(On`BN~Q8X+_v-%0jPsdtqV4sTT(856Q}o znte2FHhbRM(Y8P2X=zX3oAN_m|e2 zZuxGpI$zry%s*_Eg~EO(dpwAg7uCFg&M4X+8^uMZz1y!ZXO7& z-CCpH+n6s4J8p4DFRf-5oQ;Q#O<{hJ-KyVTesCf#9j}^K^y6_4i|9<9qv`R-`?u*C z-iTac-leI1+v7Ri%SwB3Nn6VnUAJ(1Yqhu2*jcD%2OC@WOVZY@_5J>ixr6GhTPvejnnataZefUd+r5)3;` zp&JoRl{A4M0ZT;07!%7zM9fL1j1&`Til&;jCCjE_sg|tEsxI5QqnWbeXp)R^P7H4@ z_Z|SCH{$DgdUE(ofLIr_plD7|@`Av<$?OMFiJ2p|BC9!MDVAg^vZk1-AP_|rHA|FD zEvH*ZQxTCRY#~8)Bu6r_Bj`4*gH-D%L>N^V-G(1V74#sgn+(UQiYn1;NtBhGX=-%b zmS}5&hGkPEnobXpY~@s9+mfs(B0>T^k{m~}C5?z`?o?EI>${>Ib;OVA7ac}Tgi&o9 z*}5&MmSS5HF&z`-97RW}DS5aO5;ctE9CmE%V8zBnMY@tBIbzC!jgd1Nm_JtUhWpW@ z4q;RQ9Y&3ZQHdbxj)@gPrulS`Oz{*^as=v2?M=;+HCwYV9g~8wZd)cHSd)>Jqhq&C zWt7Aqs+>os$LbXYQN8>BqgW)L|9>TC4h$LuKmY_l00ck)1V8`;KmY_@MgjQ!|Exy~ z{=?t@queuw`-A(1d&WKIp1+J!0Qv+1AOHd&00JNY0w4eaAOHd&00JQJHv+LJ%SK|{ QuS`7R? datetime('now'); + +-- name: GetUserByID :one +SELECT * +FROM user +WHERE id = ?; + + +-- name: GetUserByEmail :one +SELECT * +FROM user +WHERE email = ?; + +-- name: UpdateUserMetadata :exec +UPDATE user SET metadata = json_patch(COALESCE(metadata, '{}'), ?) WHERE id = ?; diff --git a/examples/simple-auth/internal/db/queries.sql.go b/examples/simple-auth/internal/db/queries.sql.go new file mode 100644 index 00000000..eee80acf --- /dev/null +++ b/examples/simple-auth/internal/db/queries.sql.go @@ -0,0 +1,123 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: queries.sql + +package db + +import ( + "context" +) + +const createSession = `-- name: CreateSession :exec +INSERT INTO sessions (user_id, session_id, expires_at) +VALUES (?, ?, ?) +` + +type CreateSessionParams struct { + UserID int64 + SessionID string + ExpiresAt string +} + +func (q *Queries) CreateSession(ctx context.Context, arg CreateSessionParams) error { + _, err := q.db.ExecContext(ctx, createSession, arg.UserID, arg.SessionID, arg.ExpiresAt) + return err +} + +const createUser = `-- name: CreateUser :one + +INSERT INTO user (email, password, metadata) +VALUES (?, ?, ?) +RETURNING id +` + +type CreateUserParams struct { + Email string + Password string + Metadata interface{} +} + +// Queries for User Management +func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (int64, error) { + row := q.db.QueryRowContext(ctx, createUser, arg.Email, arg.Password, arg.Metadata) + var id int64 + err := row.Scan(&id) + return id, err +} + +const getUserByEmail = `-- name: GetUserByEmail :one +SELECT id, email, password, metadata, created_at, updated_at +FROM user +WHERE email = ? +` + +func (q *Queries) GetUserByEmail(ctx context.Context, email string) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByEmail, email) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Password, + &i.Metadata, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getUserByID = `-- name: GetUserByID :one +SELECT id, email, password, metadata, created_at, updated_at +FROM user +WHERE id = ? +` + +func (q *Queries) GetUserByID(ctx context.Context, id int64) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByID, id) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Password, + &i.Metadata, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getUserByToken = `-- name: GetUserByToken :one +SELECT u.id, u.email, u.password, u.metadata, u.created_at, u.updated_at +FROM user u + JOIN sessions t ON u.id = t.user_id +WHERE t.session_id = ? + AND t.expires_at > datetime('now') +` + +func (q *Queries) GetUserByToken(ctx context.Context, sessionID string) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByToken, sessionID) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Password, + &i.Metadata, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const updateUserMetadata = `-- name: UpdateUserMetadata :exec +UPDATE user SET metadata = json_patch(COALESCE(metadata, '{}'), ?) WHERE id = ? +` + +type UpdateUserMetadataParams struct { + JsonPatch interface{} + ID int64 +} + +func (q *Queries) UpdateUserMetadata(ctx context.Context, arg UpdateUserMetadataParams) error { + _, err := q.db.ExecContext(ctx, updateUserMetadata, arg.JsonPatch, arg.ID) + return err +} diff --git a/examples/simple-auth/internal/db/schema.sql b/examples/simple-auth/internal/db/schema.sql new file mode 100644 index 00000000..e7b53a97 --- /dev/null +++ b/examples/simple-auth/internal/db/schema.sql @@ -0,0 +1,28 @@ +-- SQLite schema for User Management + +-- User table +CREATE TABLE IF NOT EXISTS user +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + email TEXT NOT NULL UNIQUE, + password TEXT NOT NULL, + metadata JSON DEFAULT '{}', + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) +); + +-- Auth Token table +CREATE TABLE IF NOT EXISTS sessions +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + session_id TEXT NOT NULL UNIQUE, + created_at TEXT DEFAULT (datetime('now')), + expires_at TEXT NOT NULL, + FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE +); + +-- Indexes to improve query performance +CREATE INDEX IF NOT EXISTS idx_user_email ON user (email); +CREATE INDEX IF NOT EXISTS idx_session_id ON sessions (session_id); +CREATE INDEX IF NOT EXISTS idx_auth_sessions_user_id ON sessions (user_id); diff --git a/examples/simple-auth/internal/embedded/os.go b/examples/simple-auth/internal/embedded/os.go new file mode 100644 index 00000000..ddfd55f5 --- /dev/null +++ b/examples/simple-auth/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/examples/simple-auth/internal/user/handler.go b/examples/simple-auth/internal/user/handler.go new file mode 100644 index 00000000..ad60648a --- /dev/null +++ b/examples/simple-auth/internal/user/handler.go @@ -0,0 +1,118 @@ +package user + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "simpleauth/internal/db" +) + +type CreateUserRequest struct { + Email string + Password string +} + +type LoginUserRequest struct { + Email string + Password string +} + +type CreatedUser struct { + Id string + Email string +} + +func Create(ctx *h.RequestContext, request CreateUserRequest) (int64, error) { + + fmt.Printf("%+v\n", request) + + if len(request.Password) < 6 { + return 0, errors.New("password must be at least 6 characters long") + } + + queries := service.Get[db.Queries](ctx.ServiceLocator()) + + hashedPassword, err := HashPassword(request.Password) + + if err != nil { + return 0, errors.New("something went wrong") + } + + id, err := queries.CreateUser(context.Background(), db.CreateUserParams{ + Email: request.Email, + Password: hashedPassword, + }) + + if err != nil { + + if err.Error() == "UNIQUE constraint failed: user.email" { + return 0, errors.New("email already exists") + } + + return 0, err + } + + return id, nil +} + +func Login(ctx *h.RequestContext, request LoginUserRequest) (int64, error) { + + queries := service.Get[db.Queries](ctx.ServiceLocator()) + + user, err := queries.GetUserByEmail(context.Background(), request.Email) + + if err != nil { + fmt.Printf("error: %s\n", err.Error()) + return 0, errors.New("email or password is incorrect") + } + + if !PasswordMatches(request.Password, user.Password) { + return 0, errors.New("email or password is incorrect") + } + + session, err := CreateSession(ctx, user.ID) + + if err != nil { + return 0, errors.New("something went wrong") + } + + WriteSessionCookie(ctx, session) + + return user.ID, nil +} + +func ParseMeta(meta any) map[string]interface{} { + if meta == nil { + return map[string]interface{}{} + } + if m, ok := meta.(string); ok { + var dest map[string]interface{} + json.Unmarshal([]byte(m), &dest) + return dest + } + return meta.(map[string]interface{}) +} + +func GetMetaKey(meta map[string]interface{}, key string) string { + if val, ok := meta[key]; ok { + return val.(string) + } + return "" +} + +func SetMeta(ctx *h.RequestContext, userId int64, meta map[string]interface{}) error { + queries := service.Get[db.Queries](ctx.ServiceLocator()) + serialized, _ := json.Marshal(meta) + fmt.Printf("serialized: %s\n", string(serialized)) + err := queries.UpdateUserMetadata(context.Background(), db.UpdateUserMetadataParams{ + JsonPatch: serialized, + ID: userId, + }) + if err != nil { + return err + } + return nil +} diff --git a/examples/simple-auth/internal/user/http.go b/examples/simple-auth/internal/user/http.go new file mode 100644 index 00000000..d6865d18 --- /dev/null +++ b/examples/simple-auth/internal/user/http.go @@ -0,0 +1,18 @@ +package user + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/internal/db" +) + +func GetUserOrRedirect(ctx *h.RequestContext) (db.User, bool) { + user, err := GetUserFromSession(ctx) + + if err != nil { + ctx.Response.Header().Set("Location", "/login") + ctx.Response.WriteHeader(302) + return db.User{}, false + } + + return user, true +} diff --git a/examples/simple-auth/internal/user/password.go b/examples/simple-auth/internal/user/password.go new file mode 100644 index 00000000..fd6a6a76 --- /dev/null +++ b/examples/simple-auth/internal/user/password.go @@ -0,0 +1,18 @@ +package user + +import ( + "golang.org/x/crypto/bcrypt" +) + +func HashPassword(password string) (string, error) { + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + return "", err + } + return string(hashedPassword), nil +} + +func PasswordMatches(password string, hashedPassword string) bool { + err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)) + return err == nil +} diff --git a/examples/simple-auth/internal/user/session.go b/examples/simple-auth/internal/user/session.go new file mode 100644 index 00000000..f8d54f4a --- /dev/null +++ b/examples/simple-auth/internal/user/session.go @@ -0,0 +1,83 @@ +package user + +import ( + "context" + "crypto/rand" + "encoding/hex" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "net/http" + "simpleauth/internal/db" + "time" +) + +type CreatedSession struct { + Id string + Expiration time.Time + UserId int64 +} + +func CreateSession(ctx *h.RequestContext, userId int64) (CreatedSession, error) { + sessionId, err := GenerateSessionID() + + if err != nil { + return CreatedSession{}, err + } + + // create a session in the database + queries := service.Get[db.Queries](ctx.ServiceLocator()) + + created := CreatedSession{ + Id: sessionId, + Expiration: time.Now().Add(time.Hour * 24), + UserId: userId, + } + + err = queries.CreateSession(context.Background(), db.CreateSessionParams{ + UserID: created.UserId, + SessionID: created.Id, + ExpiresAt: created.Expiration.Format(time.RFC3339), + }) + + if err != nil { + return CreatedSession{}, err + } + + return created, nil +} + +func GetUserFromSession(ctx *h.RequestContext) (db.User, error) { + cookie, err := ctx.Request.Cookie("session_id") + if err != nil { + return db.User{}, err + } + queries := service.Get[db.Queries](ctx.ServiceLocator()) + user, err := queries.GetUserByToken(context.Background(), cookie.Value) + if err != nil { + return db.User{}, err + } + return user, nil +} + +func WriteSessionCookie(ctx *h.RequestContext, session CreatedSession) { + cookie := http.Cookie{ + Name: "session_id", + Value: session.Id, + HttpOnly: true, + SameSite: http.SameSiteStrictMode, + Expires: session.Expiration, + Path: "/", + } + ctx.Response.Header().Add("Set-Cookie", cookie.String()) +} + +func GenerateSessionID() (string, error) { + // Create a byte slice for storing the random bytes + bytes := make([]byte, 32) // 32 bytes = 256 bits, which is a secure length + // Read random bytes from crypto/rand + if _, err := rand.Read(bytes); err != nil { + return "", err + } + // Encode to hexadecimal to get a string representation + return hex.EncodeToString(bytes), nil +} diff --git a/examples/simple-auth/main.go b/examples/simple-auth/main.go new file mode 100644 index 00000000..ca237d47 --- /dev/null +++ b/examples/simple-auth/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "io/fs" + "net/http" + "simpleauth/__htmgo" + "simpleauth/internal/db" +) + +func main() { + locator := service.NewLocator() + + service.Set(locator, service.Singleton, func() *db.Queries { + return db.Provide() + }) + + h.Start(h.AppOpts{ + ServiceLocator: locator, + LiveReload: true, + Register: func(app *h.App) { + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") + + if err != nil { + panic(err) + } + + http.FileServerFS(sub) + + app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) + __htmgo.Register(app.Router) + }, + }) +} diff --git a/examples/simple-auth/pages/index.go b/examples/simple-auth/pages/index.go new file mode 100644 index 00000000..364f0f3c --- /dev/null +++ b/examples/simple-auth/pages/index.go @@ -0,0 +1,74 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/internal/db" + "simpleauth/internal/user" + "simpleauth/partials" + "simpleauth/ui" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + u, ok := user.GetUserOrRedirect(ctx) + if !ok { + return nil + } + return h.NewPage( + RootPage(UserProfilePage(u)), + ) +} + +func UserProfilePage(u db.User) *h.Element { + + meta := user.ParseMeta(u.Metadata) + + return h.Div( + h.Class("flex flex-col gap-6 items-center pt-10 min-h-screen bg-neutral-100"), + h.H3F("User Profile", h.Class("text-2xl font-bold")), + h.Pf("Welcome, %s!", u.Email), + h.Form( + h.Attribute("hx-swap", "none"), + h.PostPartial(partials.UpdateProfile), + h.TriggerChildren(), + h.Class("flex flex-col gap-4 w-full max-w-md p-6 bg-white rounded-md shadow-md"), + + ui.Input(ui.InputProps{ + Id: "email", + Name: "email", + Label: "Email Address", + Type: "email", + DefaultValue: u.Email, + Children: []h.Ren{ + h.Disabled(), + }, + }), + + ui.Input(ui.InputProps{ + Name: "birth-date", + Label: "Birth Date", + DefaultValue: user.GetMetaKey(meta, "birthDate"), + Type: "date", + }), + + ui.Input(ui.InputProps{ + Name: "favorite-color", + Label: "Favorite Color", + DefaultValue: user.GetMetaKey(meta, "favoriteColor"), + }), + + ui.Input(ui.InputProps{ + Name: "occupation", + Label: "Occupation", + DefaultValue: user.GetMetaKey(meta, "occupation"), + }), + + ui.FormError(""), + ui.SubmitButton("Save Changes"), + ), + h.A( + h.Text("Log out"), + h.Href("/logout"), + h.Class("text-blue-400"), + ), + ) +} diff --git a/examples/simple-auth/pages/login.go b/examples/simple-auth/pages/login.go new file mode 100644 index 00000000..a9b148de --- /dev/null +++ b/examples/simple-auth/pages/login.go @@ -0,0 +1,49 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/partials" + "simpleauth/ui" +) + +func Login(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + ui.CenteredForm(ui.CenteredFormProps{ + Title: "Sign In", + SubmitText: "Sign In", + PostUrl: h.GetPartialPath(partials.LoginUser), + Children: []h.Ren{ + ui.Input(ui.InputProps{ + Id: "username", + Name: "email", + Label: "Email Address", + Type: "email", + Required: true, + Children: []h.Ren{ + h.Attribute("autocomplete", "off"), + h.MaxLength(50), + }, + }), + + ui.Input(ui.InputProps{ + Id: "password", + Name: "password", + Label: "Password", + Type: "password", + Required: true, + Children: []h.Ren{ + h.MinLength(6), + }, + }), + + h.A( + h.Href("/register"), + h.Text("Don't have an account? Register here"), + h.Class("text-blue-500"), + ), + }, + }), + ), + ) +} diff --git a/examples/simple-auth/pages/logout.go b/examples/simple-auth/pages/logout.go new file mode 100644 index 00000000..3655a427 --- /dev/null +++ b/examples/simple-auth/pages/logout.go @@ -0,0 +1,23 @@ +package pages + +import "github.com/maddalax/htmgo/framework/h" + +func LogoutPage(ctx *h.RequestContext) *h.Page { + + // clear the session cookie + ctx.Response.Header().Set( + "Set-Cookie", + "session_id=; Path=/; Max-Age=0", + ) + + ctx.Response.Header().Set( + "Location", + "/login", + ) + + ctx.Response.WriteHeader( + 302, + ) + + return nil +} diff --git a/examples/simple-auth/pages/register.go b/examples/simple-auth/pages/register.go new file mode 100644 index 00000000..476c180d --- /dev/null +++ b/examples/simple-auth/pages/register.go @@ -0,0 +1,49 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/partials" + "simpleauth/ui" +) + +func Register(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + ui.CenteredForm(ui.CenteredFormProps{ + PostUrl: h.GetPartialPath(partials.RegisterUser), + Title: "Create an Account", + SubmitText: "Register", + Children: []h.Ren{ + ui.Input(ui.InputProps{ + Id: "username", + Name: "email", + Label: "Email Address", + Type: "email", + Required: true, + Children: []h.Ren{ + h.Attribute("autocomplete", "off"), + h.MaxLength(50), + }, + }), + + ui.Input(ui.InputProps{ + Id: "password", + Name: "password", + Label: "Password", + Type: "password", + Required: true, + Children: []h.Ren{ + h.MinLength(6), + }, + }), + + h.A( + h.Href("/login"), + h.Text("Already have an account? Login here"), + h.Class("text-blue-500"), + ), + }, + }), + ), + ) +} diff --git a/examples/simple-auth/pages/root.go b/examples/simple-auth/pages/root.go new file mode 100644 index 00000000..bacdd614 --- /dev/null +++ b/examples/simple-auth/pages/root.go @@ -0,0 +1,32 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RootPage(children ...h.Ren) h.Ren { + return h.Html( + h.HxExtensions(h.BaseExtensions()), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("title", "htmgo template"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", "this is a template"), + h.Meta("og:title", "htmgo template"), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:description", "this is a template"), + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Div( + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Fragment(children...), + ), + ), + ) +} diff --git a/examples/simple-auth/partials/profile.go b/examples/simple-auth/partials/profile.go new file mode 100644 index 00000000..8f18d2f0 --- /dev/null +++ b/examples/simple-auth/partials/profile.go @@ -0,0 +1,36 @@ +package partials + +import ( + "github.com/maddalax/htmgo/framework/h" + "log/slog" + "simpleauth/internal/user" + "simpleauth/ui" +) + +func UpdateProfile(ctx *h.RequestContext) *h.Partial { + if !ctx.IsHttpPost() { + return nil + } + + patch := map[string]any{ + "birthDate": ctx.FormValue("birth-date"), + "favoriteColor": ctx.FormValue("favorite-color"), + "occupation": ctx.FormValue("occupation"), + } + + u, ok := user.GetUserOrRedirect(ctx) + + if !ok { + return nil + } + + err := user.SetMeta(ctx, u.ID, patch) + + if err != nil { + slog.Error("failed to update user profile", slog.String("error", err.Error())) + ctx.Response.WriteHeader(400) + return ui.SwapFormError(ctx, "something went wrong") + } + + return h.RedirectPartial("/") +} diff --git a/examples/simple-auth/partials/user.go b/examples/simple-auth/partials/user.go new file mode 100644 index 00000000..1023e6f1 --- /dev/null +++ b/examples/simple-auth/partials/user.go @@ -0,0 +1,62 @@ +package partials + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/internal/user" + "simpleauth/ui" +) + +func RegisterUser(ctx *h.RequestContext) *h.Partial { + if !ctx.IsHttpPost() { + return nil + } + + payload := user.CreateUserRequest{ + Email: ctx.FormValue("email"), + Password: ctx.FormValue("password"), + } + + id, err := user.Create( + ctx, + payload, + ) + + if err != nil { + ctx.Response.WriteHeader(400) + return ui.SwapFormError(ctx, err.Error()) + } + + session, err := user.CreateSession(ctx, id) + + if err != nil { + ctx.Response.WriteHeader(500) + return ui.SwapFormError(ctx, "something went wrong") + } + + user.WriteSessionCookie(ctx, session) + + return h.RedirectPartial("/") +} + +func LoginUser(ctx *h.RequestContext) *h.Partial { + if !ctx.IsHttpPost() { + return nil + } + + payload := user.LoginUserRequest{ + Email: ctx.FormValue("email"), + Password: ctx.FormValue("password"), + } + + _, err := user.Login( + ctx, + payload, + ) + + if err != nil { + ctx.Response.WriteHeader(400) + return ui.SwapFormError(ctx, err.Error()) + } + + return h.RedirectPartial("/") +} diff --git a/examples/simple-auth/sqlc.yaml b/examples/simple-auth/sqlc.yaml new file mode 100644 index 00000000..30c05183 --- /dev/null +++ b/examples/simple-auth/sqlc.yaml @@ -0,0 +1,9 @@ +version: "2" +sql: + - schema: "internal/db/schema.sql" + queries: "internal/db/queries.sql" + engine: "sqlite" + gen: + go: + package: "db" + out: "internal/db" diff --git a/examples/simple-auth/tailwind.config.js b/examples/simple-auth/tailwind.config.js new file mode 100644 index 00000000..b18125c8 --- /dev/null +++ b/examples/simple-auth/tailwind.config.js @@ -0,0 +1,5 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["**/*.go"], + plugins: [], +}; diff --git a/examples/simple-auth/ui/button.go b/examples/simple-auth/ui/button.go new file mode 100644 index 00000000..015a5e0f --- /dev/null +++ b/examples/simple-auth/ui/button.go @@ -0,0 +1,41 @@ +package ui + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/js" +) + +func SubmitButton(submitText string) *h.Element { + buttonClasses := "rounded items-center px-3 py-2 bg-slate-800 text-white w-full text-center" + + return h.Div( + h.HxBeforeRequest( + js.RemoveClassOnChildren(".loading", "hidden"), + js.SetClassOnChildren(".submit", "hidden"), + ), + h.HxAfterRequest( + js.SetClassOnChildren(".loading", "hidden"), + js.RemoveClassOnChildren(".submit", "hidden"), + ), + h.Class("flex gap-2 justify-center"), + h.Button( + h.Class("loading hidden relative text-center", buttonClasses), + spinner(), + h.Disabled(), + h.Text("Submitting..."), + ), + h.Button( + h.Type("submit"), + h.Class("submit", buttonClasses), + h.Text(submitText), + ), + ) +} + +func spinner(children ...h.Ren) *h.Element { + return h.Div( + h.Children(children...), + h.Class("absolute left-1 spinner spinner-border animate-spin inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), + h.Attribute("role", "status"), + ) +} diff --git a/examples/simple-auth/ui/error.go b/examples/simple-auth/ui/error.go new file mode 100644 index 00000000..a410e133 --- /dev/null +++ b/examples/simple-auth/ui/error.go @@ -0,0 +1,17 @@ +package ui + +import "github.com/maddalax/htmgo/framework/h" + +func FormError(error string) *h.Element { + return h.Div( + h.Id("form-error"), + h.Text(error), + h.If(error != "", h.Class("p-4 bg-rose-400 text-white rounded")), + ) +} + +func SwapFormError(ctx *h.RequestContext, error string) *h.Partial { + return h.SwapPartial(ctx, + FormError(error), + ) +} diff --git a/examples/simple-auth/ui/input.go b/examples/simple-auth/ui/input.go new file mode 100644 index 00000000..f4657662 --- /dev/null +++ b/examples/simple-auth/ui/input.go @@ -0,0 +1,55 @@ +package ui + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" +) + +type InputProps struct { + Id string + Label string + Name string + Type string + DefaultValue string + Placeholder string + Required bool + ValidationPath string + Error string + Children []h.Ren +} + +func Input(props InputProps) *h.Element { + validation := h.If(props.ValidationPath != "", h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + )) + + if props.Type == "" { + props.Type = "text" + } + + input := h.Input( + props.Type, + h.Class("border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800"), + h.If(props.Name != "", h.Name(props.Name)), + h.If(props.Children != nil, h.Children(props.Children...)), + h.If(props.Required, h.Required()), + h.If(props.Placeholder != "", h.Placeholder(props.Placeholder)), + h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), + validation, + ) + + wrapped := h.Div( + h.If(props.Id != "", h.Id(props.Id)), + h.Class("flex flex-col gap-1"), + h.If(props.Label != "", h.Label(h.Text(props.Label))), + input, + h.Div( + h.Id(props.Id+"-error"), + h.Class("text-red-500"), + ), + ) + + return wrapped +} diff --git a/examples/simple-auth/ui/login.go b/examples/simple-auth/ui/login.go new file mode 100644 index 00000000..1c18b7dc --- /dev/null +++ b/examples/simple-auth/ui/login.go @@ -0,0 +1,34 @@ +package ui + +import ( + "chat/components" + "github.com/maddalax/htmgo/framework/h" +) + +type CenteredFormProps struct { + Title string + Children []h.Ren + SubmitText string + PostUrl string +} + +func CenteredForm(props CenteredFormProps) *h.Element { + return h.Div( + h.Class("flex flex-col items-center justify-center min-h-screen bg-neutral-100"), + h.Div( + h.Class("bg-white p-8 rounded-lg shadow-lg w-full max-w-md"), + h.H2F(props.Title, h.Class("text-3xl font-bold text-center mb-6")), + h.Form( + h.TriggerChildren(), + h.Post(props.PostUrl), + h.Attribute("hx-swap", "none"), + h.Class("flex flex-col gap-4"), + h.Children(props.Children...), + // Error message + components.FormError(""), + // Submit button at the bottom + SubmitButton(props.SubmitText), + ), + ), + ) +} From abfc3b0205c303652ad0a17caf0a79e1c4fe47c2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:49:24 -0500 Subject: [PATCH 093/145] remove db --- examples/simple-auth/htmgo-user-example.db | Bin 36864 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/simple-auth/htmgo-user-example.db diff --git a/examples/simple-auth/htmgo-user-example.db b/examples/simple-auth/htmgo-user-example.db deleted file mode 100644 index f572cf5c2006e7992f372b29b42617548405ed2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmeI(U2oe|7yw{9X+Bn#7$mA*6-?RGMq5+c$6pB&BW;{5U7GYG+1d)JI<}8XNAFo^1aZX=K;mXUfs0)t?Jt1DA3)r}&Bg^F#1+SO-L$0>h;p&A*HTjZ^!U8zJnu;) zpV;fGm8MI0r`u~|mq*O&49hYf@I1pX)AV(TzQQd=cgDg4`j1&t2xcojXfDHsd00ck)1V8`;KmY_l;G6=x$;9N1DRvlZc5HIc zv=6rN!2M{uPx}34x6|Jq^hs~KX@|#`7T1hI-QdgBqOrlhusUC>^5H4`>|q<3JBj#Y zW{Mpgg*vQqto`I)+8@<9+32V|Q;ySiCs^yKT|Xdc<7Ug-OZ=tH(f_?Ry(50sub%nz z=2&8KYKr{~yVz`za17z!*kM!k!a~J38sYftI8V2x?Y;Y3xmq`F8f*N@T6wv!w#nZ% zHu*xMUMp8=1ItFWe%(LA??-T2ct*8W=c|oMC8#hOWYBKi*rE55oWPIK?u4Qu=!>dfn(vt*(DO znqOi_8()dWC$C*&Hv{#N@;T``O!m zo1V7!ikvvxEBV(6^e4@+)SQ`@d$`}f-|cy`!_P}tDNt?`7t;h``roB>-!aJA%%e|c z{#9NF_q=@ngK03HnTf+0VAg z6$xJvg)7a2yT-zv(On`BN~Q8X+_v-%0jPsdtqV4sTT(856Q}o znte2FHhbRM(Y8P2X=zX3oAN_m|e2 zZuxGpI$zry%s*_Eg~EO(dpwAg7uCFg&M4X+8^uMZz1y!ZXO7& z-CCpH+n6s4J8p4DFRf-5oQ;Q#O<{hJ-KyVTesCf#9j}^K^y6_4i|9<9qv`R-`?u*C z-iTac-leI1+v7Ri%SwB3Nn6VnUAJ(1Yqhu2*jcD%2OC@WOVZY@_5J>ixr6GhTPvejnnataZefUd+r5)3;` zp&JoRl{A4M0ZT;07!%7zM9fL1j1&`Til&;jCCjE_sg|tEsxI5QqnWbeXp)R^P7H4@ z_Z|SCH{$DgdUE(ofLIr_plD7|@`Av<$?OMFiJ2p|BC9!MDVAg^vZk1-AP_|rHA|FD zEvH*ZQxTCRY#~8)Bu6r_Bj`4*gH-D%L>N^V-G(1V74#sgn+(UQiYn1;NtBhGX=-%b zmS}5&hGkPEnobXpY~@s9+mfs(B0>T^k{m~}C5?z`?o?EI>${>Ib;OVA7ac}Tgi&o9 z*}5&MmSS5HF&z`-97RW}DS5aO5;ctE9CmE%V8zBnMY@tBIbzC!jgd1Nm_JtUhWpW@ z4q;RQ9Y&3ZQHdbxj)@gPrulS`Oz{*^as=v2?M=;+HCwYV9g~8wZd)cHSd)>Jqhq&C zWt7Aqs+>os$LbXYQN8>BqgW)L|9>TC4h$LuKmY_l00ck)1V8`;KmY_@MgjQ!|Exy~ z{=?t@queuw`-A(1d&WKIp1+J!0Qv+1AOHd&00JNY0w4eaAOHd&00JQJHv+LJ%SK|{ QuS`7R? Date: Sun, 20 Oct 2024 07:51:18 -0500 Subject: [PATCH 094/145] remove log --- examples/simple-auth/internal/user/handler.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/simple-auth/internal/user/handler.go b/examples/simple-auth/internal/user/handler.go index ad60648a..0ff3a97c 100644 --- a/examples/simple-auth/internal/user/handler.go +++ b/examples/simple-auth/internal/user/handler.go @@ -26,9 +26,6 @@ type CreatedUser struct { } func Create(ctx *h.RequestContext, request CreateUserRequest) (int64, error) { - - fmt.Printf("%+v\n", request) - if len(request.Password) < 6 { return 0, errors.New("password must be at least 6 characters long") } From 39744d6248ae17753081afb679e696d89744e137 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:52:13 -0500 Subject: [PATCH 095/145] add workflow --- .github/workflows/release-auth-example.yml | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/release-auth-example.yml diff --git a/.github/workflows/release-auth-example.yml b/.github/workflows/release-auth-example.yml new file mode 100644 index 00000000..ae84089f --- /dev/null +++ b/.github/workflows/release-auth-example.yml @@ -0,0 +1,52 @@ +name: Build and Deploy htmgo auth example + +on: + workflow_run: + workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow + types: + - completed + workflow_dispatch: # Trigger on manual workflow_dispatch + push: + branches: + - master # Trigger on pushes to master + paths: + - 'examples/simple-auth/**' # Trigger only if files in this directory change + - "framework-ui/**" + - "cli/**" + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get short commit hash + id: vars + run: echo "::set-output name=short_sha::$(echo $GITHUB_SHA | cut -c1-7)" + + - name: Build Docker image + run: | + cd ./examples/simple-auth && docker build -t ghcr.io/${{ github.repository_owner }}/simple-auth:${{ steps.vars.outputs.short_sha }} . + + - name: Tag as latest Docker image + run: | + docker tag ghcr.io/${{ github.repository_owner }}/simple-auth:${{ steps.vars.outputs.short_sha }} ghcr.io/${{ github.repository_owner }}/simple-auth:latest + + - name: Log in to GitHub Container Registry + run: echo "${{ secrets.CR_PAT }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + - name: Push Docker image + run: | + docker push ghcr.io/${{ github.repository_owner }}/simple-auth:latest From c6c05193c6869789deb118113ed5aa736e8f7ef0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:55:18 -0500 Subject: [PATCH 096/145] fix dockerfile --- examples/simple-auth/Dockerfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/simple-auth/Dockerfile b/examples/simple-auth/Dockerfile index 8f3a3583..531b7080 100644 --- a/examples/simple-auth/Dockerfile +++ b/examples/simple-auth/Dockerfile @@ -1,9 +1,5 @@ # Stage 1: Build the Go binary -FROM golang:1.23-alpine AS builder - -RUN apk update -RUN apk add git -RUN apk add curl +FROM golang:1.23 AS builder # Set the working directory inside the container WORKDIR /app @@ -18,7 +14,9 @@ RUN go mod download COPY . . # Build the Go binary for Linux -RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build +RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@latest build + +RUN CGO_ENABLED=1 GOOS=linux go build -tags prod -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . # Stage 2: Create the smallest possible image From 19b700b676516c35146aba1a568bb3817c22d91d Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:56:26 -0500 Subject: [PATCH 097/145] small fix --- examples/simple-auth/ui/login.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/simple-auth/ui/login.go b/examples/simple-auth/ui/login.go index 1c18b7dc..93a2d973 100644 --- a/examples/simple-auth/ui/login.go +++ b/examples/simple-auth/ui/login.go @@ -1,7 +1,6 @@ package ui import ( - "chat/components" "github.com/maddalax/htmgo/framework/h" ) @@ -25,7 +24,7 @@ func CenteredForm(props CenteredFormProps) *h.Element { h.Class("flex flex-col gap-4"), h.Children(props.Children...), // Error message - components.FormError(""), + FormError(""), // Submit button at the bottom SubmitButton(props.SubmitText), ), From 46b21f75b5412a644b16c2d9f7167b06295eccd7 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 08:01:24 -0500 Subject: [PATCH 098/145] fix build --- examples/simple-auth/go.mod | 3 ++- examples/simple-auth/go.sum | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 8e15c299..9514ccd2 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -2,10 +2,11 @@ module simpleauth go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/mattn/go-sqlite3 v1.14.24 // indirect golang.org/x/crypto v0.28.0 // indirect ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index b173b667..62d25928 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -6,6 +6,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 h1:Uj0Bg0Z+hu5yf8TIcKMnzjZ/GEOXUPssDVfs8s+eiRw= +github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From b8d23131b701986e0d1d04e422b0161e1793481e Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 08:03:30 -0500 Subject: [PATCH 099/145] fix entrypoint --- examples/simple-auth/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/simple-auth/Dockerfile b/examples/simple-auth/Dockerfile index 531b7080..345375d4 100644 --- a/examples/simple-auth/Dockerfile +++ b/examples/simple-auth/Dockerfile @@ -33,4 +33,4 @@ EXPOSE 3000 # Command to run the binary -CMD ["./simple-auth"] +CMD ["./simpleauth"] From c32fa1bccdfae35c546e198978fe83cc414f3aa6 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 08:09:40 -0500 Subject: [PATCH 100/145] add user auth to examples page --- htmgo-site/assets/public/auth-example.jpg | Bin 0 -> 81451 bytes htmgo-site/pages/examples.go | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 htmgo-site/assets/public/auth-example.jpg diff --git a/htmgo-site/assets/public/auth-example.jpg b/htmgo-site/assets/public/auth-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a6637386383eb8cf36824d9dcd041c790ce991b GIT binary patch literal 81451 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 Date: Sun, 20 Oct 2024 10:21:37 -0500 Subject: [PATCH 101/145] add some helper methods for redirect and setting cookie --- examples/simple-auth/internal/user/http.go | 3 +-- examples/simple-auth/internal/user/session.go | 2 +- framework/h/app.go | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/examples/simple-auth/internal/user/http.go b/examples/simple-auth/internal/user/http.go index d6865d18..8e1f462c 100644 --- a/examples/simple-auth/internal/user/http.go +++ b/examples/simple-auth/internal/user/http.go @@ -9,8 +9,7 @@ func GetUserOrRedirect(ctx *h.RequestContext) (db.User, bool) { user, err := GetUserFromSession(ctx) if err != nil { - ctx.Response.Header().Set("Location", "/login") - ctx.Response.WriteHeader(302) + ctx.Redirect("/login", 302) return db.User{}, false } diff --git a/examples/simple-auth/internal/user/session.go b/examples/simple-auth/internal/user/session.go index f8d54f4a..19cd5f81 100644 --- a/examples/simple-auth/internal/user/session.go +++ b/examples/simple-auth/internal/user/session.go @@ -68,7 +68,7 @@ func WriteSessionCookie(ctx *h.RequestContext, session CreatedSession) { Expires: session.Expiration, Path: "/", } - ctx.Response.Header().Add("Set-Cookie", cookie.String()) + ctx.SetCookie(&cookie) } func GenerateSessionID() (string, error) { diff --git a/framework/h/app.go b/framework/h/app.go index 39b480a8..bbf0e32f 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -33,6 +33,21 @@ func GetRequestContext(r *http.Request) *RequestContext { return r.Context().Value(RequestContextKey).(*RequestContext) } +func (c *RequestContext) SetCookie(cookie *http.Cookie) { + http.SetCookie(c.Response, cookie) +} + +func (c *RequestContext) Redirect(path string, code int) { + if code == 0 { + code = http.StatusTemporaryRedirect + } + if code < 300 || code > 399 { + code = http.StatusTemporaryRedirect + } + c.Response.Header().Set("Location", path) + c.Response.WriteHeader(code) +} + func (c *RequestContext) IsHttpPost() bool { return c.Request.Method == http.MethodPost } From 7a038e6af17431074350e0615de2f02c76f2f18e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 20 Oct 2024 15:22:16 +0000 Subject: [PATCH 102/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 8 +++++--- examples/simple-auth/go.sum | 6 ++---- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index b2cc51fa..7643028f 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 20c322e2..810b63cb 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index bf923487..fe3359e9 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index eca76175..d0a239fd 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 9514ccd2..c4dcdf85 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -2,11 +2,13 @@ module simpleauth go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 +require ( + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/mattn/go-sqlite3 v1.14.24 + golang.org/x/crypto v0.28.0 +) require ( github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/mattn/go-sqlite3 v1.14.24 // indirect - golang.org/x/crypto v0.28.0 // indirect ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 62d25928..2f517362 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,10 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 h1:Uj0Bg0Z+hu5yf8TIcKMnzjZ/GEOXUPssDVfs8s+eiRw= -github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 893ffb65..9c08dc95 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 33aeb0a8..9164e8ce 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index d0cf210a..7a2fbebe 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index eca76175..d0a239fd 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 2387993d..25e272ef 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index dbf8bde2..c33245dc 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 52613f25..b40e7e02 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index eca76175..d0a239fd 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From cea6b1cff24f194566695e52663dbb94f51a8e99 Mon Sep 17 00:00:00 2001 From: Kevin Lewin <97046295+lewinkedrs@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:17:18 -0400 Subject: [PATCH 103/145] Update slog output for server start (#27) Fixing f string error. --- framework/h/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/h/app.go b/framework/h/app.go index bbf0e32f..61a935a5 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -213,7 +213,7 @@ func (app *App) start() { } port := ":3000" - slog.Info(fmt.Sprintf("Server started at localhost:%s", port)) + slog.Info(fmt.Sprintf("Server started at localhost%s", port)) err := http.ListenAndServe(port, app.Router) if err != nil { From 245d63c7b2f363386464c8c2fa6d7459e3c0a227 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 21 Oct 2024 14:18:00 +0000 Subject: [PATCH 104/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 7643028f..813dbd9a 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 810b63cb..c38d243a 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index fe3359e9..7c7e257c 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 +require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index d0a239fd..9466e31f 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index c4dcdf85..26a46728 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 2f517362..99c85af2 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 9c08dc95..41cebe52 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 9164e8ce..646dd3fa 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 7a2fbebe..e3c7f33c 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 +require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index d0a239fd..9466e31f 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 25e272ef..6d0f6503 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index c33245dc..a7cca117 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index b40e7e02..c9bb61cd 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 +require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index d0a239fd..9466e31f 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 635b17dd7f9dd44785228ab6cb3af35d14780a36 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:06:18 -0500 Subject: [PATCH 105/145] add support for ignoring specific files for automatic page/partial routing --- cli/htmgo/tasks/astgen/entry.go | 15 +++++++++++ framework/config/project.go | 34 +++++++++++++++++++---- framework/config/project_test.go | 32 ++++++++++++++++++++++ framework/h/lifecycle.go | 1 - templates/starter/htmgo.yml | 8 ++++++ templates/starter/pages/index.go | 14 +++++----- templates/starter/pages/root.go | 46 +++++++++++++++++--------------- 7 files changed, 114 insertions(+), 36 deletions(-) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index e11ef0b2..8472c030 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -2,7 +2,9 @@ package astgen import ( "fmt" + "github.com/maddalax/htmgo/cli/htmgo/internal/dirutil" "github.com/maddalax/htmgo/cli/htmgo/tasks/process" + "github.com/maddalax/htmgo/framework/h" "go/ast" "go/parser" "go/token" @@ -24,6 +26,7 @@ type Partial struct { FuncName string Package string Import string + Path string } const GeneratedDirName = "__htmgo" @@ -103,6 +106,7 @@ func findPublicFuncsReturningHPartial(dir string, predicate func(partial Partial if selectorExpr.Sel.Name == "Partial" { p := Partial{ Package: node.Name.Name, + Path: sliceCommonPrefix(cwd, path), Import: sliceCommonPrefix(cwd, strings.ReplaceAll(filepath.Dir(path), `\`, `/`)), FuncName: funcDecl.Name.Name, } @@ -254,12 +258,18 @@ func buildGetPartialFromContext(builder *CodeBuilder, partials []Partial) { } func writePartialsFile() { + config := dirutil.GetConfig() + cwd := process.GetWorkingDir() partialPath := filepath.Join(cwd, "partials") partials, err := findPublicFuncsReturningHPartial(partialPath, func(partial Partial) bool { return partial.FuncName != "GetPartialFromContext" }) + partials = h.Filter(partials, func(partial Partial) bool { + return !dirutil.IsGlobExclude(partial.Path, config.AutomaticPartialRoutingIgnore) + }) + if err != nil { fmt.Println(err) return @@ -317,6 +327,7 @@ func formatRoute(path string) string { } func writePagesFile() { + config := dirutil.GetConfig() builder := NewCodeBuilder(nil) builder.AppendLine(GeneratedFileLine) @@ -326,6 +337,10 @@ func writePagesFile() { pages, _ := findPublicFuncsReturningHPage("pages") + pages = h.Filter(pages, func(page Page) bool { + return !dirutil.IsGlobExclude(page.Path, config.AutomaticPageRoutingIgnore) + }) + if len(pages) > 0 { builder.AddImport(ModuleName) } diff --git a/framework/config/project.go b/framework/config/project.go index 72e222d3..33f6cfc3 100644 --- a/framework/config/project.go +++ b/framework/config/project.go @@ -5,12 +5,15 @@ import ( "log/slog" "os" "path" + "strings" ) type ProjectConfig struct { - Tailwind bool `yaml:"tailwind"` - WatchIgnore []string `yaml:"watch_ignore"` - WatchFiles []string `yaml:"watch_files"` + Tailwind bool `yaml:"tailwind"` + WatchIgnore []string `yaml:"watch_ignore"` + WatchFiles []string `yaml:"watch_files"` + AutomaticPageRoutingIgnore []string `yaml:"automatic_page_routing_ignore"` + AutomaticPartialRoutingIgnore []string `yaml:"automatic_partial_routing_ignore"` } func DefaultProjectConfig() *ProjectConfig { @@ -25,7 +28,7 @@ func DefaultProjectConfig() *ProjectConfig { } } -func (cfg *ProjectConfig) EnhanceWithDefaults() *ProjectConfig { +func (cfg *ProjectConfig) Enhance() *ProjectConfig { defaultCfg := DefaultProjectConfig() if len(cfg.WatchFiles) == 0 { cfg.WatchFiles = defaultCfg.WatchFiles @@ -33,6 +36,27 @@ func (cfg *ProjectConfig) EnhanceWithDefaults() *ProjectConfig { if len(cfg.WatchIgnore) == 0 { cfg.WatchIgnore = defaultCfg.WatchIgnore } + + for i, s := range cfg.AutomaticPartialRoutingIgnore { + parts := strings.Split(s, string(os.PathSeparator)) + if len(parts) == 0 { + continue + } + if parts[0] != "partials" { + cfg.AutomaticPartialRoutingIgnore[i] = path.Join("partials", s) + } + } + + for i, s := range cfg.AutomaticPageRoutingIgnore { + parts := strings.Split(s, string(os.PathSeparator)) + if len(parts) == 0 { + continue + } + if parts[0] != "pages" { + cfg.AutomaticPageRoutingIgnore[i] = path.Join("pages", s) + } + } + return cfg } @@ -50,7 +74,7 @@ func FromConfigFile(workingDir string) *ProjectConfig { slog.Error("Error parsing config file", slog.String("file", filePath), slog.String("error", err.Error())) os.Exit(1) } - return cfg.EnhanceWithDefaults() + return cfg.Enhance() } } } diff --git a/framework/config/project_test.go b/framework/config/project_test.go index f015635d..bb492a03 100644 --- a/framework/config/project_test.go +++ b/framework/config/project_test.go @@ -41,6 +41,38 @@ func TestShouldNotSetTailwindTrue(t *testing.T) { assert.Equal(t, 8, len(cfg.WatchFiles)) } +func TestShouldPrefixAutomaticPageRoutingIgnore(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPageRoutingIgnore = []string{"somefile"} + cfg.Enhance() + assert.Equal(t, []string{"pages/somefile"}, cfg.AutomaticPageRoutingIgnore) +} + +func TestShouldPrefixAutomaticPageRoutingIgnore_1(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPageRoutingIgnore = []string{"pages/somefile/*"} + cfg.Enhance() + assert.Equal(t, []string{"pages/somefile/*"}, cfg.AutomaticPageRoutingIgnore) +} + +func TestShouldPrefixAutomaticPartialRoutingIgnore(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPartialRoutingIgnore = []string{"somefile/*"} + cfg.Enhance() + assert.Equal(t, []string{"partials/somefile/*"}, cfg.AutomaticPartialRoutingIgnore) +} + +func TestShouldPrefixAutomaticPartialRoutingIgnore_1(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPartialRoutingIgnore = []string{"partials/somefile/*"} + cfg.Enhance() + assert.Equal(t, []string{"partials/somefile/*"}, cfg.AutomaticPartialRoutingIgnore) +} + func writeConfigFile(t *testing.T, content string) string { temp := os.TempDir() os.Mkdir(temp, 0755) diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index c9ceb7de..719df74b 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -30,7 +30,6 @@ func validateCommands(cmds []Command) { panic(fmt.Sprintf("element is not allowed in lifecycle events. Got: %v", t)) default: panic(fmt.Sprintf("type is not allowed in lifecycle events. Got: %v", t)) - } } } diff --git a/templates/starter/htmgo.yml b/templates/starter/htmgo.yml index d60d2ff8..76470940 100644 --- a/templates/starter/htmgo.yml +++ b/templates/starter/htmgo.yml @@ -8,3 +8,11 @@ watch_ignore: [".git", "node_modules", "dist/*"] # files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar watch_files: ["**/*.go", "**/*.css", "**/*.md"] + +# files or directories to ignore when automatically registering routes for pages +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_page_routing_ignore: ["root.go"] + +# files or directories to ignore when automatically registering routes for partials +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_partial_routing_ignore: [] diff --git a/templates/starter/pages/index.go b/templates/starter/pages/index.go index ac1c0041..08c6f17b 100644 --- a/templates/starter/pages/index.go +++ b/templates/starter/pages/index.go @@ -6,15 +6,13 @@ import ( ) func IndexPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - RootPage( + return RootPage( + h.Div( + h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), + h.H3(h.Id("intro-text"), h.Text("hello htmgo"), h.Class("text-5xl")), h.Div( - h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - h.H3(h.Id("intro-text"), h.Text("hello htmgo"), h.Class("text-5xl")), - h.Div( - h.Class("mt-3"), - partials.CounterForm(0), - ), + h.Class("mt-3"), + partials.CounterForm(0), ), ), ) diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index bacdd614..d930c81d 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -4,28 +4,30 @@ import ( "github.com/maddalax/htmgo/framework/h" ) -func RootPage(children ...h.Ren) h.Ren { - return h.Html( - h.HxExtensions(h.BaseExtensions()), - h.Head( - h.Meta("viewport", "width=device-width, initial-scale=1"), - h.Link("/public/favicon.ico", "icon"), - h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), - h.Meta("title", "htmgo template"), - h.Meta("charset", "utf-8"), - h.Meta("author", "htmgo"), - h.Meta("description", "this is a template"), - h.Meta("og:title", "htmgo template"), - h.Meta("og:url", "https://htmgo.dev"), - h.Link("canonical", "https://htmgo.dev"), - h.Meta("og:description", "this is a template"), - h.Link("/public/main.css", "stylesheet"), - h.Script("/public/htmgo.js"), - ), - h.Body( - h.Div( - h.Class("flex flex-col gap-2 bg-white h-full"), - h.Fragment(children...), +func RootPage(children ...h.Ren) *h.Page { + return h.NewPage( + h.Html( + h.HxExtensions(h.BaseExtensions()), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("title", "htmgo template"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", "this is a template"), + h.Meta("og:title", "htmgo template"), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:description", "this is a template"), + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Div( + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Fragment(children...), + ), ), ), ) From ed2063df174d33c902d74e9813ae214c822dfb4a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 21 Oct 2024 15:07:08 +0000 Subject: [PATCH 106/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 813dbd9a..df7b8aad 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c38d243a..2212b7e0 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 7c7e257c..2c085bc2 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f +require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 9466e31f..aa9fe9c2 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 26a46728..88d65ae2 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 99c85af2..6bd75610 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 41cebe52..d922eb1d 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 646dd3fa..9b68ca78 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index e3c7f33c..ab6c752d 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f +require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 9466e31f..aa9fe9c2 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 6d0f6503..4c07d45e 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index a7cca117..c36cd279 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index c9bb61cd..cbe9de4f 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f +require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 9466e31f..aa9fe9c2 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 14911799b72c4d929a1f8b64d7d733dec00e1139 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:21:52 -0500 Subject: [PATCH 107/145] add config docs --- .../md/docs/9_configuration/htmgo_config.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 htmgo-site/md/docs/9_configuration/htmgo_config.md diff --git a/htmgo-site/md/docs/9_configuration/htmgo_config.md b/htmgo-site/md/docs/9_configuration/htmgo_config.md new file mode 100644 index 00000000..6ba4b79d --- /dev/null +++ b/htmgo-site/md/docs/9_configuration/htmgo_config.md @@ -0,0 +1,26 @@ +## Htmgo Configuration: + +Certain aspects of htmgo can be configured via a `htmgo.yml` file in the root of your project. + +Here is an example configuration file: + +```yaml +# htmgo configuration + +# if tailwindcss is enabled, htmgo will automatically compile your tailwind and output it to assets/dist +tailwind: true + +# which directories to ignore when watching for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_ignore: [".git", "node_modules", "dist/*"] + +# files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_files: ["**/*.go", "**/*.css", "**/*.md"] + +# files or directories to ignore when automatically registering routes for pages +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_page_routing_ignore: ["root.go"] + +# files or directories to ignore when automatically registering routes for partials +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_partial_routing_ignore: [] +``` From 86e293498fe413f3bbec34a6d1a984fd2c82ab6b Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:35:42 -0500 Subject: [PATCH 108/145] update landing page --- README.md | 6 +----- htmgo-site/md/index.md | 22 ++++++++++++++++++++-- htmgo-site/partials/navbar.go | 14 +++++++------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c4be27b0..d9b1baed 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -> [!WARNING] -> htmgo is in alpha release and active development. API's may have breaking changes between versions. Please report any issues on GitHub. - ## **htmgo** ### build simple and scalable systems with go + htmx @@ -34,8 +31,7 @@ func IndexPage(ctx *h.RequestContext) *h.Page { 2. live reload (rebuilds css, go, ent schema, and routes upon change) 3. automatic page and partial registration based on file path 4. built in tailwindcss support, no need to configure anything by default -5. plugin architecture to include optional plugins to streamline development, such as http://entgo.io -6. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/b610aefa36e648b98a13823a6f8d87566120cfcc/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks +5. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/b610aefa36e648b98a13823a6f8d87566120cfcc/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks **get started:** diff --git a/htmgo-site/md/index.md b/htmgo-site/md/index.md index 3e9ca0cf..a538c8b6 100644 --- a/htmgo-site/md/index.md +++ b/htmgo-site/md/index.md @@ -22,5 +22,23 @@ func IndexPage(ctx *h.RequestContext) *h.Page { 2. live reload (rebuilds css, go, ent schema, and routes upon change) 3. automatic page and partial registration based on file path 4. built in tailwindcss support, no need to configure anything by default -5. plugin architecture to include optional plugins to streamline development, such as http://entgo.io -6. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/master/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks +5. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/master/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks + +------ + +**what can be built with htmgo?** + +Most web applications can be built with htmgo, including but not limited to: + +- Traditional business CRUD applications +- blogs +- documentation sites +- consumer facing websites +- internal tools +- and more + +
+ +For a more detailed overview of when you should use hypermedia to build web applications, see [when-to-use-hypermedia](https://htmx.org/essays/when-to-use-hypermedia/) from htmx.org. + +Interested in some examples? Check out [examples](/examples). diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 913e09ff..1b438cfb 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -75,12 +75,12 @@ func Star(ctx *h.RequestContext) *h.Element { } func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { - prelease := h.If(props.ShowPreRelease, h.A( - h.Class("bg-yellow-200 text-yellow-800 text-center p-2 flex items-center justify-center"), - h.Href("https://github.com/maddalax/htmgo/issues"), - h.Attribute("target", "_blank"), - h.Text("htmgo is in alpha release. Please report any issues on GitHub."), - )) + //prelease := h.If(props.ShowPreRelease, h.A( + // h.Class("bg-blue-200 text-blue-700 text-center p-2 flex items-center justify-center"), + // h.Href("https://github.com/maddalax/htmgo/issues"), + // h.Attribute("target", "_blank"), + // h.Text("htmgo."), + //)) desktopNav := h.Nav( h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3 max-h-[100vh - 9rem] overflow-y-auto"), @@ -118,7 +118,7 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { return h.Div( h.Id("navbar"), - prelease, + //prelease, MobileNav(ctx, props.Expanded), desktopNav, ) From b92213b3567c77fc1213ced2731da40616c5599c Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:38:14 -0500 Subject: [PATCH 109/145] oops --- htmgo-site/md/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/md/index.md b/htmgo-site/md/index.md index a538c8b6..5325c88d 100644 --- a/htmgo-site/md/index.md +++ b/htmgo-site/md/index.md @@ -30,7 +30,7 @@ func IndexPage(ctx *h.RequestContext) *h.Page { Most web applications can be built with htmgo, including but not limited to: -- Traditional business CRUD applications +- traditional business CRUD applications - blogs - documentation sites - consumer facing websites From 70228912be410be25d92b8f23c08063d986cbd1a Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 22 Oct 2024 08:17:58 -0500 Subject: [PATCH 110/145] remove chat deploy on pr --- .github/workflows/release-chat-example.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/release-chat-example.yml b/.github/workflows/release-chat-example.yml index 6f877678..6efb4344 100644 --- a/.github/workflows/release-chat-example.yml +++ b/.github/workflows/release-chat-example.yml @@ -5,9 +5,6 @@ on: workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow types: - completed - pull_request: - branches: - - master workflow_dispatch: # Trigger on manual workflow_dispatch push: branches: From a0f5b5dfd5bd68928b5dc216939efd056a6022bd Mon Sep 17 00:00:00 2001 From: Mohammad javad <41829984+himynamej@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:32:17 -0400 Subject: [PATCH 111/145] feat:add claasf (#31) * feat:add claasf * refactor(tag.go) * refactor(cache.go) * refactor(attribute.go) * refactor(app.go) * refactor(attribute.go) --- framework/h/app.go | 20 +++++++++++--------- framework/h/attribute.go | 12 ++++++++---- framework/h/cache.go | 4 ++-- framework/h/tag.go | 4 +--- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/framework/h/app.go b/framework/h/app.go index 61a935a5..2362348a 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -3,9 +3,6 @@ package h import ( "context" "fmt" - "github.com/go-chi/chi/v5" - "github.com/maddalax/htmgo/framework/hx" - "github.com/maddalax/htmgo/framework/service" "log/slog" "net/http" "os" @@ -13,6 +10,10 @@ import ( "runtime" "strings" "time" + + "github.com/go-chi/chi/v5" + "github.com/maddalax/htmgo/framework/hx" + "github.com/maddalax/htmgo/framework/service" ) type RequestContext struct { @@ -214,9 +215,8 @@ func (app *App) start() { port := ":3000" slog.Info(fmt.Sprintf("Server started at localhost%s", port)) - err := http.ListenAndServe(port, app.Router) - if err != nil { + if err := http.ListenAndServe(port, app.Router); err != nil { // If we are in watch mode, just try to kill any processes holding that port // and try again if IsDevelopment() && IsWatchMode() { @@ -228,14 +228,16 @@ func (app *App) start() { cmd := exec.Command("bash", "-c", fmt.Sprintf("kill -9 $(lsof -ti%s)", port)) cmd.Run() } + time.Sleep(time.Millisecond * 50) - err = http.ListenAndServe(":3000", app.Router) - if err != nil { + + // Try to start server again + if err := http.ListenAndServe(port, app.Router); err != nil { + slog.Error("Failed to restart server", "error", err) panic(err) } - } else { - panic(err) } + panic(err) } } diff --git a/framework/h/attribute.go b/framework/h/attribute.go index 7cf8fd07..a9a9e72a 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -2,9 +2,10 @@ package h import ( "fmt" + "strings" + "github.com/maddalax/htmgo/framework/hx" "github.com/maddalax/htmgo/framework/internal/datastructure" - "strings" ) type AttributeMap = map[string]any @@ -89,9 +90,7 @@ func Checked() Ren { } func Id(value string) Ren { - if strings.HasPrefix(value, "#") { - value = value[1:] - } + value = strings.TrimPrefix(value, "#") return Attribute("id", value) } @@ -193,6 +192,11 @@ func Class(value ...string) *AttributeR { return Attribute("class", MergeClasses(value...)) } +func ClassF(format string, args ...interface{}) *AttributeR { + atr := fmt.Sprintf(format, args...) + return Attribute("class", atr) +} + func ClassX(value string, m ClassMap) Ren { builder := strings.Builder{} builder.WriteString(value) diff --git a/framework/h/cache.go b/framework/h/cache.go index 92338cb6..ad9260ca 100644 --- a/framework/h/cache.go +++ b/framework/h/cache.go @@ -277,7 +277,7 @@ func (c *CachedNode) ClearExpired() { c.mutex.Lock() defer c.mutex.Unlock() deletedCount := 0 - if c.isByKey == true { + if c.isByKey { if c.byKeyCache != nil && c.byKeyExpiration != nil { for key := range c.byKeyCache { expir, ok := c.byKeyExpiration[key] @@ -303,7 +303,7 @@ func (c *CachedNode) ClearExpired() { } func (c *CachedNode) Render(ctx *RenderContext) { - if c.isByKey == true { + if c.isByKey { panic("CachedPerKey should not be rendered directly") } else { c.mutex.Lock() diff --git a/framework/h/tag.go b/framework/h/tag.go index 611fc554..5682e878 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -268,9 +268,7 @@ func TagF(tag string, format string, args ...interface{}) *Element { case *AttributeMapOrdered: children = append(children, d) case *ChildList: - for _, child := range d.Children { - children = append(children, child) - } + children = append(children, d.Children...) case *AttributeR: children = append(children, d) default: From 4eabe21d68415320c26be74a6657752d6818e565 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 13:32:58 +0000 Subject: [PATCH 112/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index df7b8aad..215b93c9 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 2212b7e0..d8b91c85 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 2c085bc2..dd261416 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index aa9fe9c2..3593758b 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 88d65ae2..3cd7de64 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 6bd75610..8043a5d4 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index d922eb1d..8ed2e4b7 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 9b68ca78..591d08ec 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index ab6c752d..11301a94 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index aa9fe9c2..3593758b 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 4c07d45e..689d16c8 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index c36cd279..ceb9988d 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index cbe9de4f..00f3185a 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index aa9fe9c2..3593758b 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 30ac29fd6cf2a27b1105be15c8dfcaa727513ff0 Mon Sep 17 00:00:00 2001 From: Mohammad javad <41829984+himynamej@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:49:17 -0400 Subject: [PATCH 113/145] use path (#32) * feat:add claasf * refactor(tag.go) * refactor(cache.go) * refactor(attribute.go) * refactor(app.go) * refactor(attribute.go) * fix:use path in PostPartialWithQs * fix: PostPartial --- framework/h/xhr.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/framework/h/xhr.go b/framework/h/xhr.go index 1c707e15..30eab6ed 100644 --- a/framework/h/xhr.go +++ b/framework/h/xhr.go @@ -2,7 +2,6 @@ package h import ( "github.com/maddalax/htmgo/framework/hx" - "strings" ) func Get(path string, trigger ...string) *AttributeMapOrdered { @@ -22,18 +21,10 @@ func GetWithQs(path string, qs *Qs, trigger string) *AttributeMapOrdered { } func PostPartial(partial PartialFunc, triggers ...string) *AttributeMapOrdered { - path := GetPartialPath(partial) - if !strings.HasPrefix(path, "/") { - path = "/" + path - } - return Post(path, triggers...) + return Post(GetPartialPath(partial), triggers...) } func PostPartialWithQs(partial PartialFunc, qs *Qs, trigger ...string) *AttributeMapOrdered { - path := GetPartialPathWithQs(partial, qs) - if !strings.HasPrefix(path, "/") { - path = "/" + path - } return Post(GetPartialPathWithQs(partial, qs), trigger...) } From 146034c78b353cab096d265c1e167df9e593eeec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 13:49:54 +0000 Subject: [PATCH 114/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 215b93c9..8d080789 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index d8b91c85..b30b84ba 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index dd261416..d207b61a 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 3593758b..299ccbf3 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 3cd7de64..09898913 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 8043a5d4..eadeef9a 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 8ed2e4b7..aa5cbd47 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 591d08ec..62ee5a42 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 11301a94..102a9b74 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 3593758b..299ccbf3 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 689d16c8..3eeea58d 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index ceb9988d..f7943d1e 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 00f3185a..bf7a120c 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 3593758b..299ccbf3 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From bb9fb0b327e4e7adeba03f3518e0029b0d7bdcc4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 09:28:19 -0500 Subject: [PATCH 115/145] write doctype when rendering html --- framework/h/app.go | 2 +- framework/h/render.go | 24 +++++++++++++++++++++++- framework/h/render_test.go | 8 ++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/framework/h/app.go b/framework/h/app.go index 2362348a..0e022365 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -247,7 +247,7 @@ func writeHtml(w http.ResponseWriter, element Ren) error { return nil } w.Header().Set("Content-Type", "text/html") - _, err := fmt.Fprint(w, Render(element)) + _, err := fmt.Fprint(w, Render(element, WithDocType())) return err } diff --git a/framework/h/render.go b/framework/h/render.go index aa37dd5c..bfce7516 100644 --- a/framework/h/render.go +++ b/framework/h/render.go @@ -8,11 +8,33 @@ type Ren interface { Render(context *RenderContext) } -func Render(node Ren) string { +type RenderOptions struct { + doctype bool +} + +type RenderOpt func(context *RenderContext, opt *RenderOptions) + +func WithDocType() RenderOpt { + return func(context *RenderContext, opt *RenderOptions) { + opt.doctype = true + } +} + +func Render(node Ren, opts ...RenderOpt) string { builder := &strings.Builder{} context := &RenderContext{ builder: builder, } + options := &RenderOptions{} + + for _, opt := range opts { + opt(context, options) + } + + if options.doctype { + builder.WriteString("") + } + node.Render(context) return builder.String() } diff --git a/framework/h/render_test.go b/framework/h/render_test.go index dbbd1e1c..83a4cf4e 100644 --- a/framework/h/render_test.go +++ b/framework/h/render_test.go @@ -10,6 +10,14 @@ import ( "time" ) +func TestRendererShouldRenderDocType(t *testing.T) { + t.Parallel() + result := Render(Html( + Div(), + ), WithDocType()) + assert.Equal(t, `

`, result) +} + func TestSimpleRender(t *testing.T) { t.Parallel() result := Render( From 31cf8772c2434a35a4f61bc03a7b3974b3cb799f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 14:29:05 +0000 Subject: [PATCH 116/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 8d080789..fb97529d 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index b30b84ba..85c8bf30 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index d207b61a..8e2f5a2d 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 299ccbf3..17509d95 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 09898913..d4a631b1 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index eadeef9a..4ca08ee6 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index aa5cbd47..c4094bb0 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 62ee5a42..843f16cc 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 102a9b74..8c5aaa4e 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 299ccbf3..17509d95 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 3eeea58d..69f883e9 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index f7943d1e..8692edea 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index bf7a120c..fce93ef6 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 299ccbf3..17509d95 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 07b0c2d3c550d952d085c867fe2667109d0d24b9 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 10:34:59 -0500 Subject: [PATCH 117/145] fix css on html to go --- htmgo-site/pages/html-to-go.go | 2 +- htmgo-site/partials/html-to-go.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index 644d836a..0a2d6f23 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -10,7 +10,7 @@ func HtmlToGoPage(ctx *h.RequestContext) *h.Page { return h.NewPage( base.PageWithNav(ctx, h.Div( - h.Class("flex flex-col h-full items-center justify-center w-full pt-6"), + h.Class("flex flex-col h-screen items-center justify-center w-full pt-6"), h.H3( h.Text("Convert raw html to htmgo code"), h.Class("text-2xl font-bold"), diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 3669db83..28d0634f 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -17,7 +17,7 @@ func ConvertHtmlToGo(ctx *h.RequestContext) *h.Partial { func HtmlInput() *h.Element { return h.Div( - h.Class("h-[90%] w-1/2 min-w-1/2"), + h.Class("h-full w-1/2 min-w-1/2"), h.TextArea( h.Name("html-input"), h.MaxLength(500*1000), @@ -31,7 +31,7 @@ func HtmlInput() *h.Element { func GoOutput(content string) *h.Element { return h.Div( - h.Class("h-[90%] w-1/2 min-w-1/2"), + h.Class("h-full w-1/2 min-w-1/2"), h.Id("go-output"), h.Div( h.Class("h-[90%] w-full rounded border border-slate-200"), From a72de0a62fac4c8a7fb22c416fa80fa87f204847 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 10:50:22 -0500 Subject: [PATCH 118/145] add qs tests --- framework/h/qs.go | 8 ++++--- framework/h/qs_test.go | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 framework/h/qs_test.go diff --git a/framework/h/qs.go b/framework/h/qs.go index 75fad83b..996cf8ef 100644 --- a/framework/h/qs.go +++ b/framework/h/qs.go @@ -14,7 +14,7 @@ func NewQs(pairs ...string) *Qs { m: make(map[string]string), } if len(pairs)%2 != 0 { - return q + pairs = append(pairs, "") } for i := 0; i < len(pairs); i++ { q.m[pairs[i]] = pairs[i+1] @@ -38,8 +38,10 @@ func (q *Qs) ToString() string { index := 0 for k, v := range q.m { builder.WriteString(k) - builder.WriteString("=") - builder.WriteString(v) + if v != "" { + builder.WriteString("=") + builder.WriteString(v) + } if index < len(q.m)-1 { builder.WriteString("&") } diff --git a/framework/h/qs_test.go b/framework/h/qs_test.go new file mode 100644 index 00000000..31067fd6 --- /dev/null +++ b/framework/h/qs_test.go @@ -0,0 +1,49 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func assertHas(t *testing.T, qs *Qs, key string, value string) { + str := qs.ToString() + if value == "" { + assert.Contains(t, str, key) + assert.NotContains(t, str, key+"=") + } else { + assert.Contains(t, str, key+"="+value) + } +} + +func TestQs(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b", "c") + assertHas(t, qs, "a", "b") + assertHas(t, qs, "c", "") + + qs2 := NewQs("a", "b", "c", "d") + assertHas(t, qs2, "a", "b") + assertHas(t, qs2, "c", "d") + + qs2.Add("e", "f") + assertHas(t, qs2, "a", "b") + assertHas(t, qs2, "c", "d") + assertHas(t, qs2, "e", "f") + + qs2.Remove("e") + assert.NotContains(t, qs2.ToString(), "e") +} + +func TestSetQsOnUrl(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b", "c", "d") + set := SetQueryParams("https://example.com/path", qs) + assert.Equal(t, "https://example.com/path?a=b&c=d", set) +} + +func TestSetQsOnUrlWithDelete(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b2", "c", "") + set := SetQueryParams("https://example.com/path?a=b&c=d", qs) + assert.Equal(t, "https://example.com/path?a=b2", set) +} From fa8f8431546361fa4c2b83d58ae2b386b81d6b5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 15:51:03 +0000 Subject: [PATCH 119/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index fb97529d..978fcce4 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 85c8bf30..112bd660 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 8e2f5a2d..7b26246c 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 17509d95..8648fe69 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index d4a631b1..37bcd02e 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 4ca08ee6..9898f62f 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index c4094bb0..fb9cf077 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 843f16cc..db73f689 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 8c5aaa4e..9f9fb82e 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 17509d95..8648fe69 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 69f883e9..23a470f8 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 8692edea..fef23836 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index fce93ef6..c7612b75 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 17509d95..8648fe69 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 21ac153d5b291bdb0431e63ee2960c2b5722c3f4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 11:10:48 -0500 Subject: [PATCH 120/145] add transient to service loader, clear cache when setting a new value for the service --- framework/service/locator.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/framework/service/locator.go b/framework/service/locator.go index 855cae02..3cc79d44 100644 --- a/framework/service/locator.go +++ b/framework/service/locator.go @@ -10,6 +10,7 @@ type Lifecycle = string var ( Singleton Lifecycle = "singleton" + Transient Lifecycle = "transient" ) type Provider struct { @@ -35,6 +36,10 @@ func (l *Locator) setCache(key string, value any) { l.cache[key] = value } +func (l *Locator) clearCache(key string) { + delete(l.cache, key) +} + func (l *Locator) getCache(key string) any { return l.cache[key] } @@ -68,10 +73,12 @@ func Get[T any](locator *Locator) *T { func Set[T any](locator *Locator, lifecycle Lifecycle, value func() *T) { t := reflect.TypeOf(value) rt := t.Out(0) - locator.services[rt.String()] = Provider{ + key := rt.String() + locator.services[key] = Provider{ cb: func() any { return value() }, lifecycle: lifecycle, } + locator.clearCache(key) } From 64c61dd1786c8dfeace338565ff9780683fe1cde Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 16:11:29 +0000 Subject: [PATCH 121/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 978fcce4..d23f994c 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 112bd660..37ce3ff8 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 7b26246c..beda8668 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 8648fe69..b915392f 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 37bcd02e..6cb21fb1 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 9898f62f..f2a67f03 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index fb9cf077..cd8352ff 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index db73f689..0d08b426 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 9f9fb82e..4a68ef8c 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 8648fe69..b915392f 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 23a470f8..622bd583 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index fef23836..b51cf272 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index c7612b75..224d9abb 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 8648fe69..b915392f 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 4dd501a2f81e21a92605c048f29ae6a8bac3796c Mon Sep 17 00:00:00 2001 From: jam <41418470+Sardonyx001@users.noreply.github.com> Date: Thu, 24 Oct 2024 22:37:01 +0900 Subject: [PATCH 122/145] fix: filter by filename instead of whole path (#42) --- cli/htmgo/tasks/util/file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/htmgo/tasks/util/file.go b/cli/htmgo/tasks/util/file.go index 3cb9f707..5ddd06cf 100644 --- a/cli/htmgo/tasks/util/file.go +++ b/cli/htmgo/tasks/util/file.go @@ -19,7 +19,7 @@ func ReplaceTextInFile(file string, text string, replacement string) error { func ReplaceTextInDirRecursive(dir string, text string, replacement string, filter func(file string) bool) error { return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { - if filter(path) { + if filter(filepath.Base(path)) { _ = ReplaceTextInFile(path, text, replacement) } return nil From 90fc6e87263e3ce7739f2c203db3dc34a5ac50bb Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 24 Oct 2024 08:39:19 -0500 Subject: [PATCH 123/145] check in go.work --- .gitignore | 3 +-- go.work | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 go.work diff --git a/.gitignore b/.gitignore index 5f752a32..9a4cf057 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,7 @@ node_modules/ dist/ js/dist js/node_modules -go.work go.work.sum .idea !framework/assets/dist -/**/__htmgo \ No newline at end of file +/**/__htmgo diff --git a/go.work b/go.work new file mode 100644 index 00000000..0d27f484 --- /dev/null +++ b/go.work @@ -0,0 +1,14 @@ +go 1.23.0 + +use ( + cli/htmgo + examples/todo-list + framework + framework-ui + htmgo-site + templates/starter + examples/chat + examples/hackernews + tools/html-to-htmgo + examples/simple-auth +) From 7af750b9e78ebafcde3ac3819a64d35b3a69987f Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 24 Oct 2024 08:41:36 -0500 Subject: [PATCH 124/145] Revert "check in go.work" This reverts commit 90fc6e87263e3ce7739f2c203db3dc34a5ac50bb. --- .gitignore | 3 ++- go.work | 14 -------------- 2 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 go.work diff --git a/.gitignore b/.gitignore index 9a4cf057..5f752a32 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,8 @@ node_modules/ dist/ js/dist js/node_modules +go.work go.work.sum .idea !framework/assets/dist -/**/__htmgo +/**/__htmgo \ No newline at end of file diff --git a/go.work b/go.work deleted file mode 100644 index 0d27f484..00000000 --- a/go.work +++ /dev/null @@ -1,14 +0,0 @@ -go 1.23.0 - -use ( - cli/htmgo - examples/todo-list - framework - framework-ui - htmgo-site - templates/starter - examples/chat - examples/hackernews - tools/html-to-htmgo - examples/simple-auth -) From df490ae04ba0ae54c040e3579d184ca8e472b0c2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 24 Oct 2024 08:51:06 -0500 Subject: [PATCH 125/145] copy assets on run if needed --- cli/htmgo/runner.go | 3 +-- cli/htmgo/tasks/run/build.go | 6 +++++- cli/htmgo/tasks/run/setup.go | 9 +-------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index ab27c440..2352d39a 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -106,8 +106,7 @@ func main() { } else if taskName == "ast" { _ = astgen.GenAst(process.ExitOnError) } else if taskName == "run" { - _ = astgen.GenAst(process.ExitOnError) - _ = css.GenerateCss(process.ExitOnError) + run.MakeBuildable() _ = run.Server(process.ExitOnError) } else if taskName == "template" { name := "" diff --git a/cli/htmgo/tasks/run/build.go b/cli/htmgo/tasks/run/build.go index e4680722..724e8855 100644 --- a/cli/htmgo/tasks/run/build.go +++ b/cli/htmgo/tasks/run/build.go @@ -9,10 +9,14 @@ import ( "os" ) -func Build() { +func MakeBuildable() { copyassets.CopyAssets() astgen.GenAst(process.ExitOnError) css.GenerateCss(process.ExitOnError) +} + +func Build() { + MakeBuildable() process.RunOrExit(process.NewRawCommand("", "mkdir -p ./dist")) diff --git a/cli/htmgo/tasks/run/setup.go b/cli/htmgo/tasks/run/setup.go index d48d42d9..0dd27d6b 100644 --- a/cli/htmgo/tasks/run/setup.go +++ b/cli/htmgo/tasks/run/setup.go @@ -1,19 +1,12 @@ package run import ( - "github.com/maddalax/htmgo/cli/htmgo/tasks/astgen" - "github.com/maddalax/htmgo/cli/htmgo/tasks/copyassets" - "github.com/maddalax/htmgo/cli/htmgo/tasks/css" "github.com/maddalax/htmgo/cli/htmgo/tasks/process" ) func Setup() { process.RunOrExit(process.NewRawCommand("", "go mod download")) process.RunOrExit(process.NewRawCommand("", "go mod tidy")) - - copyassets.CopyAssets() - astgen.GenAst(process.ExitOnError) - css.GenerateCss(process.ExitOnError) - + MakeBuildable() EntGenerate() } From 531ad3342b56cc6a250db2bfd326520f4d048fcb Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:05:12 -0500 Subject: [PATCH 126/145] much better formatting for the generated go code --- .../adapters/services/formatter/formatter.go | 4 +- .../adapters/services/formatter/indent.go | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tools/html-to-htmgo/internal/adapters/services/formatter/indent.go diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go index 295a0afa..a33d98aa 100644 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go @@ -16,11 +16,11 @@ import ( func MyComponent() *h.Element { return ` + node.String() + ` }`) - dist, err := format.Source(b) + indented := Indent(string(b)) + dist, err := format.Source([]byte(indented)) if err != nil { return string(b) } - return string(dist) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go new file mode 100644 index 00000000..f6e9b131 --- /dev/null +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go @@ -0,0 +1,58 @@ +package formatter + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/printer" + "go/token" + "golang.org/x/tools/go/ast/astutil" + "strings" +) + +func Indent(input string) string { + fset := token.NewFileSet() + // Parse the code string into an AST + f, err := parser.ParseFile(fset, "", input, 0) + + if err != nil { + return input + } + + component := f.Decls[1].(*ast.FuncDecl) + + astutil.Apply(component.Body, nil, func(cursor *astutil.Cursor) bool { + switch n := cursor.Node().(type) { + case *ast.CallExpr: + newChildren := make([]ast.Expr, 0) + for i, arg := range n.Args { + if i == 0 { + switch arg.(type) { + // If the first argument is another node, add an indent + case *ast.CallExpr: + newChildren = append(newChildren, ast.NewIdent("INDENT")) + } + } + newChildren = append(newChildren, arg) + newChildren = append(newChildren, ast.NewIdent("INDENT")) + } + n.Args = newChildren + return true + } + return true + }) + + // Convert the AST node to a string + var buf bytes.Buffer + if err := printer.Fprint(&buf, fset, component); err != nil { + fmt.Println("Error printing AST:", err) + return input + } + + // Output the formatted code + indented := strings.ReplaceAll(buf.String(), "INDENT,", "\n\t\t") + indented = strings.ReplaceAll(indented, ", INDENT", ", \n\t\t") + + return indented +} From 61758622ef5db6659552af4e9578d6f9c7f59fff Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:07:35 -0500 Subject: [PATCH 127/145] indent -> indentme add details & summary html tag --- framework/h/tag.go | 8 ++++++++ .../internal/adapters/services/formatter/indent.go | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/framework/h/tag.go b/framework/h/tag.go index 5682e878..86d2d2a8 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -38,6 +38,14 @@ func TextF(format string, args ...interface{}) *TextContent { return Text(fmt.Sprintf(format, args...)) } +func Details(children ...Ren) *Element { + return Tag("details", children...) +} + +func Summary(children ...Ren) *Element { + return Tag("summary", children...) +} + func Text(text string) *TextContent { return NewTextContent(text) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go index f6e9b131..fdffc5f2 100644 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go @@ -31,11 +31,11 @@ func Indent(input string) string { switch arg.(type) { // If the first argument is another node, add an indent case *ast.CallExpr: - newChildren = append(newChildren, ast.NewIdent("INDENT")) + newChildren = append(newChildren, ast.NewIdent("INDENTME")) } } newChildren = append(newChildren, arg) - newChildren = append(newChildren, ast.NewIdent("INDENT")) + newChildren = append(newChildren, ast.NewIdent("INDENTME")) } n.Args = newChildren return true @@ -51,8 +51,8 @@ func Indent(input string) string { } // Output the formatted code - indented := strings.ReplaceAll(buf.String(), "INDENT,", "\n\t\t") - indented = strings.ReplaceAll(indented, ", INDENT", ", \n\t\t") + indented := strings.ReplaceAll(buf.String(), "INDENTME,", "\n\t\t") + indented = strings.ReplaceAll(indented, ", INDENTME", ", \n\t\t") return indented } From e496a41a39dc3a2fbf5e8809cf0c2f6153fdfb5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 12:08:14 +0000 Subject: [PATCH 128/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index d23f994c..fde9368e 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 37ce3ff8..7642b22d 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index beda8668..4c656b4a 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index b915392f..5f37ed5b 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 6cb21fb1..027aafee 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index f2a67f03..d75100d9 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index cd8352ff..d76e37d7 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 0d08b426..fe3c2f3a 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 4a68ef8c..6113c92b 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index b915392f..5f37ed5b 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 622bd583..83353b03 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index b51cf272..53d2a046 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 224d9abb..4c9273ed 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index b915392f..5f37ed5b 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 5a2b0f4f4bbfaf9b7b5b185c9344f0af19a0a4d1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:14:37 -0500 Subject: [PATCH 129/145] upgrade --- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 622bd583..32aca9b5 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -6,7 +6,7 @@ require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index b51cf272..b6a5efe1 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -23,6 +23,8 @@ github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d h1:Hw4oQTJJvulOMkan5VfsG87ACvGkzVLReq2w2pV9T9U= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From d538f6f7a8ef2c915c1d5374f0e0d6d6214b00a1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:15:11 -0500 Subject: [PATCH 130/145] upgrade --- htmgo-site/go.mod | 3 ++- htmgo-site/go.sum | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index d3689f7b..11f623c3 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,6 +4,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 + github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d @@ -13,7 +14,7 @@ require ( require ( github.com/dlclark/regexp2 v1.11.0 // indirect - github.com/go-chi/chi/v5 v5.1.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/text v0.19.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index e4bf70ec..0a10b793 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -21,8 +21,6 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d h1:Hw4oQTJJvulOMkan5VfsG87ACvGkzVLReq2w2pV9T9U= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -40,6 +38,8 @@ golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 1924270e4e6c55e8c512f997d8d8c6fda4434217 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:48:41 -0500 Subject: [PATCH 131/145] update more deps --- tools/html-to-htmgo/internal/domain/node.go | 3 -- tools/update-htmgo-dep.go | 42 ++++++++++++++------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/tools/html-to-htmgo/internal/domain/node.go b/tools/html-to-htmgo/internal/domain/node.go index a90e52e0..1c1c0792 100644 --- a/tools/html-to-htmgo/internal/domain/node.go +++ b/tools/html-to-htmgo/internal/domain/node.go @@ -30,9 +30,6 @@ func (n *CustomNode) SetType(in string) { n.Type = "h.TBody" case "id": n.Type = "h.Id" - case "path": - n.Type = "path" - n.customType = true case "circle": n.Type = "circle" n.customType = true diff --git a/tools/update-htmgo-dep.go b/tools/update-htmgo-dep.go index bd96b806..2737f0d0 100644 --- a/tools/update-htmgo-dep.go +++ b/tools/update-htmgo-dep.go @@ -13,6 +13,13 @@ import ( ) const frameworkRepo = "github.com/maddalax/htmgo/framework" +const htmlToHtmgoRepo = "github.com/maddalax/htmgo/tools/html-to-htmgo" + +var depsToUpdate = []string{ + frameworkRepo, + htmlToHtmgoRepo, +} + const githubAPIURL = "https://api.github.com/repos/maddalax/htmgo/commits" // Commit represents the structure of a commit object returned by the GitHub API. @@ -52,17 +59,14 @@ func main() { // Check if the directory contains a go.mod file. if info.IsDir() && fileExists(filepath.Join(path, "go.mod")) { - // Check if the go.mod contains 'github.com/maddalax/htmgo/framework'. - if containsFrameworkDependency(filepath.Join(path, "go.mod")) { - wg.Add(1) - go func() { - defer wg.Done() - // Run go get github.com/maddalax/htmgo/framework@. - fmt.Printf("Running 'go get' with latest commit hash in %s\n", path) - RunCommand(path, "go", "get", fmt.Sprintf("%s@%s", frameworkRepo, latestCommitHash)) - RunCommand(path, "go", "mod", "tidy") - }() - } + goModPath := filepath.Join(path, "go.mod") + wg.Add(1) + go func() { + defer wg.Done() + for _, s := range depsToUpdate { + updateDepToLatestVersion(s, goModPath, latestCommitHash) + } + }() } return nil @@ -82,8 +86,18 @@ func fileExists(path string) bool { return !os.IsNotExist(err) } -// containsFrameworkDependency checks if 'github.com/maddalax/htmgo/framework' is in the go.mod file. -func containsFrameworkDependency(goModPath string) bool { +func updateDepToLatestVersion(dep string, goModPath string, latestCommitHash string) { + if containsDep(dep, goModPath) { + dir := filepath.Dir(goModPath) + // Run go get github.com/maddalax/htmgo/framework@. + fmt.Printf("Running 'go get' with latest commit hash in %s\n", dep) + RunCommand(dir, "go", "get", fmt.Sprintf("%s@%s", dep, latestCommitHash)) + RunCommand(dir, "go", "mod", "tidy") + } +} + +// containsDep checks if 'github.com/maddalax/htmgo/framework' is in the go.mod file. +func containsDep(dep string, goModPath string) bool { file, err := os.Open(goModPath) if err != nil { fmt.Println("Error opening go.mod file:", err) @@ -93,7 +107,7 @@ func containsFrameworkDependency(goModPath string) bool { scanner := bufio.NewScanner(file) for scanner.Scan() { - if strings.Contains(scanner.Text(), frameworkRepo) { + if strings.Contains(scanner.Text(), dep) { return true } } From 9a871883188645c6c4200c8b3bc3a5d3f9288efa Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:51:11 -0500 Subject: [PATCH 132/145] run if tool changes --- .github/workflows/update-framework-dep.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-framework-dep.yml b/.github/workflows/update-framework-dep.yml index 1f934411..a59ff30a 100644 --- a/.github/workflows/update-framework-dep.yml +++ b/.github/workflows/update-framework-dep.yml @@ -6,7 +6,8 @@ on: branches: - master # Trigger on pushes to master paths: - - 'framework/**' # Trigger only if files in this directory change + - 'framework/**' + - 'tools/html-to-htmgo/**' jobs: update-htmgo-dep: From caa9d10b1bd9f786fc5e55e664ce4f91f643e68a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 12:52:22 +0000 Subject: [PATCH 133/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 6 +++--- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- tools/html-to-htmgo/go.mod | 1 + tools/html-to-htmgo/go.sum | 6 ++---- 16 files changed, 28 insertions(+), 29 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index fde9368e..59f66779 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 7642b22d..ac682267 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 4c656b4a..a8007c27 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 5f37ed5b..6ffee291 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 027aafee..e45ccdd1 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index d75100d9..c2520166 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index d76e37d7..8ed8f7f3 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index fe3c2f3a..8acc9940 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 6113c92b..415624cf 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 5f37ed5b..6ffee291 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 11f623c3..141b1e93 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,16 +4,16 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 - github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) require ( github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/text v0.19.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 0a10b793..8a0bfa6d 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d h1:Hw4oQTJJvulOMkan5VfsG87ACvGkzVLReq2w2pV9T9U= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 h1:iQ/HmCUl+XBJ0UZQ6V6h9jJdavRFLSoPA74GEHG82vQ= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 4c9273ed..c359fde5 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 5f37ed5b..6ffee291 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/tools/html-to-htmgo/go.mod b/tools/html-to-htmgo/go.mod index 6320b14f..e12e7592 100644 --- a/tools/html-to-htmgo/go.mod +++ b/tools/html-to-htmgo/go.mod @@ -5,4 +5,5 @@ go 1.23.0 require ( golang.org/x/net v0.30.0 golang.org/x/text v0.19.0 + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d ) diff --git a/tools/html-to-htmgo/go.sum b/tools/html-to-htmgo/go.sum index 613920c7..2d1e0d69 100644 --- a/tools/html-to-htmgo/go.sum +++ b/tools/html-to-htmgo/go.sum @@ -1,8 +1,6 @@ -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= From 3f8ab7d905cab145513324f0ddc5e11f75e3b681 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 08:12:11 -0500 Subject: [PATCH 134/145] add copy button --- htmgo-site/partials/html-to-go.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 28d0634f..358f8686 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -2,6 +2,7 @@ package partials import ( "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/js" "github.com/maddalax/htmgo/tools/html-to-htmgo/htmltogo" "htmgo-site/ui" ) @@ -34,8 +35,30 @@ func GoOutput(content string) *h.Element { h.Class("h-full w-1/2 min-w-1/2"), h.Id("go-output"), h.Div( - h.Class("h-[90%] w-full rounded border border-slate-200"), - h.UnsafeRaw(content), + h.Class("h-[90%] w-full rounded border border-slate-200 relative"), + h.Div( + h.Class("h-full"), + h.Id("go-output-content"), + h.UnsafeRaw(content), + ), + h.If(content != "", h.Div( + + h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), + h.Text("Copy"), + // language=JavaScript + h.OnClick(js.EvalJs(` + if(!navigator.clipboard) { + alert("Clipboard API not supported"); + return; + } + let text = self.parentElement.querySelector("#go-output-content").innerText; + navigator.clipboard.writeText(text); + self.innerText = "Copied!"; + setTimeout(() => { + self.innerText = "Copy"; + }, 1000); + `)), + )), ), ) } From 8736c00fd562595d50deccce7e48bbe624d5a1e1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 10:33:48 -0500 Subject: [PATCH 135/145] htmgo - custom formatter (#47) * format htmgo elements on save * formatter updates * ensure we maintain comments --- cli/htmgo/runner.go | 27 ++- cli/htmgo/tasks/formatter/formatter.go | 50 ++++++ cli/htmgo/tasks/process/process.go | 2 +- examples/chat/chat/component.go | 15 +- examples/chat/components/error.go | 5 +- examples/chat/components/input.go | 50 ++++-- examples/chat/pages/chat.$id.go | 33 ++-- examples/chat/pages/index.go | 25 +-- examples/hackernews/partials/comments.go | 34 ++-- examples/hackernews/partials/sidebar.go | 21 ++- examples/simple-auth/pages/index.go | 10 +- examples/simple-auth/ui/error.go | 5 +- examples/simple-auth/ui/input.go | 50 ++++-- examples/simple-auth/ui/login.go | 5 +- examples/todo-list/pages/index.go | 9 +- examples/todo-list/partials/task/task.go | 167 ++++++++++++++---- htmgo-site/pages/base/root.go | 7 +- htmgo-site/pages/docs.go | 3 +- htmgo-site/pages/examples.go | 71 ++++---- htmgo-site/pages/form.go | 16 +- htmgo-site/pages/html-to-go.go | 3 +- htmgo-site/pages/index.go | 50 +++--- htmgo-site/pages/markdown.go | 5 +- htmgo-site/pages/test.go | 59 +++++++ htmgo-site/partials/form.go | 4 +- htmgo-site/partials/html-to-go.go | 39 ++-- htmgo-site/partials/navbar.go | 82 +++++---- htmgo-site/partials/sidebar.go | 5 +- templates/starter/pages/index.go | 6 +- templates/starter/pages/root.go | 4 +- templates/starter/partials/index.go | 3 +- tools/html-to-htmgo/htmltogo/indent.go | 139 +++++++++++++++ tools/html-to-htmgo/htmltogo/main.go | 2 +- .../adapters/services/formatter/formatter.go | 3 +- .../adapters/services/formatter/indent.go | 58 ------ 35 files changed, 762 insertions(+), 305 deletions(-) create mode 100644 cli/htmgo/tasks/formatter/formatter.go create mode 100644 htmgo-site/pages/test.go create mode 100644 tools/html-to-htmgo/htmltogo/indent.go delete mode 100644 tools/html-to-htmgo/internal/adapters/services/formatter/indent.go diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index 2352d39a..0cfd5864 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -9,6 +9,7 @@ import ( "github.com/maddalax/htmgo/cli/htmgo/tasks/copyassets" "github.com/maddalax/htmgo/cli/htmgo/tasks/css" "github.com/maddalax/htmgo/cli/htmgo/tasks/downloadtemplate" + "github.com/maddalax/htmgo/cli/htmgo/tasks/formatter" "github.com/maddalax/htmgo/cli/htmgo/tasks/process" "github.com/maddalax/htmgo/cli/htmgo/tasks/reloader" "github.com/maddalax/htmgo/cli/htmgo/tasks/run" @@ -19,10 +20,10 @@ import ( ) func main() { - done := RegisterSignals() + needsSignals := true commandMap := make(map[string]*flag.FlagSet) - commands := []string{"template", "run", "watch", "build", "setup", "css", "schema", "generate"} + commands := []string{"template", "run", "watch", "build", "setup", "css", "schema", "generate", "format"} for _, command := range commands { commandMap[command] = flag.NewFlagSet(command, flag.ExitOnError) @@ -56,6 +57,15 @@ func main() { slog.Debug("Running task:", slog.String("task", taskName)) slog.Debug("working dir:", slog.String("dir", process.GetWorkingDir())) + if taskName == "format" { + needsSignals = false + } + + done := make(chan bool, 1) + if needsSignals { + done = RegisterSignals() + } + if taskName == "watch" { fmt.Printf("Running in watch mode\n") os.Setenv("ENV", "development") @@ -90,7 +100,18 @@ func main() { }() startWatcher(reloader.OnFileChange) } else { - if taskName == "schema" { + if taskName == "format" { + if len(os.Args) < 3 { + fmt.Println(fmt.Sprintf("Usage: htmgo format ")) + os.Exit(1) + } + file := os.Args[2] + if file == "." { + formatter.FormatDir(process.GetWorkingDir()) + } else { + formatter.FormatFile(os.Args[2]) + } + } else if taskName == "schema" { reader := bufio.NewReader(os.Stdin) fmt.Print("Enter entity name:") text, _ := reader.ReadString('\n') diff --git a/cli/htmgo/tasks/formatter/formatter.go b/cli/htmgo/tasks/formatter/formatter.go new file mode 100644 index 00000000..61a32058 --- /dev/null +++ b/cli/htmgo/tasks/formatter/formatter.go @@ -0,0 +1,50 @@ +package formatter + +import ( + "fmt" + "github.com/maddalax/htmgo/tools/html-to-htmgo/htmltogo" + "os" + "path/filepath" + "strings" +) + +func FormatDir(dir string) { + files, err := os.ReadDir(dir) + if err != nil { + fmt.Printf("error reading dir: %s\n", err.Error()) + return + } + for _, file := range files { + if file.IsDir() { + FormatDir(filepath.Join(dir, file.Name())) + } else { + FormatFile(filepath.Join(dir, file.Name())) + } + } +} + +func FormatFile(file string) { + if !strings.HasSuffix(file, ".go") { + return + } + + fmt.Printf("formatting file: %s\n", file) + + source, err := os.ReadFile(file) + if err != nil { + fmt.Printf("error reading file: %s\n", err.Error()) + return + } + + str := string(source) + + if !strings.Contains(str, "github.com/maddalax/htmgo/framework/h") { + return + } + + parsed := htmltogo.Indent(str) + + os.WriteFile(file, []byte(parsed), 0644) + + return +} diff --git a/cli/htmgo/tasks/process/process.go b/cli/htmgo/tasks/process/process.go index a31cd196..f3c1c41a 100644 --- a/cli/htmgo/tasks/process/process.go +++ b/cli/htmgo/tasks/process/process.go @@ -115,7 +115,7 @@ func OnShutdown() { } } // give it a second - time.Sleep(time.Second * 2) + time.Sleep(time.Second * 1) // force kill KillAll() } diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index f81adbf8..0840fe30 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -11,18 +11,25 @@ import ( func MessageRow(message *Message) *h.Element { return h.Div( h.Attribute("hx-swap-oob", "beforeend"), - h.Class("flex flex-col gap-4 w-full break-words whitespace-normal"), // Ensure container breaks long words + h.Class("flex flex-col gap-4 w-full break-words whitespace-normal"), + // Ensure container breaks long words h.Id("messages"), h.Div( h.Class("flex flex-col gap-1"), h.Div( h.Class("flex gap-2 items-center"), - h.Pf(message.UserName, h.Class("font-bold")), + h.Pf( + message.UserName, + h.Class("font-bold"), + ), h.Pf(message.CreatedAt.In(time.Local).Format("01/02 03:04 PM")), ), h.Article( - h.Class("break-words whitespace-normal"), // Ensure message text wraps correctly - h.P(h.Text(message.Message)), + h.Class("break-words whitespace-normal"), + // Ensure message text wraps correctly + h.P( + h.Text(message.Message), + ), ), ), ) diff --git a/examples/chat/components/error.go b/examples/chat/components/error.go index a20ba0d6..4b147ddd 100644 --- a/examples/chat/components/error.go +++ b/examples/chat/components/error.go @@ -6,6 +6,9 @@ func FormError(error string) *h.Element { return h.Div( h.Id("form-error"), h.Text(error), - h.If(error != "", h.Class("p-4 bg-rose-400 text-white rounded")), + h.If( + error != "", + h.Class("p-4 bg-rose-400 text-white rounded"), + ), ) } diff --git a/examples/chat/components/input.go b/examples/chat/components/input.go index fec13632..0013d4ef 100644 --- a/examples/chat/components/input.go +++ b/examples/chat/components/input.go @@ -19,11 +19,14 @@ type InputProps struct { } func Input(props InputProps) *h.Element { - validation := h.If(props.ValidationPath != "", h.Children( - h.Post(props.ValidationPath, hx.BlurEvent), - h.Attribute("hx-swap", "innerHTML transition:true"), - h.Attribute("hx-target", "next div"), - )) + validation := h.If( + props.ValidationPath != "", + h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + ), + ) if props.Type == "" { props.Type = "text" @@ -32,18 +35,41 @@ func Input(props InputProps) *h.Element { input := h.Input( props.Type, h.Class("border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800"), - h.If(props.Name != "", h.Name(props.Name)), - h.If(props.Children != nil, h.Children(props.Children...)), - h.If(props.Required, h.Required()), - h.If(props.Placeholder != "", h.Placeholder(props.Placeholder)), - h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), + h.If( + props.Name != "", + h.Name(props.Name), + ), + h.If( + props.Children != nil, + h.Children(props.Children...), + ), + h.If( + props.Required, + h.Required(), + ), + h.If( + props.Placeholder != "", + h.Placeholder(props.Placeholder), + ), + h.If( + props.DefaultValue != "", + h.Attribute("value", props.DefaultValue), + ), validation, ) wrapped := h.Div( - h.If(props.Id != "", h.Id(props.Id)), + h.If( + props.Id != "", + h.Id(props.Id), + ), h.Class("flex flex-col gap-1"), - h.If(props.Label != "", h.Label(h.Text(props.Label))), + h.If( + props.Label != "", + h.Label( + h.Text(props.Label), + ), + ), input, h.Div( h.Id(props.Id+"-error"), diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 493a873c..a06367a8 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -17,13 +17,10 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { RootPage( h.Div( h.TriggerChildren(), - h.Attribute("sse-connect", fmt.Sprintf("/sse/chat/%s", roomId)), - h.HxOnSseOpen( js.ConsoleLog("Connected to chat room"), ), - h.HxOnSseError( js.EvalJs(fmt.Sprintf(` const reason = e.detail.event.data @@ -38,35 +35,27 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { } `, roomId, roomId)), ), - // Adjusted flex properties for responsive layout h.Class("flex flex-row h-screen bg-neutral-100 overflow-x-hidden"), - // Collapse Button for mobile CollapseButton(), - // Sidebar for connected users UserSidebar(), - h.Div( // Adjusted to fill height and width h.Class("flex flex-col h-full w-full bg-white p-4 overflow-hidden"), - // Room name at the top, fixed CachedRoomHeader(ctx), - h.HxAfterSseMessage( js.EvalJsOnSibling("#messages", `element.scrollTop = element.scrollHeight;`), ), - // Chat Messages h.Div( h.Id("messages"), // Adjusted flex properties and removed max-width h.Class("flex flex-col gap-4 mb-4 overflow-auto flex-grow w-full pt-[50px]"), ), - // Chat Input at the bottom Form(), ), @@ -91,7 +80,10 @@ func roomNameHeader(ctx *h.RequestContext) *h.Element { } return h.Div( h.Class("bg-neutral-700 text-white p-3 shadow-sm w-full fixed top-0 left-0 flex justify-center z-10"), - h.H2F(room.Name, h.Class("text-lg font-bold")), + h.H2F( + room.Name, + h.Class("text-lg font-bold"), + ), h.Div( h.Class("absolute right-5 top-3 cursor-pointer"), h.Text("Share"), @@ -108,7 +100,10 @@ func UserSidebar() *h.Element { return h.Div( h.Class("sidebar h-full pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex-col justify-between gap-3 rounded-l-lg hidden md:flex"), h.Div( - h.H3F("Connected Users", h.Class("text-lg font-bold")), + h.H3F( + "Connected Users", + h.Class("text-lg font-bold"), + ), chat.ConnectedUsers(make([]db.User, 0), ""), ), h.A( @@ -121,9 +116,11 @@ func UserSidebar() *h.Element { func CollapseButton() *h.Element { return h.Div( - h.Class("fixed top-0 left-4 md:hidden z-50"), // Always visible on mobile + h.Class("fixed top-0 left-4 md:hidden z-50"), + // Always visible on mobile h.Button( - h.Class("p-2 text-2xl bg-neutral-700 text-white rounded-md"), // Styling the button + h.Class("p-2 text-2xl bg-neutral-700 text-white rounded-md"), + // Styling the button h.OnClick( js.EvalJs(` const sidebar = document.querySelector('.sidebar'); @@ -131,13 +128,15 @@ func CollapseButton() *h.Element { sidebar.classList.toggle('flex'); `), ), - h.UnsafeRaw("☰"), // The icon for collapsing the sidebar + h.UnsafeRaw("☰"), + // The icon for collapsing the sidebar ), ) } func MessageInput() *h.Element { - return h.Input("text", + return h.Input( + "text", h.Id("message-input"), h.Required(), h.Class("p-4 rounded-md border border-slate-200 w-full focus:outline-none focus:ring focus:ring-slate-200"), diff --git a/examples/chat/pages/index.go b/examples/chat/pages/index.go index 571d5b54..229c7d93 100644 --- a/examples/chat/pages/index.go +++ b/examples/chat/pages/index.go @@ -13,12 +13,14 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.Class("flex flex-col items-center justify-center min-h-screen bg-neutral-100"), h.Div( h.Class("bg-white p-8 rounded-lg shadow-lg w-full max-w-md"), - h.H2F("htmgo chat", h.Class("text-3xl font-bold text-center mb-6")), + h.H2F( + "htmgo chat", + h.Class("text-3xl font-bold text-center mb-6"), + ), h.Form( h.Attribute("hx-swap", "none"), h.PostPartial(partials.CreateOrJoinRoom), h.Class("flex flex-col gap-6"), - // Username input at the top components.Input(components.InputProps{ Id: "username", @@ -30,11 +32,9 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.MaxLength(15), }, }), - // Single box for Create or Join a Chat Room h.Div( h.Class("p-4 border border-gray-300 rounded-md flex flex-col gap-6"), - // Create New Chat Room input components.Input(components.InputProps{ Name: "new-chat-room", @@ -45,15 +45,20 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.MaxLength(20), }, }), - // OR divider h.Div( h.Class("flex items-center justify-center gap-4"), - h.Div(h.Class("border-t border-gray-300 flex-grow")), - h.P(h.Text("OR"), h.Class("text-gray-500")), - h.Div(h.Class("border-t border-gray-300 flex-grow")), + h.Div( + h.Class("border-t border-gray-300 flex-grow"), + ), + h.P( + h.Text("OR"), + h.Class("text-gray-500"), + ), + h.Div( + h.Class("border-t border-gray-300 flex-grow"), + ), ), - // Join Chat Room input components.Input(components.InputProps{ Id: "join-chat-room", @@ -67,10 +72,8 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { }, }), ), - // Error message components.FormError(""), - // Submit button at the bottom components.PrimaryButton(components.ButtonProps{ Type: "submit", diff --git a/examples/hackernews/partials/comments.go b/examples/hackernews/partials/comments.go index c0583fee..95ce923d 100644 --- a/examples/hackernews/partials/comments.go +++ b/examples/hackernews/partials/comments.go @@ -13,7 +13,12 @@ import ( func StoryComments(ctx *h.RequestContext) *h.Partial { return h.NewPartial( h.Fragment( - h.OobSwap(ctx, h.Div(h.Id("comments-loader"))), + h.OobSwap( + ctx, + h.Div( + h.Id("comments-loader"), + ), + ), h.Div( h.Class("flex flex-col gap-3 prose max-w-none"), CachedStoryComments(news.MustItemId(ctx)), @@ -57,9 +62,15 @@ func Comment(item news.Comment, nesting int) *h.Element { "border-b border-gray-200": nesting == 0, "border-l border-gray-200": nesting > 0, }), - h.If(nesting > 0, h.Attribute("style", fmt.Sprintf("margin-left: %dpx", (nesting-1)*15))), + h.If( + nesting > 0, + h.Attribute("style", fmt.Sprintf("margin-left: %dpx", (nesting-1)*15)), + ), h.Div( - h.If(nesting > 0, h.Class("pl-4")), + h.If( + nesting > 0, + h.Class("pl-4"), + ), h.Div( h.Class("flex gap-1 items-center"), h.Div( @@ -77,12 +88,15 @@ func Comment(item news.Comment, nesting int) *h.Element { h.UnsafeRaw(strings.TrimSpace(item.Text)), ), ), - h.If(len(children) > 0, h.List( - children, func(child news.Comment, index int) *h.Element { - return h.Div( - Comment(child, nesting+1), - ) - }, - )), + h.If( + len(children) > 0, + h.List( + children, func(child news.Comment, index int) *h.Element { + return h.Div( + Comment(child, nesting+1), + ) + }, + ), + ), ) } diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go index c850d09b..d3bbef0b 100644 --- a/examples/hackernews/partials/sidebar.go +++ b/examples/hackernews/partials/sidebar.go @@ -57,13 +57,18 @@ func StorySidebar(ctx *h.RequestContext) *h.Partial { page := parse.MustParseInt(pageRaw, 0) - fetchMorePath := h.GetPartialPathWithQs(StorySidebar, h.NewQs("mode", "infinite", "page", fmt.Sprintf("%d", page+1), "category", category)) + fetchMorePath := h.GetPartialPathWithQs( + StorySidebar, + h.NewQs("mode", "infinite", "page", fmt.Sprintf("%d", page+1), "category", category), + ) list := CachedStoryList(category, page, 50, fetchMorePath) body := h.Aside( h.Id("story-sidebar"), - h.JoinExtensions(h.TriggerChildren()), + h.JoinExtensions( + h.TriggerChildren(), + ), h.Class("sticky top-0 h-screen p-1 bg-gray-100 overflow-y-auto max-w-80 min-w-80"), h.Div( h.Class("flex flex-col gap-1"), @@ -99,7 +104,9 @@ func SidebarTitle(defaultCategory string) *h.Element { h.Text("Hacker News"), ), h.Div( - h.OnLoad(h.EvalJs(ScrollJs)), + h.OnLoad( + h.EvalJs(ScrollJs), + ), h.Class("scroll-container mt-2 flex gap-1 no-scrollbar overflow-y-hidden whitespace-nowrap overflow-x-auto"), h.List(news.Categories, func(item news.Category, index int) *h.Element { return CategoryBadge(defaultCategory, item) @@ -114,7 +121,13 @@ func CategoryBadge(defaultCategory string, category news.Category) *h.Element { category.Name, selected, h.Attribute("hx-swap", "none"), - h.If(!selected, h.PostPartialOnClickQs(StorySidebar, h.NewQs("category", category.Path))), + h.If( + !selected, + h.PostPartialOnClickQs( + StorySidebar, + h.NewQs("category", category.Path), + ), + ), ) } diff --git a/examples/simple-auth/pages/index.go b/examples/simple-auth/pages/index.go index 364f0f3c..f159adce 100644 --- a/examples/simple-auth/pages/index.go +++ b/examples/simple-auth/pages/index.go @@ -24,14 +24,16 @@ func UserProfilePage(u db.User) *h.Element { return h.Div( h.Class("flex flex-col gap-6 items-center pt-10 min-h-screen bg-neutral-100"), - h.H3F("User Profile", h.Class("text-2xl font-bold")), + h.H3F( + "User Profile", + h.Class("text-2xl font-bold"), + ), h.Pf("Welcome, %s!", u.Email), h.Form( h.Attribute("hx-swap", "none"), h.PostPartial(partials.UpdateProfile), h.TriggerChildren(), h.Class("flex flex-col gap-4 w-full max-w-md p-6 bg-white rounded-md shadow-md"), - ui.Input(ui.InputProps{ Id: "email", Name: "email", @@ -42,26 +44,22 @@ func UserProfilePage(u db.User) *h.Element { h.Disabled(), }, }), - ui.Input(ui.InputProps{ Name: "birth-date", Label: "Birth Date", DefaultValue: user.GetMetaKey(meta, "birthDate"), Type: "date", }), - ui.Input(ui.InputProps{ Name: "favorite-color", Label: "Favorite Color", DefaultValue: user.GetMetaKey(meta, "favoriteColor"), }), - ui.Input(ui.InputProps{ Name: "occupation", Label: "Occupation", DefaultValue: user.GetMetaKey(meta, "occupation"), }), - ui.FormError(""), ui.SubmitButton("Save Changes"), ), diff --git a/examples/simple-auth/ui/error.go b/examples/simple-auth/ui/error.go index a410e133..47d1eac6 100644 --- a/examples/simple-auth/ui/error.go +++ b/examples/simple-auth/ui/error.go @@ -6,7 +6,10 @@ func FormError(error string) *h.Element { return h.Div( h.Id("form-error"), h.Text(error), - h.If(error != "", h.Class("p-4 bg-rose-400 text-white rounded")), + h.If( + error != "", + h.Class("p-4 bg-rose-400 text-white rounded"), + ), ) } diff --git a/examples/simple-auth/ui/input.go b/examples/simple-auth/ui/input.go index f4657662..6e302fbe 100644 --- a/examples/simple-auth/ui/input.go +++ b/examples/simple-auth/ui/input.go @@ -19,11 +19,14 @@ type InputProps struct { } func Input(props InputProps) *h.Element { - validation := h.If(props.ValidationPath != "", h.Children( - h.Post(props.ValidationPath, hx.BlurEvent), - h.Attribute("hx-swap", "innerHTML transition:true"), - h.Attribute("hx-target", "next div"), - )) + validation := h.If( + props.ValidationPath != "", + h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + ), + ) if props.Type == "" { props.Type = "text" @@ -32,18 +35,41 @@ func Input(props InputProps) *h.Element { input := h.Input( props.Type, h.Class("border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800"), - h.If(props.Name != "", h.Name(props.Name)), - h.If(props.Children != nil, h.Children(props.Children...)), - h.If(props.Required, h.Required()), - h.If(props.Placeholder != "", h.Placeholder(props.Placeholder)), - h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), + h.If( + props.Name != "", + h.Name(props.Name), + ), + h.If( + props.Children != nil, + h.Children(props.Children...), + ), + h.If( + props.Required, + h.Required(), + ), + h.If( + props.Placeholder != "", + h.Placeholder(props.Placeholder), + ), + h.If( + props.DefaultValue != "", + h.Attribute("value", props.DefaultValue), + ), validation, ) wrapped := h.Div( - h.If(props.Id != "", h.Id(props.Id)), + h.If( + props.Id != "", + h.Id(props.Id), + ), h.Class("flex flex-col gap-1"), - h.If(props.Label != "", h.Label(h.Text(props.Label))), + h.If( + props.Label != "", + h.Label( + h.Text(props.Label), + ), + ), input, h.Div( h.Id(props.Id+"-error"), diff --git a/examples/simple-auth/ui/login.go b/examples/simple-auth/ui/login.go index 93a2d973..50cf046c 100644 --- a/examples/simple-auth/ui/login.go +++ b/examples/simple-auth/ui/login.go @@ -16,7 +16,10 @@ func CenteredForm(props CenteredFormProps) *h.Element { h.Class("flex flex-col items-center justify-center min-h-screen bg-neutral-100"), h.Div( h.Class("bg-white p-8 rounded-lg shadow-lg w-full max-w-md"), - h.H2F(props.Title, h.Class("text-3xl font-bold text-center mb-6")), + h.H2F( + props.Title, + h.Class("text-3xl font-bold text-center mb-6"), + ), h.Form( h.TriggerChildren(), h.Post(props.PostUrl), diff --git a/examples/todo-list/pages/index.go b/examples/todo-list/pages/index.go index 65b5cacb..2cc736d0 100644 --- a/examples/todo-list/pages/index.go +++ b/examples/todo-list/pages/index.go @@ -10,7 +10,10 @@ import ( func TaskListPage(ctx *h.RequestContext) *h.Page { title := h.Div( - h.H1(h.Class("text-7xl font-extralight text-rose-500 tracking-wide"), h.Text("todos")), + h.H1( + h.Class("text-7xl font-extralight text-rose-500 tracking-wide"), + h.Text("todos"), + ), ) return h.NewPage(base.RootPage( @@ -21,7 +24,9 @@ func TaskListPage(ctx *h.RequestContext) *h.Page { title, task.Card(ctx), h.Children( - h.Div(h.Text("Double-click to edit a todo")), + h.Div( + h.Text("Double-click to edit a todo"), + ), ), ), ), diff --git a/examples/todo-list/partials/task/task.go b/examples/todo-list/partials/task/task.go index 29498ab3..f307a577 100644 --- a/examples/todo-list/partials/task/task.go +++ b/examples/todo-list/partials/task/task.go @@ -58,7 +58,9 @@ func Input(list []*ent.Task) *h.Element { h.Name("name"), h.Class("pl-12 text-xl p-4 w-full outline-none focus:outline-2 focus:outline-rose-400"), h.Placeholder("What needs to be done?"), - h.Post(h.GetPartialPath(Create)), + h.Post( + h.GetPartialPath(Create), + ), h.HxTrigger(hx.OnEvent(hx.TriggerKeyUpEnter)), ), CompleteAllIcon(list), @@ -66,23 +68,34 @@ func Input(list []*ent.Task) *h.Element { } func CompleteAllIcon(list []*ent.Task) *h.Element { - notCompletedCount := len(h.Filter(list, func(item *ent.Task) bool { - return item.CompletedAt == nil - })) + notCompletedCount := len( + h.Filter(list, func(item *ent.Task) bool { + return item.CompletedAt == nil + }), + ) return h.Div( h.ClassX("absolute top-1 left-5 p-2 rotate-90 text-3xl cursor-pointer", map[string]bool{ "text-slate-400": notCompletedCount > 0, - }), h.UnsafeRaw("›"), - h.PostPartialWithQs(CompleteAll, h.NewQs("complete", h.Ternary(notCompletedCount > 0, "true", "false"))), + }), + h.UnsafeRaw("›"), + h.PostPartialWithQs( + CompleteAll, + h.NewQs( + "complete", + h.Ternary(notCompletedCount > 0, "true", "false"), + ), + ), ) } func Footer(list []*ent.Task, activeTab Tab) *h.Element { - notCompletedCount := len(h.Filter(list, func(item *ent.Task) bool { - return item.CompletedAt == nil - })) + notCompletedCount := len( + h.Filter(list, func(item *ent.Task) bool { + return item.CompletedAt == nil + }), + ) tabs := []Tab{TabAll, TabActive, TabComplete} @@ -96,7 +109,12 @@ func Footer(list []*ent.Task, activeTab Tab) *h.Element { h.Class("flex items-center gap-4"), h.List(tabs, func(tab Tab, index int) *h.Element { return h.P( - h.PostOnClick(h.GetPartialPathWithQs(ChangeTab, h.NewQs("tab", tab))), + h.PostOnClick( + h.GetPartialPathWithQs( + ChangeTab, + h.NewQs("tab", tab), + ), + ), h.ClassX("cursor-pointer px-2 py-1 rounded", map[string]bool{ "border border-rose-600": activeTab == tab, }), @@ -139,12 +157,14 @@ func Task(task *ent.Task, editing bool) *h.Element { "border border-b-slate-100": !editing, }), CompleteIcon(task), - h.IfElse(editing, + h.IfElse( + editing, h.Div( h.Class("flex-1 h-full"), h.Form( h.Class("h-full"), - h.Input("text", + h.Input( + "text", h.Name("task"), h.Value(task.ID.String()), h.Class("hidden"), @@ -168,30 +188,43 @@ func Task(task *ent.Task, editing bool) *h.Element { ), ), h.P( - h.GetPartialWithQs(EditNameForm, h.NewQs("id", task.ID.String()), hx.TriggerDblClick), + h.GetPartialWithQs( + EditNameForm, + h.NewQs("id", task.ID.String()), + hx.TriggerDblClick, + ), h.ClassX("text-xl break-all text-wrap truncate", map[string]bool{ "line-through text-slate-400": task.CompletedAt != nil, }), h.Text(task.Name), - )), + ), + ), ) } func CompleteIcon(task *ent.Task) *h.Element { return h.Div( h.HxTrigger(hx.OnClick()), - h.Post(h.GetPartialPathWithQs(ToggleCompleted, h.NewQs("id", task.ID.String()))), + h.Post( + h.GetPartialPathWithQs( + ToggleCompleted, + h.NewQs("id", task.ID.String()), + ), + ), h.Class("flex items-center justify-center cursor-pointer"), h.Div( h.ClassX("w-10 h-10 border rounded-full flex items-center justify-center", map[string]bool{ "border-green-500": task.CompletedAt != nil, "border-slate-400": task.CompletedAt == nil, }), - h.If(task.CompletedAt != nil, h.UnsafeRaw(` + h.If( + task.CompletedAt != nil, + h.UnsafeRaw(` - `)), + `), + ), ), ) } @@ -199,46 +232,75 @@ func CompleteIcon(task *ent.Task) *h.Element { func UpdateName(ctx *h.RequestContext) *h.Partial { id, err := uuid.Parse(ctx.FormValue("task")) if err != nil { - return h.NewPartial(h.Div(h.Text("invalid id"))) + return h.NewPartial( + h.Div( + h.Text("invalid id"), + ), + ) } name := ctx.FormValue("name") if name == "" { - return h.NewPartial(h.Div(h.Text("name is required"))) + return h.NewPartial( + h.Div( + h.Text("name is required"), + ), + ) } if len(name) > 150 { - return h.NewPartial(h.Div(h.Text("task must be less than 150 characters"))) + return h.NewPartial( + h.Div( + h.Text("task must be less than 150 characters"), + ), + ) } service := tasks.NewService(ctx) task, err := service.Get(id) if task == nil { - return h.NewPartial(h.Div(h.Text("task not found"))) + return h.NewPartial( + h.Div( + h.Text("task not found"), + ), + ) } task, err = service.SetName(task.ID, name) if err != nil { - return h.NewPartial(h.Div(h.Text("failed to update"))) + return h.NewPartial( + h.Div( + h.Text("failed to update"), + ), + ) } return h.NewPartial( - h.OobSwap(ctx, Task(task, false))) + h.OobSwap(ctx, Task(task, false)), + ) } func EditNameForm(ctx *h.RequestContext) *h.Partial { id, err := uuid.Parse(ctx.QueryParam("id")) if err != nil { - return h.NewPartial(h.Div(h.Text("invalid id"))) + return h.NewPartial( + h.Div( + h.Text("invalid id"), + ), + ) } service := tasks.NewService(ctx) task, err := service.Get(id) if task == nil { - return h.NewPartial(h.Div(h.Text("task not found"))) + return h.NewPartial( + h.Div( + h.Text("task not found"), + ), + ) } return h.NewPartial( @@ -249,21 +311,36 @@ func EditNameForm(ctx *h.RequestContext) *h.Partial { func ToggleCompleted(ctx *h.RequestContext) *h.Partial { id, err := uuid.Parse(ctx.QueryParam("id")) if err != nil { - return h.NewPartial(h.Div(h.Text("invalid id"))) + return h.NewPartial( + h.Div( + h.Text("invalid id"), + ), + ) } service := tasks.NewService(ctx) task, err := service.Get(id) if task == nil { - return h.NewPartial(h.Div(h.Text("task not found"))) + return h.NewPartial( + h.Div( + h.Text("task not found"), + ), + ) } - task, err = service.SetCompleted(task.ID, h. - Ternary(task.CompletedAt == nil, true, false)) + task, err = service.SetCompleted( + task.ID, + h. + Ternary(task.CompletedAt == nil, true, false), + ) if err != nil { - return h.NewPartial(h.Div(h.Text("failed to update"))) + return h.NewPartial( + h.Div( + h.Text("failed to update"), + ), + ) } list, _ := service.List() @@ -282,7 +359,9 @@ func CompleteAll(ctx *h.RequestContext) *h.Partial { list, _ := service.List() - return h.NewPartial(h.OobSwap(ctx, CardBody(list, getActiveTab(ctx)))) + return h.NewPartial( + h.OobSwap(ctx, CardBody(list, getActiveTab(ctx))), + ) } func ClearCompleted(ctx *h.RequestContext) *h.Partial { @@ -291,7 +370,9 @@ func ClearCompleted(ctx *h.RequestContext) *h.Partial { list, _ := service.List() - return h.NewPartial(h.OobSwap(ctx, CardBody(list, getActiveTab(ctx)))) + return h.NewPartial( + h.OobSwap(ctx, CardBody(list, getActiveTab(ctx))), + ) } func Create(ctx *h.RequestContext) *h.Partial { @@ -300,7 +381,9 @@ func Create(ctx *h.RequestContext) *h.Partial { if len(name) > 150 { return h.NewPartial( h.Div( - h.HxOnLoad(js.Alert("Task must be less than 150 characters")), + h.HxOnLoad( + js.Alert("Task must be less than 150 characters"), + ), ), ) } @@ -312,7 +395,9 @@ func Create(ctx *h.RequestContext) *h.Partial { if list != nil && len(list) >= 100 { return h.NewPartial( h.Div( - h.HxOnLoad(js.Alert("There are too many tasks, please complete and clear some.")), + h.HxOnLoad( + js.Alert("There are too many tasks, please complete and clear some."), + ), ), ) } @@ -322,7 +407,11 @@ func Create(ctx *h.RequestContext) *h.Partial { }) if err != nil { - return h.NewPartial(h.Div(h.Text("failed to create"))) + return h.NewPartial( + h.Div( + h.Text("failed to create"), + ), + ) } list, err = service.List() @@ -338,8 +427,12 @@ func ChangeTab(ctx *h.RequestContext) *h.Partial { tab := ctx.QueryParam("tab") - return h.SwapManyPartialWithHeaders(ctx, - h.PushQsHeader(ctx, h.NewQs("tab", tab)), + return h.SwapManyPartialWithHeaders( + ctx, + h.PushQsHeader( + ctx, + h.NewQs("tab", tab), + ), List(list, tab), Footer(list, tab), ) diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 4b0e1851..0fd37e46 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -13,7 +13,9 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { description := "build simple and scalable systems with go + htmx" return h.Html( - h.HxExtension(h.BaseExtensions()), + h.HxExtension( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Meta("title", title), @@ -54,7 +56,8 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { } func PageWithNav(ctx *h.RequestContext, children ...h.Ren) *h.Element { - return RootPage(ctx, + return RootPage( + ctx, h.Fragment( partials.NavBar(ctx, partials.NavBarProps{ Expanded: false, diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index f85e689c..c8a35721 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -43,7 +43,8 @@ func DocsPage(ctx *h.RequestContext) *h.Page { MarkdownContent(ctx, page.FilePath, anchor), h.Div( h.Class("ml-4 pl-1 mt-2 bg-rose-200"), - h.If(anchor == "core-concepts-partials", + h.If( + anchor == "core-concepts-partials", h.GetPartial(partials.CurrentTimePartial, "load, every 1s"), ), ), diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go index 719a87a9..ceefac99 100644 --- a/htmgo-site/pages/examples.go +++ b/htmgo-site/pages/examples.go @@ -57,31 +57,34 @@ var examples = []Example{ func ExamplesPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.PageWithNav(ctx, h.Div( - h.Class("flex items-center justify-center"), + base.PageWithNav( + ctx, h.Div( - h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), + h.Class("flex items-center justify-center"), h.Div( - h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), h.Div( - h.H1( - h.Class("text-center md:text-left"), - h.Text("htmgo examples"), - ), - h.H3( - h.Class("-mt-4"), - h.TextF("example projects built with htmgo"), + h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Div( + h.H1( + h.Class("text-center md:text-left"), + h.Text("htmgo examples"), + ), + h.H3( + h.Class("-mt-4"), + h.TextF("example projects built with htmgo"), + ), ), ), - ), - h.Div( - h.Class("border-b border-b-slate-200 h-1"), h.Div( - h.Class("mt-4"), - ExampleCards(), + h.Class("border-b border-b-slate-200 h-1"), + h.Div( + h.Class("mt-4"), + ExampleCards(), + ), ), ), - )), + ), ), ) } @@ -91,26 +94,32 @@ func ExampleCards() *h.Element { h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 gap-6 text-center pb-8"), h.List(examples, func(example Example, index int) *h.Element { return h.Div( - h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), // Removed specific width, handled by grid + h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), h.Div( h.Class("flex flex-col gap-1 mt-4"), h.H2( - h.Class("text-lg text-center mb-1"), // Reduced margin at the bottom of the title + h.Class("text-lg text-center mb-1"), h.Text(example.Title), ), - h.If(example.Image != "", h.Div( - h.A( - h.Href(example.Demo), - h.Class("not-prose"), - h.Img( - h.Src(example.Image), - h.Class("w-[75%] rounded-md mx-auto"), + h.If( + example.Image != "", + h.Div( + h.A( + h.Href(example.Demo), + h.Class("not-prose"), + h.Img( + h.Src(example.Image), + h.Class("w-[75%] rounded-md mx-auto"), + ), ), - ), // Ensures image is centered within the card - )), - h.If(example.Description != "", h.Div( - h.Pf(example.Description), - )), + ), + ), + h.If( + example.Description != "", + h.Div( + h.Pf(example.Description), + ), + ), h.Div( h.Div( h.Class("flex gap-2 justify-center mt-2"), diff --git a/htmgo-site/pages/form.go b/htmgo-site/pages/form.go index 94150753..fdd9d24e 100644 --- a/htmgo-site/pages/form.go +++ b/htmgo-site/pages/form.go @@ -9,21 +9,29 @@ import ( ) func Form(ctx *h.RequestContext) *h.Page { - return h.NewPage(base.RootPage(ctx, + return h.NewPage(base.RootPage( + ctx, h.Div( h.Class("flex flex-col items-center justify-center p-4 gap-6"), - h.H2F("Form submission with loading state example", h.Class("text-2xl font-bold")), + h.H2F( + "Form submission with loading state example", + h.Class("text-2xl font-bold"), + ), h.Form( h.TriggerChildren(), h.PostPartial(partials.SubmitForm), h.Class("flex flex-col gap-2"), h.LabelFor("name", "Your Name"), - h.Input("text", + h.Input( + "text", h.Required(), h.Class("p-4 rounded-md border border-slate-200"), h.Name("name"), h.Placeholder("Name"), - h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), + h.OnEvent( + hx.KeyDownEvent, + js.SubmitFormOnEnter(), + ), ), SubmitButton(), ), diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index 0a2d6f23..face609e 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -8,7 +8,8 @@ import ( func HtmlToGoPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.PageWithNav(ctx, + base.PageWithNav( + ctx, h.Div( h.Class("flex flex-col h-screen items-center justify-center w-full pt-6"), h.H3( diff --git a/htmgo-site/pages/index.go b/htmgo-site/pages/index.go index 8470795f..1b08002f 100644 --- a/htmgo-site/pages/index.go +++ b/htmgo-site/pages/index.go @@ -7,37 +7,43 @@ import ( func IndexPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.PageWithNav(ctx, h.Div( - h.Class("flex items-center justify-center"), + base.PageWithNav( + ctx, h.Div( - h.Class("w-full px-4 flex flex-col prose md:max-w-3xl mt-6 mx-auto"), + h.Class("flex items-center justify-center"), h.Div( - h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Class("w-full px-4 flex flex-col prose md:max-w-3xl mt-6 mx-auto"), h.Div( - h.H1F("htmgo", h.Class("text-center md:text-left")), - h.H3F( - "build simple and scalable systems with %s", - "go + htmx", - h.Class("-mt-4"), + h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Div( + h.H1F( + "htmgo", + h.Class("text-center md:text-left"), + ), + h.H3F( + "build simple and scalable systems with %s", + "go + htmx", + h.Class("-mt-4"), + ), ), - ), - h.Div( - h.Class("mt-2"), - h.A( - h.Href("/docs"), - h.Class("not-prose p-3 bg-slate-900 text-white rounded-md"), - h.Text("Get Started"), + h.Div( + h.Class("mt-2"), + h.A( + h.Href("/docs"), + h.Class("not-prose p-3 bg-slate-900 text-white rounded-md"), + h.Text("Get Started"), + ), ), ), - ), - h.Div( - h.Class("border-b border-b-slate-200 h-1"), h.Div( - h.Class("mt-4"), - MarkdownPage(ctx, "md/index.md", ""), + h.Class("border-b border-b-slate-200 h-1"), + h.Div( + h.Class("mt-4"), + MarkdownPage(ctx, "md/index.md", ""), + ), ), ), - )), + ), ), ) } diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index 6bdc9331..eff2c6af 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -20,7 +20,10 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { embeddedMd := ctx.Get("embeddedMarkdown").(fs.FS) renderer := service.Get[markdown.Renderer](ctx.ServiceLocator()) return h.Div( - h.If(id != "", h.Id(id)), + h.If( + id != "", + h.Id(id), + ), h.Div( h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-3xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), diff --git a/htmgo-site/pages/test.go b/htmgo-site/pages/test.go new file mode 100644 index 00000000..e868461b --- /dev/null +++ b/htmgo-site/pages/test.go @@ -0,0 +1,59 @@ +package pages + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" +) + +func TestFormatPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + base.RootPage( + ctx, + h.Div( + h.P( + h.Class("hello"), + h.Details( + h.Summary( + h.Text("Summary"), + ), + h.Text("Details"), + ), + h.Id("hi"), + ), + ), + ), + ) +} + +func notPage() int { + test := 1 + fmt.Printf("test: %d\n", test) + return test +} + +func TestOtherPage(ctx *h.RequestContext) *h.Page { + + return h.NewPage( + base.RootPage( + ctx, + h.Div( + h.Id("test"), + h.Details( + h.Summary( + h.Text("Summary"), + ), + h.Text("Details"), + ), + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Id("test"), + h.Details( + h.Summary( + h.Text("Summary"), + ), + h.Text("Details"), + ), + ), + ), + ) +} diff --git a/htmgo-site/partials/form.go b/htmgo-site/partials/form.go index 4934822e..8ef0b753 100644 --- a/htmgo-site/partials/form.go +++ b/htmgo-site/partials/form.go @@ -8,6 +8,8 @@ import ( func SubmitForm(ctx *h.RequestContext) *h.Partial { time.Sleep(time.Second * 3) return h.NewPartial( - h.Div(h.Text("Form submitted")), + h.Div( + h.Text("Form submitted"), + ), ) } diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 358f8686..00945e5d 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -41,24 +41,27 @@ func GoOutput(content string) *h.Element { h.Id("go-output-content"), h.UnsafeRaw(content), ), - h.If(content != "", h.Div( - - h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), - h.Text("Copy"), - // language=JavaScript - h.OnClick(js.EvalJs(` - if(!navigator.clipboard) { - alert("Clipboard API not supported"); - return; - } - let text = self.parentElement.querySelector("#go-output-content").innerText; - navigator.clipboard.writeText(text); - self.innerText = "Copied!"; - setTimeout(() => { - self.innerText = "Copy"; - }, 1000); - `)), - )), + h.If( + content != "", + h.Div( + h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), + h.Text("Copy"), + h.OnClick( + js.EvalJs(` + if(!navigator.clipboard) { + alert("Clipboard API not supported"); + return; + } + let text = self.parentElement.querySelector("#go-output-content").innerText; + navigator.clipboard.writeText(text); + self.innerText = "Copied!"; + setTimeout(() => { + self.innerText = "Copy"; + }, 1000); + `), + ), + ), + ), ), ) } diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 1b438cfb..75c6b481 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -58,29 +58,26 @@ func Star(ctx *h.RequestContext) *h.Element { h.Class("w-4 h-4 -mt-0.5 mr-0.5 stroke-current text-white"), h.Attribute("xmlns", "http://www.w3.org/2000/svg"), h.Attribute("viewBox", "0 0 24 24"), - h.Attribute("fill", "none"), // No fill - h.Attribute("stroke", "currentColor"), // Apply stroke - h.Attribute("stroke-width", "2"), // Stroke width + h.Attribute("fill", "none"), + h.Attribute("stroke", "currentColor"), + h.Attribute("stroke-width", "2"), h.Path( h.D("M12 17.27l5.18 3.05-1.64-5.68 4.46-3.87-5.88-.5L12 3.5l-2.12 6.77-5.88.5 4.46 3.87-1.64 5.68L12 17.27z"), ), ), h.Text("Star"), ), - h.If(count > 0, h.Div( - h.Class("flex items-center px-3 py-1 bg-black text-white text-sm font-semibold"), - h.Pf("%d", count), - )), + h.If( + count > 0, + h.Div( + h.Class("flex items-center px-3 py-1 bg-black text-white text-sm font-semibold"), + h.Pf("%d", count), + ), + ), ) } func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { - //prelease := h.If(props.ShowPreRelease, h.A( - // h.Class("bg-blue-200 text-blue-700 text-center p-2 flex items-center justify-center"), - // h.Href("https://github.com/maddalax/htmgo/issues"), - // h.Attribute("target", "_blank"), - // h.Text("htmgo."), - //)) desktopNav := h.Nav( h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3 max-h-[100vh - 9rem] overflow-y-auto"), @@ -94,7 +91,8 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { h.Class("text-2xl"), h.Href("/"), h.Text("htmgo"), - )), + ), + ), h.Div( h.Id("search-container"), ), @@ -118,7 +116,6 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { return h.Div( h.Id("navbar"), - //prelease, MobileNav(ctx, props.Expanded), desktopNav, ) @@ -139,43 +136,54 @@ func MobileNav(ctx *h.RequestContext, expanded bool) *h.Element { h.Class("text-2xl"), h.Href("/"), h.Text("htmgo"), - )), + ), + ), h.Div( h.Class("flex items-center gap-3"), - h.Div(h.Class("mt-1"), CachedStar(ctx)), + h.Div( + h.Class("mt-1"), + CachedStar(ctx), + ), h.Button( h.Boost(), - h.GetPartialWithQs( ToggleNavbar, - h.NewQs("expanded", h.Ternary(expanded, "false", "true"), "test", "true"), + h.NewQs( + "expanded", + h.Ternary(expanded, "false", "true"), + "test", + "true", + ), "click", ), - h.AttributePairs( - "class", "text-2xl", - "aria-expanded", h.Ternary(expanded, "true", "false"), + "class", + "text-2xl", + "aria-expanded", + h.Ternary(expanded, "true", "false"), ), - h.Class("text-2xl"), h.UnsafeRaw("☰"), ), ), ), ), - h.If(expanded, h.Div( - h.Class("mt-2 ml-2 flex flex-col gap-2"), - h.List(navItems, func(item NavItem, index int) *h.Element { - return h.Div( - h.Class("flex items-center"), - h.A( - h.Boost(), - h.Class(""), - h.Href(item.Url), - h.Text(item.Name), - ), - ) - }), - )), + h.If( + expanded, + h.Div( + h.Class("mt-2 ml-2 flex flex-col gap-2"), + h.List(navItems, func(item NavItem, index int) *h.Element { + return h.Div( + h.Class("flex items-center"), + h.A( + h.Boost(), + h.Class(""), + h.Href(item.Url), + h.Text(item.Name), + ), + ) + }), + ), + ), ) } diff --git a/htmgo-site/partials/sidebar.go b/htmgo-site/partials/sidebar.go index 8387f488..a3447c6b 100644 --- a/htmgo-site/partials/sidebar.go +++ b/htmgo-site/partials/sidebar.go @@ -71,7 +71,10 @@ func DocSidebar(pages []*dirwalk.Page) *h.Element { h.Class("flex flex-col gap-4"), h.List(grouped.Entries(), func(entry datastructures.Entry[string, []*dirwalk.Page], index int) *h.Element { return h.Div( - h.P(h.Text(formatPart(entry.Key)), h.Class("text-slate-800 font-bold")), + h.P( + h.Text(formatPart(entry.Key)), + h.Class("text-slate-800 font-bold"), + ), h.Div( h.Class("pl-4 flex flex-col"), h.List(entry.Value, func(page *dirwalk.Page, index int) *h.Element { diff --git a/templates/starter/pages/index.go b/templates/starter/pages/index.go index 08c6f17b..7c81c8ac 100644 --- a/templates/starter/pages/index.go +++ b/templates/starter/pages/index.go @@ -9,7 +9,11 @@ func IndexPage(ctx *h.RequestContext) *h.Page { return RootPage( h.Div( h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - h.H3(h.Id("intro-text"), h.Text("hello htmgo"), h.Class("text-5xl")), + h.H3( + h.Id("intro-text"), + h.Text("hello htmgo"), + h.Class("text-5xl"), + ), h.Div( h.Class("mt-3"), partials.CounterForm(0), diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index d930c81d..323f4363 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -7,7 +7,9 @@ import ( func RootPage(children ...h.Ren) *h.Page { return h.NewPage( h.Html( - h.HxExtensions(h.BaseExtensions()), + h.HxExtensions( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), diff --git a/templates/starter/partials/index.go b/templates/starter/partials/index.go index f5b47e8c..bdedba97 100644 --- a/templates/starter/partials/index.go +++ b/templates/starter/partials/index.go @@ -26,7 +26,8 @@ func CounterForm(count int) *h.Element { h.Class("flex flex-col gap-3 items-center"), h.Id("counter-form"), h.PostPartial(CounterPartial), - h.Input("text", + h.Input( + "text", h.Class("hidden"), h.Value(count), h.Name("count"), diff --git a/tools/html-to-htmgo/htmltogo/indent.go b/tools/html-to-htmgo/htmltogo/indent.go new file mode 100644 index 00000000..519fbe98 --- /dev/null +++ b/tools/html-to-htmgo/htmltogo/indent.go @@ -0,0 +1,139 @@ +package htmltogo + +import ( + "bytes" + "fmt" + "go/ast" + "go/format" + "go/parser" + "go/printer" + "go/token" + "golang.org/x/tools/go/ast/astutil" + "slices" + "strings" +) + +func Indent(input string) string { + fset := token.NewFileSet() + // Parse the code string into an AST + f, err := parser.ParseFile(fset, "", input, parser.ParseComments) + + if err != nil { + return input + } + + htmgoComponentTypes := []string{ + "h.Element", + "h.Page", + "h.Partial", + "h.Ren", + } + + for _, decl := range f.Decls { + switch c := decl.(type) { + case *ast.FuncDecl: + + if c.Type.Results == nil || len(c.Type.Results.List) == 0 { + continue + } + + returnType := c.Type.Results.List[0].Type + + isHtmgoComponent := false + if v, ok := returnType.(*ast.StarExpr); ok { + if x, ok := v.X.(*ast.SelectorExpr); ok { + name := x.X.(*ast.Ident).Name + str := name + "." + x.Sel.Name + isHtmgoComponent = slices.Contains(htmgoComponentTypes, str) + } + } + + if !isHtmgoComponent { + continue + } + + var isHTag = func(n ast.Expr) bool { + switch argc := n.(type) { + // If the first argument is another node, add an indent + case *ast.CallExpr: + if v, ok := argc.Fun.(*ast.SelectorExpr); ok { + if v2, ok := v.X.(*ast.Ident); ok { + if v2.Name == "h" || v2.Name == "js" { + return true + } + } + } + } + return false + } + + var indent = func(children []ast.Expr) []ast.Expr { + children = append(children, ast.NewIdent("INDENTME")) + return children + } + + astutil.Apply(c.Body, nil, func(cursor *astutil.Cursor) bool { + switch n := cursor.Node().(type) { + case *ast.CallExpr: + newChildren := make([]ast.Expr, 0) + + hasAnyHElements := false + + for _, arg := range n.Args { + if isHTag(arg) { + hasAnyHElements = true + break + } + } + + for i, arg := range n.Args { + + if len(n.Args) == 1 && isHTag(arg) { + newChildren = indent(newChildren) + newChildren = append(newChildren, arg) + newChildren = indent(newChildren) + continue + } + + if !hasAnyHElements { + newChildren = append(newChildren, arg) + continue + } + + if len(n.Args) > 1 { + if i == 0 { + newChildren = indent(newChildren) + } + } + newChildren = append(newChildren, arg) + if len(n.Args) > 1 { + newChildren = indent(newChildren) + } + } + n.Args = newChildren + return true + } + return true + }) + } + } + + // Convert the AST node to a string + var buf bytes.Buffer + if err := printer.Fprint(&buf, fset, f); err != nil { + fmt.Println("Error printing AST:", err) + return input + } + + // Output the formatted code + indented := strings.ReplaceAll(buf.String(), "INDENTME,", "\n\t\t") + indented = strings.ReplaceAll(indented, ", INDENTME", ", \n\t\t") + + formatted, err := format.Source([]byte(indented)) + + if err != nil { + return input + } + + return string(formatted) +} diff --git a/tools/html-to-htmgo/htmltogo/main.go b/tools/html-to-htmgo/htmltogo/main.go index ce382c16..d2806fd3 100644 --- a/tools/html-to-htmgo/htmltogo/main.go +++ b/tools/html-to-htmgo/htmltogo/main.go @@ -18,5 +18,5 @@ func Parse(input []byte) []byte { return nil } - return []byte(formatter.Format(parsed)) + return []byte(Indent(formatter.Format(parsed))) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go index a33d98aa..6bfb3bdb 100644 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go @@ -16,8 +16,7 @@ import ( func MyComponent() *h.Element { return ` + node.String() + ` }`) - indented := Indent(string(b)) - dist, err := format.Source([]byte(indented)) + dist, err := format.Source(b) if err != nil { return string(b) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go deleted file mode 100644 index fdffc5f2..00000000 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go +++ /dev/null @@ -1,58 +0,0 @@ -package formatter - -import ( - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "golang.org/x/tools/go/ast/astutil" - "strings" -) - -func Indent(input string) string { - fset := token.NewFileSet() - // Parse the code string into an AST - f, err := parser.ParseFile(fset, "", input, 0) - - if err != nil { - return input - } - - component := f.Decls[1].(*ast.FuncDecl) - - astutil.Apply(component.Body, nil, func(cursor *astutil.Cursor) bool { - switch n := cursor.Node().(type) { - case *ast.CallExpr: - newChildren := make([]ast.Expr, 0) - for i, arg := range n.Args { - if i == 0 { - switch arg.(type) { - // If the first argument is another node, add an indent - case *ast.CallExpr: - newChildren = append(newChildren, ast.NewIdent("INDENTME")) - } - } - newChildren = append(newChildren, arg) - newChildren = append(newChildren, ast.NewIdent("INDENTME")) - } - n.Args = newChildren - return true - } - return true - }) - - // Convert the AST node to a string - var buf bytes.Buffer - if err := printer.Fprint(&buf, fset, component); err != nil { - fmt.Println("Error printing AST:", err) - return input - } - - // Output the formatted code - indented := strings.ReplaceAll(buf.String(), "INDENTME,", "\n\t\t") - indented = strings.ReplaceAll(indented, ", INDENTME", ", \n\t\t") - - return indented -} From f4083b70141ff0db7cd95d8b7f78fd9ab509a538 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 15:34:32 +0000 Subject: [PATCH 136/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 59f66779..d70f0c17 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index ac682267..bf8a7b89 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index a8007c27..d1c2ce0d 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 6ffee291..9bf1b0fc 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index e45ccdd1..433e75f2 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index c2520166..41639c16 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 8ed8f7f3..dad36aea 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 8acc9940..660baad0 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 415624cf..483f1253 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 6ffee291..9bf1b0fc 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 141b1e93..5407f278 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 8a0bfa6d..9470743d 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 h1:iQ/HmCUl+XBJ0UZQ6V6h9jJdavRFLSoPA74GEHG82vQ= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 h1:VDaKRsl3yIs957Romc2+EMLQyGiWjAUy9PA3k+NyLg4= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index c359fde5..f1af4353 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 6ffee291..9bf1b0fc 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 504a64aa636092d854929ea2609e72e107a4027d Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 10:54:12 -0500 Subject: [PATCH 137/145] add instructions for running the formatter --- examples/chat/pages/chat.$id.go | 3 +- .../md/docs/8_miscellaneous/3_htmgo format.md | 60 +++++++++++++++++++ htmgo-site/partials/html-to-go.go | 1 + 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index a06367a8..deb676df 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -129,7 +129,8 @@ func CollapseButton() *h.Element { `), ), h.UnsafeRaw("☰"), - // The icon for collapsing the sidebar + + // The icon for collapsing the sidebar ), ) } diff --git a/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md b/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md new file mode 100644 index 00000000..18b124d5 --- /dev/null +++ b/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md @@ -0,0 +1,60 @@ +## Htmgo Format + +htmgo has a built-in formatter that can be used to format htmgo element blocks. + +It is available through the 'htmgo' cli tool that is installed with htmgo. + +**Note:** if you have previously installed htmgo, you will need to run `GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest` to update the cli tool. + +
+To use it, run the following command: + +```bash +// format all .go files in the current directory recursively +htmgo format . + +// format the file specified +htmgo format ./my-file.go +``` + +This will format all htmgo element blocks in your project. + +**Example:** + +```go +h.Div( + h.Class("flex gap-2"), h.Text("hello"), h.Text("world"), +) +``` + +**Output:** + +```go +h.Div( + h.Class("flex gap-2"), + h.Text("hello"), + h.Text("world"), +) +``` + +## Running htmgo format on save + +### Jetbrains IDE's + +1. Go to Settings -> Tools -> File Watchers -> + custom + +2. Set the following values: + +```yaml +Name: htmgo format +File Type: Go +Scope: Current File +Program: htmgo +Arguments: format $FilePath$ +Output paths to refresh: $FilePath$ +Working directory: $ProjectFileDir$ +``` + +3. Save the file watcher and ensure it is enabled + +4. Go to `Settings -> Tools -> Actions On Save` and ensure the `htmgo format` action is enabled diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 00945e5d..a43f70cb 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -47,6 +47,7 @@ func GoOutput(content string) *h.Element { h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), h.Text("Copy"), h.OnClick( + // language=JavaScript js.EvalJs(` if(!navigator.clipboard) { alert("Clipboard API not supported"); From e2939cd8ba8e199d5936cf4eb3ca0c8a078d5d8b Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 11:11:22 -0500 Subject: [PATCH 138/145] support non pointer types on formatter --- examples/chat/components/button.go | 26 +++++++++++--- examples/hackernews/pages/root.go | 7 ++-- examples/simple-auth/pages/root.go | 4 ++- examples/todo-list/pages/base/root.go | 4 ++- tools/html-to-htmgo/htmltogo/indent.go | 9 +++++ tools/html-to-htmgo/htmltogo/indent_test.go | 38 +++++++++++++++++++++ 6 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 tools/html-to-htmgo/htmltogo/indent_test.go diff --git a/examples/chat/components/button.go b/examples/chat/components/button.go index bc767c89..3f9c8c16 100644 --- a/examples/chat/components/button.go +++ b/examples/chat/components/button.go @@ -28,12 +28,28 @@ func Button(props ButtonProps) h.Ren { text := h.Text(props.Text) button := h.Button( - h.If(props.Id != "", h.Id(props.Id)), - h.If(props.Children != nil, h.Children(props.Children...)), + h.If( + props.Id != "", + h.Id(props.Id), + ), + h.If( + props.Children != nil, + h.Children(props.Children...), + ), h.Class("flex gap-1 items-center justify-center border p-4 rounded cursor-hover", props.Class), - h.If(props.Get != "", h.Get(props.Get)), - h.If(props.Target != "", h.HxTarget(props.Target)), - h.IfElse(props.Type != "", h.Type(props.Type), h.Type("button")), + h.If( + props.Get != "", + h.Get(props.Get), + ), + h.If( + props.Target != "", + h.HxTarget(props.Target), + ), + h.IfElse( + props.Type != "", + h.Type(props.Type), + h.Type("button"), + ), text, ) diff --git a/examples/hackernews/pages/root.go b/examples/hackernews/pages/root.go index 1df43ef5..3358b222 100644 --- a/examples/hackernews/pages/root.go +++ b/examples/hackernews/pages/root.go @@ -5,14 +5,17 @@ import ( ) func RootPage(children ...h.Ren) h.Ren { - banner := h.A(h.Class("bg-neutral-200 text-neutral-600 text-center p-2 flex items-center justify-center"), + banner := h.A( + h.Class("bg-neutral-200 text-neutral-600 text-center p-2 flex items-center justify-center"), h.Href("https://github.com/maddalax/htmgo"), h.Attribute("target", "_blank"), h.Text("Built with htmgo.dev"), ) return h.Html( - h.HxExtensions(h.BaseExtensions()), + h.HxExtensions( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), diff --git a/examples/simple-auth/pages/root.go b/examples/simple-auth/pages/root.go index bacdd614..510163e1 100644 --- a/examples/simple-auth/pages/root.go +++ b/examples/simple-auth/pages/root.go @@ -6,7 +6,9 @@ import ( func RootPage(children ...h.Ren) h.Ren { return h.Html( - h.HxExtensions(h.BaseExtensions()), + h.HxExtensions( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), diff --git a/examples/todo-list/pages/base/root.go b/examples/todo-list/pages/base/root.go index 7a9ca912..f612a62c 100644 --- a/examples/todo-list/pages/base/root.go +++ b/examples/todo-list/pages/base/root.go @@ -6,7 +6,9 @@ import ( func RootPage(children ...h.Ren) h.Ren { return h.Html( - h.HxExtension(h.BaseExtensions()), + h.HxExtension( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Meta("title", "htmgo todo mvc"), diff --git a/tools/html-to-htmgo/htmltogo/indent.go b/tools/html-to-htmgo/htmltogo/indent.go index 519fbe98..da7146ca 100644 --- a/tools/html-to-htmgo/htmltogo/indent.go +++ b/tools/html-to-htmgo/htmltogo/indent.go @@ -48,6 +48,15 @@ func Indent(input string) string { } } + // support non-pointer return types + if v, ok := returnType.(*ast.SelectorExpr); ok { + if x, ok := v.X.(*ast.Ident); ok { + name := x.Name + str := name + "." + v.Sel.Name + isHtmgoComponent = slices.Contains(htmgoComponentTypes, str) + } + } + if !isHtmgoComponent { continue } diff --git a/tools/html-to-htmgo/htmltogo/indent_test.go b/tools/html-to-htmgo/htmltogo/indent_test.go new file mode 100644 index 00000000..b29679fb --- /dev/null +++ b/tools/html-to-htmgo/htmltogo/indent_test.go @@ -0,0 +1,38 @@ +package htmltogo + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestIdentHRen(t *testing.T) { + input := ` + package main + import ( + "github.com/maddalax/htmgo/framework/h" + ) + func Button(props ButtonProps) h.Ren { + return h.Div( + h.Div(h.Div(),h.P(),h.P(), + ), + ) + } + ` + indented := Indent(input) + assert.Equal(t, `package main + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func Button(props ButtonProps) h.Ren { + return h.Div( + h.Div( + h.Div(), + h.P(), + h.P(), + ), + ) +} +`, indented) +} From 2953a487d2bcf462b12029c12cdc5f17f04814d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 16:12:08 +0000 Subject: [PATCH 139/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- tools/html-to-htmgo/go.mod | 7 +++++++ tools/html-to-htmgo/go.sum | 10 ++++++++++ 16 files changed, 41 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index d70f0c17..aa6bae91 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index bf8a7b89..0b6125c8 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index d1c2ce0d..8e9c8747 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 9bf1b0fc..b26b318e 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 433e75f2..e6d5e2f5 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 41639c16..601ae49a 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index dad36aea..82b035c4 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 660baad0..4a03512c 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 483f1253..0da1d4f2 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 9bf1b0fc..b26b318e 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 5407f278..95c84c93 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 9470743d..397e6c23 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 h1:VDaKRsl3yIs957Romc2+EMLQyGiWjAUy9PA3k+NyLg4= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e h1:xKylmFT6lU58+RLE9NlCfINxXinI/Z85XHIV3gWufHo= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index f1af4353..6146d985 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 9bf1b0fc..b26b318e 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/tools/html-to-htmgo/go.mod b/tools/html-to-htmgo/go.mod index e12e7592..e60bec42 100644 --- a/tools/html-to-htmgo/go.mod +++ b/tools/html-to-htmgo/go.mod @@ -3,7 +3,14 @@ module github.com/maddalax/htmgo/tools/html-to-htmgo go 1.23.0 require ( + github.com/stretchr/testify v1.9.0 golang.org/x/net v0.30.0 golang.org/x/text v0.19.0 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d ) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/tools/html-to-htmgo/go.sum b/tools/html-to-htmgo/go.sum index 2d1e0d69..ef925bc2 100644 --- a/tools/html-to-htmgo/go.sum +++ b/tools/html-to-htmgo/go.sum @@ -1,6 +1,16 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 97ad3cbee2b3a23c0a9210d1175a33aa509a0166 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 11:30:50 -0500 Subject: [PATCH 140/145] add top banner --- htmgo-site/partials/navbar.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 75c6b481..9cc7db01 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -78,7 +78,15 @@ func Star(ctx *h.RequestContext) *h.Element { } func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { - + banner := h.If( + true, + h.A( + h.Class("bg-blue-200 text-slate-700 text-center p-2 flex items-center justify-center"), + h.Href("https://github.com/maddalax/htmgo/releases/tag/framework%2Fv1.0.1"), + h.Attribute("target", "_blank"), + h.Text("htmgo v1.0.1 is released and it includes a new automatic formatter, view release notes"), + ), + ) desktopNav := h.Nav( h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3 max-h-[100vh - 9rem] overflow-y-auto"), h.Div( @@ -116,6 +124,7 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { return h.Div( h.Id("navbar"), + banner, MobileNav(ctx, props.Expanded), desktopNav, ) From 5a69d9ba20b616ddb1e5ece737094492fe3c7d71 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 12:39:22 -0500 Subject: [PATCH 141/145] cleanup the intro example --- .../md/docs/1_quick-start/1_introduction.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/htmgo-site/md/docs/1_quick-start/1_introduction.md b/htmgo-site/md/docs/1_quick-start/1_introduction.md index 992cdd97..9300d43b 100644 --- a/htmgo-site/md/docs/1_quick-start/1_introduction.md +++ b/htmgo-site/md/docs/1_quick-start/1_introduction.md @@ -5,26 +5,22 @@ We give you the utilities to build html using pure go code in a reusable way (go ```go func DocsPage(ctx *h.RequestContext) *h.Page { - assets := ctx.Get("embeddedMarkdown").(fs.FS) - pages := dirwalk.WalkPages("md/docs", assets) - - return h.NewPage(base.RootPage( + pages := dirwalk.WalkPages("md/docs") + return h.NewPage( h.Div( - h.Class("flex flex-col md:flex-row gap-4 justify-center mb-12"), - partials.DocSidebar(pages), + h.Class("flex flex-col md:flex-row gap-4"), + DocSidebar(pages), h.Div( h.Class("flex flex-col justify-center items-center mt-6"), h.List(pages, func(page *dirwalk.Page, index int) *h.Element { return h.Div( - h.Class("border-b border-b-slate-300 w-full pb-8 mb-8"), - MarkdownContent(ctx, - page.FilePath, - partials.CreateAnchor(page.Parts)), + h.Class("border-b border-b-slate-300"), + MarkdownContent(ctx, page), ) }), ), ), - )) + ) } ``` From df3edccd7fb09283665a42f40ce08b88f0c5ebf5 Mon Sep 17 00:00:00 2001 From: Mohammad javad <41829984+himynamej@users.noreply.github.com> Date: Fri, 25 Oct 2024 13:41:32 -0400 Subject: [PATCH 142/145] fix:parser_test remove impossible condition (#44) --- .../internal/adapters/services/parser/parser_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go b/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go index 5d2de8df..25541727 100644 --- a/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go +++ b/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go @@ -22,7 +22,7 @@ func FuzzFromBytes(f *testing.F) { if err != nil { return } - if err != nil && !isExpectedError(err) { + if !isExpectedError(err) { t.Errorf("Unexpected error: %v", err) } }) From abad4b4eb7a59b594986b2800e1a52b8d5085c2d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 17:42:22 +0000 Subject: [PATCH 143/145] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index aa6bae91..10cece91 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 0b6125c8..e84281e1 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 8e9c8747..741c20eb 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index b26b318e..f050d04d 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index e6d5e2f5..d41f1b91 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 601ae49a..98141722 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 82b035c4..9d1467ea 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 4a03512c..6ebdaf95 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 0da1d4f2..8c49a12f 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index b26b318e..f050d04d 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 95c84c93..5083b4ad 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 397e6c23..76197bb3 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e h1:xKylmFT6lU58+RLE9NlCfINxXinI/Z85XHIV3gWufHo= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0 h1:U57+3oRD+uGrc9Aapi/Ol1ZzRuCY2s0diK0pxWtIZeU= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 6146d985..437362f7 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index b26b318e..f050d04d 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From e3edd49800036d882ae8d18d832276b3d6acce52 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 13:33:55 -0500 Subject: [PATCH 144/145] add logo --- htmgo-site/partials/navbar.go | 41 ++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 9cc7db01..9c7daa76 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -34,6 +34,31 @@ var CachedStar = h.CachedT(time.Minute*15, func(t *h.RequestContext) *h.Element return Star(t) }) +func Logo() *h.Element { + return h.Svg( + h.Attribute("viewBox", "0 0 370 80.8775381264543"), + h.Class("h-full w-full"), + h.Tag( + "G", + h.Attribute("transform", "matrix(1.276616840702525,0,0,1.276616840702525,-4.447757222875277,-26.431067200135733)"), + h.Attribute("fill", "#111111"), + h.Path( + h.Attribute("xmlns", "http://www.w3.org/2000/svg"), + h.Attribute("fill", "#111111"), + h.Attribute("d", "M48.34863,25.46777c-0.23438,0.48438-0.47461,0.99414-0.72461,1.55859 c-3.42871,7.72266-11.42285,25.09375-13.74707,30.13672c-1.5293-1.76367-3.08398-3.55469-4.55859-5.24609L48.34863,25.46777z M5.83398,68.5127l10.04492-21.2168c0.31445-0.83008,1.5293-3.20117,2.93848-3.20117c0.02832,0,0.05957,0.01172,0.08887,0.01367 c-0.67969,0.76563-1.42188,2.04102-2.00195,4.17578c-1.03125,3.79492-4.48535,16.94922-5.34473,20.22852H5.83398z M13.62695,68.5127 c1.03516-3.94531,4.22461-16.08984,5.20703-19.70313c0.63086-2.32227,1.39551-3.26367,1.83691-3.63477 c0.00684,0.00781,0.01367,0.01172,0.02051,0.01953C23.94629,48.68066,36.72852,63.5127,41.0293,68.5127H13.62695z M43.66699,68.5127 c-1.00293-1.16602-4.45117-5.17773-8.35352-9.68945c1.65039-3.58008,10.4834-22.75195,14.13867-30.98633 c2.32031-5.22852,3.6582-6.17773,4.04297-6.34961c0.82715,0.41797,1.73926,1.29102,2.66992,2.61719 c3.94141,5.61719,23.45703,37.07422,28.00098,44.4082H43.66699z"), + ), + ), + h.Tag( + "G", + h.Attribute("transform", "matrix(4.097970099125154,0,0,4.097970099125154,114.03704346489575,-20.491491909735604)"), + h.Attribute("fill", "#111111"), + h.Path( + h.Attribute("d", "M7.5293 9.766 c2.2461 0 3.5938 1.25 3.5938 3.7598 l0 6.4746 l-2.8223 0 l0 -6.0156 c0 -1.4746 -0.82031 -1.9629 -1.8262 -1.9629 c-1.0449 0 -2.1875 0.51758 -2.207 2.4414 l0 5.5371 l-2.8125 0 l0 -15 l2.8125 0 l0 6.1621 c0.71289 -0.86914 1.8359 -1.3965 3.2617 -1.3965 z M17.568346875 20 c-1.9531 0 -3.0664 -1.1328 -3.0664 -3.1348 l0 -4.7461 l-1.9727 0 l0 -2.1582 l0.63477 0 c1.0645 0 1.6504 -0.41016 1.6504 -1.9141 l0 -1.3281 l2.5391 0 l0 3.2422 l2.0703 0 l0 2.1582 l-2.0703 0 l0 4.4434 c0 0.89844 0.43945 1.2988 1.1621 1.2988 l0.9082 0 l0 2.1387 l-1.8555 0 z M33.496484375 9.766 c2.1484 0 3.5352 1.0938 3.5352 3.1543 l0 7.0801 l-2.8125 0 l0 -6.2793 c0 -1.1816 -0.74219 -1.6992 -1.582 -1.6992 c-1.0059 0 -1.8945 0.57617 -1.8945 2.3145 l0 5.6641 l-2.8418 0 l0 -6.25 c0 -1.2012 -0.72266 -1.7285 -1.6113 -1.7285 c-0.97656 0 -1.8848 0.57617 -1.8848 2.4609 l0 5.5176 l-2.8027 0 l0 -10.039 l2.8027 0 l0 1.1816 c0.66406 -0.88867 1.6797 -1.377 2.9102 -1.377 c1.4551 0 2.5488 0.52734 3.0762 1.5039 c0.70313 -1.0059 1.7773 -1.5039 3.1055 -1.5039 z M46.679646875 9.961 l2.6758 0 l0 9.2871 c0 3.9063 -2.1191 5.4883 -5.3223 5.4883 c-2.8809 0 -4.4434 -1.2109 -5.1758 -3.1152 l2.334 -0.99609 c0.56641 1.2988 1.3867 1.9238 2.7344 1.9238 c1.7773 0 2.6074 -1.1133 2.6074 -3.0957 l0 -1.1719 c-0.58594 0.80078 -1.7383 1.3672 -3.0469 1.3672 c-2.4902 0 -4.5801 -1.9629 -4.5801 -4.9609 c0 -3.0078 2.0996 -4.9219 4.5996 -4.9219 c1.4063 0 2.5586 0.625 3.1055 1.5234 z M44.208946875 17.373 c1.4648 0 2.5977 -1.1914 2.5977 -2.6855 c0 -1.5039 -1.1133 -2.6953 -2.5977 -2.6953 c-1.4746 0 -2.5879 1.1426 -2.5879 2.6953 c0 1.5332 1.1328 2.6855 2.5879 2.6855 z M56.9531125 20.19531 c-3.1934 0 -5.498 -1.9434 -5.498 -5.2246 c0 -3.2617 2.2852 -5.2051 5.498 -5.2051 c3.2324 0 5.5078 1.9434 5.5078 5.2051 c0 3.2813 -2.2852 5.2246 -5.5078 5.2246 z M56.9238125 17.959 c1.6309 0 2.7441 -1.1914 2.7441 -2.9883 s-1.1133 -2.9883 -2.7441 -2.9883 c-1.5723 0 -2.6758 1.1914 -2.6758 2.9883 s1.1035 2.9883 2.6758 2.9883 z"), + ), + ), + ) +} + func Star(ctx *h.RequestContext) *h.Element { type Repo struct { @@ -93,13 +118,10 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { h.Class("max-w-[95%] md:max-w-3xl px-4 mx-auto"), h.Div( h.Class("flex justify-between items-center"), - h.Div( - h.Class("flex items-center"), - h.A( - h.Class("text-2xl"), - h.Href("/"), - h.Text("htmgo"), - ), + h.A( + h.Href("/"), + h.Class("mt-1 max-w-[125px]"), + Logo(), ), h.Div( h.Id("search-container"), @@ -141,10 +163,9 @@ func MobileNav(ctx *h.RequestContext, expanded bool) *h.Element { h.Div( h.Class("flex items-center"), h.A( - h.Boost(), - h.Class("text-2xl"), h.Href("/"), - h.Text("htmgo"), + h.Class("mt-1 max-w-[125px]"), + Logo(), ), ), h.Div( From 4398eb1fdbd91e1049700431671436f155b5bcab Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 14:11:48 -0500 Subject: [PATCH 145/145] style fixes --- htmgo-site/internal/markdown/render.go | 8 ++++++++ htmgo-site/pages/base/root.go | 2 +- htmgo-site/pages/docs.go | 6 +++--- htmgo-site/pages/markdown.go | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/htmgo-site/internal/markdown/render.go b/htmgo-site/internal/markdown/render.go index 8677ac91..0c8f2163 100644 --- a/htmgo-site/internal/markdown/render.go +++ b/htmgo-site/internal/markdown/render.go @@ -2,6 +2,8 @@ package markdown import ( "bytes" + "github.com/alecthomas/chroma/v2" + chromahtml "github.com/alecthomas/chroma/v2/formatters/html" "github.com/yuin/goldmark" highlighting "github.com/yuin/goldmark-highlighting/v2" "github.com/yuin/goldmark/extension" @@ -52,6 +54,12 @@ func RenderMarkdown(reader io.Reader) bytes.Buffer { ), goldmark.WithExtensions( highlighting.NewHighlighting( + highlighting.WithFormatOptions( + chromahtml.WithLineNumbers(true), + chromahtml.WithCustomCSS(map[chroma.TokenType]string{ + chroma.PreWrapper: "padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important;", + }), + ), highlighting.WithStyle("github"), ), ), diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 0fd37e46..54d7a3cf 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -38,7 +38,7 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { `), ), h.Body( - h.Class("bg-stone-50 h-screen"), + h.Class("bg-white h-screen"), h.Fragment(children...), h.Script("https://cdn.jsdelivr.net/npm/@docsearch/js@3"), h.UnsafeRawScript(` diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index c8a35721..c08fa780 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -31,11 +31,11 @@ func DocsPage(ctx *h.RequestContext) *h.Page { h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto"), partials.DocSidebar(pages), ), - h.Class("overflow-y-auto justify-center md:mx-auto overflow-x-hidden pb-6"), + h.Class("overflow-y-auto justify-center overflow-x-hidden pb-6 items-center w-full"), h.Div( - h.Class("flex flex-col"), + h.Class("flex flex-col mx-auto"), h.Div( - h.Class("flex flex-col justify-center items-center md:mt-6 "), + h.Class("flex flex-col justify-center items-center md:mt-6 mx-auto"), h.List(pages, func(page *dirwalk.Page, index int) *h.Element { anchor := partials.CreateAnchor(page.Parts) return h.Div( diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index eff2c6af..8f2fcbb7 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -25,7 +25,7 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { h.Id(id), ), h.Div( - h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-3xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), + h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), ), )