PreMiD / Extension

🧩 Source code of the official PreMiD extension.
https://premid.app/
Mozilla Public License 2.0
77 stars 29 forks source link

[console logs] uBlock Origin kills Presence #80

Closed gkp1 closed 2 years ago

gkp1 commented 3 years ago

(sry for text wall, I'm trying to provide a little more details to clarify more)

Everything is default configs, both chrome (recently installed) and premid. My pc is Win7 64bits 12GB RAM

I had to turn uBlock Origin off for premid to start working, and now the presence works and is active most of the time but randomly the presence disappears from my discord profile. It seems it happens on song switches but also randomly throughout songs.

I'm not entirely sure if it's uBlock, but pretty sure. My other extensions are Dark reader (not activated), Text to Speech and enhancer for youtube (not active on ytmusic).

I'm providing chrome console log, I saved it just as the error happened so if anything shows it should be at the end of the log.

I could provide ublock's log if it helps, I just wait for the error to happen then stop it.

I'm sending it because I don't know what error to search or what uBlock might be blocking that is breaking the presence.

So any help or info is greatly appreciated. I tried discord support ticket but they didn't know what to look for either, not their fault though, this is pretty obscure.

Thanks for the great app guys. My discord is 7777#6250

music.youtube.com-1606862539113.log

JustArion commented 3 years ago

Can Confirm ^ I use uBlock Origin, Dark Reader and Enhancer, Disabling the extension itself via Extensions does not resolve the issue.

Additional Trace:

{
   "applications": {
      "gecko": {
         "id": "support@premid.app",
         "strict_min_version": "53.0",
         "update_url": "https://api.premid.app/firefox/updates"
      }
   },
   "background": {
      "scripts": [ "js/vendor.js", "js/background.js" ]
   },
   "browser_action": {
      "default_popup": "html/popup/index.html"
   },
   "content_scripts": [ {
      "js": [ "js/vendor.js", "js/contentScript.js", "js/devHelper.js" ],
      "matches": [ "\u003Call_urls>" ],
      "run_at": "document_start"
   }, {
      "js": [ "js/presenceManager.js" ],
      "matches": [ "*://*.premid.app/*" ],
      "run_at": "document_start"
   }, {
      "all_frames": true,
      "js": [ "js/iFrameHandler.js", "js/lib/aes.min.js", "js/devHelper.js" ],
      "matches": [ "\u003Call_urls>" ],
      "run_at": "document_start"
   } ],
   "content_security_policy": "script-src 'self' 'unsafe-eval' https://kit.fontawesome.com/; object-src 'self'",
   "default_locale": "en",
   "description": "__MSG_description__",
   "icons": {
      "128": "assets/images/icon_128x128.png",
      "16": "assets/images/icon_16x16.png",
      "48": "assets/images/icon_48x48.png"
   },
   "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3U3U7VGk+xJOJx4GL2CKJ1mSoozkhmgXv0LHLn5Wp7iTBQYhkkaNXZdryaVT08zKu2Koxj+eOsPAYyamlvmv0doPdpUfK9cN9cUu6ySgV9mR3yd3SIQ+41ECuX+31Owp7ShdUzBa6Mjqu1DJLqfJav2R6Df8FAfmuCviuBVDea/sAWGtc9hwsyDRdqG4C6PE4sVkyJbc3thz3Xoepc5zdaOmIOuzZHpIAWk0lceeec30cBVlIq+F6NAh5nanHIATOo+5rZO6yGi8eBV5HRjSQF0ajOHSz07na9jDf6rYJKQXbrhTiwBUKWKx5aAsvI4ltb4VvJlhiE2KABlgblKOOwIDAQAB",
   "manifest_version": 2,
   "name": "PreMiD",
   "permissions": [ "tabs", "\u003Call_urls>", "storage" ],
   "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx",
   "version": "2.2.3",
   "version_name": "2.2.3",
   "web_accessible_resources": [ "js/devHelper.js" ]
}
var pmd;pmd=(()=>{var e={9729:(e,t,a)=>{"use strict";a.r(t);var n=a(9387),s=a(7710),r=a(7899);async function i(){let e=(await(0,s.c)("local","defaultAdded")).defaultAdded;if(e)return;const t=["YouTube","YouTube Music","Netflix","Twitch","SoundCloud"];await(0,r.addPresence)(t),e=!0;let a=(await(0,s.c)("local","presences")).presences.map((e=>e.metadata.service));for(const n of t)if(!a.includes(n)){e=!1;break}(0,s.p)("local",{defaultAdded:e})}var o=a(3216),c=a(3250);function d(){return-1!==navigator.userAgent.indexOf("Safari")&&-1===navigator.userAgent.indexOf("Chrome")}async function l(e){const t=await new Promise((t=>{chrome.tabs.executeScript(e,{code:"try{PreMiD_Presence}catch(_){false}"},t)}));return!!t&&t[0]}var m=a(5069);async function u(e){if(e){const e=await(0,c.Z)("\n\t\tquery {\n\t\t\tversions {\n\t\t\t\tsafari {\n\t\t\t\t\tversion\n\t\t\t\t\turgent\n\t\t\t\t}\n\t\t\t}\n\t\t}");if((0,m.Z)(e.data),e.data.versions.safari.version===chrome.runtime.getManifest().version_name)return chrome.browserAction.setBadgeText({text:""}),{latestVersion:!0,urgentUpdate:!1};{const t=e.data.versions.safari.urgent;return chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#ff5050"}),{latestVersion:!1,urgentUpdate:t}}}return{latestVersion:!0,urgentUpdate:!1}}async function p(e,t){return!((await u(d())).urgentUpdate&&!(await u(d())).latestVersion)&&!await l(e)&&new Promise((async a=>{const n=(await(0,s.c)("local","identifier")).identifier;let r="";t.metadata.readLogs&&(r='\n\t\t\t\tconst PreMiD_consoleLogger = document.createElement("script");\n\t\t\t\tPreMiD_consoleLogger.type = "text/javascript";\n\t\t\t\tPreMiD_consoleLogger.id = "PreMiD_consoleLogger";\n\t\t\t\tPreMiD_consoleLogger.innerText = `\n\t\t\t\tconsole.stdlog = console.log.bind(console);\n\t\t\t\tconsole.logs = [];\n\t\t\t\tconsole.log = function() {\n\t\t\t\t\tlet inc = Array.from(arguments);\n\t\t\t\t\tinc.forEach(arg => {\n\t\t\t\t\t\tconsole.logs.push(arg);\n\t\t\t\t\t});\n\t\t\t\t\twhile (console.logs.length > 100) {\n\t\t\t\t\t\tconsole.logs.shift();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.stdlog.apply(console, arguments);\n\t\t\t\t};\n\t\t\t\t`;\n\t\t\t\tdocument.head.appendChild(PreMiD_consoleLogger);\n\t\t\t\t'.replace(/(\r\n)|\n/g,"")),chrome.tabs.executeScript(e,{code:`let PreMiD_Presence=true;let PreMiD_Identifier="${n}";let PMD_Info={tabId:${e}};let PreMiD_Metadata=${JSON.stringify(t.metadata)};`+t.presence+r,runAt:"document_start"},a),(0,o.Vp)("injectPresence.ts","Injected "+t.metadata.service),t.metadata.readLogs&&(0,o.Vp)("injectPresence.ts","Reading logs")}))}let g,f=null,h=null;async function v(e){let t=await new Promise((e=>chrome.windows.getLastFocused(e))),a=(await new Promise((e=>chrome.tabs.query({active:!0,windowId:t.id},(t=>e(t))))))[0],n=(await(0,s.c)("local","presences")).presences;if(!a?.url||a.url.startsWith("chrome")||a.url.startsWith("edge"))return;let r=await new Promise((e=>chrome.tabs.executeScript(a.id,{code:"try{document.querySelector('meta[name=\"PreMiD_Presence\"]').content}catch(e){false}"},(t=>{e(t?t[0]:void 0)}))));if(n=n.filter((e=>{if(e.metaTag&&e.metadata.service===r)return!1;let t=null;return!!e.enabled&&(void 0!==e.metadata.regExp?(t=a.url.match(new RegExp("^(https?:|file:[/]?)[/]{2}"+e.metadata.regExp)),null!==t&&t.length>0):(t=Array.isArray(e.metadata.url)?e.metadata.url.filter((e=>new URL(a.url).hostname===e)).length>0:new URL(a.url).hostname===e.metadata.url,t))})),0===n.length&&r){const e=(await(0,c.L)(r)).data.metadata,t={metadata:e,presence:null,enabled:!0,metaTag:!0,hidden:!1},a=(await(0,c.Z)(`\n\t\t\tquery {\n\t\t\t\tpresences(service: "${r}") {\n\t\t\t\t\tpresenceJs\n\t\t\t\t\t${e.iframe?"iframeJs":""}\n\t\t\t\t}\n\t\t\t}\n\t\t`)).data.presences[0];t.presence=a.presenceJs,e.iframe&&(t.iframe=a.iframeJs),n=[t],chrome.storage.local.get("presences",(e=>{const a=e.presences.findIndex((e=>e.metadata.service===t.metadata.service&&e.metaTag===t.metaTag));if(a>-1){const n=e.presences[a].enabled,s=t;s.enabled=n,s.hidden=!1,e.presences[a]=s}else e.presences.push(t);chrome.storage.local.set(e)}))}if(n.length>0){const t=await l(a.id);f?g||f===a.id?f===a.id&&!t&&e&&e.status&&"complete"===e.status&&(null!==h&&h.metadata.service!==n[0].metadata.service&&j(),await p(f,n[0]),chrome.tabs.sendMessage(f,{tabPriority:!0}),h=n[0],w()):g=window.setTimeout((async()=>{j(),chrome.tabs.sendMessage(f,{tabPriority:!1}),f=a.id,t||await p(f,n[0]),h=n[0],chrome.tabs.sendMessage(f,{tabPriority:!0}),w(),g=null}),5e3):(h=n[0],f=a.id,t||await p(f,n[0]),chrome.tabs.sendMessage(f,{tabPriority:!0}),w())}else f===a.id&&(h=null,j(!0)),clearTimeout(g),g=null}function w(){chrome.storage.local.get("presences",(({presences:e})=>{const t=e.findIndex((e=>e.metaTag&&e.hidden&&e.metadata.service===h.metadata.service)),a=e.findIndex((e=>e.metaTag&&!e.hidden&&e.metadata.service!==h.metadata.service));t>-1&&(e[t].hidden=!1),a>-1&&(e[a].hidden=!0),chrome.storage.local.set({presences:e})}))}function y(){chrome.storage.local.get("presences",(({presences:e})=>{const t=e.findIndex((e=>e.metaTag&&!e.hidden));t>-1&&(e[t].hidden=!0),chrome.storage.local.set({presences:e})}))}var b=a(6809);function P(e){let t,a={};for(t in e)a[t]=e[t];return a}async function x(e,t){if(["ALPHA","BETA"].includes(n.t0)){const{authorizedBetaAlpha:e}=await(0,s.c)("local","authorizedBetaAlpha");if(!e)return}if((await u(d())).urgentUpdate&&!(await u(d())).latestVersion)return!1;if(t||(t=(await(0,s.c)("sync","settings")).settings),null==e||!t.enabled.value)return;const a=P(e);a.trayTitle&&t.titleMenubar.value&&a.trayTitle.trim()?a.trayTitle=a.trayTitle.trim():a.trayTitle="",t.mediaKeys.value||(a.mediaKeys=!1),a.presenceData.details&&(a.presenceData.details.length<3?a.presenceData.details="   "+a.presenceData.details:a.presenceData.details=a.presenceData.details.slice(0,128).trim()),a.presenceData.state&&(a.presenceData.state.length<3?a.presenceData.state="   "+a.presenceData.state:a.presenceData.state=a.presenceData.state.slice(0,128).trim()),T.connected&&T.emit("setActivity",a),(0,o.um)("setActivity.ts","setActivity")}var L=a(3765);let M=null,A=null;chrome.runtime.onConnect.addListener((function(e){!function(e){if("tabs"===e.name){const t=()=>{e.postMessage({connected:T.connected})};t(),T.on("connect",t),T.on("disconnect",t),e.onDisconnect.addListener((()=>{T.removeListener("connect",t),T.removeListener("disconnect",t)}))}}(e),function(e){if("popup"===e.name){const t=async()=>{e.postMessage({connected:T.connected,appVersionSupported:E(),latestExtensionVersion:await u(d())})};t(),T.on("connect",t),T.on("disconnect",t),e.onDisconnect.addListener((()=>{T.removeListener("connect",t),T.removeListener("disconnect",t)})),e.onMessage.addListener((async e=>{"loadLocalPresence"===e.action&&T.connected?T.emit("selectLocalPresence"):"popupOpened"===e.action&&await(0,L.XP)()}))}}(e),async function(e){"contentScript"===e.name&&e.onMessage.addListener((async e=>{if(void 0===e.presence||void 0===e.presence.presenceData)return;const t=await new Promise((e=>chrome.runtime.getPlatformInfo((t=>e({os:t.os,arch:t.arch}))))),a=String.fromCodePoint(128039);var n;if(void 0!==e.presence.presenceData.largeImageKey&&(e.presence.presenceData.largeImageText=`PreMiD ${"linux"===t.os||"cros"===t.os?a:""} v${n=k,Array.from(String(n)).reverse().map(((e,t)=>t%1==0&&t>0?e+".":e)).reverse().join("")} ${String.fromCharCode(8226)} Ext v${chrome.runtime.getManifest().version_name}`),null==M)return M=P(e.presence.presenceData),A=e.presence,void x(e.presence);const s=P(M);delete s.startTimestamp,delete s.endTimestamp;const r=P(e.presence.presenceData);delete r.startTimestamp,delete r.endTimestamp,(!function(e,t){const a=Object.getOwnPropertyNames(e),n=Object.getOwnPropertyNames(t);if(a.length!=n.length)return!1;for(let n=0;n<a.length;n++){const s=a[n];if(e[s]!==t[s])return!1}return!0}(s,r)||M.endTimestamp+1!==e.presence.presenceData.endTimestamp&&M.endTimestamp-1!==e.presence.presenceData.endTimestamp&&M.endTimestamp!==e.presence.presenceData.endTimestamp)&&(A=e.presence,x(e.presence)),(void 0!==M.startTimestamp&&void 0===e.presence.presenceData.startTimestamp||void 0===M.startTimestamp&&void 0!==e.presence.presenceData.startTimestamp||void 0!==M.endTimestamp&&void 0===e.presence.presenceData.endTimestamp||void 0===M.endTimestamp&&void 0!==e.presence.presenceData.endTimestamp)&&(A=e.presence,x(e.presence)),M=P(e.presence.presenceData)}))}(e),function(e){"app.ts"===e.name&&e.onMessage.addListener((async t=>{if("reinit"===t.action){await(0,s.p)("local",{defaultAdded:!1});let t=!1;if(navigator.onLine)try{await B(),t=!0}catch(e){}e.postMessage({action:"reinit",success:t})}}))}(e)}));let D=[];const T=b.connect("http://localhost:3020",{autoConnect:!1}),_=()=>T.open();let k=0,S=null;function E(){return k>=n.tn||0===k?(chrome.browserAction.setBadgeText({text:""}),!0):(chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#ff5050"}),!1)}function j(e=!1){(0,o.um)("clearActivity.ts","Clear Activity | "+e),e&&(chrome.tabs.sendMessage(f,{tabPriority:!1}),f=null),T.connected&&T.emit("clearActivity")}T.on("connect",(async()=>{chrome.browserAction.setBadgeText({text:""}),T.emit("getVersion"),S=window.setTimeout((()=>{k=-1,(0,o.vU)("socketManager.ts","Unsupported app version")}),5e3);let e=(await(0,s.c)("sync","settings")).settings;e=Object.assign({},...Object.keys(e).map((t=>({[t]:e[t].value})))),T.emit("settingUpdate",e)})),T.on("receiveVersion",(e=>{clearTimeout(S),k=e,E()?((0,o.um)("socketManager.ts","Supported app version"),A&&x(A),(0,o.Vp)("socketManager.ts","Connected to application"),chrome.runtime.sendMessage({socket:T.connected}),null!==f&&chrome.tabs.sendMessage(f,{tabPriority:!0})):(0,o.vU)("socketManager.ts","Unsupported app version")})),T.on("disconnect",(()=>{chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#e1e100"}),(0,o.vU)("socketManager.ts","Disconnected from application"),chrome.runtime.sendMessage({socket:T.connected}),chrome.storage.local.get("presences",(({presences:e})=>{e=e.filter((e=>!e.tmp)),chrome.storage.local.set({presences:e})})),null!==f&&chrome.tabs.sendMessage(f,{tabPriority:!1})})),T.on("localPresence",(async function(e){D=[],(0,o.um)("presenceDevManager.ts","Local Presence update");let t=(e=e.files).find((e=>"metadata.json"===e.file.toLowerCase())),a=e.find((e=>"presence.js"===e.file.toLowerCase())),n=e.find((e=>"iframe.js"===e.file.toLowerCase()));t?(t=t.contents,void 0!==t.iframe&&t.iframe&&!n&&D.push("No iframe.js found."),void 0===t.service&&D.push("property service not defined."),"object"!=typeof t.author?D.push("property author not defined."):(void 0===t.author.name&&D.push("property author.name not defined."),void 0===t.author.id&&D.push("property author.id not defined.")),"object"!=typeof t.description?D.push("property description not defined."):void 0===t.description.en&&D.push("property description.en not defined."),void 0===t.url&&D.push("property url not defined.")):D.push("No metadata.json found."),a||D.push("No presence.js found."),D.map((e=>(0,o.vU)("presenceDevManager.ts",e,!0)));let i=(await(0,s.c)("local","presences")).presences;i=i.filter((e=>!e.tmp));const c=i.find((e=>e.metadata.service===t.service));c&&(c.enabled=!1);const d={enabled:!0,metadata:t,presence:a?.contents,tmp:!0};void 0!==t?.iframe&&t?.iframe&&(d.iframe=n.contents),d.metadata.settings&&(chrome.storage.local.set({["pSettings_"+d.metadata.service]:d.metadata.settings}),(0,r.initPresenceLanguages)(d)),i.push(d),chrome.storage.local.set({presences:i});for(let e=0;e<i.length;e++)if(i[e].tmp){const t=i[e];chrome.tabs.query({windowType:"normal"},(e=>{for(let a=0;a<e.length;a++){let n=new URL(e[a].url);("string"==typeof t.metadata.url&&t.metadata.url===n.hostname||t.metadata.url instanceof Array&&t.metadata.url.includes(n.hostname)||t.metadata.regExp&&new RegExp(t.metadata.regExp).test(n.href))&&chrome.tabs.reload(e[a].id,{bypassCache:!0},(()=>{console.info(`Presence ${t.metadata.service} updated, tab reloaded!`)}))}}))}})),T.on("discordUser",(async e=>{if(!e)return;const{premium_type:t,...a}=e;chrome.storage.local.set({discordUser:a})}));var U=a(9669),I=a.n(U);let $=null;async function C(){(await(0,s.c)("local","presences")).presences||await new Promise((e=>chrome.storage.local.set({presences:[]},e))),$=(await(0,s.c)("sync","settings")).settings,void 0===$&&($={}),F("enabled","popup.setting.enabled",0),F("autoLaunch","popup.setting.autoLaunch",1),F("mediaKeys","popup.setting.mediaControl",2),F("titleMenubar","popup.setting.titleMenubar",3),await new Promise((e=>chrome.storage.sync.set({settings:$},e))),(0,o.um)("initSettings.ts","Initialized settings")}function F(e,t,a,n=!0,s=!0){void 0===$[e]&&function(e,t,a,n,s){$[e]||($[e]={string:t,value:n,position:a},s&&($[e].show=s))}(e,t,a,n,s)}async function B(){await async function(){console.log(`%cPreMiD\n%c${String.fromCharCode(169)} 2018-${(new Date).getFullYear()} Timeraa\n\n%cVersion: %c${chrome.runtime.getManifest().version_name}\n%cRelease type: %c${n.t0}\n%cReq App build: %c${n.tn}\n%cScience Id: %c${(await(0,s.c)("local","identifier")).identifier}`,"font-family:sans-serif;font-size:2.5rem;font-weight:bold;color: #596cae","font-size:1rem;font-weight:bold;color:rgb(70,200,70);","font-size:1rem;","font-size:1rem;color:#99AAB5;","font-size:1rem;","font-size:1rem;color:#99AAB5;","font-size:1rem;","font-size:1rem;color:#99AAB5;","font-size:1rem;","font-size:1rem;color:#99AAB5;")}(),["ALPHA","BETA"].includes(n.t0)&&await async function(){const{authorizedBetaAlpha:e}=await(0,s.c)("local","authorizedBetaAlpha");if(!e){let e="https://cpoegcmgabanfledhkjdicdclgpmghog.chromiumapp.org";"undefined"!=typeof browser&&(e=await browser.identity.getRedirectURL());const t=await new Promise((t=>chrome.identity.launchWebAuthFlow({url:"https://discordapp.com/api/oauth2/authorize?response_type=token&client_id=503557087041683458&scope=identify&redirect_uri="+e,interactive:!0},(async e=>{if(!e||!e.match(/(&access_token=[\d\w]+)/g))return chrome.runtime.lastError,void t();const a=e.match(/(&access_token=[\d\w]+)/g)[0].replace("&access_token=",""),s=(await I()("https://discordapp.com/api/users/@me",{headers:{Authorization:"Bearer "+a}})).data,r=(await(0,c.Z)(`\n\t\t\t\t\t\tquery {\n\t\t\t\t\t\t\talphaBetaAccess(userId: "${s.id}") {\n\t\t\t\t\t\t\t\tbetaAccess\n\t\t\t\t\t\t\t\talphaAccess\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t`)).data.alphaBetaAccess[0];let i;switch(n.t0){case"BETA":i=r.betaAccess;break;case"ALPHA":i=r.alphaAccess}t(i)}))));chrome.storage.local.set({authorizedBetaAlpha:t})}}(),chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#e1e100"}),await Promise.all([C(),i(),(0,r.updatePresences)(),(0,L.IG)(chrome.i18n.getUILanguage()),(0,r.presenceScience)()]),setInterval((function(){(0,r.presenceScience)()}),18e5),_()}chrome.storage.onChanged.addListener((e=>{if(e.settings){const t=Object.assign({},...Object.keys(e.settings.newValue).map((t=>({[t]:e.settings.newValue[t].value}))));t.enabled?x(A,e.settings.newValue):null!==f&&j(!0),T.connected&&T.emit("settingUpdate",t),(0,o.um)("initSettings.ts","Settings update")}if(e.presences&&e.presences.newValue!==e.presences.oldValue){const t=e.presences.oldValue;e.presences.newValue.filter((e=>t.find((t=>t.metadata.service===e.metadata.service&&(t.metadata.version!==e.metadata.version||t.tmp))))).forEach((e=>{const t=e.metadata.settings;chrome.storage.local.get("pSettings_"+e.metadata.service,(a=>{a=a["pSettings_"+e.metadata.service]||[],t.forEach((e=>{const t=a.find((t=>t.id===e.id));t&&null!==t.value&&(typeof e.value==typeof t.value?e.value=t.value:t.multiLanguage&&(e=t))})),chrome.storage.local.set(JSON.parse(JSON.stringify({["pSettings_"+e.metadata.service]:t})),(()=>{(0,o.um)("initSettings.ts","Updated setting storage of "+e.metadata.service)}))}))}))}})),!d()&&chrome.runtime.onUpdateAvailable.addListener((()=>chrome.runtime.reload())),chrome.tabs.onActivated.addListener((()=>v())),chrome.tabs.onReplaced.addListener(((e,t)=>{f===t&&(j(!0),y())})),chrome.tabs.onRemoved.addListener((e=>{f===e&&(j(!0),y())})),chrome.tabs.onUpdated.addListener(((e,t)=>v(t))),chrome.windows.onFocusChanged.addListener((e=>{-1!==e&&v()})),(0,r.updatePresences)(),(0,L.IG)(chrome.i18n.getUILanguage());const V=setTimeout((()=>B().then(_)),100);chrome.runtime.onInstalled.addListener((async e=>{switch(clearTimeout(V),await B(),e.reason){case"install":chrome.tabs.create({active:!0,index:0,url:chrome.runtime.getURL("html/tabs/index.html#/installed")}),chrome.storage.local.set({lastVersion:chrome.runtime.getManifest().version_name});break;case"update":!async function(){parseInt((await(0,s.c)("local","lastVersion")).lastVersion?(await(0,s.c)("local","lastVersion")).lastVersion.replace(/\./g,"").slice(0,3):0)<parseInt(chrome.runtime.getManifest().version_name.replace(/\./g,"").slice(0,3))&&(chrome.storage.local.set({lastVersion:chrome.runtime.getManifest().version_name}),await(0,L.XP)(),chrome.tabs.create({active:!0,index:0,url:chrome.runtime.getURL("html/tabs/index.html#/updated")}))}()}})),chrome.runtime.onMessage.addListener(((e,t)=>function(e,t){h&&(e.iFrameUpdateData&&void 0!==h.metadata.iframe&&h.metadata.iframe&&chrome.tabs.sendMessage(t.tab.id,{iFrameUpdateData:!0}),e.iFrameData&&chrome.tabs.sendMessage(t.tab.id,{iFrameData:e.iFrameData}),e.iFrame&&(null!==h&&void 0!==h.metadata.iframe&&h.metadata.iframe?chrome.tabs.sendMessage(t.tab.id,{iFrame:h.iframe,iFrameRegExp:h.metadata.iFrameRegExp||""}):chrome.tabs.sendMessage(t.tab.id,{iFrame:!1})))}(e,t))),chrome.storage.onChanged.addListener((async e=>{if(!e.presences||!h||!f)return;const t=(await(0,s.c)("local","presences")).presences.find((e=>e.metadata.service===h.metadata.service));t&&t.enabled?(M=null,chrome.tabs.sendMessage(f,{tabPriority:!0})):(chrome.tabs.sendMessage(f,{tabPriority:!1}),j(!0))})),chrome.storage.local.get("identifier",(e=>{e.identifier&&chrome.runtime.setUninstallURL(`${n.XJ.replace("/v3/","/v2/")}science/${e.identifier}`)}))},9387:(e,t,a)=>{"use strict";a.d(t,{XJ:()=>n,t0:()=>s,tn:()=>r});const n="https://api.premid.app/v3/",s="RELEASE",r=214},3216:(e,t,a)=>{"use strict";a.d(t,{um:()=>o,Vp:()=>c,vU:()=>d});var n=a(9387);const s="font-weight: 800; padding: 2px 5px; color: white;",r="RELEASE"!==n.t0;let i;function o(e,t,a=!1){(r||a)&&(l(e),console.log("%cPreMiD%cINFO%c "+t,s+"border-radius: 25px 0 0 25px; background: #596cae;",s+"border-radius: 0 25px 25px 0; background: #5050ff;","color: unset;"))}function c(e,t,a=!1){(r||a)&&(l(e),console.log("%cPreMiD%cSUCCESS%c "+t,s+"border-radius: 25px 0 0 25px; background: #596cae;",s+"border-radius: 0 25px 25px 0; background: #50ff50; color: black;","color: unset;"))}function d(e,t,a=!1){(r||a)&&(l(e),console.log("%cPreMiD%cERROR%c "+t,s+"border-radius: 25px 0 0 25px; background: #596cae;",s+"border-radius: 0 25px 25px 0; background: #ff5050;","color: unset;"))}function l(e){i!==e&&(console.groupEnd(),console.group(e),i=e)}},7710:(e,t,a)=>{"use strict";function n(e,t){return new Promise((a=>chrome.storage[e].get(t,(e=>a(e)))))}function s(e,t){return new Promise((a=>chrome.storage[e].set(t,a)))}a.d(t,{c:()=>n,p:()=>s})},5069:(e,t,a)=>{"use strict";function n(e){for(const t in e)"object"==typeof e[t]&&n(e[t]),null!==e[t]&&void 0!==e[t]||delete e[t]}a.d(t,{Z:()=>n})},3250:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o,L:()=>c});var n=a(9669),s=a.n(n),r=a(9387),i=a(5069);async function o(e){const t=await s()({url:r.XJ,method:"post",data:{query:e}});return(0,i.Z)(t.data),t.data}async function c(e){const t=await o(`\n    query {\n      presences(service: "${e}") {\n        url\n        metadata {\n          author {\n            id\n            name\n          }\n          contributors {\n            id\n            name\n          }\n          altnames\n          warning\n          readLogs\n          button\n          service\n          description\n          url\n          version\n          logo\n          thumbnail\n          color\n          tags\n          category\n          iframe\n          regExp\n          iframeRegExp\n          settings {\n            id\n            title\n            icon\n            if {\n              propretyNames\n              patternProprties\n            }\n            placeholder\n            value\n            values\n            multiLanguage\n          }\n        }\n      }\n    }`);return(0,i.Z)(t.data),{data:{name:t.data.presences[0].metadata.service,url:t.data.presences[0].url,metadata:t.data.presences[0].metadata}}}},3765:(e,t,a)=>{"use strict";a.d(t,{ZW:()=>i,IG:()=>l,XP:()=>m,cc:()=>p,KF:()=>g,r2:()=>f});var n=a(3216),s=a(7710),r=a(3250);const i="en",o=3e5;let c={};function d(e){return e.split("-")[0]}async function l(e){e||(e=i),e.includes("ja")||e.includes("zh")||e.includes("ko")||(e=d(e));let t=e,a=e,s=e;switch(e){case"ja":t="ja_JP",s="ja_JP";break;case"ja_JP":a="ja";break;case"ko":t="ko_KR",s="ko_KR";break;case"ko_KR":a="ko";break;case"zh-CN":t="zh_CN",s="zh_CN";break;case"zh_CN":a="zh-CN";break;case"zh-TW":t="zh_TW",s="zh_TW";break;case"zh_TW":a="zh-TW";break;default:const e=(await(0,r.Z)('\n\t\t\tquery {\n\t\t\t\tlangFiles(project: "extension") {\n\t\t\t\t\tlang\n\t\t\t\t}\n\t\t\t}\n\t\t\t')).data.langFiles.map((e=>e.lang));if(!e.includes(a)){const n=e.findIndex((e=>e.includes(a+"_")));n>=0&&(t=e[n],a=e[n],s=e[n])}}try{const i=await(0,r.Z)(`\n\t\t\tquery {\n\t\t\t\twebsite: langFiles(project: "website", lang: "${t}") {\n\t\t\t\t\ttranslations\n\t\t\t\t}\n\t\t\t\textension: langFiles(project: "extension", lang: "${a}") {\n\t\t\t\t\ttranslations\n\t\t\t\t}\n\t\t\t\tpresence: langFiles(project: "presence", lang: "${s}") {\n\t\t\t\t\ttranslations\n\t\t\t\t}\n\t\t\t}\n\t\t`);c[e]={name:i.data.website[0].translations["header.language"],loading:i.data.website[0].translations["header.loader.phrases"],extension:i.data.extension[0].translations,presence:i.data.presence[0].translations,updatedAt:Date.now()},(0,n.Vp)("langManager.ts",`Updated ${e} translations`)}catch(t){return void(0,n.vU)("langManager.ts",`Error while fetching langFiles of ${e} language: ${t.message}`)}c[e]&&c[e].error?c[e]=void 0:await chrome.storage.local.set({languages:c})}async function m(){const e=Object.keys((await(0,s.c)("local","languages")).languages);await Promise.all(e.map((e=>p(e,!0))))}const u=[];async function p(e,t){return e||(e=i),t||(t=!1),e=d(e),new Promise((a=>{if(void 0!==c[e]&&a(),u.includes(e)){let t=setInterval((()=>{void 0!==c&&void 0!==c[e]&&(clearInterval(t),a())}),5)}else u.push(e),chrome.storage.local.get("languages",(async n=>{n.languages||(n.languages={});const s=[];(t&&void 0!==n.languages[i]&&Date.now()-n.languages[i].updatedAt>=o||e!==i&&void 0===n.languages[i])&&s.push(l(i)),(void 0===n.languages[e]||t&&Date.now()-n.languages[e].updatedAt>=o)&&s.push(l(e)),await Promise.all(s),c={...c,...n.languages},u.splice(u.indexOf(e),1),a()}))}))}function g(e,t){return t||(t=chrome.i18n.getUILanguage()),t=d(t),new Promise((async a=>{if(await p(t),void 0!==c[t]){if(["name","header.language"].includes(e)&&void 0!==c[t].name)return a(c[t].name);if(["loading","header.loader.phrases"].includes(e)&&void 0!==c[t].loading)return a(c[t].loading);if(void 0!==c[t].extension&&void 0!==c[t].extension[e])return a(c[t].extension[e]);if(void 0!==c[t].presence&&void 0!==c[t].presence[e])return a(c[t].presence[e])}return a(t===i?e:await g(e,i))}))}async function f(e){try{const t=await(0,r.Z)(`\n\t\t\tquery {\n\t\t\t\tlangFiles(presence: "${e.toLowerCase()}") {\n\t\t\t\t\tlang\n\t\t\t\t}\n\t\t\t\tgeneralLangFiles: langFiles(presence: "general") {\n\t\t\t\t\tlang\n\t\t\t\t}\n\t\t\t}\n\t\t`),a=[];return t.data.langFiles.length>0&&t.data.generalLangFiles.length>0?t.data.generalLangFiles.forEach((e=>{t.data.langFiles.find((t=>t.lang===e.lang))&&a.push(e.lang)})):t.data.generalLangFiles.length>0&&t.data.generalLangFiles.forEach((e=>{a.push(e.lang)})),a}catch(e){return[]}}},7899:(e,t,a)=>{"use strict";a.d(t,{presenceScience:()=>c,updatePresences:()=>d,addPresence:()=>l,initPresenceLanguages:()=>u});var n=a(3765),s=a(3216),r=a(3250),i=a(7710),o=a(4586);async function c(){let e=(await(0,i.c)("local","identifier")).identifier,t=(await(0,i.c)("local","presences")).presences;e||(e=(0,o.Z)(),chrome.storage.local.set({identifier:e}));const a=await new Promise((e=>chrome.runtime.getPlatformInfo((t=>e({os:t.os,arch:t.arch}))))),n=t.filter((e=>!e.tmp)).map((e=>e.metadata.service));(0,r.Z)(`\n\tmutation {\n\t\taddScience(identifier: "${e}", presences: ["${n.toString().split(",").join('", "')}"], os: "${a.os}", arch:"${a.arch}") {\n\t\t\tidentifier\n\t\t}\n\t}\n\t`)}async function d(){let e,t=(await(0,i.c)("local","presences")).presences;if(!t||0===t.length)return;try{const t=(await(0,r.Z)("\n\t\t\tquery {\n  \t\t\tpresences {\n    \t\t\turl\n    \t\t\tmetadata {\n      \t\t\tservice\n      \t\t\tversion\n    \t\t\t}\n  \t\t\t}\n\t\t\t}\n\t\t")).data,a=[];t.presences.forEach((e=>{a.push({name:e.metadata.service,url:e.url,version:e.metadata.version})})),e=a}catch(e){return void(0,s.vU)("presenceManager.ts","Error while updating presences: "+e.message)}let a=t.filter((e=>!e.tmp)).map((e=>({name:e.metadata.service,version:e.metadata.version}))).filter((t=>e.find((e=>e.name==t.name&&e.version!==t.version))));Promise.all(a.map((async e=>{const a=t.findIndex((t=>t.metadata.service===e.name&&!e.tmp)),n=(await(0,r.Z)(`\n\t\t\tquery {\n\t\t\t\tpresences(service: "${e.name}") {\n\t\t\t\t\tpresenceJs\n\t\t\t\t\tiframeJs\n\t\t\t\t\tmetadata {\n\t\t\t\t\t\tauthor {\n\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontributors {\n\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t}\n\t\t\t\t\t\taltnames\n\t\t\t\t\t\twarning\n\t\t\t\t\t\treadLogs\n\t\t\t\t\t\tservice\n\t\t\t\t\t\tdescription\n\t\t\t\t\t\turl\n\t\t\t\t\t\tversion\n\t\t\t\t\t\tlogo\n\t\t\t\t\t\tthumbnail\n\t\t\t\t\t\tcolor\n\t\t\t\t\t\ttags\n\t\t\t\t\t\tcategory\n\t\t\t\t\t\tiframe\n\t\t\t\t\t\tregExp\n\t\t\t\t\t\tiframeRegExp\n\t\t\t\t\t\tbutton\n\t\t\t\t\t\twarning\n\t\t\t\t\t\tsettings {\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t\ticon\n\t\t\t\t\t\t\tif {\n\t\t\t\t\t\t\t\tpropretyNames\n\t\t\t\t\t\t\t\tpatternProprties\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tplaceholder\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t\tvalues\n\t\t\t\t\t\t\tmultiLanguage\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t`)).data,s=n.presences[0].metadata,i=[n.presences[0].presenceJs,s.iframe?n.presences[0].iframeJs:void 0].filter((e=>e));t[a].metadata=s,t[a].presence=i[0],2==i.length&&(t[a].iframe=i[1])}))).then((()=>{chrome.storage.local.set({presences:[...t]},(()=>{a.map((t=>(0,s.Vp)("presenceDevManager.ts",`Updated ${t.name} from v${t.version} to v${e.find((e=>e.name===t.name)).version}`)))}));const r=a.map((e=>e.name));t.filter((e=>r.includes(e.metadata.service))).forEach((async e=>{await u(e);const t="pSettings_"+e.metadata.service,a=(await(0,i.c)("local",t))[t];if(a){const e=a.find((e=>void 0!==e.multiLanguage));if(e&&e.values){const t=e.values.map((e=>e.value));await Promise.all(t.map((e=>(0,n.cc)(e,!0))))}}}))}))}async function l(e){let t=(await(0,i.c)("local","presences")).presences;if(t||(t=[]),"string"==typeof e){if(t.filter((e=>!e.tmp)).find((t=>t.metadata.service===e)))return void(0,s.vU)("presenceManager",`Presence ${e} already added.`)}else{const a=e.filter((e=>!t.map((e=>e.metadata.service)).includes(e)));if(0===a.length)return void(0,s.vU)("presenceManager","Presences already added.");e=a}if("string"==typeof e)(0,r.L)(e).then((async({data:e})=>{if(void 0!==e.metadata.button&&!e.metadata.button)return;const a=(await(0,r.Z)(`\n\t\t\t\t\t\tquery {\n\t\t\t\t\t\t\tpresences(service: "${e.metadata.service}") {\n    \t\t\t\t\tpresenceJs\n    \t\t\t\t\tiframeJs\n    \t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t`)).data.presences[0],n={metadata:e.metadata,presence:a.presenceJs,enabled:!0};void 0!==e.metadata.iframe&&e.metadata.iframe&&(n.iframe=a.iframeJs),t.push(n),chrome.storage.local.set({presences:t}),t.map((e=>{e.metadata.settings&&chrome.storage.local.set({["pSettings_"+e.metadata.service]:e.metadata.settings})}))})).catch((()=>{}));else{const a=(await Promise.all((await Promise.all(e.map((e=>(0,r.L)(e))))).map((async({data:e})=>{if(void 0!==e.metadata.button&&!e.metadata.button)return;const t=(await(0,r.Z)(`\n\t\t\t\t\t\tquery {\n\t\t\t\t\t\t\tpresences(service: "${e.metadata.service}") {\n    \t\t\t\t\tpresenceJs\n    \t\t\t\t\tiframeJs\n    \t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t`)).data.presences[0],a={metadata:e.metadata,presence:t.presenceJs,enabled:!0};return void 0!==e.metadata.iframe&&e.metadata.iframe&&(a.iframe=t.iframeJs),a})))).filter((e=>void 0!==e));chrome.storage.local.set({presences:t.concat(a)}),t.concat(a).map((e=>{e.metadata.settings&&(chrome.storage.local.set({["pSettings_"+e.metadata.service]:e.metadata.settings}),u(e))}))}d(),(0,n.IG)(chrome.i18n.getUILanguage())}async function m(){let e={detail:(await(0,i.c)("local","presences")).presences.filter((e=>!e.tmp)).map((e=>e.metadata.service))};"function"==typeof cloneInto&&(e=cloneInto(e,document.defaultView));const t=new CustomEvent("PreMiD_GetWebisteFallback",e);window.dispatchEvent(t)}async function u(e){if(e.metadata.settings){const t=e.metadata.settings.findIndex((e=>void 0!==e.multiLanguage));if(t>=0){const a=e.metadata.settings[t],s=await async function(e,t){switch(typeof e){case"boolean":if(!0===e)return await p(t);break;case"string":return await p(e);case"object":if(e instanceof Array){let t=[];for(const a of e)if("string"==typeof a&&a.trim().length>0){const e=await p(a);t=0===t.length?e:t.filter((t=>e.findIndex((e=>e===t))>=0))}return t}}}(a.multiLanguage,e.metadata.service);Object.keys(s).length>1?await async function(e,t){const a=e.metadata.settings.find((e=>void 0!==e.multiLanguage));let s=(await(0,i.c)("local","pSettings_"+e.metadata.service))["pSettings_"+e.metadata.service];if(!s&&e.metadata.settings&&(s=e.metadata.settings),!s.find((e=>e.id===a.id&&e.values&&e.values.length>0))){const r=chrome.i18n.getUILanguage(),i=t.find((e=>e.value===r));a.title=await(0,n.KF)("general.language",r),a.icon="fas fa-language",a.value=i?i.value:n.ZW,a.values=t;const o=s.findIndex((e=>e.id===a.id));s[o]=a,chrome.storage.local.set(JSON.parse(JSON.stringify({["pSettings_"+e.metadata.service]:s})))}}(e,s):e.metadata.settings.splice(t,1)}}}async function p(e){const t=[],a=await(0,n.r2)(e);for(const e of a)t.push({name:await(0,n.KF)("name",e),value:e});return t}"/_generated_background_page.html"!==document.location.pathname&&(document.addEventListener("DOMContentLoaded",(()=>{document.querySelector("#app")&&document.querySelector("#app").setAttribute("extension-ready","true")})),window.addEventListener("PreMiD_AddPresence",(function(e){l([e.detail])})),window.addEventListener("PreMiD_RemovePresence",(async function(e){const{presences:t}=await(0,i.c)("local","presences");chrome.storage.local.set({presences:t.filter((t=>t.metadata.service!==e.detail))}),d(),(0,n.IG)(chrome.i18n.getUILanguage())})),window.addEventListener("PreMiD_GetPresenceList",m),chrome.storage.onChanged.addListener((e=>{"presences"===Object.keys(e)[0]&&m()})))},418:()=>{}},t={};function a(n){if(t[n])return t[n].exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,a),s.exports}return a.m=e,a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={464:0,293:0},t=[[9729,999]],n=()=>{};function s(){for(var n,s=0;s<t.length;s++){for(var r=t[s],i=!0,o=1;o<r.length;o++){var c=r[o];0!==e[c]&&(i=!1)}i&&(t.splice(s--,1),n=a(a.s=r[0]))}return 0===t.length&&(a.x(),a.x=()=>{}),n}a.x=()=>{a.x=()=>{},i=i.slice();for(var e=0;e<i.length;e++)r(i[e]);return(n=s)()};var r=s=>{for(var r,i,[c,d,l,m]=s,u=0,p=[];u<c.length;u++)i=c[u],a.o(e,i)&&e[i]&&p.push(e[i][0]),e[i]=0;for(r in d)a.o(d,r)&&(a.m[r]=d[r]);for(l&&l(a),o(s);p.length;)p.shift()();return m&&t.push.apply(t,m),n()},i=self.webpackChunkpmd=self.webpackChunkpmd||[],o=i.push.bind(i);i.push=r})(),a.x()})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvYWRkRGVmYXVsdFByZXNlbmNlcy50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvZGV0ZWN0U2FmYXJpLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2Z1bmN0aW9ucy90YWJIYXNQcmVzZW5jZS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvdXBkYXRlQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaW5qZWN0UHJlc2VuY2UudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvdGFiUHJpb3JpdHkudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZnVuY3Rpb25zL2NwT2JqLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2Z1bmN0aW9ucy9zZXRBY3Rpdml0eS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9iYWNrZ3JvdW5kL29uQ29ubmVjdC50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaXNFcXVpdmFsZW50LnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2Z1bmN0aW9ucy9wcmVzZW5jZURldk1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvc29ja2V0TWFuYWdlci50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvY2xlYXJBY3Rpdml0eS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaW5pdFNldHRpbmdzLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2JhY2tncm91bmQvZ2VuZXJpYy50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvY29uc29sZUhlYWRlci50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaGFzQWxwaGFCZXRhQWNjZXNzLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2JhY2tncm91bmQvb25JbnN0YWxsZWQudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvYmFja2dyb3VuZC9vbk1lc3NhZ2UudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvYmFja2dyb3VuZC9vblN0b3JhZ2VDaGFuZ2UudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvYmFja2dyb3VuZC9vblVuaW5zdGFsbGVkLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy9jb25maWcudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZGVidWcudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZnVuY3Rpb25zL2FzeW5jU3RvcmFnZS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvY2xlYW5PYmplY3QudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZnVuY3Rpb25zL2dyYXBocWwudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvbGFuZ01hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvcHJlc2VuY2VNYW5hZ2VyLnRzIiwid2VicGFjazovL3BtZC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9wbWQvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9wbWQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6WyJhc3luYyIsImFkZERlZmF1bHRQcmVzZW5jZXMiLCJkZWZhdWx0QWRkZWQiLCJkZWZhdWx0UHJlc2VuY2VzIiwiYWRkUHJlc2VuY2UiLCJwcmVzZW5jZXMiLCJtYXAiLCJwIiwibWV0YWRhdGEiLCJzZXJ2aWNlIiwicHJlc2VuY2UiLCJpbmNsdWRlcyIsImRldGVjdFNhZmFyaSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJ0YWJIYXNQcmVzZW5jZSIsInRhYklkIiwicmVzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjaHJvbWUiLCJ0YWJzIiwiZXhlY3V0ZVNjcmlwdCIsImNvZGUiLCJjaGVja1VwZGF0ZSIsInNhZmFyaSIsInJlc3VsdCIsImdyYXBocWwiLCJjbGVhbk9iamVjdCIsImRhdGEiLCJ2ZXJzaW9ucyIsInZlcnNpb24iLCJydW50aW1lIiwiZ2V0TWFuaWZlc3QiLCJ2ZXJzaW9uX25hbWUiLCJicm93c2VyQWN0aW9uIiwic2V0QmFkZ2VUZXh0IiwidGV4dCIsImxhdGVzdFZlcnNpb24iLCJ1cmdlbnRVcGRhdGUiLCJ1cmdlbnQiLCJzZXRCYWRnZUJhY2tncm91bmRDb2xvciIsImNvbG9yIiwiaW5qZWN0UHJlc2VuY2UiLCJpZGVudGlmaWVyIiwibG9nZ2VyIiwicmVhZExvZ3MiLCJyZXBsYWNlIiwiSlNPTiIsInN0cmluZ2lmeSIsInJ1bkF0IiwiY3VyclRpbWVvdXQiLCJwcmlvcml0eVRhYiIsIm9sZFByZXNlbmNlIiwidGFiUHJpb3JpdHkiLCJpbmZvIiwibGFzdEZvY3VzZWRXaW5kb3ciLCJ3aW5kb3dzIiwiZ2V0TGFzdEZvY3VzZWQiLCJhY3RpdmVUYWIiLCJxdWVyeSIsImFjdGl2ZSIsIndpbmRvd0lkIiwiaWQiLCJ1cmwiLCJzdGFydHNXaXRoIiwicG1kTWV0YVRhZyIsInVuZGVmaW5lZCIsImZpbHRlciIsIm1ldGFUYWciLCJlbmFibGVkIiwicmVnRXhwIiwibWF0Y2giLCJSZWdFeHAiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJVUkwiLCJob3N0bmFtZSIsInBycyIsImhpZGRlbiIsInByZXNlbmNlSnNDb2RlIiwiaWZyYW1lIiwicHJlc2VuY2VKcyIsImlmcmFtZUpzIiwic3RvcmFnZSIsImxvY2FsIiwiZ2V0IiwiZXhQcmVzZW5jZSIsImZpbmRJbmRleCIsInByZXNlbmNlMSIsInB1c2giLCJzZXQiLCJ0YWJIYXNQcnMiLCJzdGF0dXMiLCJjbGVhckFjdGl2aXR5Iiwic2VuZE1lc3NhZ2UiLCJ1cGRhdGVQb3B1cFZpc2liaWxpdHkiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwicHJlc2VuY2VUb1Nob3ciLCJwcmVzZW5jZVRvSGlkZSIsImhpZGVNZXRhVGFnUHJlc2VuY2VzIiwiY3BPYmoiLCJtYWluT2JqIiwia2V5Iiwib2JqQ29weSIsInNldEFjdGl2aXR5Iiwic2V0dGluZ3MiLCJhdXRob3JpemVkQmV0YUFscGhhIiwidmFsdWUiLCJwVFMiLCJ0cmF5VGl0bGUiLCJ0aXRsZU1lbnViYXIiLCJ0cmltIiwibWVkaWFLZXlzIiwicHJlc2VuY2VEYXRhIiwiZGV0YWlscyIsInNsaWNlIiwic3RhdGUiLCJzb2NrZXQiLCJjb25uZWN0ZWQiLCJlbWl0Iiwib2xkT2JqZWN0Iiwib2xkQWN0aXZpdHkiLCJvbkNvbm5lY3QiLCJhZGRMaXN0ZW5lciIsInBvcnQiLCJuYW1lIiwic2VuZFJlc3BvbnNlIiwicG9zdE1lc3NhZ2UiLCJvbiIsIm9uRGlzY29ubmVjdCIsInJlbW92ZUxpc3RlbmVyIiwiaGFuZGxlVGFicyIsImFwcFZlcnNpb25TdXBwb3J0ZWQiLCJzdXBwb3J0ZWRBcHBWZXJzaW9uIiwibGF0ZXN0RXh0ZW5zaW9uVmVyc2lvbiIsIm9uTWVzc2FnZSIsIm1zZyIsImFjdGlvbiIsImhhbmRsZVBvcHVwIiwicGxhdGZvcm0iLCJnZXRQbGF0Zm9ybUluZm8iLCJvcyIsImFyY2giLCJwZW5ndWluRW1vamkiLCJTdHJpbmciLCJmcm9tQ29kZVBvaW50IiwibiIsImxhcmdlSW1hZ2VLZXkiLCJsYXJnZUltYWdlVGV4dCIsImFwcFZlcnNpb24iLCJmcm9tIiwicmV2ZXJzZSIsImEiLCJpIiwiam9pbiIsImZyb21DaGFyQ29kZSIsImNoZWNrIiwic3RhcnRUaW1lc3RhbXAiLCJlbmRUaW1lc3RhbXAiLCJjaGVjazEiLCJiIiwiYVByb3BzIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImJQcm9wcyIsInByb3BOYW1lIiwiaXNFcXVpdmFsZW50IiwiaGFuZGxlUHJlc2VuY2UiLCJzdWNjZXNzIiwib25MaW5lIiwic3RhcnQiLCJlIiwiaGFuZGxlQXBwVHMiLCJlcnJvcnMiLCJhdXRvQ29ubmVjdCIsImNvbm5lY3QiLCJvcGVuIiwiYXBwVmVyc2lvblRpbWVvdXQiLCJyZXNldFRhYlByaW9yaXR5IiwiYXNzaWduIiwia2V5cyIsImsiLCJ0bXAiLCJmaWxlcyIsImZpbmQiLCJmIiwiZmlsZSIsInRvTG93ZXJDYXNlIiwiY29udGVudHMiLCJhdXRob3IiLCJkZXNjcmlwdGlvbiIsImVuIiwiZXJyIiwiYWRkZWRQcmVzZW5jZSIsInRtcFByIiwiaW5pdFByZXNlbmNlTGFuZ3VhZ2VzIiwidXBkYXRlZFByZXNlbmNlIiwid2luZG93VHlwZSIsImoiLCJ0YWJVcmwiLCJ0ZXN0IiwiaHJlZiIsInJlbG9hZCIsImJ5cGFzc0NhY2hlIiwiY29uc29sZSIsInVzZXIiLCJwcmVtaXVtX3R5cGUiLCJuZXdVc2VyIiwiZGlzY29yZFVzZXIiLCJpbml0U2V0dGluZyIsInN5bmMiLCJzZXR0aW5nIiwic3RyaW5nIiwicG9zaXRpb24iLCJvcHRpb24iLCJzaG93IiwiY09wdGlvbiIsImxvZyIsIkRhdGUiLCJnZXRGdWxsWWVhciIsImNvbnNvbGVIZWFkZXIiLCJyZWRpcmVjdFVSTCIsImJyb3dzZXIiLCJpZGVudGl0eSIsImdldFJlZGlyZWN0VVJMIiwiYWxsb3dlZEFjY2VzcyIsImxhdW5jaFdlYkF1dGhGbG93IiwiaW50ZXJhY3RpdmUiLCJyZXNwb25zZVVybCIsImxhc3RFcnJvciIsImFjY2Vzc1Rva2VuIiwiZFVzZXIiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImFjY2Vzc1R5cGUiLCJhbHBoYUJldGFBY2Nlc3MiLCJiZXRhQWNjZXNzIiwiYWxwaGFBY2Nlc3MiLCJoYXNBbHBoYUJldGFBY2Nlc3MiLCJhbGwiLCJpbml0U2V0dGluZ3MiLCJ1cGRhdGVQcmVzZW5jZXMiLCJpMThuIiwiZ2V0VUlMYW5ndWFnZSIsInByZXNlbmNlU2NpZW5jZSIsInNldEludGVydmFsIiwib25DaGFuZ2VkIiwiY2hhbmdlcyIsIm5TZXR0aW5ncyIsIm5ld1ZhbHVlIiwib2xkVmFsdWUiLCJucCIsIm92IiwiZm9yRWFjaCIsInN0b3JhZ2VTZXR0aW5ncyIsInN0b3JhZ2VTZXR0aW5nIiwicyIsIm11bHRpTGFuZ3VhZ2UiLCJwYXJzZSIsIm9uVXBkYXRlQXZhaWxhYmxlIiwib25BY3RpdmF0ZWQiLCJvblJlcGxhY2VkIiwiXyIsIm9uUmVtb3ZlZCIsIm9uVXBkYXRlZCIsImNoYW5nZUluZm8iLCJvbkZvY3VzQ2hhbmdlZCIsIm9uRXh0RW5hYmxlIiwidGhlbiIsIm9uSW5zdGFsbGVkIiwicmVhc29uIiwiY3JlYXRlIiwiaW5kZXgiLCJnZXRVUkwiLCJsYXN0VmVyc2lvbiIsInBhcnNlSW50IiwidXBkYXRlIiwic2VuZGVyIiwiaUZyYW1lVXBkYXRlRGF0YSIsInRhYiIsImlGcmFtZURhdGEiLCJpRnJhbWUiLCJpRnJhbWVSZWdFeHAiLCJoYW5kbGVpRnJhbWUiLCJzZXRVbmluc3RhbGxVUkwiLCJhcGlCYXNlIiwicmVsZWFzZVR5cGUiLCJyZXF1aXJlZEFwcFZlcnNpb24iLCJnZW5lcmljU3R5bGUiLCJkZWJ1Z2dpbmciLCJsYXN0RmlsZSIsIm1lc3NhZ2UiLCJmb3JjZSIsImdyb3VwRmlsZSIsImVycm9yIiwiZ3JvdXBFbmQiLCJncm91cCIsImdldFN0b3JhZ2UiLCJ0eXBlIiwiaXRlbXMiLCJzZXRTdG9yYWdlIiwib2JqIiwiZ3JhcGhxbFJlcXVlc3QiLCJtZXRob2QiLCJnZXRQcmVzZW5jZU1ldGFkYXRhIiwiREVGQVVMVF9MT0NBTEUiLCJNSU5fVVBEQVRFX1RJTUUiLCJsYW5ndWFnZXMiLCJub3JtYWxpemVMYW5ndWFnZUNvZGUiLCJsYW5ndWFnZUNvZGUiLCJzcGxpdCIsInVwZGF0ZVN0cmluZ3MiLCJ3ZWJzaXRlTGFuZ3VhZ2UiLCJleHRlbnNpb25MYW5ndWFnZSIsInByZXNlbmNlTGFuZ3VhZ2UiLCJhdmFpbGFibGVMYW5ncyIsImxhbmdGaWxlcyIsImxmIiwibGFuZyIsImMiLCJncmFwaHFsUmVzdWx0Iiwid2Vic2l0ZSIsInRyYW5zbGF0aW9ucyIsImxvYWRpbmciLCJleHRlbnNpb24iLCJ1cGRhdGVkQXQiLCJub3ciLCJ1cGRhdGVBbGxTdHJpbmdzIiwibG5nIiwibG9hZFN0cmluZ3MiLCJsb2FkaW5nTGFuZ3MiLCJsb2FkU3RhdHVzIiwiY2xlYXJJbnRlcnZhbCIsImxuZ3MiLCJ1cGRhdGVQcm9taXNlcyIsInNwbGljZSIsImdldFN0cmluZyIsImdldFByZXNlbmNlTGFuZ3VhZ2VzIiwicHJlc2VuY2VOYW1lIiwibGFuZ3MiLCJmaW5hbEFycmF5IiwiZ2VuZXJhbExhbmdGaWxlcyIsInByZXNlbmNlc0FycmF5IiwidG9TdHJpbmciLCJwcmVzZW5jZVZlcnNpb25zIiwiZWxlbWVudCIsInByZXNlbmNlc1RvVXBkYXRlIiwicDEiLCJwcmVzZW5jZUluZGV4IiwicHJlc2VuY2VOYW1lc1RvVXBkYXRlIiwic2V0dGluZ05hbWUiLCJsYW5nU2V0dGluZ3MiLCJ2YWx1ZXMiLCJ2IiwiYnV0dG9uIiwicHJlc2VuY2VBbmRJZnJhbWUiLCJjYXRjaCIsInByZXNlbmNlc1RvQWRkIiwiY29uY2F0Iiwic2VuZEJhY2tQcmVzZW5jZXMiLCJkZXRhaWwiLCJjbG9uZUludG8iLCJkb2N1bWVudCIsImRlZmF1bHRWaWV3IiwiZXZlbnQiLCJDdXN0b21FdmVudCIsImRpc3BhdGNoRXZlbnQiLCJsbmdTZXR0aW5nSWR4IiwibG5nU2V0dGluZyIsImNvbW1vbkxuZ3MiLCJwcmVmaXgiLCJjbCIsImwiLCJwcmVzZW5jZU11bHRpTGFuZ3VhZ2VMYW5ndWFnZXMiLCJwcmVzZW5jZVNldHRpbmdzIiwidWlMYW5nIiwicHJlZmVycmVkVmFsdWUiLCJ0aXRsZSIsImljb24iLCJzdG9yZURlZmF1bHRMYW5ndWFnZU9mUHJlc2VuY2UiLCJzZXJ2aWNlTmFtZSIsImxhbmd1YWdlIiwibG9jYXRpb24iLCJwYXRobmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJxdWVyeVNlbGVjdG9yIiwic2V0QXR0cmlidXRlIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJjYWxsIiwibSIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkIiwiZGVmaW5pdGlvbiIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnIiwiZ2xvYmFsVGhpcyIsInRoaXMiLCJGdW5jdGlvbiIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImluc3RhbGxlZENodW5rcyIsIjQ2NCIsIjI5MyIsImRlZmVycmVkTW9kdWxlcyIsImNoZWNrRGVmZXJyZWRNb2R1bGVzIiwiY2hlY2tEZWZlcnJlZE1vZHVsZXNJbXBsIiwiZGVmZXJyZWRNb2R1bGUiLCJmdWxmaWxsZWQiLCJkZXBJZCIsIngiLCJjaHVua0xvYWRpbmdHbG9iYWwiLCJ3ZWJwYWNrSnNvbnBDYWxsYmFjayIsImNodW5rSWQiLCJjaHVua0lkcyIsIm1vcmVNb2R1bGVzIiwiZXhlY3V0ZU1vZHVsZXMiLCJyZXNvbHZlcyIsInBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uIiwic2hpZnQiLCJhcHBseSIsInNlbGYiLCJiaW5kIl0sIm1hcHBpbmdzIjoiOEZBSWVBLGVBQWVDLElBRTdCLElBQUlDLFNBQXNCLE9BQVcsUUFBUyxpQkFBaUJBLGFBRy9ELEdBQUlBLEVBQWMsT0FDbEIsTUFBTUMs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RUFBb0JpQyxJQUNwQmpDLEVBQW9CaUMsRUFBSSxRQUlsQi9ZLEVBRVI4VyxFQUFvQmlDLEVBQUksS0FFdkJqQyxFQUFvQmlDLEVBQUksT0FHeEJDLEVBQXFCQSxFQUFtQm5ULFFBQ3hDLElBQUksSUFBSXNDLEVBQUksRUFBR0EsRUFBSTZRLEVBQW1CaFcsT0FBUW1GLElBQUs4USxFQUFxQkQsRUFBbUI3USxJQUMzRixPQUFRdVEsRUFBdUJDLE1BSWhDLElBQUlNLEVBQXdCOVksSUFLM0IsSUFKQSxJQUdJNFcsRUFBVW1DLEdBSFRDLEVBQVVDLEVBQWE5WSxFQUFTK1ksR0FBa0JsWixFQUdoQ2dJLEVBQUksRUFBR21SLEVBQVcsR0FDcENuUixFQUFJZ1IsRUFBU25XLE9BQVFtRixJQUN6QitRLEVBQVVDLEVBQVNoUixHQUNoQjJPLEVBQW9CVyxFQUFFYSxFQUFpQlksSUFBWVosRUFBZ0JZLElBQ3JFSSxFQUFTclYsS0FBS3FVLEVBQWdCWSxHQUFTLElBRXhDWixFQUFnQlksR0FBVyxFQUU1QixJQUFJbkMsS0FBWXFDLEVBQ1p0QyxFQUFvQlcsRUFBRTJCLEVBQWFyQyxLQUNyQ0QsRUFBb0JNLEVBQUVMLEdBQVlxQyxFQUFZckMsSUFLaEQsSUFGR3pXLEdBQVNBLEVBQVF3VyxHQUNwQnlDLEVBQTJCcFosR0FDckJtWixFQUFTdFcsUUFDZHNXLEVBQVNFLE9BQVRGLEdBT0QsT0FIR0QsR0FBZ0JaLEVBQWdCeFUsS0FBS3dWLE1BQU1oQixFQUFpQlksR0FHeERYLEtBR0pNLEVBQXFCVSxLQUFzQixnQkFBSUEsS0FBc0IsaUJBQUssR0FDMUVILEVBQTZCUCxFQUFtQi9VLEtBQUswVixLQUFLWCxHQUM5REEsRUFBbUIvVSxLQUFPZ1YsRyxHTnpGbkJuQyxFQUFvQmlDLEsiLCJmaWxlIjoianMvYmFja2dyb3VuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFN0b3JhZ2UsIHNldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuXHJcbmltcG9ydCB7IGFkZFByZXNlbmNlIH0gZnJvbSBcIi4uL3ByZXNlbmNlTWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gYWRkRGVmYXVsdFByZXNlbmNlcygpIHtcclxuXHQvLyogQWRkIGRlZmF1bHQgcHJlc2VuY2VzXHJcblx0bGV0IGRlZmF1bHRBZGRlZCA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJkZWZhdWx0QWRkZWRcIikpLmRlZmF1bHRBZGRlZFxyXG5cdC8vKiByZXR1cm4gaWYgYWxyZWFkeSBhZGRlZFxyXG5cdC8vKiBBZGQgZGVmYXVsdCBwcmVzZW5jZXNcclxuXHRpZiAoZGVmYXVsdEFkZGVkKSByZXR1cm47XHJcblx0Y29uc3QgZGVmYXVsdFByZXNlbmNlcyA9IFtcclxuXHRcdFwiWW91VHViZVwiLFxyXG5cdFx0XCJZb3VUdWJlIE11c2ljXCIsXHJcblx0XHRcIk5ldGZsaXhcIixcclxuXHRcdFwiVHdpdGNoXCIsXHJcblx0XHRcIlNvdW5kQ2xvdWRcIlxyXG5cdF07XHJcblx0YXdhaXQgYWRkUHJlc2VuY2UoZGVmYXVsdFByZXNlbmNlcyk7XHJcblx0ZGVmYXVsdEFkZGVkID0gdHJ1ZTtcclxuXHJcblx0bGV0IHByZXNlbmNlcyA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpLnByZXNlbmNlc1xyXG5cdFx0Lm1hcChwID0+IHAubWV0YWRhdGEuc2VydmljZSk7XHJcblxyXG5cdC8vKiBjaGVjayB0aGF0IGFsbCByZXF1ZXN0ZWQgcHJlc2VuY2VzIGhhdmUgYmVlbiBpbnN0YWxsZWRcclxuXHRmb3IgKGNvbnN0IHByZXNlbmNlIG9mIGRlZmF1bHRQcmVzZW5jZXMpIHtcclxuXHRcdGlmICghcHJlc2VuY2VzLmluY2x1ZGVzKHByZXNlbmNlKSkge1xyXG5cdFx0XHRkZWZhdWx0QWRkZWQgPSBmYWxzZTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzZXRTdG9yYWdlKFwibG9jYWxcIiwge1xyXG5cdFx0ZGVmYXVsdEFkZGVkXHJcblx0fSk7XHJcbn1cclxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0U2FmYXJpKCkge1xyXG5cdC8vKiBEZXRlY3QgU2FmYXJpIEJyb3dzZXIgYW5kIHJldHVybiB0cnVlL2ZhbHNlLlxyXG5cdHJldHVybiAoXHJcblx0XHRuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJTYWZhcmlcIikgIT09IC0xICYmXHJcblx0XHRuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJDaHJvbWVcIikgPT09IC0xXHJcblx0KTtcclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiB0YWJIYXNQcmVzZW5jZSh0YWJJZDogbnVtYmVyKSB7XHJcblx0Y29uc3QgcmVzID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbltdPihyZXNvbHZlID0+IHtcclxuXHRcdGNocm9tZS50YWJzLmV4ZWN1dGVTY3JpcHQoXHJcblx0XHRcdHRhYklkLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0Y29kZTogXCJ0cnl7UHJlTWlEX1ByZXNlbmNlfWNhdGNoKF8pe2ZhbHNlfVwiXHJcblx0XHRcdH0sXHJcblx0XHRcdHJlc29sdmVcclxuXHRcdCk7XHJcblx0fSk7XHJcblxyXG5cdGlmICghcmVzKSByZXR1cm4gZmFsc2U7XHJcblx0ZWxzZSByZXR1cm4gcmVzWzBdO1xyXG59XHJcbiIsImltcG9ydCBjbGVhbk9iamVjdCBmcm9tIFwiLi9jbGVhbk9iamVjdFwiO1xyXG5pbXBvcnQgZ3JhcGhxbFJlcXVlc3QgZnJvbSBcIi4vZ3JhcGhxbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gY2hlY2tVcGRhdGUoc2FmYXJpOiBib29sZWFuKSB7XHJcblx0aWYgKHNhZmFyaSkge1xyXG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgZ3JhcGhxbFJlcXVlc3QoYFxyXG5cdFx0cXVlcnkge1xyXG5cdFx0XHR2ZXJzaW9ucyB7XHJcblx0XHRcdFx0c2FmYXJpIHtcclxuXHRcdFx0XHRcdHZlcnNpb25cclxuXHRcdFx0XHRcdHVyZ2VudFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fWApO1xyXG5cdFx0Y2xlYW5PYmplY3QocmVzdWx0LmRhdGEpO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRyZXN1bHQuZGF0YS52ZXJzaW9ucy5zYWZhcmkudmVyc2lvbiA9PT1cclxuXHRcdFx0Y2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3QoKS52ZXJzaW9uX25hbWVcclxuXHRcdCkge1xyXG5cdFx0XHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIlwiIH0pO1xyXG5cdFx0XHRyZXR1cm4geyBsYXRlc3RWZXJzaW9uOiB0cnVlLCB1cmdlbnRVcGRhdGU6IGZhbHNlIH07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zdCB1cmdlbnRVcGRhdGUgPSByZXN1bHQuZGF0YS52ZXJzaW9ucy5zYWZhcmkudXJnZW50O1xyXG5cdFx0XHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIiFcIiB9KTtcclxuXHRcdFx0Y2hyb21lLmJyb3dzZXJBY3Rpb24uc2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3IoeyBjb2xvcjogXCIjZmY1MDUwXCIgfSk7XHJcblx0XHRcdHJldHVybiB7IGxhdGVzdFZlcnNpb246IGZhbHNlLCB1cmdlbnRVcGRhdGUgfTtcclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIHsgbGF0ZXN0VmVyc2lvbjogdHJ1ZSwgdXJnZW50VXBkYXRlOiBmYWxzZSB9O1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBzdWNjZXNzIH0gZnJvbSBcIi4uL2RlYnVnXCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGRldGVjdFNhZmFyaSBmcm9tIFwiLi9kZXRlY3RTYWZhcmlcIjtcclxuaW1wb3J0IHRhYkhhc1ByZXNlbmNlIGZyb20gXCIuL3RhYkhhc1ByZXNlbmNlXCI7XHJcbmltcG9ydCBjaGVja1VwZGF0ZSBmcm9tIFwiLi91cGRhdGVDaGVja2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBpbmplY3RQcmVzZW5jZShcclxuXHR0YWJJZDogbnVtYmVyLFxyXG5cdHByZXNlbmNlOiBwcmVzZW5jZVN0b3JhZ2VbMF1cclxuKSB7XHJcblx0aWYgKFxyXG5cdFx0KGF3YWl0IGNoZWNrVXBkYXRlKGRldGVjdFNhZmFyaSgpKSkudXJnZW50VXBkYXRlICYmXHJcblx0XHQhKGF3YWl0IGNoZWNrVXBkYXRlKGRldGVjdFNhZmFyaSgpKSkubGF0ZXN0VmVyc2lvblxyXG5cdClcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHRpZiAoYXdhaXQgdGFiSGFzUHJlc2VuY2UodGFiSWQpKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcclxuXHRcdGNvbnN0IGlkZW50aWZpZXIgPSAoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIFwiaWRlbnRpZmllclwiKSkuaWRlbnRpZmllcjtcclxuXHJcblx0XHRsZXQgbG9nZ2VyID0gXCJcIjtcclxuXHJcblx0XHRpZiAocHJlc2VuY2UubWV0YWRhdGEucmVhZExvZ3MpIHtcclxuXHRcdFx0Y29uc3QgTUFYX0xPR19FTlRSSUVTID0gMTAwO1xyXG5cdFx0XHRsb2dnZXIgPSBgXHJcblx0XHRcdFx0Y29uc3QgUHJlTWlEX2NvbnNvbGVMb2dnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG5cdFx0XHRcdFByZU1pRF9jb25zb2xlTG9nZ2VyLnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG5cdFx0XHRcdFByZU1pRF9jb25zb2xlTG9nZ2VyLmlkID0gXCJQcmVNaURfY29uc29sZUxvZ2dlclwiO1xyXG5cdFx0XHRcdFByZU1pRF9jb25zb2xlTG9nZ2VyLmlubmVyVGV4dCA9IFxcYFxyXG5cdFx0XHRcdGNvbnNvbGUuc3RkbG9nwqA9wqBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nc8KgPcKgW107XHJcblx0XHRcdFx0Y29uc29sZS5sb2fCoD3CoGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0bGV0IGluYyA9IEFycmF5LmZyb20oYXJndW1lbnRzKTtcclxuXHRcdFx0XHRcdGluYy5mb3JFYWNoKGFyZyA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9ncy5wdXNoKGFyZyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdHdoaWxlIChjb25zb2xlLmxvZ3MubGVuZ3RoID4gJHtNQVhfTE9HX0VOVFJJRVN9KSB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9ncy5zaGlmdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc29sZS5zdGRsb2cuYXBwbHkoY29uc29sZSzCoGFyZ3VtZW50cyk7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRcXGA7XHJcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChQcmVNaURfY29uc29sZUxvZ2dlcik7XHJcblx0XHRcdFx0YC5yZXBsYWNlKC8oXFxyXFxuKXxcXG4vZywgXCJcIik7XHJcblx0XHR9XHJcblxyXG5cdFx0Y2hyb21lLnRhYnMuZXhlY3V0ZVNjcmlwdChcclxuXHRcdFx0dGFiSWQsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRjb2RlOlxyXG5cdFx0XHRcdFx0YGxldCBQcmVNaURfUHJlc2VuY2U9dHJ1ZTtsZXQgUHJlTWlEX0lkZW50aWZpZXI9XCIke2lkZW50aWZpZXJ9XCI7bGV0IFBNRF9JbmZvPXt0YWJJZDoke3RhYklkfX07bGV0IFByZU1pRF9NZXRhZGF0YT0ke0pTT04uc3RyaW5naWZ5KFxyXG5cdFx0XHRcdFx0XHRwcmVzZW5jZS5tZXRhZGF0YVxyXG5cdFx0XHRcdFx0KX07YCArXHJcblx0XHRcdFx0XHRwcmVzZW5jZS5wcmVzZW5jZSArXHJcblx0XHRcdFx0XHRsb2dnZXIsXHJcblx0XHRcdFx0cnVuQXQ6IFwiZG9jdW1lbnRfc3RhcnRcIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRyZXNvbHZlXHJcblx0XHQpO1xyXG5cclxuXHRcdHN1Y2Nlc3MoXCJpbmplY3RQcmVzZW5jZS50c1wiLCBgSW5qZWN0ZWQgJHtwcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlfWApO1xyXG5cdFx0aWYgKHByZXNlbmNlLm1ldGFkYXRhLnJlYWRMb2dzKSB7XHJcblx0XHRcdHN1Y2Nlc3MoXCJpbmplY3RQcmVzZW5jZS50c1wiLCBgUmVhZGluZyBsb2dzYCk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuIiwiaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGNsZWFyQWN0aXZpdHkgZnJvbSBcIi4vZnVuY3Rpb25zL2NsZWFyQWN0aXZpdHlcIjtcclxuaW1wb3J0IGdyYXBocWwsIHsgZ2V0UHJlc2VuY2VNZXRhZGF0YSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9ncmFwaHFsXCI7XHJcbmltcG9ydCBpbmplY3RQcmVzZW5jZSBmcm9tIFwiLi9mdW5jdGlvbnMvaW5qZWN0UHJlc2VuY2VcIjtcclxuaW1wb3J0IHRhYkhhc1ByZXNlbmNlIGZyb20gXCIuL2Z1bmN0aW9ucy90YWJIYXNQcmVzZW5jZVwiO1xyXG5cclxuZXhwb3J0IGxldCBwcmlvcml0eVRhYjogbnVtYmVyID0gbnVsbDtcclxuZXhwb3J0IGxldCBvbGRQcmVzZW5jZTogYW55ID0gbnVsbDtcclxuXHJcbmV4cG9ydCBsZXQgY3VycmVudFByZXNlbmNlID0gbnVsbDtcclxuXHJcbmxldCBjdXJyVGltZW91dDogbnVtYmVyO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhYlByaW9yaXR5KGluZm86IGFueSA9IHVuZGVmaW5lZCkge1xyXG5cdC8vKiBHZXQgbGFzdCBmb2N1c2VkIHdpbmRvd1xyXG5cdGxldCBsYXN0Rm9jdXNlZFdpbmRvdyA9IGF3YWl0IG5ldyBQcm9taXNlPGNocm9tZS53aW5kb3dzLldpbmRvdz4ocmVzb2x2ZSA9PlxyXG5cdFx0XHRjaHJvbWUud2luZG93cy5nZXRMYXN0Rm9jdXNlZChyZXNvbHZlKVxyXG5cdFx0KSxcclxuXHRcdGFjdGl2ZVRhYiA9IChcclxuXHRcdFx0YXdhaXQgbmV3IFByb21pc2U8Y2hyb21lLnRhYnMuVGFiW10+KHJlc29sdmUgPT5cclxuXHRcdFx0XHRjaHJvbWUudGFicy5xdWVyeShcclxuXHRcdFx0XHRcdHsgYWN0aXZlOiB0cnVlLCB3aW5kb3dJZDogbGFzdEZvY3VzZWRXaW5kb3cuaWQgfSxcclxuXHRcdFx0XHRcdHRhYnMgPT4gcmVzb2x2ZSh0YWJzKVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KVxyXG5cdFx0KVswXSxcclxuXHRcdHByZXNlbmNlOiBwcmVzZW5jZVN0b3JhZ2UgPSAoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIFwicHJlc2VuY2VzXCIpKVxyXG5cdFx0XHQucHJlc2VuY2VzO1xyXG5cclxuXHQvLyogTm8gcG9pbnQgdG8gY29udGludWUgaWYgdGhlcmVzIG5vIHVybFxyXG5cdGlmIChcclxuXHRcdCFhY3RpdmVUYWI/LnVybCB8fFxyXG5cdFx0YWN0aXZlVGFiLnVybC5zdGFydHNXaXRoKFwiY2hyb21lXCIpIHx8XHJcblx0XHRhY3RpdmVUYWIudXJsLnN0YXJ0c1dpdGgoXCJlZGdlXCIpXHJcblx0KVxyXG5cdFx0cmV0dXJuO1xyXG5cclxuXHQvLyogQ2hlY2sgaWYgdGhpcyB3ZWJzaXRlIHVzZXMgdGhlIFByZU1pRF9QcmVzZW5jZSBtZXRhIHRhZ1xyXG5cdGxldCBwbWRNZXRhVGFnOiBzdHJpbmcgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+XHJcblx0XHRjaHJvbWUudGFicy5leGVjdXRlU2NyaXB0KFxyXG5cdFx0XHRhY3RpdmVUYWIuaWQsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRjb2RlOiBgdHJ5e2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIlByZU1pRF9QcmVzZW5jZVwiXScpLmNvbnRlbnR9Y2F0Y2goZSl7ZmFsc2V9YFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRyZXMgPT4ge1xyXG5cdFx0XHRcdGlmICghcmVzKSB7XHJcblx0XHRcdFx0XHRyZXNvbHZlKHVuZGVmaW5lZCk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXNvbHZlKHJlc1swXSk7XHJcblx0XHRcdH1cclxuXHRcdClcclxuXHQpO1xyXG5cclxuXHRwcmVzZW5jZSA9IHByZXNlbmNlLmZpbHRlcihwID0+IHtcclxuXHRcdGlmIChwLm1ldGFUYWcgJiYgcC5tZXRhZGF0YS5zZXJ2aWNlID09PSBwbWRNZXRhVGFnKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgcmVzID0gbnVsbDtcclxuXHJcblx0XHQvLyogSWYgbm90IGVuYWJsZWQgcmV0dXJuIGZhbHNlXHJcblx0XHRpZiAoIXAuZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgcC5tZXRhZGF0YS5yZWdFeHAgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuXHRcdFx0cmVzID0gYWN0aXZlVGFiLnVybC5tYXRjaChcclxuXHRcdFx0XHRuZXcgUmVnRXhwKFwiXihodHRwcz86fGZpbGU6Wy9dPylbL117Mn1cIiArIHAubWV0YWRhdGEucmVnRXhwKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0aWYgKHJlcyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRlbHNlIHJldHVybiByZXMubGVuZ3RoID4gMDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoQXJyYXkuaXNBcnJheShwLm1ldGFkYXRhLnVybCkpXHJcblx0XHRcdHJlcyA9XHJcblx0XHRcdFx0cC5tZXRhZGF0YS51cmwuZmlsdGVyKHVybCA9PiBuZXcgVVJMKGFjdGl2ZVRhYi51cmwpLmhvc3RuYW1lID09PSB1cmwpXHJcblx0XHRcdFx0XHQubGVuZ3RoID4gMDtcclxuXHRcdGVsc2UgcmVzID0gbmV3IFVSTChhY3RpdmVUYWIudXJsKS5ob3N0bmFtZSA9PT0gcC5tZXRhZGF0YS51cmw7XHJcblxyXG5cdFx0cmV0dXJuIHJlcztcclxuXHR9KTtcclxuXHJcblx0Ly8qIElmIFByZU1pRCBoYXMgbm8gcHJlc2VuY2UgdG8gaW5qZWN0IGhlcmUsIGluamVjdCBvbmUgaWYgcG1kTWV0YVRhZyBoYXMgb25lXHJcblx0aWYgKHByZXNlbmNlLmxlbmd0aCA9PT0gMCAmJiBwbWRNZXRhVGFnKSB7XHJcblx0XHRjb25zdCBtZXRhZGF0YSA9IChhd2FpdCBnZXRQcmVzZW5jZU1ldGFkYXRhKHBtZE1ldGFUYWcpKS5kYXRhLm1ldGFkYXRhLFxyXG5cdFx0XHRwcnM6IGFueSA9IHtcclxuXHRcdFx0XHRtZXRhZGF0YTogbWV0YWRhdGEsXHJcblx0XHRcdFx0cHJlc2VuY2U6IG51bGwsXHJcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRtZXRhVGFnOiB0cnVlLFxyXG5cdFx0XHRcdGhpZGRlbjogZmFsc2VcclxuXHRcdFx0fTtcclxuXHJcblx0XHRjb25zdCBwcmVzZW5jZUpzQ29kZSA9IChcclxuXHRcdFx0YXdhaXQgZ3JhcGhxbChgXHJcblx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRwcmVzZW5jZXMoc2VydmljZTogXCIke3BtZE1ldGFUYWd9XCIpIHtcclxuXHRcdFx0XHRcdHByZXNlbmNlSnNcclxuXHRcdFx0XHRcdCR7bWV0YWRhdGEuaWZyYW1lID8gXCJpZnJhbWVKc1wiIDogXCJcIn1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdGApXHJcblx0XHQpLmRhdGEucHJlc2VuY2VzWzBdO1xyXG5cdFx0cHJzLnByZXNlbmNlID0gcHJlc2VuY2VKc0NvZGUucHJlc2VuY2VKcztcclxuXHJcblx0XHRpZiAobWV0YWRhdGEuaWZyYW1lKSB7XHJcblx0XHRcdHBycy5pZnJhbWUgPSBwcmVzZW5jZUpzQ29kZS5pZnJhbWVKcztcclxuXHRcdH1cclxuXHRcdHByZXNlbmNlID0gW3Byc107XHJcblxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFwicHJlc2VuY2VzXCIsIGRhdGEgPT4ge1xyXG5cdFx0XHRjb25zdCBleFByZXNlbmNlID0gZGF0YS5wcmVzZW5jZXMuZmluZEluZGV4KFxyXG5cdFx0XHRcdHAgPT5cclxuXHRcdFx0XHRcdHAubWV0YWRhdGEuc2VydmljZSA9PT0gcHJzLm1ldGFkYXRhLnNlcnZpY2UgJiZcclxuXHRcdFx0XHRcdHAubWV0YVRhZyA9PT0gcHJzLm1ldGFUYWdcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGlmIChleFByZXNlbmNlID4gLTEpIHtcclxuXHRcdFx0XHRjb25zdCBlbmFibGVkID0gZGF0YS5wcmVzZW5jZXNbZXhQcmVzZW5jZV0uZW5hYmxlZCxcclxuXHRcdFx0XHRcdHByZXNlbmNlMSA9IHBycztcclxuXHRcdFx0XHRwcmVzZW5jZTEuZW5hYmxlZCA9IGVuYWJsZWQ7XHJcblx0XHRcdFx0cHJlc2VuY2UxLmhpZGRlbiA9IGZhbHNlO1xyXG5cdFx0XHRcdGRhdGEucHJlc2VuY2VzW2V4UHJlc2VuY2VdID0gcHJlc2VuY2UxO1xyXG5cdFx0XHR9IGVsc2UgZGF0YS5wcmVzZW5jZXMucHVzaChwcnMpO1xyXG5cdFx0XHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoZGF0YSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vKiBQcmVzZW5jZSBhdmFpbGFibGUgZm9yIGN1cnJVcmxcclxuXHRpZiAocHJlc2VuY2UubGVuZ3RoID4gMCkge1xyXG5cdFx0Ly8qIENoZWNrIGlmIHRoaXMgdGFiIGFscmVhZHkgaGFzIGEgcHJlc2VuY2UgaW5qZWN0ZWRcclxuXHRcdGNvbnN0IHRhYkhhc1BycyA9IGF3YWl0IHRhYkhhc1ByZXNlbmNlKGFjdGl2ZVRhYi5pZCk7XHJcblxyXG5cdFx0Ly8qIElmIGEgdGFiIGlzIGFscmVhZHkgcHJpb3JpdGl6ZWQsIHJ1biA1IHNlYyB0aW1lb3V0XHJcblx0XHRpZiAocHJpb3JpdHlUYWIpIHtcclxuXHRcdFx0Ly8qIElmIHRpbWVvdXQgZW5kcyBjaGFuZ2UgcHJpb3JpdHlUYWJcclxuXHRcdFx0aWYgKCFjdXJyVGltZW91dCAmJiBwcmlvcml0eVRhYiAhPT0gYWN0aXZlVGFiLmlkKVxyXG5cdFx0XHRcdGN1cnJUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0Ly8qIENsZWFyIG9sZCBhY3Rpdml0eVxyXG5cdFx0XHRcdFx0Y2xlYXJBY3Rpdml0eSgpO1xyXG5cdFx0XHRcdFx0Ly8qIERpc2FibGUgdGFiUHJpb3JpdHkgb24gb2xkIHByaW9yaXR5VGFiXHJcblx0XHRcdFx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwgeyB0YWJQcmlvcml0eTogZmFsc2UgfSk7XHJcblx0XHRcdFx0XHQvLyogVXBkYXRlIHRhYiB0byBiZSB0aGlzIG9uZVxyXG5cdFx0XHRcdFx0cHJpb3JpdHlUYWIgPSBhY3RpdmVUYWIuaWQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8qIElmIHRhYiBkb2Vzbid0IGhhdmUgcHJlc2VuY2UsIGluamVjdFxyXG5cdFx0XHRcdFx0aWYgKCF0YWJIYXNQcnMpIGF3YWl0IGluamVjdFByZXNlbmNlKHByaW9yaXR5VGFiLCBwcmVzZW5jZVswXSk7XHJcblxyXG5cdFx0XHRcdFx0b2xkUHJlc2VuY2UgPSBwcmVzZW5jZVswXTtcclxuXHRcdFx0XHRcdGNocm9tZS50YWJzLnNlbmRNZXNzYWdlKHByaW9yaXR5VGFiLCB7IHRhYlByaW9yaXR5OiB0cnVlIH0pO1xyXG5cclxuXHRcdFx0XHRcdHVwZGF0ZVBvcHVwVmlzaWJpbGl0eSgpO1xyXG5cclxuXHRcdFx0XHRcdC8vKiBSZXNldCBUaW1lb3V0XHJcblx0XHRcdFx0XHRjdXJyVGltZW91dCA9IG51bGw7XHJcblx0XHRcdFx0fSwgNSAqIDEwMDApO1xyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHQvLyogQ2hlY2sgaWYgcHJlc2VuY2UgaW5qZWN0ZWQsIGlmIG5vdCBpbmplY3QgYW5kIHNlbmQgVGFiUHJpb3JpdHlcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRwcmlvcml0eVRhYiA9PT0gYWN0aXZlVGFiLmlkICYmXHJcblx0XHRcdFx0XHQhdGFiSGFzUHJzICYmXHJcblx0XHRcdFx0XHRpbmZvICYmXHJcblx0XHRcdFx0XHRpbmZvLnN0YXR1cyAmJlxyXG5cdFx0XHRcdFx0aW5mby5zdGF0dXMgPT09IFwiY29tcGxldGVcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Ly8qIE9ubHkgY2xlYXIgcHJlc2VuY2UgaWYgb2xkIHByZXNlbmNlICE9IG5ldyBwcmVzZW5jZVxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRvbGRQcmVzZW5jZSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdFx0XHRvbGRQcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlICE9PSBwcmVzZW5jZVswXS5tZXRhZGF0YS5zZXJ2aWNlXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8qIENsZWFyIG9sZCBwcmVzZW5jZSBmcm9tIHByZXZpb3VzIHBhZ2VcclxuXHRcdFx0XHRcdFx0Y2xlYXJBY3Rpdml0eSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8qIGluamVjdCBuZXcgcHJlc2VuY2VcclxuXHRcdFx0XHRcdGF3YWl0IGluamVjdFByZXNlbmNlKHByaW9yaXR5VGFiLCBwcmVzZW5jZVswXSk7XHJcblx0XHRcdFx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwge1xyXG5cdFx0XHRcdFx0XHR0YWJQcmlvcml0eTogdHJ1ZVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRvbGRQcmVzZW5jZSA9IHByZXNlbmNlWzBdO1xyXG5cdFx0XHRcdFx0dXBkYXRlUG9wdXBWaXNpYmlsaXR5KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRvbGRQcmVzZW5jZSA9IHByZXNlbmNlWzBdO1xyXG5cdFx0XHRwcmlvcml0eVRhYiA9IGFjdGl2ZVRhYi5pZDtcclxuXHJcblx0XHRcdGlmICghdGFiSGFzUHJzKSBhd2FpdCBpbmplY3RQcmVzZW5jZShwcmlvcml0eVRhYiwgcHJlc2VuY2VbMF0pO1xyXG5cclxuXHRcdFx0Y2hyb21lLnRhYnMuc2VuZE1lc3NhZ2UocHJpb3JpdHlUYWIsIHtcclxuXHRcdFx0XHR0YWJQcmlvcml0eTogdHJ1ZVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dXBkYXRlUG9wdXBWaXNpYmlsaXR5KCk7XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdGlmIChwcmlvcml0eVRhYiA9PT0gYWN0aXZlVGFiLmlkKSB7XHJcblx0XHRcdG9sZFByZXNlbmNlID0gbnVsbDtcclxuXHRcdFx0Y2xlYXJBY3Rpdml0eSh0cnVlKTtcclxuXHRcdH1cclxuXHRcdGNsZWFyVGltZW91dChjdXJyVGltZW91dCk7XHJcblx0XHRjdXJyVGltZW91dCA9IG51bGw7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJpb3JpdHlUYWIodmFsdWU6IGFueSkge1xyXG5cdHByaW9yaXR5VGFiID0gdmFsdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVBvcHVwVmlzaWJpbGl0eSgpIHtcclxuXHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoXCJwcmVzZW5jZXNcIiwgKHsgcHJlc2VuY2VzIH0pID0+IHtcclxuXHRcdGNvbnN0IHByZXNlbmNlVG9TaG93ID0gcHJlc2VuY2VzLmZpbmRJbmRleChcclxuXHRcdFx0XHRwID0+XHJcblx0XHRcdFx0XHRwLm1ldGFUYWcgJiZcclxuXHRcdFx0XHRcdHAuaGlkZGVuICYmXHJcblx0XHRcdFx0XHRwLm1ldGFkYXRhLnNlcnZpY2UgPT09IG9sZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2VcclxuXHRcdFx0KSxcclxuXHRcdFx0cHJlc2VuY2VUb0hpZGUgPSBwcmVzZW5jZXMuZmluZEluZGV4KFxyXG5cdFx0XHRcdHAgPT5cclxuXHRcdFx0XHRcdHAubWV0YVRhZyAmJlxyXG5cdFx0XHRcdFx0IXAuaGlkZGVuICYmXHJcblx0XHRcdFx0XHRwLm1ldGFkYXRhLnNlcnZpY2UgIT09IG9sZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2VcclxuXHRcdFx0KTtcclxuXHJcblx0XHRpZiAocHJlc2VuY2VUb1Nob3cgPiAtMSkgcHJlc2VuY2VzW3ByZXNlbmNlVG9TaG93XS5oaWRkZW4gPSBmYWxzZTtcclxuXHRcdGlmIChwcmVzZW5jZVRvSGlkZSA+IC0xKSBwcmVzZW5jZXNbcHJlc2VuY2VUb0hpZGVdLmhpZGRlbiA9IHRydWU7XHJcblxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBwcmVzZW5jZXMgfSk7XHJcblx0fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoaWRlTWV0YVRhZ1ByZXNlbmNlcygpIHtcclxuXHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoXCJwcmVzZW5jZXNcIiwgKHsgcHJlc2VuY2VzIH0pID0+IHtcclxuXHRcdGNvbnN0IHByZXNlbmNlVG9IaWRlID0gcHJlc2VuY2VzLmZpbmRJbmRleChwID0+IHAubWV0YVRhZyAmJiAhcC5oaWRkZW4pO1xyXG5cclxuXHRcdGlmIChwcmVzZW5jZVRvSGlkZSA+IC0xKSBwcmVzZW5jZXNbcHJlc2VuY2VUb0hpZGVdLmhpZGRlbiA9IHRydWU7XHJcblxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBwcmVzZW5jZXMgfSk7XHJcblx0fSk7XHJcbn1cclxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3BPYmoobWFpbk9iajogYW55KSB7XHJcblx0Ly8qIG9iakNvcHkgd2lsbCBzdG9yZSBhIGNvcHkgb2YgdGhlIG1haW5PYmpcclxuXHRsZXQgb2JqQ29weTogYW55ID0ge30sXHJcblx0XHRrZXk6IGFueTtcclxuXHJcblx0Zm9yIChrZXkgaW4gbWFpbk9iaikge1xyXG5cdFx0Ly8qIGNvcGllcyBlYWNoIHByb3BlcnR5IHRvIHRoZSBvYmpDb3B5IG9iamVjdFxyXG5cdFx0b2JqQ29weVtrZXldID0gbWFpbk9ialtrZXldO1xyXG5cdH1cclxuXHRyZXR1cm4gb2JqQ29weTtcclxufVxyXG4iLCJpbXBvcnQgeyByZWxlYXNlVHlwZSB9IGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCIuLi9kZWJ1Z1wiO1xyXG5pbXBvcnQgeyBzb2NrZXQgfSBmcm9tIFwiLi4vc29ja2V0TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBnZXRTdG9yYWdlIH0gZnJvbSBcIi4vYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCBjcE9iaiBmcm9tIFwiLi9jcE9ialwiO1xyXG5pbXBvcnQgZGV0ZWN0U2FmYXJpIGZyb20gXCIuL2RldGVjdFNhZmFyaVwiO1xyXG5pbXBvcnQgY2hlY2tVcGRhdGUgZnJvbSBcIi4vdXBkYXRlQ2hlY2tlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc2V0QWN0aXZpdHkoXHJcblx0cHJlc2VuY2U6IGFueSxcclxuXHRzZXR0aW5nczogYW55ID0gdW5kZWZpbmVkXHJcbikge1xyXG5cdGlmIChbXCJBTFBIQVwiLCBcIkJFVEFcIl0uaW5jbHVkZXMocmVsZWFzZVR5cGUpKSB7XHJcblx0XHRjb25zdCB7IGF1dGhvcml6ZWRCZXRhQWxwaGEgfSA9IGF3YWl0IGdldFN0b3JhZ2UoXHJcblx0XHRcdFwibG9jYWxcIixcclxuXHRcdFx0XCJhdXRob3JpemVkQmV0YUFscGhhXCJcclxuXHRcdCk7XHJcblxyXG5cdFx0aWYgKCFhdXRob3JpemVkQmV0YUFscGhhKSByZXR1cm47XHJcblx0fVxyXG5cclxuXHRpZiAoXHJcblx0XHQoYXdhaXQgY2hlY2tVcGRhdGUoZGV0ZWN0U2FmYXJpKCkpKS51cmdlbnRVcGRhdGUgJiZcclxuXHRcdCEoYXdhaXQgY2hlY2tVcGRhdGUoZGV0ZWN0U2FmYXJpKCkpKS5sYXRlc3RWZXJzaW9uXHJcblx0KVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRpZiAoIXNldHRpbmdzKSBzZXR0aW5ncyA9IChhd2FpdCBnZXRTdG9yYWdlKFwic3luY1wiLCBcInNldHRpbmdzXCIpKS5zZXR0aW5ncztcclxuXHRpZiAocHJlc2VuY2UgPT0gbnVsbCB8fCAhc2V0dGluZ3MuZW5hYmxlZC52YWx1ZSkgcmV0dXJuO1xyXG5cclxuXHRjb25zdCBwVFMgPSBjcE9iaihwcmVzZW5jZSk7XHJcblxyXG5cdGlmIChwVFMudHJheVRpdGxlICYmIHNldHRpbmdzLnRpdGxlTWVudWJhci52YWx1ZSAmJiBwVFMudHJheVRpdGxlLnRyaW0oKSlcclxuXHRcdHBUUy50cmF5VGl0bGUgPSBwVFMudHJheVRpdGxlLnRyaW0oKTtcclxuXHRlbHNlIHBUUy50cmF5VGl0bGUgPSBcIlwiO1xyXG5cclxuXHRpZiAoIXNldHRpbmdzLm1lZGlhS2V5cy52YWx1ZSkgcFRTLm1lZGlhS2V5cyA9IGZhbHNlO1xyXG5cclxuXHRpZiAocFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzKVxyXG5cdFx0cFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzLmxlbmd0aCA8IDNcclxuXHRcdFx0PyAocFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzID0gXCIgICBcIiArIHBUUy5wcmVzZW5jZURhdGEuZGV0YWlscylcclxuXHRcdFx0OiAocFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzID0gcFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzXHJcblx0XHRcdFx0XHQuc2xpY2UoMCwgMTI4KVxyXG5cdFx0XHRcdFx0LnRyaW0oKSk7XHJcblx0aWYgKHBUUy5wcmVzZW5jZURhdGEuc3RhdGUpXHJcblx0XHRwVFMucHJlc2VuY2VEYXRhLnN0YXRlLmxlbmd0aCA8IDNcclxuXHRcdFx0PyAocFRTLnByZXNlbmNlRGF0YS5zdGF0ZSA9IFwiICAgXCIgKyBwVFMucHJlc2VuY2VEYXRhLnN0YXRlKVxyXG5cdFx0XHQ6IChwVFMucHJlc2VuY2VEYXRhLnN0YXRlID0gcFRTLnByZXNlbmNlRGF0YS5zdGF0ZS5zbGljZSgwLCAxMjgpLnRyaW0oKSk7XHJcblxyXG5cdGlmIChzb2NrZXQuY29ubmVjdGVkKSBzb2NrZXQuZW1pdChcInNldEFjdGl2aXR5XCIsIHBUUyk7XHJcblx0aW5mbyhcInNldEFjdGl2aXR5LnRzXCIsIFwic2V0QWN0aXZpdHlcIik7XHJcbn1cclxuIiwiaW1wb3J0IHsgc2V0U3RvcmFnZSB9IGZyb20gXCIuLi9mdW5jdGlvbnMvYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCBjcE9iaiBmcm9tIFwiLi4vZnVuY3Rpb25zL2NwT2JqXCI7XHJcbmltcG9ydCBkZXRlY3RTYWZhcmkgZnJvbSBcIi4uL2Z1bmN0aW9ucy9kZXRlY3RTYWZhcmlcIjtcclxuaW1wb3J0IGlzRXF1aXZhbGVudCBmcm9tIFwiLi4vZnVuY3Rpb25zL2lzRXF1aXZhbGVudFwiO1xyXG5pbXBvcnQgc2V0QWN0aXZpdHkgZnJvbSBcIi4uL2Z1bmN0aW9ucy9zZXRBY3Rpdml0eVwiO1xyXG5pbXBvcnQgY2hlY2tVcGRhdGUgZnJvbSBcIi4uL2Z1bmN0aW9ucy91cGRhdGVDaGVja2VyXCI7XHJcbmltcG9ydCB7IHVwZGF0ZUFsbFN0cmluZ3MgfSBmcm9tIFwiLi4vbGFuZ01hbmFnZXJcIjtcclxuaW1wb3J0IHsgcGxhdGZvcm1UeXBlIH0gZnJvbSBcIi4uL3ByZXNlbmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBhcHBWZXJzaW9uLCBzb2NrZXQsIHN1cHBvcnRlZEFwcFZlcnNpb24gfSBmcm9tIFwiLi4vc29ja2V0TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBzdGFydCB9IGZyb20gXCIuL2dlbmVyaWNcIjtcclxuXHJcbi8vKiBTb21lIGRlYnVnIHN0dWZmIHRvIHByZXZlbnQgdGltZXN0YW1wIGp1bXBpbmdcclxuZXhwb3J0IGxldCBvbGRPYmplY3Q6IGFueSA9IG51bGw7XHJcbmV4cG9ydCBsZXQgb2xkQWN0aXZpdHk6IGFueSA9IG51bGw7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0T2xkT2JqZWN0KG9iamVjdDogYW55KSB7XHJcblx0b2xkT2JqZWN0ID0gb2JqZWN0O1xyXG59XHJcblxyXG5jb25zdCBmb3JtYXROdW0gPSBuID0+XHJcblx0QXJyYXkuZnJvbShTdHJpbmcobikpXHJcblx0XHQucmV2ZXJzZSgpXHJcblx0XHQubWFwKChhLCBpKSA9PiB7XHJcblx0XHRcdGlmIChpICUgMSA9PSAwICYmIGkgPiAwKSByZXR1cm4gYSArIFwiLlwiO1xyXG5cdFx0XHRyZXR1cm4gYTtcclxuXHRcdH0pXHJcblx0XHQucmV2ZXJzZSgpXHJcblx0XHQuam9pbihcIlwiKTtcclxuXHJcbmNocm9tZS5ydW50aW1lLm9uQ29ubmVjdC5hZGRMaXN0ZW5lcihmdW5jdGlvbihwb3J0KSB7XHJcblx0aGFuZGxlVGFicyhwb3J0KTtcclxuXHRoYW5kbGVQb3B1cChwb3J0KTtcclxuXHRoYW5kbGVQcmVzZW5jZShwb3J0KTtcclxuXHRoYW5kbGVBcHBUcyhwb3J0KTtcclxufSk7XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVUYWJzKHBvcnQ6IGNocm9tZS5ydW50aW1lLlBvcnQpIHtcclxuXHRpZiAocG9ydC5uYW1lID09PSBcInRhYnNcIikge1xyXG5cdFx0Y29uc3Qgc2VuZFJlc3BvbnNlID0gKCkgPT4ge1xyXG5cdFx0XHRwb3J0LnBvc3RNZXNzYWdlKHtcclxuXHRcdFx0XHRjb25uZWN0ZWQ6IHNvY2tldC5jb25uZWN0ZWRcclxuXHRcdFx0fSk7XHJcblx0XHR9O1xyXG5cclxuXHRcdHNlbmRSZXNwb25zZSgpO1xyXG5cclxuXHRcdHNvY2tldC5vbihcImNvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHRcdHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHJcblx0XHRwb3J0Lm9uRGlzY29ubmVjdC5hZGRMaXN0ZW5lcigoKSA9PiB7XHJcblx0XHRcdHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcImNvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHRcdFx0c29ja2V0LnJlbW92ZUxpc3RlbmVyKFwiZGlzY29ubmVjdFwiLCBzZW5kUmVzcG9uc2UpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVQb3B1cChwb3J0OiBjaHJvbWUucnVudGltZS5Qb3J0KSB7XHJcblx0aWYgKHBvcnQubmFtZSA9PT0gXCJwb3B1cFwiKSB7XHJcblx0XHRjb25zdCBzZW5kUmVzcG9uc2UgPSBhc3luYyAoKSA9PiB7XHJcblx0XHRcdHBvcnQucG9zdE1lc3NhZ2Uoe1xyXG5cdFx0XHRcdGNvbm5lY3RlZDogc29ja2V0LmNvbm5lY3RlZCxcclxuXHRcdFx0XHRhcHBWZXJzaW9uU3VwcG9ydGVkOiBzdXBwb3J0ZWRBcHBWZXJzaW9uKCksXHJcblx0XHRcdFx0bGF0ZXN0RXh0ZW5zaW9uVmVyc2lvbjogYXdhaXQgY2hlY2tVcGRhdGUoZGV0ZWN0U2FmYXJpKCkpXHJcblx0XHRcdH0pO1xyXG5cdFx0fTtcclxuXHJcblx0XHRzZW5kUmVzcG9uc2UoKTtcclxuXHJcblx0XHRzb2NrZXQub24oXCJjb25uZWN0XCIsIHNlbmRSZXNwb25zZSk7XHJcblx0XHRzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsIHNlbmRSZXNwb25zZSk7XHJcblxyXG5cdFx0cG9ydC5vbkRpc2Nvbm5lY3QuYWRkTGlzdGVuZXIoKCkgPT4ge1xyXG5cdFx0XHRzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJjb25uZWN0XCIsIHNlbmRSZXNwb25zZSk7XHJcblx0XHRcdHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcImRpc2Nvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHBvcnQub25NZXNzYWdlLmFkZExpc3RlbmVyKGFzeW5jIG1zZyA9PiB7XHJcblx0XHRcdGlmIChtc2cuYWN0aW9uID09PSBcImxvYWRMb2NhbFByZXNlbmNlXCIgJiYgc29ja2V0LmNvbm5lY3RlZClcclxuXHRcdFx0XHRzb2NrZXQuZW1pdChcInNlbGVjdExvY2FsUHJlc2VuY2VcIik7XHJcblx0XHRcdGVsc2UgaWYgKG1zZy5hY3Rpb24gPT09IFwicG9wdXBPcGVuZWRcIikgYXdhaXQgdXBkYXRlQWxsU3RyaW5ncygpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVQcmVzZW5jZShwb3J0OiBjaHJvbWUucnVudGltZS5Qb3J0KSB7XHJcblx0aWYgKHBvcnQubmFtZSA9PT0gXCJjb250ZW50U2NyaXB0XCIpIHtcclxuXHRcdHBvcnQub25NZXNzYWdlLmFkZExpc3RlbmVyKGFzeW5jIG1zZyA9PiB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0eXBlb2YgbXNnLnByZXNlbmNlID09PSBcInVuZGVmaW5lZFwiIHx8XHJcblx0XHRcdFx0dHlwZW9mIG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEgPT09IFwidW5kZWZpbmVkXCJcclxuXHRcdFx0KVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IHBsYXRmb3JtOiBwbGF0Zm9ybVR5cGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+XHJcblx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUuZ2V0UGxhdGZvcm1JbmZvKGluZm8gPT5cclxuXHRcdFx0XHRcdHJlc29sdmUoe1xyXG5cdFx0XHRcdFx0XHRvczogaW5mby5vcyxcclxuXHRcdFx0XHRcdFx0YXJjaDogaW5mby5hcmNoXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGNvbnN0IHBlbmd1aW5FbW9qaSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KDEyODAzOSk7IC8vID8/XHJcblxyXG5cdFx0XHRpZiAodHlwZW9mIG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEubGFyZ2VJbWFnZUtleSAhPT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0XHRtc2cucHJlc2VuY2UucHJlc2VuY2VEYXRhLmxhcmdlSW1hZ2VUZXh0ID0gYFByZU1pRCAke1xyXG5cdFx0XHRcdFx0cGxhdGZvcm0ub3MgPT09IFwibGludXhcIiB8fCBwbGF0Zm9ybS5vcyA9PT0gXCJjcm9zXCIgPyBwZW5ndWluRW1vamkgOiBcIlwiXHJcblx0XHRcdFx0fSB2JHtmb3JtYXROdW0oYXBwVmVyc2lvbil9ICR7U3RyaW5nLmZyb21DaGFyQ29kZSg4MjI2KX0gRXh0IHYke1xyXG5cdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3QoKS52ZXJzaW9uX25hbWVcclxuXHRcdFx0XHR9YDtcclxuXHJcblx0XHRcdGlmIChvbGRPYmplY3QgPT0gbnVsbCkge1xyXG5cdFx0XHRcdG9sZE9iamVjdCA9IGNwT2JqKG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEpO1xyXG5cdFx0XHRcdG9sZEFjdGl2aXR5ID0gbXNnLnByZXNlbmNlO1xyXG5cdFx0XHRcdHNldEFjdGl2aXR5KG1zZy5wcmVzZW5jZSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyogQ2hlY2sgZGlmZmVyZW5jZXMgYW5kIGlmIHRoZXJlIGFyZW4ndCBhbnkgcmV0dXJuXHJcblxyXG5cdFx0XHRjb25zdCBjaGVjayA9IGNwT2JqKG9sZE9iamVjdCk7XHJcblx0XHRcdGRlbGV0ZSBjaGVjay5zdGFydFRpbWVzdGFtcDtcclxuXHRcdFx0ZGVsZXRlIGNoZWNrLmVuZFRpbWVzdGFtcDtcclxuXHJcblx0XHRcdGNvbnN0IGNoZWNrMSA9IGNwT2JqKG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEpO1xyXG5cdFx0XHRkZWxldGUgY2hlY2sxLnN0YXJ0VGltZXN0YW1wO1xyXG5cdFx0XHRkZWxldGUgY2hlY2sxLmVuZFRpbWVzdGFtcDtcclxuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQhKFxyXG5cdFx0XHRcdFx0aXNFcXVpdmFsZW50KGNoZWNrLCBjaGVjazEpICYmXHJcblx0XHRcdFx0XHQob2xkT2JqZWN0LmVuZFRpbWVzdGFtcCArIDEgPT09XHJcblx0XHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wIHx8XHJcblx0XHRcdFx0XHRcdG9sZE9iamVjdC5lbmRUaW1lc3RhbXAgLSAxID09PVxyXG5cdFx0XHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wIHx8XHJcblx0XHRcdFx0XHRcdG9sZE9iamVjdC5lbmRUaW1lc3RhbXAgPT09IG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wKVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0b2xkQWN0aXZpdHkgPSBtc2cucHJlc2VuY2U7XHJcblx0XHRcdFx0c2V0QWN0aXZpdHkobXNnLnByZXNlbmNlKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8qIE5vIHByZXNlbmNlIHVwZGF0ZSB3aGVuIGVpdGhlciBzdGFydFRpbWVzdGFtcCAvIGVuZFRpbWVzdGFtcCByZW1vdmVkXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQob2xkT2JqZWN0LnN0YXJ0VGltZXN0YW1wICE9PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuc3RhcnRUaW1lc3RhbXAgPT09IHVuZGVmaW5lZCkgfHxcclxuXHRcdFx0XHQob2xkT2JqZWN0LnN0YXJ0VGltZXN0YW1wID09PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuc3RhcnRUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCkgfHxcclxuXHRcdFx0XHQob2xkT2JqZWN0LmVuZFRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdFx0XHRtc2cucHJlc2VuY2UucHJlc2VuY2VEYXRhLmVuZFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB8fFxyXG5cdFx0XHRcdChvbGRPYmplY3QuZW5kVGltZXN0YW1wID09PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wICE9PSB1bmRlZmluZWQpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdG9sZEFjdGl2aXR5ID0gbXNnLnByZXNlbmNlO1xyXG5cdFx0XHRcdHNldEFjdGl2aXR5KG1zZy5wcmVzZW5jZSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG9sZE9iamVjdCA9IGNwT2JqKG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUFwcFRzKHBvcnQ6IGNocm9tZS5ydW50aW1lLlBvcnQpIHtcclxuXHRpZiAocG9ydC5uYW1lID09PSBcImFwcC50c1wiKSB7XHJcblx0XHRwb3J0Lm9uTWVzc2FnZS5hZGRMaXN0ZW5lcihhc3luYyBtc2cgPT4ge1xyXG5cdFx0XHRpZiAobXNnLmFjdGlvbiA9PT0gXCJyZWluaXRcIikge1xyXG5cdFx0XHRcdGF3YWl0IHNldFN0b3JhZ2UoXCJsb2NhbFwiLCB7XHJcblx0XHRcdFx0XHRkZWZhdWx0QWRkZWQ6IGZhbHNlXHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGxldCBzdWNjZXNzID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGlmIChuYXZpZ2F0b3Iub25MaW5lKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRhd2FpdCBzdGFydCgpO1xyXG5cdFx0XHRcdFx0XHRzdWNjZXNzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdFx0Ly8gZXJyb3JcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHBvcnQucG9zdE1lc3NhZ2Uoe1xyXG5cdFx0XHRcdFx0YWN0aW9uOiBcInJlaW5pdFwiLFxyXG5cdFx0XHRcdFx0c3VjY2Vzc1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuIiwiLy8qIENyZWRpdCBodHRwOi8vYWRyaXBvZmphdmFzY3JpcHQuY29tL2Jsb2cvZHJpcHMvb2JqZWN0LWVxdWFsaXR5LWluLWphdmFzY3JpcHQuaHRtbFxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VxdWl2YWxlbnQoYTogYW55LCBiOiBhbnkpIHtcclxuXHQvLyogQ3JlYXRlIGFycmF5cyBvZiBwcm9wZXJ0eSBuYW1lc1xyXG5cdGNvbnN0IGFQcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpLFxyXG5cdFx0YlByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYik7XHJcblxyXG5cdC8vKiBJZiBudW1iZXIgb2YgcHJvcGVydGllcyBpcyBkaWZmZXJlbnQsXHJcblx0Ly8qIG9iamVjdHMgYXJlIG5vdCBlcXVpdmFsZW50XHJcblx0aWYgKGFQcm9wcy5sZW5ndGggIT0gYlByb3BzLmxlbmd0aCkge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUHJvcHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdGNvbnN0IHByb3BOYW1lID0gYVByb3BzW2ldO1xyXG5cclxuXHRcdC8vKiBJZiB2YWx1ZXMgb2Ygc2FtZSBwcm9wZXJ0eSBhcmUgbm90IGVxdWFsLFxyXG5cdFx0Ly8qIG9iamVjdHMgYXJlIG5vdCBlcXVpdmFsZW50XHJcblx0XHRpZiAoYVtwcm9wTmFtZV0gIT09IGJbcHJvcE5hbWVdKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vKiBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCBvYmplY3RzXHJcblx0Ly8qIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnRcclxuXHRyZXR1cm4gdHJ1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBlcnJvciwgaW5mbyB9IGZyb20gXCIuLi9kZWJ1Z1wiO1xyXG5pbXBvcnQgeyBpbml0UHJlc2VuY2VMYW5ndWFnZXMgfSBmcm9tIFwiLi4vcHJlc2VuY2VNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuXHJcbi8vIGltcG9ydCB7IG9sZFByZXNlbmNlLCBwcmlvcml0eVRhYiB9IGZyb20gXCIuLi90YWJQcmlvcml0eVwiO1xyXG4vL1RPRE8gUkVDT0RFXHJcbi8vIEB0cy1ub2NoZWNrXHJcblxyXG5sZXQgZXJyb3JzID0gW107XHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uKGZpbGVzOiBhbnkpIHtcclxuXHRlcnJvcnMgPSBbXTtcclxuXHRpbmZvKFwicHJlc2VuY2VEZXZNYW5hZ2VyLnRzXCIsIFwiTG9jYWwgUHJlc2VuY2UgdXBkYXRlXCIpO1xyXG5cclxuXHRmaWxlcyA9IGZpbGVzLmZpbGVzO1xyXG5cdGxldCBtZXRhZGF0YSA9IGZpbGVzLmZpbmQoZiA9PiBmLmZpbGUudG9Mb3dlckNhc2UoKSA9PT0gXCJtZXRhZGF0YS5qc29uXCIpLFxyXG5cdFx0cHJlc2VuY2UgPSBmaWxlcy5maW5kKGYgPT4gZi5maWxlLnRvTG93ZXJDYXNlKCkgPT09IFwicHJlc2VuY2UuanNcIiksXHJcblx0XHRpZnJhbWUgPSBmaWxlcy5maW5kKGYgPT4gZi5maWxlLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lLmpzXCIpO1xyXG5cclxuXHRpZiAoIW1ldGFkYXRhKSBlcnJvcnMucHVzaChcIk5vIG1ldGFkYXRhLmpzb24gZm91bmQuXCIpO1xyXG5cdGVsc2Uge1xyXG5cdFx0bWV0YWRhdGEgPSBtZXRhZGF0YS5jb250ZW50cztcclxuXHJcblx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLmlmcmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtZXRhZGF0YS5pZnJhbWUgJiYgIWlmcmFtZSlcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJObyBpZnJhbWUuanMgZm91bmQuXCIpO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgbWV0YWRhdGEuc2VydmljZSA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBzZXJ2aWNlIG5vdCBkZWZpbmVkLlwiKTtcclxuXHJcblx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLmF1dGhvciAhPT0gXCJvYmplY3RcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBhdXRob3Igbm90IGRlZmluZWQuXCIpO1xyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0aG9yLm5hbWUgPT09IFwidW5kZWZpbmVkXCIpXHJcblx0XHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBhdXRob3IubmFtZSBub3QgZGVmaW5lZC5cIik7XHJcblxyXG5cdFx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLmF1dGhvci5pZCA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0XHRlcnJvcnMucHVzaChcInByb3BlcnR5IGF1dGhvci5pZCBub3QgZGVmaW5lZC5cIik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBtZXRhZGF0YS5kZXNjcmlwdGlvbiAhPT0gXCJvYmplY3RcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBkZXNjcmlwdGlvbiBub3QgZGVmaW5lZC5cIik7XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0aWYgKHR5cGVvZiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5lbiA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0XHRlcnJvcnMucHVzaChcInByb3BlcnR5IGRlc2NyaXB0aW9uLmVuIG5vdCBkZWZpbmVkLlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLnVybCA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSB1cmwgbm90IGRlZmluZWQuXCIpO1xyXG5cdH1cclxuXHRpZiAoIXByZXNlbmNlKSBlcnJvcnMucHVzaChcIk5vIHByZXNlbmNlLmpzIGZvdW5kLlwiKTtcclxuXHJcblx0ZXJyb3JzLm1hcChlcnIgPT4gZXJyb3IoXCJwcmVzZW5jZURldk1hbmFnZXIudHNcIiwgZXJyLCB0cnVlKSk7XHJcblxyXG5cdGxldCBwcmVzZW5jZXM6IHByZXNlbmNlU3RvcmFnZSA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpXHJcblx0XHQucHJlc2VuY2VzO1xyXG5cclxuXHRwcmVzZW5jZXMgPSBwcmVzZW5jZXMuZmlsdGVyKHAgPT4gIXAudG1wKTtcclxuXHJcblx0Y29uc3QgYWRkZWRQcmVzZW5jZSA9IHByZXNlbmNlcy5maW5kKFxyXG5cdFx0cCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UgPT09IG1ldGFkYXRhLnNlcnZpY2VcclxuXHQpO1xyXG5cdGlmIChhZGRlZFByZXNlbmNlKSBhZGRlZFByZXNlbmNlLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0Y29uc3QgdG1wUHI6IGFueSA9IHtcclxuXHRcdGVuYWJsZWQ6IHRydWUsXHJcblx0XHRtZXRhZGF0YTogbWV0YWRhdGEsXHJcblx0XHRwcmVzZW5jZTogcHJlc2VuY2U/LmNvbnRlbnRzLFxyXG5cdFx0dG1wOiB0cnVlXHJcblx0fTtcclxuXHJcblx0aWYgKHR5cGVvZiBtZXRhZGF0YT8uaWZyYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIG1ldGFkYXRhPy5pZnJhbWUpXHJcblx0XHR0bXBQci5pZnJhbWUgPSBpZnJhbWUuY29udGVudHM7XHJcblxyXG5cdGlmICh0bXBQci5tZXRhZGF0YS5zZXR0aW5ncykge1xyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHtcclxuXHRcdFx0W2BwU2V0dGluZ3NfJHt0bXBQci5tZXRhZGF0YS5zZXJ2aWNlfWBdOiB0bXBQci5tZXRhZGF0YS5zZXR0aW5nc1xyXG5cdFx0fSk7XHJcblx0XHRpbml0UHJlc2VuY2VMYW5ndWFnZXModG1wUHIpO1xyXG5cdH1cclxuXHJcblx0cHJlc2VuY2VzLnB1c2godG1wUHIpO1xyXG5cclxuXHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoeyBwcmVzZW5jZXM6IHByZXNlbmNlcyB9KTtcclxuXHJcblx0Ly8gcmVsb2FkIGFsbCB0YWJzIG9mIGFueSBwcmVzZW5jZSBpbiBkZXZlbG9wbWVudCBtb2RlXHJcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcmVzZW5jZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdGlmIChwcmVzZW5jZXNbaV0udG1wKSB7XHJcblx0XHRcdGNvbnN0IHVwZGF0ZWRQcmVzZW5jZSA9IHByZXNlbmNlc1tpXTtcclxuXHJcblx0XHRcdGNocm9tZS50YWJzLnF1ZXJ5KFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdHdpbmRvd1R5cGU6IFwibm9ybWFsXCJcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHRhYnMgPT4ge1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdGxldCB0YWJVcmwgPSBuZXcgVVJMKHRhYnNbal0udXJsKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHQodHlwZW9mIHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS51cmwgPT09IFwic3RyaW5nXCIgJiZcclxuXHRcdFx0XHRcdFx0XHRcdHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS51cmwgPT09IHRhYlVybC5ob3N0bmFtZSkgfHxcclxuXHRcdFx0XHRcdFx0XHQodXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnVybCBpbnN0YW5jZW9mIEFycmF5ICYmXHJcblx0XHRcdFx0XHRcdFx0XHR1cGRhdGVkUHJlc2VuY2UubWV0YWRhdGEudXJsLmluY2x1ZGVzKHRhYlVybC5ob3N0bmFtZSkpIHx8XHJcblx0XHRcdFx0XHRcdFx0KHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5yZWdFeHAgJiZcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBSZWdFeHAodXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnJlZ0V4cCkudGVzdCh0YWJVcmwuaHJlZikpXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGNocm9tZS50YWJzLnJlbG9hZCh0YWJzW2pdLmlkLCB7IGJ5cGFzc0NhY2hlOiB0cnVlIH0sICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuaW5mbyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0YFByZXNlbmNlICR7dXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2V9IHVwZGF0ZWQsIHRhYiByZWxvYWRlZCFgXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gaWYgKG9sZFByZXNlbmNlICYmIHByaW9yaXR5VGFiKSBjaHJvbWUudGFicy5yZWxvYWQocHJpb3JpdHlUYWIpO1xyXG59XHJcbiIsImltcG9ydCAqIGFzIHNvY2tldElvIGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XHJcblxyXG5pbXBvcnQgeyByZXF1aXJlZEFwcFZlcnNpb24gfSBmcm9tIFwiLi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IG9sZEFjdGl2aXR5IH0gZnJvbSBcIi4vYmFja2dyb3VuZC9vbkNvbm5lY3RcIjtcclxuaW1wb3J0IHsgZXJyb3IsIGluZm8sIHN1Y2Nlc3MgfSBmcm9tIFwiLi9kZWJ1Z1wiO1xyXG5pbXBvcnQgeyBnZXRTdG9yYWdlIH0gZnJvbSBcIi4vZnVuY3Rpb25zL2FzeW5jU3RvcmFnZVwiO1xyXG5pbXBvcnQgcHJlc2VuY2VEZXZNYW5hZ2VyIGZyb20gXCIuL2Z1bmN0aW9ucy9wcmVzZW5jZURldk1hbmFnZXJcIjtcclxuaW1wb3J0IHNldEFjdGl2aXR5IGZyb20gXCIuL2Z1bmN0aW9ucy9zZXRBY3Rpdml0eVwiO1xyXG5pbXBvcnQgeyBwcmlvcml0eVRhYiB9IGZyb20gXCIuL3RhYlByaW9yaXR5XCI7XHJcblxyXG4vLyogQ3JlYXRlIHNvY2tldFxyXG5leHBvcnQgY29uc3Qgc29ja2V0ID0gc29ja2V0SW8uY29ubmVjdChcImh0dHA6Ly9sb2NhbGhvc3Q6MzAyMFwiLCB7XHJcblx0YXV0b0Nvbm5lY3Q6IGZhbHNlXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbm5lY3QgPSAoKSA9PiBzb2NrZXQub3BlbigpO1xyXG5cclxuZXhwb3J0IGxldCBhcHBWZXJzaW9uID0gMDtcclxuXHJcbmxldCBhcHBWZXJzaW9uVGltZW91dDogbnVtYmVyID0gbnVsbDtcclxuXHJcbnNvY2tldC5vbihcImNvbm5lY3RcIiwgYXN5bmMgKCkgPT4ge1xyXG5cdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlVGV4dCh7IHRleHQ6IFwiXCIgfSk7XHJcblxyXG5cdC8vKiBUZWxsIGFwcCB0byBnaXZlIHVzIGl0cyB2ZXJzaW9uXHJcblx0Ly8qIFN0YXJ0IHRpbWVvdXQgaWYgd2UgZG9uJ3QgcmVjZWl2ZSB2ZXJzaW9uIHJlc3BvbnNlXHJcblx0c29ja2V0LmVtaXQoXCJnZXRWZXJzaW9uXCIpO1xyXG5cdGFwcFZlcnNpb25UaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0Ly8qIE5vIHJlc3BvbnNlIGdvdCwgbW9zdCBsaWtlbHkgb2xkIHZlcnNpb25cclxuXHRcdGFwcFZlcnNpb24gPSAtMTtcclxuXHRcdGVycm9yKFwic29ja2V0TWFuYWdlci50c1wiLCBcIlVuc3VwcG9ydGVkIGFwcCB2ZXJzaW9uXCIpO1xyXG5cdH0sIDUwMDApO1xyXG5cclxuXHQvL1RPRE8gbW92ZSB0aGlzIGluIGEgZmlsZSBvciBzb1xyXG5cdGxldCBzZXR0aW5ncyA9IChhd2FpdCBnZXRTdG9yYWdlKFwic3luY1wiLCBcInNldHRpbmdzXCIpKS5zZXR0aW5ncztcclxuXHRzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcblx0XHR7fSxcclxuXHRcdC4uLk9iamVjdC5rZXlzKHNldHRpbmdzKS5tYXAoayA9PiB7XHJcblx0XHRcdHJldHVybiB7IFtrXTogc2V0dGluZ3Nba10udmFsdWUgfTtcclxuXHRcdH0pXHJcblx0KTtcclxuXHRzb2NrZXQuZW1pdChcInNldHRpbmdVcGRhdGVcIiwgc2V0dGluZ3MpO1xyXG59KTtcclxuXHJcbnNvY2tldC5vbihcInJlY2VpdmVWZXJzaW9uXCIsICh2ZXJzaW9uOiBudW1iZXIpID0+IHtcclxuXHRjbGVhclRpbWVvdXQoYXBwVmVyc2lvblRpbWVvdXQpO1xyXG5cdGFwcFZlcnNpb24gPSB2ZXJzaW9uO1xyXG5cclxuXHRpZiAoIXN1cHBvcnRlZEFwcFZlcnNpb24oKSkge1xyXG5cdFx0ZXJyb3IoXCJzb2NrZXRNYW5hZ2VyLnRzXCIsIFwiVW5zdXBwb3J0ZWQgYXBwIHZlcnNpb25cIik7XHJcblx0XHRyZXR1cm47XHJcblx0fSBlbHNlIGluZm8oXCJzb2NrZXRNYW5hZ2VyLnRzXCIsIFwiU3VwcG9ydGVkIGFwcCB2ZXJzaW9uXCIpO1xyXG5cclxuXHRpZiAob2xkQWN0aXZpdHkpIHNldEFjdGl2aXR5KG9sZEFjdGl2aXR5KTtcclxuXHJcblx0c3VjY2VzcyhcInNvY2tldE1hbmFnZXIudHNcIiwgXCJDb25uZWN0ZWQgdG8gYXBwbGljYXRpb25cIik7XHJcblx0Y2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBzb2NrZXQ6IHNvY2tldC5jb25uZWN0ZWQgfSk7XHJcblxyXG5cdGlmIChwcmlvcml0eVRhYiAhPT0gbnVsbClcclxuXHRcdGNocm9tZS50YWJzLnNlbmRNZXNzYWdlKHByaW9yaXR5VGFiLCB7IHRhYlByaW9yaXR5OiB0cnVlIH0pO1xyXG59KTtcclxuXHJcbnNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xyXG5cdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlVGV4dCh7IHRleHQ6IFwiIVwiIH0pO1xyXG5cdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlQmFja2dyb3VuZENvbG9yKHsgY29sb3I6IFwiI2UxZTEwMFwiIH0pO1xyXG5cclxuXHRlcnJvcihcInNvY2tldE1hbmFnZXIudHNcIiwgXCJEaXNjb25uZWN0ZWQgZnJvbSBhcHBsaWNhdGlvblwiKTtcclxuXHRjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IHNvY2tldDogc29ja2V0LmNvbm5lY3RlZCB9KTtcclxuXHJcblx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFwicHJlc2VuY2VzXCIsICh7IHByZXNlbmNlcyB9KSA9PiB7XHJcblx0XHRwcmVzZW5jZXMgPSAocHJlc2VuY2VzIGFzIHByZXNlbmNlU3RvcmFnZSkuZmlsdGVyKHAgPT4gIXAudG1wKTtcclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IHByZXNlbmNlczogcHJlc2VuY2VzIH0pO1xyXG5cdH0pO1xyXG5cclxuXHRpZiAocHJpb3JpdHlUYWIgIT09IG51bGwpXHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwgeyB0YWJQcmlvcml0eTogZmFsc2UgfSk7XHJcbn0pO1xyXG5cclxuc29ja2V0Lm9uKFwibG9jYWxQcmVzZW5jZVwiLCBwcmVzZW5jZURldk1hbmFnZXIpO1xyXG5cclxuc29ja2V0Lm9uKFxyXG5cdFwiZGlzY29yZFVzZXJcIixcclxuXHRhc3luYyAoXHJcblx0XHR1c2VyOiB7XHJcblx0XHRcdGF2YXRhcjogc3RyaW5nO1xyXG5cdFx0XHRib3Q6IGJvb2xlYW47XHJcblx0XHRcdGRpc2NyaW1pbmF0b3I6IHN0cmluZztcclxuXHRcdFx0ZmxhZ3M6IG51bWJlcjtcclxuXHRcdFx0aWQ6IHN0cmluZztcclxuXHRcdFx0cHJlbWl1bV90eXBlOiBzdHJpbmc7XHJcblx0XHRcdHVzZXJuYW1lOiBzdHJpbmc7XHJcblx0XHR9IHwgbnVsbFxyXG5cdCkgPT4ge1xyXG5cdFx0aWYgKCF1c2VyKSByZXR1cm47XHJcblx0XHRjb25zdCB7IHByZW1pdW1fdHlwZSwgLi4ubmV3VXNlciB9ID0gdXNlcjtcclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IGRpc2NvcmRVc2VyOiBuZXdVc2VyIH0pO1xyXG5cdH1cclxuKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0ZWRBcHBWZXJzaW9uKCkge1xyXG5cdGlmIChhcHBWZXJzaW9uID49IHJlcXVpcmVkQXBwVmVyc2lvbiB8fCBhcHBWZXJzaW9uID09PSAwKSB7XHJcblx0XHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIlwiIH0pO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fSBlbHNlIHtcclxuXHRcdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlVGV4dCh7IHRleHQ6IFwiIVwiIH0pO1xyXG5cdFx0Y2hyb21lLmJyb3dzZXJBY3Rpb24uc2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3IoeyBjb2xvcjogXCIjZmY1MDUwXCIgfSk7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IGluZm8gfSBmcm9tIFwiLi4vZGVidWdcIjtcclxuaW1wb3J0IHsgcHJpb3JpdHlUYWIsIHNldFByaW9yaXR5VGFiIH0gZnJvbSBcIi4uL3RhYlByaW9yaXR5XCI7XHJcbmltcG9ydCB7IHNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXRNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGVhckFjdGl2aXR5KHJlc2V0VGFiUHJpb3JpdHkgPSBmYWxzZSkge1xyXG5cdC8vKiBTZW5kIGRlYnVnXHJcblx0Ly8qIElmIHJlc2V0VGFiUHJpb3JpdHlcclxuXHQvLyogRW1pdCBjbGVhckFjdGl2aXR5IHRvIGFwcFxyXG5cdGluZm8oXCJjbGVhckFjdGl2aXR5LnRzXCIsIGBDbGVhciBBY3Rpdml0eSB8ICR7cmVzZXRUYWJQcmlvcml0eX1gKTtcclxuXHRpZiAocmVzZXRUYWJQcmlvcml0eSkge1xyXG5cdFx0Ly8qIFRyeSB0byBjbGVhckludGVydmFsXHJcblx0XHQvLyogU2V0IHByaW9yaXR5IHRhYiB0byBudWxsXHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwgeyB0YWJQcmlvcml0eTogZmFsc2UgfSk7XHJcblx0XHRzZXRQcmlvcml0eVRhYihudWxsKTtcclxuXHR9XHJcblx0aWYgKHNvY2tldC5jb25uZWN0ZWQpIHNvY2tldC5lbWl0KFwiY2xlYXJBY3Rpdml0eVwiKTtcclxufVxyXG4iLCJpbXBvcnQgeyBvbGRBY3Rpdml0eSB9IGZyb20gXCIuLi9iYWNrZ3JvdW5kL29uQ29ubmVjdFwiO1xyXG5pbXBvcnQgeyBpbmZvIH0gZnJvbSBcIi4uL2RlYnVnXCI7XHJcbmltcG9ydCB7IHNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHByaW9yaXR5VGFiIH0gZnJvbSBcIi4uL3RhYlByaW9yaXR5XCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGNsZWFyQWN0aXZpdHkgZnJvbSBcIi4vY2xlYXJBY3Rpdml0eVwiO1xyXG5pbXBvcnQgc2V0QWN0aXZpdHkgZnJvbSBcIi4vc2V0QWN0aXZpdHlcIjtcclxuXHJcbmxldCBzZXR0aW5nczogYW55ID0gbnVsbDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG5cdGNvbnN0IHByZXNlbmNlcyA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpLnByZXNlbmNlcztcclxuXHRpZiAoIXByZXNlbmNlcylcclxuXHRcdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT5cclxuXHRcdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBbXSB9LCByZXNvbHZlKVxyXG5cdFx0KTtcclxuXHJcblx0c2V0dGluZ3MgPSAoYXdhaXQgZ2V0U3RvcmFnZShcInN5bmNcIiwgXCJzZXR0aW5nc1wiKSkuc2V0dGluZ3M7XHJcblx0aWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gXCJ1bmRlZmluZWRcIikgc2V0dGluZ3MgPSB7fTtcclxuXHJcblx0aW5pdFNldHRpbmcoXCJlbmFibGVkXCIsIFwicG9wdXAuc2V0dGluZy5lbmFibGVkXCIsIDApO1xyXG5cdGluaXRTZXR0aW5nKFwiYXV0b0xhdW5jaFwiLCBcInBvcHVwLnNldHRpbmcuYXV0b0xhdW5jaFwiLCAxKTtcclxuXHRpbml0U2V0dGluZyhcIm1lZGlhS2V5c1wiLCBcInBvcHVwLnNldHRpbmcubWVkaWFDb250cm9sXCIsIDIpO1xyXG5cdGluaXRTZXR0aW5nKFwidGl0bGVNZW51YmFyXCIsIFwicG9wdXAuc2V0dGluZy50aXRsZU1lbnViYXJcIiwgMyk7XHJcblxyXG5cdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT5cclxuXHRcdGNocm9tZS5zdG9yYWdlLnN5bmMuc2V0KHsgc2V0dGluZ3M6IHNldHRpbmdzIH0sIHJlc29sdmUpXHJcblx0KTtcclxuXHJcblx0aW5mbyhcImluaXRTZXR0aW5ncy50c1wiLCBcIkluaXRpYWxpemVkIHNldHRpbmdzXCIpO1xyXG59XHJcblxyXG5jaHJvbWUuc3RvcmFnZS5vbkNoYW5nZWQuYWRkTGlzdGVuZXIoY2hhbmdlcyA9PiB7XHJcblx0aWYgKGNoYW5nZXMuc2V0dGluZ3MpIHtcclxuXHRcdGNvbnN0IG5TZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcblx0XHRcdHt9LFxyXG5cdFx0XHQuLi5PYmplY3Qua2V5cyhjaGFuZ2VzLnNldHRpbmdzLm5ld1ZhbHVlKS5tYXAoayA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIHsgW2tdOiBjaGFuZ2VzLnNldHRpbmdzLm5ld1ZhbHVlW2tdLnZhbHVlIH07XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdGlmIChuU2V0dGluZ3MuZW5hYmxlZCkgc2V0QWN0aXZpdHkob2xkQWN0aXZpdHksIGNoYW5nZXMuc2V0dGluZ3MubmV3VmFsdWUpO1xyXG5cdFx0ZWxzZSBpZiAocHJpb3JpdHlUYWIgIT09IG51bGwpIGNsZWFyQWN0aXZpdHkodHJ1ZSk7XHJcblxyXG5cdFx0aWYgKHNvY2tldC5jb25uZWN0ZWQpIHNvY2tldC5lbWl0KFwic2V0dGluZ1VwZGF0ZVwiLCBuU2V0dGluZ3MpO1xyXG5cdFx0aW5mbyhcImluaXRTZXR0aW5ncy50c1wiLCBcIlNldHRpbmdzIHVwZGF0ZVwiKTtcclxuXHR9XHJcblxyXG5cdGlmIChcclxuXHRcdGNoYW5nZXMucHJlc2VuY2VzICYmXHJcblx0XHRjaGFuZ2VzLnByZXNlbmNlcy5uZXdWYWx1ZSAhPT0gY2hhbmdlcy5wcmVzZW5jZXMub2xkVmFsdWVcclxuXHQpIHtcclxuXHRcdGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlcy5wcmVzZW5jZXMub2xkVmFsdWUsXHJcblx0XHRcdGNoYW5nZWRQcmVzZW5jZXMgPSBjaGFuZ2VzLnByZXNlbmNlcy5uZXdWYWx1ZS5maWx0ZXIobnAgPT5cclxuXHRcdFx0XHRvbGRWYWx1ZS5maW5kKFxyXG5cdFx0XHRcdFx0b3YgPT5cclxuXHRcdFx0XHRcdFx0b3YubWV0YWRhdGEuc2VydmljZSA9PT0gbnAubWV0YWRhdGEuc2VydmljZSAmJlxyXG5cdFx0XHRcdFx0XHQob3YubWV0YWRhdGEudmVyc2lvbiAhPT0gbnAubWV0YWRhdGEudmVyc2lvbiB8fCBvdi50bXApXHJcblx0XHRcdFx0KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdGNoYW5nZWRQcmVzZW5jZXMuZm9yRWFjaCh1cGRhdGVkUHJlc2VuY2UgPT4ge1xyXG5cdFx0XHRjb25zdCBzZXR0aW5ncyA9IHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5zZXR0aW5ncztcclxuXHJcblx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChcclxuXHRcdFx0XHRgcFNldHRpbmdzXyR7dXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2V9YCxcclxuXHRcdFx0XHRzdG9yYWdlU2V0dGluZ3MgPT4ge1xyXG5cdFx0XHRcdFx0c3RvcmFnZVNldHRpbmdzID1cclxuXHRcdFx0XHRcdFx0c3RvcmFnZVNldHRpbmdzW2BwU2V0dGluZ3NfJHt1cGRhdGVkUHJlc2VuY2UubWV0YWRhdGEuc2VydmljZX1gXSB8fFxyXG5cdFx0XHRcdFx0XHRbXTtcclxuXHJcblx0XHRcdFx0XHRzZXR0aW5ncy5mb3JFYWNoKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzdG9yYWdlU2V0dGluZyA9IHN0b3JhZ2VTZXR0aW5ncy5maW5kKFxyXG5cdFx0XHRcdFx0XHRcdHMgPT4gcy5pZCA9PT0gc2V0dGluZy5pZFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHN0b3JhZ2VTZXR0aW5nICYmIHN0b3JhZ2VTZXR0aW5nLnZhbHVlICE9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBzZXR0aW5nLnZhbHVlID09PSB0eXBlb2Ygc3RvcmFnZVNldHRpbmcudmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmcudmFsdWUgPSBzdG9yYWdlU2V0dGluZy52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHN0b3JhZ2VTZXR0aW5nLm11bHRpTGFuZ3VhZ2UpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmcgPSBzdG9yYWdlU2V0dGluZztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChcclxuXHRcdFx0XHRcdFx0SlNPTi5wYXJzZShcclxuXHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdFx0XHRcdFx0XHRbYHBTZXR0aW5nc18ke3VwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlfWBdOiBzZXR0aW5nc1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdCksXHJcblx0XHRcdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRpbmZvKFxyXG5cdFx0XHRcdFx0XHRcdFx0XCJpbml0U2V0dGluZ3MudHNcIixcclxuXHRcdFx0XHRcdFx0XHRcdGBVcGRhdGVkIHNldHRpbmcgc3RvcmFnZSBvZiAke3VwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlfWBcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiBpbml0U2V0dGluZyhcclxuXHRzZXR0aW5nOiBzdHJpbmcsXHJcblx0c3RyaW5nOiBzdHJpbmcsXHJcblx0cG9zaXRpb246IG51bWJlcixcclxuXHRvcHRpb246IGFueSA9IHRydWUsXHJcblx0c2hvdyA9IHRydWVcclxuKSB7XHJcblx0aWYgKHR5cGVvZiBzZXR0aW5nc1tzZXR0aW5nXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdGNPcHRpb24oc2V0dGluZywgc3RyaW5nLCBwb3NpdGlvbiwgb3B0aW9uLCBzaG93KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY09wdGlvbihcclxuXHRzZXR0aW5nOiBzdHJpbmcsXHJcblx0c3RyaW5nOiBzdHJpbmcsXHJcblx0cG9zaXRpb246IG51bWJlcixcclxuXHRvcHRpb246IGJvb2xlYW4sXHJcblx0c2hvdzogYm9vbGVhblxyXG4pIHtcclxuXHRpZiAoIXNldHRpbmdzW3NldHRpbmddKSB7XHJcblx0XHRzZXR0aW5nc1tzZXR0aW5nXSA9IHtcclxuXHRcdFx0c3RyaW5nOiBzdHJpbmcsXHJcblx0XHRcdHZhbHVlOiBvcHRpb24sXHJcblx0XHRcdHBvc2l0aW9uOiBwb3NpdGlvblxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoc2hvdykgc2V0dGluZ3Nbc2V0dGluZ10uc2hvdyA9IHNob3c7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IHJlbGVhc2VUeXBlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgYWRkRGVmYXVsdFByZXNlbmNlcyBmcm9tIFwiLi4vZnVuY3Rpb25zL2FkZERlZmF1bHRQcmVzZW5jZXNcIjtcclxuaW1wb3J0IGNsZWFyQWN0aXZpdHkgZnJvbSBcIi4uL2Z1bmN0aW9ucy9jbGVhckFjdGl2aXR5XCI7XHJcbmltcG9ydCBjb25zb2xlSGVhZGVyIGZyb20gXCIuLi9mdW5jdGlvbnMvY29uc29sZUhlYWRlclwiO1xyXG5pbXBvcnQgZGV0ZWN0U2FmYXJpIGZyb20gXCIuLi9mdW5jdGlvbnMvZGV0ZWN0U2FmYXJpXCI7XHJcbmltcG9ydCBoYXNBbHBoYUJldGFBY2Nlc3MgZnJvbSBcIi4uL2Z1bmN0aW9ucy9oYXNBbHBoYUJldGFBY2Nlc3NcIjtcclxuaW1wb3J0IGluaXRTZXR0aW5ncyBmcm9tIFwiLi4vZnVuY3Rpb25zL2luaXRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyB1cGRhdGVTdHJpbmdzIH0gZnJvbSBcIi4uL2xhbmdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHByZXNlbmNlU2NpZW5jZSwgdXBkYXRlUHJlc2VuY2VzIH0gZnJvbSBcIi4uL3ByZXNlbmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIi4uL3NvY2tldE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgaGlkZU1ldGFUYWdQcmVzZW5jZXMsIHByaW9yaXR5VGFiLCB0YWJQcmlvcml0eSB9IGZyb20gXCIuLi90YWJQcmlvcml0eVwiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xyXG5cdGF3YWl0IGNvbnNvbGVIZWFkZXIoKTtcclxuXHJcblx0Ly8qIENoZWNrIGFscGhhL2JldGEgYWNjZXNzIGlmIHJlbGVhc3lUeXBlIGVxdWFscyBBTFBIQS9CRVRBXHJcblx0aWYgKFtcIkFMUEhBXCIsIFwiQkVUQVwiXS5pbmNsdWRlcyhyZWxlYXNlVHlwZSkpIGF3YWl0IGhhc0FscGhhQmV0YUFjY2VzcygpO1xyXG5cclxuXHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIiFcIiB9KTtcclxuXHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZUJhY2tncm91bmRDb2xvcih7IGNvbG9yOiBcIiNlMWUxMDBcIiB9KTtcclxuXHJcblx0Ly8qIEluaXRpYWxpemUgc2V0dGluZ3MsIEFkZCBkZWZhdWx0IHByZXNlbmNlcywgVXBkYXRlIHN0cmluZ3MsIFVwZGF0ZSBwcmVzZW5jZXNcclxuXHQvLyogU3RhcnQgdXBkYXRlciBpbnRlcnZhbHNcclxuXHQvLypcclxuXHQvLyogQ29ubmVjdCB0byBhcHBcclxuXHRhd2FpdCBQcm9taXNlLmFsbChbXHJcblx0XHRpbml0U2V0dGluZ3MoKSxcclxuXHRcdGFkZERlZmF1bHRQcmVzZW5jZXMoKSxcclxuXHRcdHVwZGF0ZVByZXNlbmNlcygpLFxyXG5cdFx0dXBkYXRlU3RyaW5ncyhjaHJvbWUuaTE4bi5nZXRVSUxhbmd1YWdlKCkpLFxyXG5cdFx0cHJlc2VuY2VTY2llbmNlKClcclxuXHRdKTtcclxuXHRzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcclxuXHRcdHByZXNlbmNlU2NpZW5jZSgpO1xyXG5cdH0sIDYwICogMzAgKiAxMDAwKTtcclxuXHRjb25uZWN0KCk7XHJcbn1cclxuXHJcbi8vKiBVcGRhdGUgaWYgdXBkYXRlIGF2YWlsYWJsZVxyXG4vLyogT24gVGFiIGFjdGl2ZVxyXG4vLyogT24gVGFiIHJlcGxhY2VcclxuLy8qIE9uIFRhYiByZW1vdmVcclxuLy8qIE9uIFRhYiB1cGRhdGVcclxuLy8qIE9uIFRhYiBmb2N1cyBjaGFuZ2VcclxuZGV0ZWN0U2FmYXJpKClcclxuXHQ/IFwiXCJcclxuXHQ6IGNocm9tZS5ydW50aW1lLm9uVXBkYXRlQXZhaWxhYmxlLmFkZExpc3RlbmVyKCgpID0+IGNocm9tZS5ydW50aW1lLnJlbG9hZCgpKTtcclxuY2hyb21lLnRhYnMub25BY3RpdmF0ZWQuYWRkTGlzdGVuZXIoKCkgPT4gdGFiUHJpb3JpdHkoKSk7XHJcbmNocm9tZS50YWJzLm9uUmVwbGFjZWQuYWRkTGlzdGVuZXIoKF8sIHRhYklkKSA9PiB7XHJcblx0Ly8qIE9ubHkgY2xlYXIgaWYgdGFiIGlzIHByaW9yaXR5VGFiXHJcblx0aWYgKHByaW9yaXR5VGFiID09PSB0YWJJZCkge1xyXG5cdFx0Y2xlYXJBY3Rpdml0eSh0cnVlKTtcclxuXHRcdGhpZGVNZXRhVGFnUHJlc2VuY2VzKCk7XHJcblx0fVxyXG59KTtcclxuY2hyb21lLnRhYnMub25SZW1vdmVkLmFkZExpc3RlbmVyKHRhYklkID0+IHtcclxuXHQvLyogT25seSBjbGVhciBpZiB0YWIgaXMgcHJpb3JpdHlUYWJcclxuXHRpZiAocHJpb3JpdHlUYWIgPT09IHRhYklkKSB7XHJcblx0XHRjbGVhckFjdGl2aXR5KHRydWUpO1xyXG5cdFx0aGlkZU1ldGFUYWdQcmVzZW5jZXMoKTtcclxuXHR9XHJcbn0pO1xyXG5jaHJvbWUudGFicy5vblVwZGF0ZWQuYWRkTGlzdGVuZXIoKF8sIGNoYW5nZUluZm8pID0+IHRhYlByaW9yaXR5KGNoYW5nZUluZm8pKTtcclxuY2hyb21lLndpbmRvd3Mub25Gb2N1c0NoYW5nZWQuYWRkTGlzdGVuZXIod2luZG93SWQgPT4ge1xyXG5cdC8vKiBDYW4ndCBjaGFuZ2Ugd2luZG93XHJcblx0Ly8qIFJ1biB0YWJQcmlvcml0eVxyXG5cdGlmICh3aW5kb3dJZCA9PT0gLTEpIHJldHVybjtcclxuXHR0YWJQcmlvcml0eSgpO1xyXG59KTtcclxuXHJcbnVwZGF0ZVByZXNlbmNlcygpLCB1cGRhdGVTdHJpbmdzKGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKSk7XHJcbiIsImltcG9ydCB7IHJlbGVhc2VUeXBlLCByZXF1aXJlZEFwcFZlcnNpb24gfSBmcm9tIFwiLi4vLi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGNvbnNvbGVIZWFkZXIoKSB7XHJcblx0Y29uc29sZS5sb2coXHJcblx0XHRgJWNQcmVNaURcXG4lYyR7U3RyaW5nLmZyb21DaGFyQ29kZShcclxuXHRcdFx0MTY5XHJcblx0XHQpfSAyMDE4LSR7bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpfSBUaW1lcmFhXFxuXFxuJWNWZXJzaW9uOiAlYyR7XHJcblx0XHRcdGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCkudmVyc2lvbl9uYW1lXHJcblx0XHR9XFxuJWNSZWxlYXNlIHR5cGU6ICVjJHtyZWxlYXNlVHlwZX1cXG4lY1JlcSBBcHAgYnVpbGQ6ICVjJHtyZXF1aXJlZEFwcFZlcnNpb259XFxuJWNTY2llbmNlIElkOiAlYyR7XHJcblx0XHRcdChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJpZGVudGlmaWVyXCIpKS5pZGVudGlmaWVyXHJcblx0XHR9YCxcclxuXHRcdFwiZm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6Mi41cmVtO2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6ICM1OTZjYWVcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjpyZ2IoNzAsMjAwLDcwKTtcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07XCIsXHJcblx0XHRcImZvbnQtc2l6ZToxcmVtO2NvbG9yOiM5OUFBQjU7XCIsXHJcblx0XHRcImZvbnQtc2l6ZToxcmVtO1wiLFxyXG5cdFx0XCJmb250LXNpemU6MXJlbTtjb2xvcjojOTlBQUI1O1wiLFxyXG5cdFx0XCJmb250LXNpemU6MXJlbTtcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07Y29sb3I6Izk5QUFCNTtcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07XCIsXHJcblx0XHRcImZvbnQtc2l6ZToxcmVtO2NvbG9yOiM5OUFBQjU7XCJcclxuXHQpO1xyXG59XHJcbiIsImltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcclxuXHJcbmltcG9ydCB7IHJlbGVhc2VUeXBlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgeyBnZXRTdG9yYWdlIH0gZnJvbSBcIi4vYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCBncmFwaHFsUmVxdWVzdCBmcm9tIFwiLi9ncmFwaHFsXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBoYXNBbHBoYUJldGFBY2Nlc3MoKSB7XHJcblx0Y29uc3QgeyBhdXRob3JpemVkQmV0YUFscGhhIH0gPSBhd2FpdCBnZXRTdG9yYWdlKFxyXG5cdFx0XCJsb2NhbFwiLFxyXG5cdFx0XCJhdXRob3JpemVkQmV0YUFscGhhXCJcclxuXHQpO1xyXG5cclxuXHRpZiAoIWF1dGhvcml6ZWRCZXRhQWxwaGEpIHtcclxuXHRcdGxldCByZWRpcmVjdFVSTCA9XHJcblx0XHRcdFwiaHR0cHM6Ly9jcG9lZ2NtZ2FiYW5mbGVkaGtqZGljZGNsZ3BtZ2hvZy5jaHJvbWl1bWFwcC5vcmdcIjtcclxuXHRcdC8vIEB0cy1pZ25vcmUgLy8qIEZpcmVmb3ggZGV0ZWN0aW9uXHJcblx0XHRpZiAodHlwZW9mIGJyb3dzZXIgIT09IFwidW5kZWZpbmVkXCIpXHJcblx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0cmVkaXJlY3RVUkwgPSBhd2FpdCBicm93c2VyLmlkZW50aXR5LmdldFJlZGlyZWN0VVJMKCk7XHJcblxyXG5cdFx0Y29uc3QgYWxsb3dlZEFjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlPHZvaWQgfCBib29sZWFuPihyZXNvbHZlID0+XHJcblx0XHRcdGNocm9tZS5pZGVudGl0eS5sYXVuY2hXZWJBdXRoRmxvdyhcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR1cmw6IGBodHRwczovL2Rpc2NvcmRhcHAuY29tL2FwaS9vYXV0aDIvYXV0aG9yaXplP3Jlc3BvbnNlX3R5cGU9dG9rZW4mY2xpZW50X2lkPTUwMzU1NzA4NzA0MTY4MzQ1OCZzY29wZT1pZGVudGlmeSZyZWRpcmVjdF91cmk9JHtyZWRpcmVjdFVSTH1gLFxyXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmU6IHRydWVcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGFzeW5jIHJlc3BvbnNlVXJsID0+IHtcclxuXHRcdFx0XHRcdGlmICghcmVzcG9uc2VVcmwgfHwgIXJlc3BvbnNlVXJsLm1hdGNoKC8oJmFjY2Vzc190b2tlbj1bXFxkXFx3XSspL2cpKSB7XHJcblx0XHRcdFx0XHRcdC8vKiBTbyBjaHJvbWUgc2h1dHMgdXBcclxuXHRcdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUubGFzdEVycm9yO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBhY2Nlc3NUb2tlbiA9IHJlc3BvbnNlVXJsXHJcblx0XHRcdFx0XHRcdFx0Lm1hdGNoKC8oJmFjY2Vzc190b2tlbj1bXFxkXFx3XSspL2cpWzBdXHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoXCImYWNjZXNzX3Rva2VuPVwiLCBcIlwiKSxcclxuXHRcdFx0XHRcdFx0ZFVzZXIgPSAoXHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgYXhpb3MoXCJodHRwczovL2Rpc2NvcmRhcHAuY29tL2FwaS91c2Vycy9AbWVcIiwge1xyXG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YFxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdCkuZGF0YSxcclxuXHRcdFx0XHRcdFx0YWNjZXNzVHlwZSA9IChcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCBncmFwaHFsUmVxdWVzdChgXHJcblx0XHRcdFx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRcdFx0XHRhbHBoYUJldGFBY2Nlc3ModXNlcklkOiBcIiR7ZFVzZXIuaWR9XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGJldGFBY2Nlc3NcclxuXHRcdFx0XHRcdFx0XHRcdGFscGhhQWNjZXNzXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRgKVxyXG5cdFx0XHRcdFx0XHQpLmRhdGEuYWxwaGFCZXRhQWNjZXNzWzBdO1xyXG5cclxuXHRcdFx0XHRcdGxldCBhbGxvd2VkQWNjZXNzOiBib29sZWFuO1xyXG5cdFx0XHRcdFx0c3dpdGNoIChyZWxlYXNlVHlwZSkge1xyXG5cdFx0XHRcdFx0XHRjYXNlIFwiQkVUQVwiOlxyXG5cdFx0XHRcdFx0XHRcdGFsbG93ZWRBY2Nlc3MgPSBhY2Nlc3NUeXBlLmJldGFBY2Nlc3M7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgXCJBTFBIQVwiOlxyXG5cdFx0XHRcdFx0XHRcdGFsbG93ZWRBY2Nlc3MgPSBhY2Nlc3NUeXBlLmFscGhhQWNjZXNzO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJlc29sdmUoYWxsb3dlZEFjY2Vzcyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpXHJcblx0XHQpO1xyXG5cclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRcdGF1dGhvcml6ZWRCZXRhQWxwaGE6IGFsbG93ZWRBY2Nlc3NcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIi4uL3NvY2tldE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuLi9mdW5jdGlvbnMvYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIi4vZ2VuZXJpY1wiO1xyXG5pbXBvcnQgeyB1cGRhdGVBbGxTdHJpbmdzIH0gZnJvbSBcIi4uL2xhbmdNYW5hZ2VyXCI7XHJcblxyXG5jb25zdCBlbmFibGUgPSAoKSA9PiBzdGFydCgpLnRoZW4oY29ubmVjdCk7XHJcbi8vKiBSdW4gdGhpcyB3aGVuIGV4dGVuc2lvbiBlbmFibGVzIChvbmx5IGlmIHdhcyBkaXNhYmxlZClcclxuY29uc3Qgb25FeHRFbmFibGUgPSBzZXRUaW1lb3V0KGVuYWJsZSwgMTAwKTtcclxuXHJcbmNocm9tZS5ydW50aW1lLm9uSW5zdGFsbGVkLmFkZExpc3RlbmVyKGFzeW5jIGRldGFpbHMgPT4ge1xyXG5cdC8vKiBFeHRFbmFibGVcclxuXHQvLyogQ2hlY2sgYWNjZXNzIChiZXRhKVxyXG5cdGNsZWFyVGltZW91dChvbkV4dEVuYWJsZSk7XHJcblxyXG5cdGF3YWl0IHN0YXJ0KCk7XHJcblxyXG5cdHN3aXRjaCAoZGV0YWlscy5yZWFzb24pIHtcclxuXHRcdGNhc2UgXCJpbnN0YWxsXCI6XHJcblx0XHRcdGluc3RhbGwoKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwidXBkYXRlXCI6XHJcblx0XHRcdHVwZGF0ZSgpO1xyXG5cdFx0XHRicmVhaztcclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gaW5zdGFsbCgpIHtcclxuXHQvLyogT3BlbiBpbnN0YWxsZWQgdGFiXHJcblx0Ly8qIFNldCBsYXN0VmVyc2lvblxyXG5cdGNocm9tZS50YWJzLmNyZWF0ZSh7XHJcblx0XHRhY3RpdmU6IHRydWUsXHJcblx0XHRpbmRleDogMCxcclxuXHRcdHVybDogY2hyb21lLnJ1bnRpbWUuZ2V0VVJMKFwiaHRtbC90YWJzL2luZGV4Lmh0bWwjL2luc3RhbGxlZFwiKVxyXG5cdH0pO1xyXG5cdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRsYXN0VmVyc2lvbjogY2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3QoKS52ZXJzaW9uX25hbWVcclxuXHR9KTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlKCkge1xyXG5cdC8vKiBDaGVjayBleHRlbnNpb24gdXBkYXRlXHJcblx0Ly8qIFVwZGF0ZWRcclxuXHQvLyogU2F2ZSB1cGRhdGUgdmVyc2lvblxyXG5cdC8vKiBPcGVuIHVwZGF0ZWQgdGFiXHJcblx0aWYgKFxyXG5cdFx0cGFyc2VJbnQoXHJcblx0XHRcdChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJsYXN0VmVyc2lvblwiKSkubGFzdFZlcnNpb25cclxuXHRcdFx0XHQ/IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJsYXN0VmVyc2lvblwiKSkubGFzdFZlcnNpb25cclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoL1xcLi9nLCBcIlwiKVxyXG5cdFx0XHRcdFx0XHQuc2xpY2UoMCwgMylcclxuXHRcdFx0XHQ6IDBcclxuXHRcdCkgPFxyXG5cdFx0cGFyc2VJbnQoXHJcblx0XHRcdGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCkudmVyc2lvbl9uYW1lLnJlcGxhY2UoL1xcLi9nLCBcIlwiKS5zbGljZSgwLCAzKVxyXG5cdFx0KVxyXG5cdCkge1xyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHtcclxuXHRcdFx0bGFzdFZlcnNpb246IGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCkudmVyc2lvbl9uYW1lXHJcblx0XHR9KTtcclxuXHJcblx0XHRhd2FpdCB1cGRhdGVBbGxTdHJpbmdzKCk7XHJcblxyXG5cdFx0Y2hyb21lLnRhYnMuY3JlYXRlKHtcclxuXHRcdFx0YWN0aXZlOiB0cnVlLFxyXG5cdFx0XHRpbmRleDogMCxcclxuXHRcdFx0dXJsOiBjaHJvbWUucnVudGltZS5nZXRVUkwoXCJodG1sL3RhYnMvaW5kZXguaHRtbCMvdXBkYXRlZFwiKVxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IG9sZFByZXNlbmNlIH0gZnJvbSBcIi4uL3RhYlByaW9yaXR5XCI7XHJcblxyXG5jaHJvbWUucnVudGltZS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoKG1zZywgc2VuZGVyKSA9PlxyXG5cdGhhbmRsZWlGcmFtZShtc2csIHNlbmRlcilcclxuKTtcclxuXHJcbmZ1bmN0aW9uIGhhbmRsZWlGcmFtZShtc2c6IGFueSwgc2VuZGVyOiBjaHJvbWUucnVudGltZS5NZXNzYWdlU2VuZGVyKSB7XHJcblx0aWYgKCFvbGRQcmVzZW5jZSkgcmV0dXJuO1xyXG5cclxuXHQvLyogU2VuZCBcIlVwZGF0ZURhdGFcIiB0byBpZnJhbWVcclxuXHRpZiAoXHJcblx0XHRtc2cuaUZyYW1lVXBkYXRlRGF0YSAmJlxyXG5cdFx0dHlwZW9mIG9sZFByZXNlbmNlLm1ldGFkYXRhLmlmcmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxyXG5cdFx0b2xkUHJlc2VuY2UubWV0YWRhdGEuaWZyYW1lXHJcblx0KVxyXG5cdFx0Y2hyb21lLnRhYnMuc2VuZE1lc3NhZ2Uoc2VuZGVyLnRhYi5pZCwgeyBpRnJhbWVVcGRhdGVEYXRhOiB0cnVlIH0pO1xyXG5cclxuXHQvLyogU2VuZCBpRnJhbWVEYXRhIGJhY2sgdG8gcHJlc2VuY2VcclxuXHRpZiAobXNnLmlGcmFtZURhdGEpXHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7IGlGcmFtZURhdGE6IG1zZy5pRnJhbWVEYXRhIH0pO1xyXG5cclxuXHQvLyogaUZyYW1lIHdhbnRzIHRvIGtub3cgd2hhdCBwcmVzZW5jZSBpdCBzaG91bGQgaW5qZWN0IChpZiBhdmFpbGFibGUpXHJcblx0aWYgKCFtc2cuaUZyYW1lKSByZXR1cm47XHJcblx0aWYgKG9sZFByZXNlbmNlID09PSBudWxsKSB7XHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7IGlGcmFtZTogZmFsc2UgfSk7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRpZiAoXHJcblx0XHR0eXBlb2Ygb2xkUHJlc2VuY2UubWV0YWRhdGEuaWZyYW1lID09PSBcInVuZGVmaW5lZFwiIHx8XHJcblx0XHQhb2xkUHJlc2VuY2UubWV0YWRhdGEuaWZyYW1lXHJcblx0KSB7XHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7IGlGcmFtZTogZmFsc2UgfSk7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7XHJcblx0XHRpRnJhbWU6IG9sZFByZXNlbmNlLmlmcmFtZSxcclxuXHRcdGlGcmFtZVJlZ0V4cDogb2xkUHJlc2VuY2UubWV0YWRhdGEuaUZyYW1lUmVnRXhwIHx8IFwiXCJcclxuXHR9KTtcclxufVxyXG4iLCJpbXBvcnQgY2xlYXJBY3Rpdml0eSBmcm9tIFwiLi4vZnVuY3Rpb25zL2NsZWFyQWN0aXZpdHlcIjtcclxuaW1wb3J0IHsgc2V0T2xkT2JqZWN0IH0gZnJvbSBcIi4vb25Db25uZWN0XCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi4vZnVuY3Rpb25zL2FzeW5jU3RvcmFnZVwiO1xyXG5pbXBvcnQgeyBvbGRQcmVzZW5jZSwgcHJpb3JpdHlUYWIgfSBmcm9tIFwiLi4vdGFiUHJpb3JpdHlcIjtcclxuXHJcbi8vKiBEaXNhYmxlIGFjdGl2ZSBwcmVzZW5jZSBpZiBpdCBqdXN0IGdvdCBkaXNhYmxlZFxyXG5jaHJvbWUuc3RvcmFnZS5vbkNoYW5nZWQuYWRkTGlzdGVuZXIoYXN5bmMgY2hhbmdlcyA9PiB7XHJcblx0aWYgKCFjaGFuZ2VzLnByZXNlbmNlcyB8fCAhb2xkUHJlc2VuY2UgfHwgIXByaW9yaXR5VGFiKSByZXR1cm47XHJcblxyXG5cdGNvbnN0IHBycyA9ICgoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIFwicHJlc2VuY2VzXCIpKVxyXG5cdFx0LnByZXNlbmNlcyBhcyBwcmVzZW5jZVN0b3JhZ2UpLmZpbmQoXHJcblx0XHRwID0+IHAubWV0YWRhdGEuc2VydmljZSA9PT0gb2xkUHJlc2VuY2UubWV0YWRhdGEuc2VydmljZVxyXG5cdCk7XHJcblxyXG5cdGlmIChwcnMgJiYgcHJzLmVuYWJsZWQpIHtcclxuXHRcdHNldE9sZE9iamVjdChudWxsKTtcclxuXHRcdGNocm9tZS50YWJzLnNlbmRNZXNzYWdlKHByaW9yaXR5VGFiLCB7XHJcblx0XHRcdHRhYlByaW9yaXR5OiB0cnVlXHJcblx0XHR9KTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Y2hyb21lLnRhYnMuc2VuZE1lc3NhZ2UocHJpb3JpdHlUYWIsIHtcclxuXHRcdFx0dGFiUHJpb3JpdHk6IGZhbHNlXHJcblx0XHR9KTtcclxuXHRcdGNsZWFyQWN0aXZpdHkodHJ1ZSk7XHJcblx0fVxyXG59KTtcclxuIiwiaW1wb3J0IHsgYXBpQmFzZSB9IGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuXHJcbmNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChcImlkZW50aWZpZXJcIiwgcyA9PiB7XHJcblx0aWYgKHMuaWRlbnRpZmllcikge1xyXG5cdFx0Y2hyb21lLnJ1bnRpbWUuc2V0VW5pbnN0YWxsVVJMKFxyXG5cdFx0XHRgJHthcGlCYXNlLnJlcGxhY2UoXCIvdjMvXCIsIFwiL3YyL1wiKX1zY2llbmNlLyR7cy5pZGVudGlmaWVyfWBcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvLyBUT0RPIFVuaW5zdGFsbCBwYWdlXHJcblx0Ly8gZ3JhcGhxbFJlcXVlc3QoYFxyXG5cdC8vIG11dGF0aW9uIHtcclxuXHQvLyBcdGRlbGV0ZVNjaWVuY2UoaWRlbnRpZmllcjogXCIke3MuaWRlbnRpZmllcn1cIikge1xyXG5cdC8vIFx0XHRpZGVudGlmaWVyXHJcblx0Ly8gXHR9XHJcblx0Ly8gfVxyXG5cdC8vIGApO1xyXG59KTtcclxuIiwiZXhwb3J0IGNvbnN0IGFwaUJhc2UgPSBcImh0dHBzOi8vYXBpLnByZW1pZC5hcHAvdjMvXCI7XHJcbmV4cG9ydCBjb25zdCByZWxlYXNlVHlwZTogXCJCRVRBXCIgfCBcIkFMUEhBXCIgfCBcIlJFTEVBU0VcIiB8IFwiREVWXCIgPSBcIlJFTEVBU0VcIjtcclxuZXhwb3J0IGNvbnN0IHJlcXVpcmVkQXBwVmVyc2lvbiA9IDIxNDtcclxuIiwiaW1wb3J0IHsgcmVsZWFzZVR5cGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XHJcblxyXG5jb25zdCBnZW5lcmljU3R5bGUgPSBcImZvbnQtd2VpZ2h0OiA4MDA7IHBhZGRpbmc6IDJweCA1cHg7IGNvbG9yOiB3aGl0ZTtcIixcclxuXHRkZWJ1Z2dpbmcgPSByZWxlYXNlVHlwZSAhPT0gXCJSRUxFQVNFXCI7XHJcbmxldCBsYXN0RmlsZTogc3RyaW5nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluZm8oZmlsZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGZvcmNlID0gZmFsc2UpIHtcclxuXHRpZiAoIWRlYnVnZ2luZyAmJiAhZm9yY2UpIHJldHVybjtcclxuXHJcblx0Ly8qIEdyb3VwIGJ5IGZpbGVcclxuXHRncm91cEZpbGUoZmlsZSk7XHJcblx0Y29uc29sZS5sb2coXHJcblx0XHRcIiVjUHJlTWlEJWNJTkZPJWMgXCIgKyBtZXNzYWdlLFxyXG5cdFx0Z2VuZXJpY1N0eWxlICsgXCJib3JkZXItcmFkaXVzOiAyNXB4IDAgMCAyNXB4OyBiYWNrZ3JvdW5kOiAjNTk2Y2FlO1wiLFxyXG5cdFx0Z2VuZXJpY1N0eWxlICsgXCJib3JkZXItcmFkaXVzOiAwIDI1cHggMjVweCAwOyBiYWNrZ3JvdW5kOiAjNTA1MGZmO1wiLFxyXG5cdFx0XCJjb2xvcjogdW5zZXQ7XCJcclxuXHQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzcyhmaWxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZm9yY2UgPSBmYWxzZSkge1xyXG5cdGlmICghZGVidWdnaW5nICYmICFmb3JjZSkgcmV0dXJuO1xyXG5cclxuXHQvLyogR3JvdXAgYnkgZmlsZVxyXG5cdGdyb3VwRmlsZShmaWxlKTtcclxuXHRjb25zb2xlLmxvZyhcclxuXHRcdFwiJWNQcmVNaUQlY1NVQ0NFU1MlYyBcIiArIG1lc3NhZ2UsXHJcblx0XHRnZW5lcmljU3R5bGUgKyBcImJvcmRlci1yYWRpdXM6IDI1cHggMCAwIDI1cHg7IGJhY2tncm91bmQ6ICM1OTZjYWU7XCIsXHJcblx0XHRnZW5lcmljU3R5bGUgK1xyXG5cdFx0XHRcImJvcmRlci1yYWRpdXM6IDAgMjVweCAyNXB4IDA7IGJhY2tncm91bmQ6ICM1MGZmNTA7IGNvbG9yOiBibGFjaztcIixcclxuXHRcdFwiY29sb3I6IHVuc2V0O1wiXHJcblx0KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yKGZpbGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBmb3JjZSA9IGZhbHNlKSB7XHJcblx0aWYgKCFkZWJ1Z2dpbmcgJiYgIWZvcmNlKSByZXR1cm47XHJcblxyXG5cdC8vKiBHcm91cCBieSBmaWxlXHJcblx0Z3JvdXBGaWxlKGZpbGUpO1xyXG5cdGNvbnNvbGUubG9nKFxyXG5cdFx0XCIlY1ByZU1pRCVjRVJST1IlYyBcIiArIG1lc3NhZ2UsXHJcblx0XHRnZW5lcmljU3R5bGUgKyBcImJvcmRlci1yYWRpdXM6IDI1cHggMCAwIDI1cHg7IGJhY2tncm91bmQ6ICM1OTZjYWU7XCIsXHJcblx0XHRnZW5lcmljU3R5bGUgKyBcImJvcmRlci1yYWRpdXM6IDAgMjVweCAyNXB4IDA7IGJhY2tncm91bmQ6ICNmZjUwNTA7XCIsXHJcblx0XHRcImNvbG9yOiB1bnNldDtcIlxyXG5cdCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdyb3VwRmlsZShmaWxlOiBzdHJpbmcpIHtcclxuXHRpZiAobGFzdEZpbGUgIT09IGZpbGUpIHtcclxuXHRcdGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuXHRcdGNvbnNvbGUuZ3JvdXAoZmlsZSk7XHJcblx0XHRsYXN0RmlsZSA9IGZpbGU7XHJcblx0fVxyXG59XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKFxyXG5cdHR5cGU6IFwibG9jYWxcIiB8IFwic3luY1wiLFxyXG5cdG5hbWU6IHN0cmluZyB8IEFycmF5PHN0cmluZz5cclxuKSB7XHJcblx0cmV0dXJuIG5ldyBQcm9taXNlPGFueT4ocmVzb2x2ZSA9PlxyXG5cdFx0Y2hyb21lLnN0b3JhZ2VbdHlwZV0uZ2V0KG5hbWUsIGl0ZW1zID0+IHJlc29sdmUoaXRlbXMpKVxyXG5cdCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRTdG9yYWdlKFxyXG5cdHR5cGU6IFwibG9jYWxcIiB8IFwic3luY1wiLFxyXG5cdGl0ZW1zOiBPYmplY3RcclxuKSB7XHJcblx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT5cclxuXHRcdGNocm9tZS5zdG9yYWdlW3R5cGVdLnNldChpdGVtcywgcmVzb2x2ZSlcclxuXHQpO1xyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsZWFuT2JqZWN0KG9iajogb2JqZWN0KTogdm9pZCB7XHJcblx0Zm9yIChjb25zdCBwcm9wTmFtZSBpbiBvYmopIHtcclxuXHRcdGlmICh0eXBlb2Ygb2JqW3Byb3BOYW1lXSA9PSBcIm9iamVjdFwiKSB7XHJcblx0XHRcdGNsZWFuT2JqZWN0KG9ialtwcm9wTmFtZV0pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKG9ialtwcm9wTmFtZV0gPT09IG51bGwgfHwgb2JqW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGRlbGV0ZSBvYmpbcHJvcE5hbWVdO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XHJcblxyXG5pbXBvcnQgeyBhcGlCYXNlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgY2xlYW5PYmplY3QgZnJvbSBcIi4vY2xlYW5PYmplY3RcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGdyYXBocWxSZXF1ZXN0KHF1ZXJ5OiBzdHJpbmcpIHtcclxuXHRjb25zdCByZXMgPSBhd2FpdCBheGlvcyh7XHJcblx0XHR1cmw6IGFwaUJhc2UsXHJcblx0XHRtZXRob2Q6IFwicG9zdFwiLFxyXG5cdFx0ZGF0YToge1xyXG5cdFx0XHRxdWVyeTogcXVlcnlcclxuXHRcdH1cclxuXHR9KTtcclxuXHRjbGVhbk9iamVjdChyZXMuZGF0YSk7XHJcblxyXG5cdHJldHVybiByZXMuZGF0YTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByZXNlbmNlTWV0YWRhdGEocHJlc2VuY2U6IHN0cmluZykge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuICAgIHF1ZXJ5IHtcclxuICAgICAgcHJlc2VuY2VzKHNlcnZpY2U6IFwiJHtwcmVzZW5jZX1cIikge1xyXG4gICAgICAgIHVybFxyXG4gICAgICAgIG1ldGFkYXRhIHtcclxuICAgICAgICAgIGF1dGhvciB7XHJcbiAgICAgICAgICAgIGlkXHJcbiAgICAgICAgICAgIG5hbWVcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRyaWJ1dG9ycyB7XHJcbiAgICAgICAgICAgIGlkXHJcbiAgICAgICAgICAgIG5hbWVcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFsdG5hbWVzXHJcbiAgICAgICAgICB3YXJuaW5nXHJcbiAgICAgICAgICByZWFkTG9nc1xyXG4gICAgICAgICAgYnV0dG9uXHJcbiAgICAgICAgICBzZXJ2aWNlXHJcbiAgICAgICAgICBkZXNjcmlwdGlvblxyXG4gICAgICAgICAgdXJsXHJcbiAgICAgICAgICB2ZXJzaW9uXHJcbiAgICAgICAgICBsb2dvXHJcbiAgICAgICAgICB0aHVtYm5haWxcclxuICAgICAgICAgIGNvbG9yXHJcbiAgICAgICAgICB0YWdzXHJcbiAgICAgICAgICBjYXRlZ29yeVxyXG4gICAgICAgICAgaWZyYW1lXHJcbiAgICAgICAgICByZWdFeHBcclxuICAgICAgICAgIGlmcmFtZVJlZ0V4cFxyXG4gICAgICAgICAgc2V0dGluZ3Mge1xyXG4gICAgICAgICAgICBpZFxyXG4gICAgICAgICAgICB0aXRsZVxyXG4gICAgICAgICAgICBpY29uXHJcbiAgICAgICAgICAgIGlmIHtcclxuICAgICAgICAgICAgICBwcm9wcmV0eU5hbWVzXHJcbiAgICAgICAgICAgICAgcGF0dGVyblByb3BydGllc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgIHZhbHVlXHJcbiAgICAgICAgICAgIHZhbHVlc1xyXG4gICAgICAgICAgICBtdWx0aUxhbmd1YWdlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9YCk7XHJcblx0Y2xlYW5PYmplY3QocmVzdWx0LmRhdGEpO1xyXG5cdGNvbnN0IGZpbmFsID0ge1xyXG5cdFx0ZGF0YToge1xyXG5cdFx0XHRuYW1lOiByZXN1bHQuZGF0YS5wcmVzZW5jZXNbMF0ubWV0YWRhdGEuc2VydmljZSxcclxuXHRcdFx0dXJsOiByZXN1bHQuZGF0YS5wcmVzZW5jZXNbMF0udXJsLFxyXG5cdFx0XHRtZXRhZGF0YTogcmVzdWx0LmRhdGEucHJlc2VuY2VzWzBdLm1ldGFkYXRhXHJcblx0XHR9XHJcblx0fTtcclxuXHRyZXR1cm4gZmluYWw7XHJcbn1cclxuIiwiaW1wb3J0IHsgZXJyb3IsIHN1Y2Nlc3MgfSBmcm9tIFwiLi9kZWJ1Z1wiO1xyXG5cclxuaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGdyYXBocWxSZXF1ZXN0IGZyb20gXCIuL2Z1bmN0aW9ucy9ncmFwaHFsXCI7XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBsYW5ndWFnZSBjb2RlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImVuXCI7XHJcblxyXG4vKipcclxuICogTWluaW11bSB0aW1lIGJldHdlZW4gc3RyaW5ncyB1cGRhdGVcclxuICovXHJcbmNvbnN0IE1JTl9VUERBVEVfVElNRSA9IDEwMDAgKiA2MCAqIDU7XHJcblxyXG5sZXQgbGFuZ3VhZ2VzOiBvYmplY3QgPSB7fTtcclxuXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUxhbmd1YWdlQ29kZShsYW5ndWFnZUNvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0cmV0dXJuIGxhbmd1YWdlQ29kZS5zcGxpdChcIi1cIilbMF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgc3RyaW5ncyB2YWx1ZXMgKGV4dGVuc2lvbiBhbmQgcHJlc2VuY2UgZW5kcG9pbnRzKSBmcm9tIHRoZSBBUEkgd2Vic2l0ZVxyXG4gKlxyXG4gKiBAcGFyYW0gbGFuZ3VhZ2VDb2RlIGxhbmd1YWdlIGNvZGUgZm9sbG93aW5nIElTTzYzOS0xIHNwZWNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVTdHJpbmdzKGxhbmd1YWdlQ29kZT86IHN0cmluZykge1xyXG5cdGlmICghbGFuZ3VhZ2VDb2RlKSBsYW5ndWFnZUNvZGUgPSBERUZBVUxUX0xPQ0FMRTtcclxuXHRpZiAoXHJcblx0XHQhbGFuZ3VhZ2VDb2RlLmluY2x1ZGVzKFwiamFcIikgJiZcclxuXHRcdCFsYW5ndWFnZUNvZGUuaW5jbHVkZXMoXCJ6aFwiKSAmJlxyXG5cdFx0IWxhbmd1YWdlQ29kZS5pbmNsdWRlcyhcImtvXCIpXHJcblx0KVxyXG5cdFx0bGFuZ3VhZ2VDb2RlID0gbm9ybWFsaXplTGFuZ3VhZ2VDb2RlKGxhbmd1YWdlQ29kZSk7XHJcblxyXG5cdGxldCB3ZWJzaXRlTGFuZ3VhZ2U6IHN0cmluZyA9IGxhbmd1YWdlQ29kZSxcclxuXHRcdGV4dGVuc2lvbkxhbmd1YWdlOiBzdHJpbmcgPSBsYW5ndWFnZUNvZGUsXHJcblx0XHRwcmVzZW5jZUxhbmd1YWdlOiBzdHJpbmcgPSBsYW5ndWFnZUNvZGU7XHJcblxyXG5cdHN3aXRjaCAobGFuZ3VhZ2VDb2RlKSB7XHJcblx0XHRjYXNlIFwiamFcIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJqYV9KUFwiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJqYV9KUFwiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJqYV9KUFwiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwiamFcIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwia29cIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJrb19LUlwiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJrb19LUlwiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJrb19LUlwiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwia29cIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiemgtQ05cIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJ6aF9DTlwiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJ6aF9DTlwiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJ6aF9DTlwiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwiemgtQ05cIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiemgtVFdcIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJ6aF9UV1wiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJ6aF9UV1wiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJ6aF9UV1wiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwiemgtVFdcIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHRjb25zdCByZXNwb25zZUxhbmdzID0gYXdhaXQgZ3JhcGhxbFJlcXVlc3QoYFxyXG5cdFx0XHRxdWVyeSB7XHJcblx0XHRcdFx0bGFuZ0ZpbGVzKHByb2plY3Q6IFwiZXh0ZW5zaW9uXCIpIHtcclxuXHRcdFx0XHRcdGxhbmdcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0YCksXHJcblx0XHRcdFx0YXZhaWxhYmxlTGFuZ3M6IHN0cmluZ1tdID0gcmVzcG9uc2VMYW5ncy5kYXRhLmxhbmdGaWxlcy5tYXAoXHJcblx0XHRcdFx0XHRsZiA9PiBsZi5sYW5nXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdGlmICghYXZhaWxhYmxlTGFuZ3MuaW5jbHVkZXMoZXh0ZW5zaW9uTGFuZ3VhZ2UpKSB7XHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBhdmFpbGFibGVMYW5ncy5maW5kSW5kZXgoYyA9PlxyXG5cdFx0XHRcdFx0Yy5pbmNsdWRlcyhleHRlbnNpb25MYW5ndWFnZSArIFwiX1wiKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGluZGV4ID49IDApIHtcclxuXHRcdFx0XHRcdHdlYnNpdGVMYW5ndWFnZSA9IGF2YWlsYWJsZUxhbmdzW2luZGV4XTtcclxuXHRcdFx0XHRcdGV4dGVuc2lvbkxhbmd1YWdlID0gYXZhaWxhYmxlTGFuZ3NbaW5kZXhdO1xyXG5cdFx0XHRcdFx0cHJlc2VuY2VMYW5ndWFnZSA9IGF2YWlsYWJsZUxhbmdzW2luZGV4XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0YnJlYWs7XHJcblx0fVxyXG5cclxuXHR0cnkge1xyXG5cdFx0Y29uc3QgZ3JhcGhxbFJlc3VsdCA9IGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0cXVlcnkge1xyXG5cdFx0XHRcdHdlYnNpdGU6IGxhbmdGaWxlcyhwcm9qZWN0OiBcIndlYnNpdGVcIiwgbGFuZzogXCIke3dlYnNpdGVMYW5ndWFnZX1cIikge1xyXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGV4dGVuc2lvbjogbGFuZ0ZpbGVzKHByb2plY3Q6IFwiZXh0ZW5zaW9uXCIsIGxhbmc6IFwiJHtleHRlbnNpb25MYW5ndWFnZX1cIikge1xyXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHByZXNlbmNlOiBsYW5nRmlsZXMocHJvamVjdDogXCJwcmVzZW5jZVwiLCBsYW5nOiBcIiR7cHJlc2VuY2VMYW5ndWFnZX1cIikge1xyXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRgKTtcclxuXHJcblx0XHRsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSA9IHtcclxuXHRcdFx0bmFtZTogZ3JhcGhxbFJlc3VsdC5kYXRhLndlYnNpdGVbMF0udHJhbnNsYXRpb25zW1wiaGVhZGVyLmxhbmd1YWdlXCJdLFxyXG5cdFx0XHRsb2FkaW5nOlxyXG5cdFx0XHRcdGdyYXBocWxSZXN1bHQuZGF0YS53ZWJzaXRlWzBdLnRyYW5zbGF0aW9uc1tcImhlYWRlci5sb2FkZXIucGhyYXNlc1wiXSxcclxuXHRcdFx0ZXh0ZW5zaW9uOiBncmFwaHFsUmVzdWx0LmRhdGEuZXh0ZW5zaW9uWzBdLnRyYW5zbGF0aW9ucyxcclxuXHRcdFx0cHJlc2VuY2U6IGdyYXBocWxSZXN1bHQuZGF0YS5wcmVzZW5jZVswXS50cmFuc2xhdGlvbnMsXHJcblx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxyXG5cdFx0fTtcclxuXHJcblx0XHRzdWNjZXNzKFwibGFuZ01hbmFnZXIudHNcIiwgYFVwZGF0ZWQgJHtsYW5ndWFnZUNvZGV9IHRyYW5zbGF0aW9uc2ApO1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGVycm9yKFxyXG5cdFx0XHRcImxhbmdNYW5hZ2VyLnRzXCIsXHJcblx0XHRcdGBFcnJvciB3aGlsZSBmZXRjaGluZyBsYW5nRmlsZXMgb2YgJHtsYW5ndWFnZUNvZGV9IGxhbmd1YWdlOiAke2UubWVzc2FnZX1gXHJcblx0XHQpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0aWYgKGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdICYmIGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdLmVycm9yKSB7XHJcblx0XHRsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSA9IHVuZGVmaW5lZDtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGF3YWl0IGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IGxhbmd1YWdlcyB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbFN0cmluZ3MoKSB7XHJcblx0Y29uc3QgbGFuZ3VhZ2VzID0gT2JqZWN0LmtleXMoKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcImxhbmd1YWdlc1wiKSkubGFuZ3VhZ2VzKTtcclxuXHRhd2FpdCBQcm9taXNlLmFsbChcclxuXHRcdGxhbmd1YWdlcy5tYXAobG5nID0+IGxvYWRTdHJpbmdzKGxuZywgdHJ1ZSkpXHJcblx0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFN0cmluZ3MgdGhhdCBhcmUgYmVpbmcgbG9hZGVkIGJ5IGxvYWRTdHJpbmdzIGZ1bmN0aW9uXHJcbiAqL1xyXG5jb25zdCBsb2FkaW5nTGFuZ3MgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBMb2FkIHRoZSBzdHJpbmdzIGZyb20gdGhlIGJyb3dzZXIgbG9jYWwgc3RvcmFnZSwgaWYgdGhleSBhcmUgbm90IGZvdW5kIGluIHRoZSBzdG9yYWdlIHRoZXkgd2lsbCBiZVxyXG4gKiBmZXRjaCBmcm9tIHRoZSBBUEkuXHJcbiAqXHJcbiAqIEBwYXJhbSBsYW5ndWFnZUNvZGUgbGFuZ3VhZ2UgY29kZSBJU082MzktMSBpZiBub3Qgc3BlY2lmaWVkIERFRkFVTFRfTE9DQUxFIGlzIHVzZWRcclxuICogQHBhcmFtIHVwZGF0ZSBib29sZWFuIHRvIGZvcmNlIGFuIHVwZGF0ZSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgZ2l2ZW4gbG9jYWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFN0cmluZ3MobGFuZ3VhZ2VDb2RlPzogc3RyaW5nLCB1cGRhdGU/OiBib29sZWFuKSB7XHJcblx0aWYgKCFsYW5ndWFnZUNvZGUpIGxhbmd1YWdlQ29kZSA9IERFRkFVTFRfTE9DQUxFO1xyXG5cdGlmICghdXBkYXRlKSB1cGRhdGUgPSBmYWxzZTtcclxuXHRsYW5ndWFnZUNvZGUgPSBub3JtYWxpemVMYW5ndWFnZUNvZGUobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xyXG5cdFx0aWYgKHR5cGVvZiBsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSAhPT0gXCJ1bmRlZmluZWRcIikgcmVzb2x2ZSgpO1xyXG5cclxuXHRcdGlmICghbG9hZGluZ0xhbmdzLmluY2x1ZGVzKGxhbmd1YWdlQ29kZSkpIHtcclxuXHRcdFx0bG9hZGluZ0xhbmdzLnB1c2gobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChcImxhbmd1YWdlc1wiLCBhc3luYyBsbmdzID0+IHtcclxuXHRcdFx0XHRpZiAoIWxuZ3MubGFuZ3VhZ2VzKSB7XHJcblx0XHRcdFx0XHRsbmdzLmxhbmd1YWdlcyA9IHt9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgdXBkYXRlUHJvbWlzZXMgPSBbXTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdHVwZGF0ZSAmJlxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgbG5ncy5sYW5ndWFnZXNbREVGQVVMVF9MT0NBTEVdICE9PSBcInVuZGVmaW5lZFwiICYmXHJcblx0XHRcdFx0XHRcdERhdGUubm93KCkgLSBsbmdzLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0udXBkYXRlZEF0ID49IE1JTl9VUERBVEVfVElNRVxyXG5cdFx0XHRcdFx0KSB8fFxyXG5cdFx0XHRcdFx0KFxyXG5cdFx0XHRcdFx0XHRsYW5ndWFnZUNvZGUgIT09IERFRkFVTFRfTE9DQUxFICYmXHJcblx0XHRcdFx0XHRcdHR5cGVvZiBsbmdzLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0gPT09IFwidW5kZWZpbmVkXCJcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdHVwZGF0ZVByb21pc2VzLnB1c2godXBkYXRlU3RyaW5ncyhERUZBVUxUX0xPQ0FMRSkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0dHlwZW9mIGxuZ3MubGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0gPT09IFwidW5kZWZpbmVkXCIgfHxcclxuXHRcdFx0XHRcdChcclxuXHRcdFx0XHRcdFx0dXBkYXRlICYmXHJcblx0XHRcdFx0XHRcdC8vIGFscmVhZHkgY2hlY2tlZCBpZiBsbmdzLmxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdIGlzIHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHREYXRlLm5vdygpIC0gbG5ncy5sYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS51cGRhdGVkQXQgPj0gTUlOX1VQREFURV9USU1FXHJcblx0XHRcdFx0XHQpXHJcblxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0dXBkYXRlUHJvbWlzZXMucHVzaCh1cGRhdGVTdHJpbmdzKGxhbmd1YWdlQ29kZSkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwodXBkYXRlUHJvbWlzZXMpO1xyXG5cclxuXHRcdFx0XHQvLyBtZXJnZSBhbGwgbGFuZ3VhZ2VzXHJcblx0XHRcdFx0bGFuZ3VhZ2VzID0geyAuLi5sYW5ndWFnZXMsIC4uLmxuZ3MubGFuZ3VhZ2VzIH07XHJcblxyXG5cdFx0XHRcdGxvYWRpbmdMYW5ncy5zcGxpY2UobG9hZGluZ0xhbmdzLmluZGV4T2YobGFuZ3VhZ2VDb2RlKSwgMSk7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxldCBsb2FkU3RhdHVzID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdHR5cGVvZiBsYW5ndWFnZXMgIT09IFwidW5kZWZpbmVkXCIgJiZcclxuXHRcdFx0XHRcdHR5cGVvZiBsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbChsb2FkU3RhdHVzKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIDUpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGFsbCB0aGUgdHJhbnNsYXRpb25zIGluIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgREVGQVVMVF9MT0NBTEVcclxuICpcclxuICogQHBhcmFtIGxhbmd1YWdlQ29kZSBsYW5ndWFnZSBjb2RlIElTTzYzOS0xIGlmIG5vdCBzcGVjaWZpZWQgREVGQVVMVF9MT0NBTEUgaXMgdXNlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ3MobGFuZ3VhZ2VDb2RlPzogc3RyaW5nKSB7XHJcblx0aWYgKCFsYW5ndWFnZUNvZGUpIGxhbmd1YWdlQ29kZSA9IERFRkFVTFRfTE9DQUxFO1xyXG5cdGxhbmd1YWdlQ29kZSA9IG5vcm1hbGl6ZUxhbmd1YWdlQ29kZShsYW5ndWFnZUNvZGUpO1xyXG5cclxuXHRyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgcmVzb2x2ZSA9PiB7XHJcblx0XHRhd2FpdCBsb2FkU3RyaW5ncyhsYW5ndWFnZUNvZGUpO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuXHRcdFx0aWYgKCFsYW5ndWFnZXNbREVGQVVMVF9MT0NBTEVdKSB7XHJcblx0XHRcdFx0cmVzb2x2ZSh7fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlc29sdmUoe1xyXG5cdFx0XHRcdFtERUZBVUxUX0xPQ0FMRV06IHtcclxuXHRcdFx0XHRcdC4uLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0uZXh0ZW5zaW9uLFxyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW0RFRkFVTFRfTE9DQUxFXS5wcmVzZW5jZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXNvbHZlKHtcclxuXHRcdFx0XHRbbGFuZ3VhZ2VDb2RlXToge1xyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0uZXh0ZW5zaW9uLFxyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ucHJlc2VuY2VcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFtERUZBVUxUX0xPQ0FMRV06IHtcclxuXHRcdFx0XHRcdC4uLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0uZXh0ZW5zaW9uLFxyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW0RFRkFVTFRfTE9DQUxFXS5wcmVzZW5jZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdHJhbnNsYXRpb24gb2YgYSBzcGVjaWZpYyBrZXlcclxuICpcclxuICogQHBhcmFtIHN0cmluZyBuYW1lIG9mIHRoZSBzdHJpbmcsIHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UgdXNlIFwibmFtZVwiIG9yIFwiaGVhZGVyLmxhbmd1YWdlXCJcclxuICogQHBhcmFtIGxhbmd1YWdlQ29kZSBsYW5ndWFnZSBjb2RlIElTTzYzOS0xIGlmIG5vdCBzcGVjaWZpZWQgREVGQVVMVF9MT0NBTEUgaXMgdXNlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZyhzdHJpbmc6IHN0cmluZywgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nKSB7XHJcblx0aWYgKCFsYW5ndWFnZUNvZGUpIGxhbmd1YWdlQ29kZSA9IGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKTtcclxuXHRsYW5ndWFnZUNvZGUgPSBub3JtYWxpemVMYW5ndWFnZUNvZGUobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xyXG5cdFx0YXdhaXQgbG9hZFN0cmluZ3MobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0XHRpZiAodHlwZW9mIGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRbXCJuYW1lXCIsIFwiaGVhZGVyLmxhbmd1YWdlXCJdLmluY2x1ZGVzKHN0cmluZykgJiZcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ubmFtZSAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS5uYW1lKTtcclxuXHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRbXCJsb2FkaW5nXCIsIFwiaGVhZGVyLmxvYWRlci5waHJhc2VzXCJdLmluY2x1ZGVzKHN0cmluZykgJiZcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ubG9hZGluZyAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS5sb2FkaW5nKTtcclxuXHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0uZXh0ZW5zaW9uICE9PSBcInVuZGVmaW5lZFwiICYmXHJcblx0XHRcdFx0dHlwZW9mIGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdLmV4dGVuc2lvbltzdHJpbmddICE9PSBcInVuZGVmaW5lZFwiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHJldHVybiByZXNvbHZlKGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdLmV4dGVuc2lvbltzdHJpbmddKTtcclxuXHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ucHJlc2VuY2UgIT09IFwidW5kZWZpbmVkXCIgJiZcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ucHJlc2VuY2Vbc3RyaW5nXSAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS5wcmVzZW5jZVtzdHJpbmddKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcclxuXHRcdGlmIChsYW5ndWFnZUNvZGUgPT09IERFRkFVTFRfTE9DQUxFKSB7XHJcblx0XHRcdHJldHVybiByZXNvbHZlKHN0cmluZyk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc29sdmUoYXdhaXQgZ2V0U3RyaW5nKHN0cmluZywgREVGQVVMVF9MT0NBTEUpKTtcclxuXHR9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9idGFpbiBhbGwgbGFuZ3VhZ2VzIHRoYXQgYXJlIDEwMCUgdHJhbnNsYXRlZCBmb3IgYSBwcmVzZW5jZSBhbmQgdGhhdCBhbHNvIGhhdmUgdGhlIGdlbmVyYWwgZmlsZSAxMDAlIHRyYW5zbGF0ZWRcclxuICpcclxuICogQHBhcmFtIHByZXNlbmNlTmFtZSBuYW1lIG9mIHRoZSBwcmVzZW5jZSBhcyBzcGVjaWZpZWQgaW4gdGhlIFwic2VydmljZVwiIGtleSBvZiB0aGUgbWV0YWRhdGEuanNvbiBmaWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJlc2VuY2VMYW5ndWFnZXMocHJlc2VuY2VOYW1lOiBzdHJpbmcpIHtcclxuXHR0cnkge1xyXG5cdFx0Y29uc3QgbGFuZ3MgPSBhd2FpdCBncmFwaHFsUmVxdWVzdChgXHJcblx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRsYW5nRmlsZXMocHJlc2VuY2U6IFwiJHtwcmVzZW5jZU5hbWUudG9Mb3dlckNhc2UoKX1cIikge1xyXG5cdFx0XHRcdFx0bGFuZ1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRnZW5lcmFsTGFuZ0ZpbGVzOiBsYW5nRmlsZXMocHJlc2VuY2U6IFwiZ2VuZXJhbFwiKSB7XHJcblx0XHRcdFx0XHRsYW5nXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRgKTtcclxuXHJcblx0XHRjb25zdCBmaW5hbEFycmF5ID0gW107XHJcblx0XHRpZiAoXHJcblx0XHRcdGxhbmdzLmRhdGEubGFuZ0ZpbGVzLmxlbmd0aCA+IDAgJiZcclxuXHRcdFx0bGFuZ3MuZGF0YS5nZW5lcmFsTGFuZ0ZpbGVzLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRsYW5ncy5kYXRhLmdlbmVyYWxMYW5nRmlsZXMuZm9yRWFjaChsYW5nID0+IHtcclxuXHRcdFx0XHRjb25zdCBmb3VuZCA9IGxhbmdzLmRhdGEubGFuZ0ZpbGVzLmZpbmQocCA9PiBwLmxhbmcgPT09IGxhbmcubGFuZyk7XHJcblx0XHRcdFx0aWYgKGZvdW5kKSBmaW5hbEFycmF5LnB1c2gobGFuZy5sYW5nKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2UgaWYgKGxhbmdzLmRhdGEuZ2VuZXJhbExhbmdGaWxlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGxhbmdzLmRhdGEuZ2VuZXJhbExhbmdGaWxlcy5mb3JFYWNoKGxhbmcgPT4ge1xyXG5cdFx0XHRcdGZpbmFsQXJyYXkucHVzaChsYW5nLmxhbmcpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmaW5hbEFycmF5O1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuXHRERUZBVUxUX0xPQ0FMRSxcclxuXHRnZXRTdHJpbmcsXHJcblx0Z2V0UHJlc2VuY2VMYW5ndWFnZXMgYXMgcHJlc2VuY2VMYW5ndWFnZXMsXHJcblx0dXBkYXRlU3RyaW5nc1xyXG59IGZyb20gXCIuL2xhbmdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IGVycm9yLCBzdWNjZXNzIH0gZnJvbSBcIi4vZGVidWdcIjtcclxuaW1wb3J0IGdyYXBocWxSZXF1ZXN0LCB7IGdldFByZXNlbmNlTWV0YWRhdGEgfSBmcm9tIFwiLi9mdW5jdGlvbnMvZ3JhcGhxbFwiO1xyXG5cclxuaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IHsgbG9hZFN0cmluZ3MgfSBmcm9tIFwiLi9sYW5nTWFuYWdlclwiO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBwbGF0Zm9ybVR5cGUge1xyXG5cdG9zOiBzdHJpbmc7XHJcblx0YXJjaDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlc2VuY2VTY2llbmNlKCkge1xyXG5cdGxldCBpZGVudGlmaWVyID0gKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcImlkZW50aWZpZXJcIikpLmlkZW50aWZpZXIsXHJcblx0XHRwcmVzZW5jZXM6IHByZXNlbmNlU3RvcmFnZSA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpXHJcblx0XHRcdC5wcmVzZW5jZXM7XHJcblxyXG5cdGlmICghaWRlbnRpZmllcikge1xyXG5cdFx0aWRlbnRpZmllciA9IHV1aWR2NCgpO1xyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgaWRlbnRpZmllcjogaWRlbnRpZmllciB9KTtcclxuXHR9XHJcblxyXG5cdGNvbnN0IHBsYXRmb3JtOiBwbGF0Zm9ybVR5cGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+XHJcblx0XHRcdGNocm9tZS5ydW50aW1lLmdldFBsYXRmb3JtSW5mbyhpbmZvID0+XHJcblx0XHRcdFx0cmVzb2x2ZSh7IG9zOiBpbmZvLm9zLCBhcmNoOiBpbmZvLmFyY2ggfSlcclxuXHRcdFx0KVxyXG5cdFx0KSxcclxuXHRcdHByZXNlbmNlc0FycmF5ID0gcHJlc2VuY2VzLmZpbHRlcihwID0+ICFwLnRtcCkubWFwKHAgPT4gcC5tZXRhZGF0YS5zZXJ2aWNlKTtcclxuXHJcblx0Z3JhcGhxbFJlcXVlc3QoYFxyXG5cdG11dGF0aW9uIHtcclxuXHRcdGFkZFNjaWVuY2UoaWRlbnRpZmllcjogXCIke2lkZW50aWZpZXJ9XCIsIHByZXNlbmNlczogW1wiJHtwcmVzZW5jZXNBcnJheVxyXG5cdFx0LnRvU3RyaW5nKClcclxuXHRcdC5zcGxpdChcIixcIilcclxuXHRcdC5qb2luKGBcIiwgXCJgKX1cIl0sIG9zOiBcIiR7cGxhdGZvcm0ub3N9XCIsIGFyY2g6XCIke3BsYXRmb3JtLmFyY2h9XCIpIHtcclxuXHRcdFx0aWRlbnRpZmllclxyXG5cdFx0fVxyXG5cdH1cclxuXHRgKTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByZXNlbmNlcygpIHtcclxuXHRsZXQgcHJlc2VuY2VWZXJzaW9uczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgdXJsOiBzdHJpbmcgfT4sXHJcblx0XHRwcmVzZW5jZXM6IHByZXNlbmNlU3RvcmFnZSA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpXHJcblx0XHRcdC5wcmVzZW5jZXM7XHJcblxyXG5cdGlmICghcHJlc2VuY2VzIHx8IHByZXNlbmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcblx0Ly8qIENhdGNoIGZldGNoIGVycm9yXHJcblx0dHJ5IHtcclxuXHRcdGNvbnN0IGdyYXBocWxSZXN1bHQgPSAoXHJcblx0XHRcdGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0cXVlcnkge1xyXG4gIFx0XHRcdHByZXNlbmNlcyB7XHJcbiAgICBcdFx0XHR1cmxcclxuICAgIFx0XHRcdG1ldGFkYXRhIHtcclxuICAgICAgXHRcdFx0c2VydmljZVxyXG4gICAgICBcdFx0XHR2ZXJzaW9uXHJcbiAgICBcdFx0XHR9XHJcbiAgXHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRgKVxyXG5cdFx0KS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuXHRcdGdyYXBocWxSZXN1bHQucHJlc2VuY2VzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcblx0XHRcdHJlc3VsdC5wdXNoKHtcclxuXHRcdFx0XHRuYW1lOiBlbGVtZW50Lm1ldGFkYXRhLnNlcnZpY2UsXHJcblx0XHRcdFx0dXJsOiBlbGVtZW50LnVybCxcclxuXHRcdFx0XHR2ZXJzaW9uOiBlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb25cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRwcmVzZW5jZVZlcnNpb25zID0gcmVzdWx0O1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGVycm9yKFwicHJlc2VuY2VNYW5hZ2VyLnRzXCIsIGBFcnJvciB3aGlsZSB1cGRhdGluZyBwcmVzZW5jZXM6ICR7ZS5tZXNzYWdlfWApO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0bGV0IGN1cnJQcmVzZW5jZVZlcnNpb25zID0gcHJlc2VuY2VzXHJcblx0XHRcdC5maWx0ZXIocCA9PiAhcC50bXApXHJcblx0XHRcdC5tYXAocCA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIHsgbmFtZTogcC5tZXRhZGF0YS5zZXJ2aWNlLCB2ZXJzaW9uOiBwLm1ldGFkYXRhLnZlcnNpb24gfTtcclxuXHRcdFx0fSksXHJcblx0XHRwcmVzZW5jZXNUb1VwZGF0ZSA9IGN1cnJQcmVzZW5jZVZlcnNpb25zLmZpbHRlcihwID0+XHJcblx0XHRcdHByZXNlbmNlVmVyc2lvbnMuZmluZChwMSA9PiBwMS5uYW1lID09IHAubmFtZSAmJiBwMS52ZXJzaW9uICE9PSBwLnZlcnNpb24pXHJcblx0XHQpO1xyXG5cclxuXHRQcm9taXNlLmFsbChcclxuXHRcdHByZXNlbmNlc1RvVXBkYXRlLm1hcChhc3luYyBwID0+IHtcclxuXHRcdFx0Y29uc3QgcHJlc2VuY2VJbmRleCA9IHByZXNlbmNlcy5maW5kSW5kZXgoXHJcblx0XHRcdFx0Ly9AdHMtaWdub3JlXHJcblx0XHRcdFx0cDEgPT4gcDEubWV0YWRhdGEuc2VydmljZSA9PT0gcC5uYW1lICYmICFwLnRtcFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JhcGhxbFJlc3VsdCA9IChcclxuXHRcdFx0XHRhd2FpdCBncmFwaHFsUmVxdWVzdChgXHJcblx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRwcmVzZW5jZXMoc2VydmljZTogXCIke3AubmFtZX1cIikge1xyXG5cdFx0XHRcdFx0cHJlc2VuY2VKc1xyXG5cdFx0XHRcdFx0aWZyYW1lSnNcclxuXHRcdFx0XHRcdG1ldGFkYXRhIHtcclxuXHRcdFx0XHRcdFx0YXV0aG9yIHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lXHJcblx0XHRcdFx0XHRcdFx0aWRcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRjb250cmlidXRvcnMge1xyXG5cdFx0XHRcdFx0XHRcdG5hbWVcclxuXHRcdFx0XHRcdFx0XHRpZFxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGFsdG5hbWVzXHJcblx0XHRcdFx0XHRcdHdhcm5pbmdcclxuXHRcdFx0XHRcdFx0cmVhZExvZ3NcclxuXHRcdFx0XHRcdFx0c2VydmljZVxyXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvblxyXG5cdFx0XHRcdFx0XHR1cmxcclxuXHRcdFx0XHRcdFx0dmVyc2lvblxyXG5cdFx0XHRcdFx0XHRsb2dvXHJcblx0XHRcdFx0XHRcdHRodW1ibmFpbFxyXG5cdFx0XHRcdFx0XHRjb2xvclxyXG5cdFx0XHRcdFx0XHR0YWdzXHJcblx0XHRcdFx0XHRcdGNhdGVnb3J5XHJcblx0XHRcdFx0XHRcdGlmcmFtZVxyXG5cdFx0XHRcdFx0XHRyZWdFeHBcclxuXHRcdFx0XHRcdFx0aWZyYW1lUmVnRXhwXHJcblx0XHRcdFx0XHRcdGJ1dHRvblxyXG5cdFx0XHRcdFx0XHR3YXJuaW5nXHJcblx0XHRcdFx0XHRcdHNldHRpbmdzIHtcclxuXHRcdFx0XHRcdFx0XHRpZFxyXG5cdFx0XHRcdFx0XHRcdHRpdGxlXHJcblx0XHRcdFx0XHRcdFx0aWNvblxyXG5cdFx0XHRcdFx0XHRcdGlmIHtcclxuXHRcdFx0XHRcdFx0XHRcdHByb3ByZXR5TmFtZXNcclxuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm5Qcm9wcnRpZXNcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZVxyXG5cdFx0XHRcdFx0XHRcdHZhbHVlc1xyXG5cdFx0XHRcdFx0XHRcdG11bHRpTGFuZ3VhZ2VcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRgKVxyXG5cdFx0XHQpLmRhdGE7XHJcblxyXG5cdFx0XHRjb25zdCBtZXRhZGF0YSA9IGdyYXBocWxSZXN1bHQucHJlc2VuY2VzWzBdLm1ldGFkYXRhLFxyXG5cdFx0XHRcdGZpbGVzID0gW1xyXG5cdFx0XHRcdFx0Z3JhcGhxbFJlc3VsdC5wcmVzZW5jZXNbMF0ucHJlc2VuY2VKcyxcclxuXHRcdFx0XHRcdG1ldGFkYXRhLmlmcmFtZSA/IGdyYXBocWxSZXN1bHQucHJlc2VuY2VzWzBdLmlmcmFtZUpzIDogdW5kZWZpbmVkXHJcblx0XHRcdFx0XS5maWx0ZXIoZiA9PiBmKTtcclxuXHJcblx0XHRcdHByZXNlbmNlc1twcmVzZW5jZUluZGV4XS5tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG5cdFx0XHRwcmVzZW5jZXNbcHJlc2VuY2VJbmRleF0ucHJlc2VuY2UgPSBmaWxlc1swXTtcclxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRpZiAoZmlsZXMubGVuZ3RoID09IDIpIHByZXNlbmNlc1twcmVzZW5jZUluZGV4XS5pZnJhbWUgPSBmaWxlc1sxXTtcclxuXHRcdH0pXHJcblx0KS50aGVuKCgpID0+IHtcclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IHByZXNlbmNlczogWy4uLnByZXNlbmNlc10gfSwgKCkgPT4ge1xyXG5cdFx0XHRwcmVzZW5jZXNUb1VwZGF0ZS5tYXAocCA9PlxyXG5cdFx0XHRcdHN1Y2Nlc3MoXHJcblx0XHRcdFx0XHRcInByZXNlbmNlRGV2TWFuYWdlci50c1wiLFxyXG5cdFx0XHRcdFx0YFVwZGF0ZWQgJHtwLm5hbWV9IGZyb20gdiR7cC52ZXJzaW9ufSB0byB2JHtcclxuXHRcdFx0XHRcdFx0cHJlc2VuY2VWZXJzaW9ucy5maW5kKHAxID0+IHAxLm5hbWUgPT09IHAubmFtZSkudmVyc2lvblxyXG5cdFx0XHRcdFx0fWBcclxuXHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IHByZXNlbmNlTmFtZXNUb1VwZGF0ZSA9IHByZXNlbmNlc1RvVXBkYXRlLm1hcChwID0+IHAubmFtZSksXHJcblx0XHRcdHVwZGF0ZWRQcmVzZW5jZXMgPSBwcmVzZW5jZXMuZmlsdGVyKHAgPT4gcHJlc2VuY2VOYW1lc1RvVXBkYXRlLmluY2x1ZGVzKHAubWV0YWRhdGEuc2VydmljZSkpO1xyXG5cclxuXHRcdHVwZGF0ZWRQcmVzZW5jZXMuZm9yRWFjaChhc3luYyBwID0+IHtcclxuXHRcdFx0XHRhd2FpdCBpbml0UHJlc2VuY2VMYW5ndWFnZXMocCk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNldHRpbmdOYW1lID0gYHBTZXR0aW5nc18ke3AubWV0YWRhdGEuc2VydmljZX1gLFxyXG5cdFx0XHRcdFx0c2V0dGluZ3MgPSAoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIHNldHRpbmdOYW1lKSlbc2V0dGluZ05hbWVdO1xyXG5cclxuXHRcdFx0XHRpZiAoc2V0dGluZ3MpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGxhbmdTZXR0aW5ncyA9IHNldHRpbmdzLmZpbmQocyA9PiB0eXBlb2Ygcy5tdWx0aUxhbmd1YWdlICE9PSBcInVuZGVmaW5lZFwiKTtcclxuXHJcblx0XHRcdFx0XHRpZiAobGFuZ1NldHRpbmdzICYmIGxhbmdTZXR0aW5ncy52YWx1ZXMpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbGFuZ3MgPSBsYW5nU2V0dGluZ3MudmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpO1xyXG5cclxuXHRcdFx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXHJcblx0XHRcdFx0XHRcdFx0bGFuZ3MubWFwKGxhbmcgPT4gbG9hZFN0cmluZ3MobGFuZywgdHJ1ZSkpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRQcmVzZW5jZShuYW1lOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+KSB7XHJcblx0bGV0IHByZXNlbmNlczogcHJlc2VuY2VTdG9yYWdlID0gKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcInByZXNlbmNlc1wiKSlcclxuXHRcdC5wcmVzZW5jZXM7XHJcblxyXG5cdGlmICghcHJlc2VuY2VzKSBwcmVzZW5jZXMgPSBbXTtcclxuXHQvLyogRmlsdGVyIG91dCB0bXAgcHJlc2VuY2VzXHJcblxyXG5cdGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0aWYgKHByZXNlbmNlcy5maWx0ZXIocCA9PiAhcC50bXApLmZpbmQocCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UgPT09IG5hbWUpKSB7XHJcblx0XHRcdGVycm9yKFwicHJlc2VuY2VNYW5hZ2VyXCIsIGBQcmVzZW5jZSAke25hbWV9IGFscmVhZHkgYWRkZWQuYCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0Y29uc3QgcmVzID0gbmFtZS5maWx0ZXIoXHJcblx0XHRcdHMgPT4gIXByZXNlbmNlcy5tYXAocCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UpLmluY2x1ZGVzKHMpXHJcblx0XHQpO1xyXG5cclxuXHRcdGlmIChyZXMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdGVycm9yKFwicHJlc2VuY2VNYW5hZ2VyXCIsIFwiUHJlc2VuY2VzIGFscmVhZHkgYWRkZWQuXCIpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2UgbmFtZSA9IHJlcztcclxuXHR9XHJcblxyXG5cdGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0Z2V0UHJlc2VuY2VNZXRhZGF0YShuYW1lKVxyXG5cdFx0XHQudGhlbihhc3luYyAoeyBkYXRhIH0pID0+IHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHR0eXBlb2YgZGF0YS5tZXRhZGF0YS5idXR0b24gIT09IFwidW5kZWZpbmVkXCIgJiZcclxuXHRcdFx0XHRcdCFkYXRhLm1ldGFkYXRhLmJ1dHRvblxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRjb25zdCBwcmVzZW5jZUFuZElmcmFtZSA9IChcclxuXHRcdFx0XHRcdGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0XHRcdFx0cXVlcnkge1xyXG5cdFx0XHRcdFx0XHRcdHByZXNlbmNlcyhzZXJ2aWNlOiBcIiR7ZGF0YS5tZXRhZGF0YS5zZXJ2aWNlfVwiKSB7XHJcbiAgICBcdFx0XHRcdFx0cHJlc2VuY2VKc1xyXG4gICAgXHRcdFx0XHRcdGlmcmFtZUpzXHJcbiAgICBcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGApXHJcblx0XHRcdFx0KS5kYXRhLnByZXNlbmNlc1swXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVzOiBhbnkgPSB7XHJcblx0XHRcdFx0XHRtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcclxuXHRcdFx0XHRcdHByZXNlbmNlOiBwcmVzZW5jZUFuZElmcmFtZS5wcmVzZW5jZUpzLFxyXG5cdFx0XHRcdFx0ZW5hYmxlZDogdHJ1ZVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGlmICh0eXBlb2YgZGF0YS5tZXRhZGF0YS5pZnJhbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YS5tZXRhZGF0YS5pZnJhbWUpXHJcblx0XHRcdFx0XHRyZXMuaWZyYW1lID0gcHJlc2VuY2VBbmRJZnJhbWUuaWZyYW1lSnM7XHJcblxyXG5cdFx0XHRcdHByZXNlbmNlcy5wdXNoKHJlcyk7XHJcblx0XHRcdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBwcmVzZW5jZXMgfSk7XHJcblx0XHRcdFx0cHJlc2VuY2VzLm1hcChwID0+IHtcclxuXHRcdFx0XHRcdGlmIChwLm1ldGFkYXRhLnNldHRpbmdzKSB7XHJcblx0XHRcdFx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRcdFx0XHRcdFx0W2BwU2V0dGluZ3NfJHtwLm1ldGFkYXRhLnNlcnZpY2V9YF06IHAubWV0YWRhdGEuc2V0dGluZ3NcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pXHJcblx0XHRcdC5jYXRjaCgoKSA9PiB7fSk7XHJcblx0fSBlbHNlIHtcclxuXHRcdGNvbnN0IHByZXNlbmNlc1RvQWRkOiBhbnkgPSAoXHJcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxyXG5cdFx0XHRcdChcclxuXHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxyXG5cdFx0XHRcdFx0XHRuYW1lLm1hcChuYW1lID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZ2V0UHJlc2VuY2VNZXRhZGF0YShuYW1lKTtcclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpLm1hcChhc3luYyAoeyBkYXRhIH0pID0+IHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0dHlwZW9mIGRhdGEubWV0YWRhdGEuYnV0dG9uICE9PSBcInVuZGVmaW5lZFwiICYmXHJcblx0XHRcdFx0XHRcdCFkYXRhLm1ldGFkYXRhLmJ1dHRvblxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcHJlc2VuY2VBbmRJZnJhbWUgPSAoXHJcblx0XHRcdFx0XHRcdGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0XHRcdFx0cXVlcnkge1xyXG5cdFx0XHRcdFx0XHRcdHByZXNlbmNlcyhzZXJ2aWNlOiBcIiR7ZGF0YS5tZXRhZGF0YS5zZXJ2aWNlfVwiKSB7XHJcbiAgICBcdFx0XHRcdFx0cHJlc2VuY2VKc1xyXG4gICAgXHRcdFx0XHRcdGlmcmFtZUpzXHJcbiAgICBcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGApXHJcblx0XHRcdFx0XHQpLmRhdGEucHJlc2VuY2VzWzBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHJlczogYW55ID0ge1xyXG5cdFx0XHRcdFx0XHRtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcclxuXHRcdFx0XHRcdFx0cHJlc2VuY2U6IHByZXNlbmNlQW5kSWZyYW1lLnByZXNlbmNlSnMsXHJcblx0XHRcdFx0XHRcdGVuYWJsZWQ6IHRydWVcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhLm1ldGFkYXRhLmlmcmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxyXG5cdFx0XHRcdFx0XHRkYXRhLm1ldGFkYXRhLmlmcmFtZVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRyZXMuaWZyYW1lID0gcHJlc2VuY2VBbmRJZnJhbWUuaWZyYW1lSnM7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJlcztcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpXHJcblx0XHQpLmZpbHRlcihwID0+IHR5cGVvZiBwICE9PSBcInVuZGVmaW5lZFwiKTtcclxuXHJcblx0XHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoeyBwcmVzZW5jZXM6IHByZXNlbmNlcy5jb25jYXQocHJlc2VuY2VzVG9BZGQpIH0pO1xyXG5cdFx0cHJlc2VuY2VzLmNvbmNhdChwcmVzZW5jZXNUb0FkZCkubWFwKHAgPT4ge1xyXG5cdFx0XHRpZiAocC5tZXRhZGF0YS5zZXR0aW5ncykge1xyXG5cdFx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRcdFx0XHRbYHBTZXR0aW5nc18ke3AubWV0YWRhdGEuc2VydmljZX1gXTogcC5tZXRhZGF0YS5zZXR0aW5nc1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdC8vKiBOb3QgYXdhaXRpbmcgaXQsIGl0IGNvdWxkIHRha2UgYSBsb3Qgb2YgdGltZVxyXG5cdFx0XHRcdGluaXRQcmVzZW5jZUxhbmd1YWdlcyhwKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHR1cGRhdGVQcmVzZW5jZXMoKTtcclxuXHR1cGRhdGVTdHJpbmdzKGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKSk7XHJcbn1cclxuXHJcbi8vKiBPbmx5IGFkZCB0aGVzZSBpZiBpcyBub3QgYmFja2dyb3VuZCBwYWdlXHJcbmlmIChkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvX2dlbmVyYXRlZF9iYWNrZ3JvdW5kX3BhZ2UuaHRtbFwiKSB7XHJcblx0Ly8qIEFkZCBleHRlbnNpb25cclxuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiB7XHJcblx0XHRpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHBcIikpXHJcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwXCIpLnNldEF0dHJpYnV0ZShcImV4dGVuc2lvbi1yZWFkeVwiLCBcInRydWVcIik7XHJcblx0fSk7XHJcblxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiUHJlTWlEX0FkZFByZXNlbmNlXCIsIGZ1bmN0aW9uKGRhdGE6IEN1c3RvbUV2ZW50KSB7XHJcblx0XHRhZGRQcmVzZW5jZShbZGF0YS5kZXRhaWxdKTtcclxuXHR9KTtcclxuXHJcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJQcmVNaURfUmVtb3ZlUHJlc2VuY2VcIiwgYXN5bmMgZnVuY3Rpb24oXHJcblx0XHRkYXRhOiBDdXN0b21FdmVudFxyXG5cdCkge1xyXG5cdFx0Y29uc3QgeyBwcmVzZW5jZXMgfSA9IGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcInByZXNlbmNlc1wiKTtcclxuXHJcblx0XHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoe1xyXG5cdFx0XHRwcmVzZW5jZXM6IChwcmVzZW5jZXMgYXMgcHJlc2VuY2VTdG9yYWdlKS5maWx0ZXIoXHJcblx0XHRcdFx0cCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UgIT09IGRhdGEuZGV0YWlsXHJcblx0XHRcdClcclxuXHRcdH0pO1xyXG5cdFx0dXBkYXRlUHJlc2VuY2VzKCk7XHJcblx0XHR1cGRhdGVTdHJpbmdzKGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKSk7XHJcblx0fSk7XHJcblxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiUHJlTWlEX0dldFByZXNlbmNlTGlzdFwiLCBzZW5kQmFja1ByZXNlbmNlcyk7XHJcblxyXG5cdC8vKiBPbiBwcmVzZW5jZSBjaGFuZ2UgdXBkYXRlXHJcblx0Y2hyb21lLnN0b3JhZ2Uub25DaGFuZ2VkLmFkZExpc3RlbmVyKGtleSA9PiB7XHJcblx0XHRpZiAoT2JqZWN0LmtleXMoa2V5KVswXSA9PT0gXCJwcmVzZW5jZXNcIikgc2VuZEJhY2tQcmVzZW5jZXMoKTtcclxuXHR9KTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2VuZEJhY2tQcmVzZW5jZXMoKSB7XHJcblx0Y29uc3QgcHJlc2VuY2VzID0gKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcInByZXNlbmNlc1wiKSlcclxuXHRcdC5wcmVzZW5jZXMgYXMgcHJlc2VuY2VTdG9yYWdlO1xyXG5cdGxldCBkYXRhID0ge1xyXG5cdFx0ZGV0YWlsOiBwcmVzZW5jZXMuZmlsdGVyKHAgPT4gIXAudG1wKS5tYXAocCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UpXHJcblx0fTtcclxuXHJcblx0Ly8gQHRzLWlnbm9yZVxyXG5cdGlmICh0eXBlb2YgY2xvbmVJbnRvID09PSBcImZ1bmN0aW9uXCIpXHJcblx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRkYXRhID0gY2xvbmVJbnRvKGRhdGEsIGRvY3VtZW50LmRlZmF1bHRWaWV3KTtcclxuXHJcblx0Y29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJQcmVNaURfR2V0V2ViaXN0ZUZhbGxiYWNrXCIsIGRhdGEpO1xyXG5cdHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRQcmVzZW5jZUxhbmd1YWdlcyhwKSB7XHJcblx0aWYgKHAubWV0YWRhdGEuc2V0dGluZ3MpIHtcclxuXHRcdGNvbnN0IGxuZ1NldHRpbmdJZHggPSBwLm1ldGFkYXRhLnNldHRpbmdzLmZpbmRJbmRleChcclxuXHRcdFx0cyA9PiB0eXBlb2Ygcy5tdWx0aUxhbmd1YWdlICE9PSBcInVuZGVmaW5lZFwiXHJcblx0XHQpO1xyXG5cclxuXHRcdGlmIChsbmdTZXR0aW5nSWR4ID49IDApIHtcclxuXHRcdFx0Y29uc3QgbG5nU2V0dGluZyA9IHAubWV0YWRhdGEuc2V0dGluZ3NbbG5nU2V0dGluZ0lkeF0sXHJcblx0XHRcdFx0bGFuZ3VhZ2VzID0gYXdhaXQgcHJlc2VuY2VNdWx0aUxhbmd1YWdlTGFuZ3VhZ2VzKFxyXG5cdFx0XHRcdFx0bG5nU2V0dGluZy5tdWx0aUxhbmd1YWdlLFxyXG5cdFx0XHRcdFx0cC5tZXRhZGF0YS5zZXJ2aWNlXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdGlmIChPYmplY3Qua2V5cyhsYW5ndWFnZXMpLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0XHRhd2FpdCBzdG9yZURlZmF1bHRMYW5ndWFnZU9mUHJlc2VuY2UocCwgbGFuZ3VhZ2VzKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRwLm1ldGFkYXRhLnNldHRpbmdzLnNwbGljZShsbmdTZXR0aW5nSWR4LCAxKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJlc2VuY2VMYW5ndWFnZXMoc2VydmljZU5hbWUpIHtcclxuXHRjb25zdCB2YWx1ZXMgPSBbXSxcclxuXHRcdGxhbmd1YWdlcyA9IGF3YWl0IHByZXNlbmNlTGFuZ3VhZ2VzKHNlcnZpY2VOYW1lKTtcclxuXHJcblx0Zm9yIChjb25zdCBsYW5ndWFnZSBvZiBsYW5ndWFnZXMpIHtcclxuXHRcdHZhbHVlcy5wdXNoKHtcclxuXHRcdFx0bmFtZTogYXdhaXQgZ2V0U3RyaW5nKFwibmFtZVwiLCBsYW5ndWFnZSksXHJcblx0XHRcdHZhbHVlOiBsYW5ndWFnZVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdmFsdWVzO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBwcmVzZW5jZU11bHRpTGFuZ3VhZ2VMYW5ndWFnZXMobXVsdGlMYW5ndWFnZSwgc2VydmljZSkge1xyXG5cdHN3aXRjaCAodHlwZW9mIG11bHRpTGFuZ3VhZ2UpIHtcclxuXHRcdGNhc2UgXCJib29sZWFuXCI6XHJcblx0XHRcdGlmIChtdWx0aUxhbmd1YWdlID09PSB0cnVlKSByZXR1cm4gYXdhaXQgZ2V0UHJlc2VuY2VMYW5ndWFnZXMoc2VydmljZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcInN0cmluZ1wiOlxyXG5cdFx0XHRyZXR1cm4gYXdhaXQgZ2V0UHJlc2VuY2VMYW5ndWFnZXMobXVsdGlMYW5ndWFnZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcIm9iamVjdFwiOlxyXG5cdFx0XHRpZiAobXVsdGlMYW5ndWFnZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcblx0XHRcdFx0bGV0IGNvbW1vbkxuZ3MgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yIChjb25zdCBwcmVmaXggb2YgbXVsdGlMYW5ndWFnZSkge1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBwcmVmaXggPT09IFwic3RyaW5nXCIgJiYgcHJlZml4LnRyaW0oKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGxuZ3MgPSBhd2FpdCBnZXRQcmVzZW5jZUxhbmd1YWdlcyhwcmVmaXgpO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gb25seSBsb2FkIGNvbW1vbiBsYW5ndWFnZXNcclxuXHRcdFx0XHRcdFx0aWYgKGNvbW1vbkxuZ3MubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tbW9uTG5ncyA9IGxuZ3M7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tbW9uTG5ncyA9IGNvbW1vbkxuZ3MuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0Y2wgPT4gbG5ncy5maW5kSW5kZXgobCA9PiBsID09PSBjbCkgPj0gMFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBjb21tb25MbmdzO1xyXG5cdFx0XHR9XHJcblx0XHRcdGJyZWFrO1xyXG5cdH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc3RvcmVEZWZhdWx0TGFuZ3VhZ2VPZlByZXNlbmNlKHAsIGxhbmd1YWdlcykge1xyXG5cdGNvbnN0IGxuZ1NldHRpbmcgPSBwLm1ldGFkYXRhLnNldHRpbmdzLmZpbmQoXHJcblx0XHRzID0+IHR5cGVvZiBzLm11bHRpTGFuZ3VhZ2UgIT09IFwidW5kZWZpbmVkXCJcclxuXHQpO1xyXG5cclxuXHRsZXQgcHJlc2VuY2VTZXR0aW5ncyA9IChcclxuXHRcdGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBgcFNldHRpbmdzXyR7cC5tZXRhZGF0YS5zZXJ2aWNlfWApXHJcblx0KVtgcFNldHRpbmdzXyR7cC5tZXRhZGF0YS5zZXJ2aWNlfWBdO1xyXG5cclxuXHRpZiAoIXByZXNlbmNlU2V0dGluZ3MgJiYgcC5tZXRhZGF0YS5zZXR0aW5ncykge1xyXG5cdFx0cHJlc2VuY2VTZXR0aW5ncyA9IHAubWV0YWRhdGEuc2V0dGluZ3M7XHJcblx0fVxyXG5cclxuXHRpZiAoXHJcblx0XHQhcHJlc2VuY2VTZXR0aW5ncy5maW5kKFxyXG5cdFx0XHRzID0+IHMuaWQgPT09IGxuZ1NldHRpbmcuaWQgJiYgcy52YWx1ZXMgJiYgcy52YWx1ZXMubGVuZ3RoID4gMFxyXG5cdFx0KVxyXG5cdCkge1xyXG5cdFx0Y29uc3QgdWlMYW5nID0gY2hyb21lLmkxOG4uZ2V0VUlMYW5ndWFnZSgpLFxyXG5cdFx0XHRwcmVmZXJyZWRWYWx1ZSA9IGxhbmd1YWdlcy5maW5kKGwgPT4gbC52YWx1ZSA9PT0gdWlMYW5nKTtcclxuXHJcblx0XHRsbmdTZXR0aW5nLnRpdGxlID0gYXdhaXQgZ2V0U3RyaW5nKFwiZ2VuZXJhbC5sYW5ndWFnZVwiLCB1aUxhbmcpO1xyXG5cdFx0bG5nU2V0dGluZy5pY29uID0gXCJmYXMgZmEtbGFuZ3VhZ2VcIjtcclxuXHRcdGxuZ1NldHRpbmcudmFsdWUgPSBwcmVmZXJyZWRWYWx1ZSA/IHByZWZlcnJlZFZhbHVlLnZhbHVlIDogREVGQVVMVF9MT0NBTEU7XHJcblx0XHRsbmdTZXR0aW5nLnZhbHVlcyA9IGxhbmd1YWdlcztcclxuXHJcblx0XHRjb25zdCBsbmdTZXR0aW5nSWR4ID0gcHJlc2VuY2VTZXR0aW5ncy5maW5kSW5kZXgoXHJcblx0XHRcdHMgPT4gcy5pZCA9PT0gbG5nU2V0dGluZy5pZFxyXG5cdFx0KTtcclxuXHRcdHByZXNlbmNlU2V0dGluZ3NbbG5nU2V0dGluZ0lkeF0gPSBsbmdTZXR0aW5nO1xyXG5cclxuXHRcdC8vKiBZb3UgbWF5IGJlIHdvbmRlcmluZywgd2h5IHRoZSBmdWNrIGRvIHlvdSBzdHJpbmdpZnkgYW5kIHBhcnNlIHRoaXM/IEd1ZXNzIHdoYXQgYmVjYXVzZSBGaXJlZm94IHN1Y2tzIGFuZCBicmVha3MgaXRzIHN0b3JhZ2VcclxuXHRcdC8vQHRzLWlnbm9yZVxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KFxyXG5cdFx0XHRKU09OLnBhcnNlKFxyXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHtcclxuXHRcdFx0XHRcdFtgcFNldHRpbmdzXyR7cC5tZXRhZGF0YS5zZXJ2aWNlfWBdOiBwcmVzZW5jZVNldHRpbmdzXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuXHRcdHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8vIHJ1biBzdGFydHVwXG5yZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiBtb2R1bGVbJ2RlZmF1bHQnXSA6XG5cdFx0KCkgPT4gbW9kdWxlO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gUHJvbWlzZSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdDQ2NDogMCxcblx0MjkzOiAwXG59O1xuXG52YXIgZGVmZXJyZWRNb2R1bGVzID0gW1xuXHRbOTcyOSw5OTldXG5dO1xuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxudmFyIGNoZWNrRGVmZXJyZWRNb2R1bGVzID0gKCkgPT4ge1xuXG59O1xuZnVuY3Rpb24gY2hlY2tEZWZlcnJlZE1vZHVsZXNJbXBsKCkge1xuXHR2YXIgcmVzdWx0O1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGRlZmVycmVkTW9kdWxlID0gZGVmZXJyZWRNb2R1bGVzW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvcih2YXIgaiA9IDE7IGogPCBkZWZlcnJlZE1vZHVsZS5sZW5ndGg7IGorKykge1xuXHRcdFx0dmFyIGRlcElkID0gZGVmZXJyZWRNb2R1bGVbal07XG5cdFx0XHRpZihpbnN0YWxsZWRDaHVua3NbZGVwSWRdICE9PSAwKSBmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYoZnVsZmlsbGVkKSB7XG5cdFx0XHRkZWZlcnJlZE1vZHVsZXMuc3BsaWNlKGktLSwgMSk7XG5cdFx0XHRyZXN1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IGRlZmVycmVkTW9kdWxlWzBdKTtcblx0XHR9XG5cdH1cblx0aWYoZGVmZXJyZWRNb2R1bGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18ueCgpO1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuX193ZWJwYWNrX3JlcXVpcmVfXy54ID0gKCkgPT4ge1xuXHQvLyByZXNldCBzdGFydHVwIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBjYWxsZWQgYWdhaW4gd2hlbiBtb3JlIHN0YXJ0dXAgY29kZSBpcyBhZGRlZFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnggPSAoKSA9PiB7XG5cblx0fVxuXHRjaHVua0xvYWRpbmdHbG9iYWwgPSBjaHVua0xvYWRpbmdHbG9iYWwuc2xpY2UoKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGNodW5rTG9hZGluZ0dsb2JhbC5sZW5ndGg7IGkrKykgd2VicGFja0pzb25wQ2FsbGJhY2soY2h1bmtMb2FkaW5nR2xvYmFsW2ldKTtcblx0cmV0dXJuIChjaGVja0RlZmVycmVkTW9kdWxlcyA9IGNoZWNrRGVmZXJyZWRNb2R1bGVzSW1wbCkoKTtcbn07XG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKGRhdGEpID0+IHtcblx0dmFyIFtjaHVua0lkcywgbW9yZU1vZHVsZXMsIHJ1bnRpbWUsIGV4ZWN1dGVNb2R1bGVzXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMCwgcmVzb2x2ZXMgPSBbXTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRyZXNvbHZlcy5wdXNoKGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSk7XG5cdFx0fVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9IDA7XG5cdH1cblx0Zm9yKG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHR3aGlsZShyZXNvbHZlcy5sZW5ndGgpIHtcblx0XHRyZXNvbHZlcy5zaGlmdCgpKCk7XG5cdH1cblxuXHQvLyBhZGQgZW50cnkgbW9kdWxlcyBmcm9tIGxvYWRlZCBjaHVuayB0byBkZWZlcnJlZCBsaXN0XG5cdGlmKGV4ZWN1dGVNb2R1bGVzKSBkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzKTtcblxuXHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcblx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rcG1kXCJdID0gc2VsZltcIndlYnBhY2tDaHVua3BtZFwiXSB8fCBbXTtcbnZhciBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiA9IGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gd2VicGFja0pzb25wQ2FsbGJhY2s7Il0sInNvdXJjZVJvb3QiOiIifQ==
JustArion commented 3 years ago

Still occurs msedge-Dawn-896-277-NQ

StackTrace for 1:

{
   "applications": {
      "gecko": {
         "id": "support@premid.app",
         "strict_min_version": "53.0",
         "update_url": "https://api.premid.app/firefox/updates"
      }
   },
   "background": {
      "scripts": [ "js/vendor.js", "js/background.js" ]
   },
   "browser_action": {
      "default_popup": "html/popup/index.html"
   },
   "content_scripts": [ {
      "js": [ "js/vendor.js", "js/contentScript.js", "js/devHelper.js" ],
      "matches": [ "\u003Call_urls>" ],
      "run_at": "document_start"
   }, {
      "js": [ "js/presenceManager.js" ],
      "matches": [ "*://*.premid.app/*" ],
      "run_at": "document_start"
   }, {
      "all_frames": true,
      "js": [ "js/iFrameHandler.js", "js/lib/aes.min.js", "js/devHelper.js" ],
      "matches": [ "\u003Call_urls>" ],
      "run_at": "document_start"
   } ],
   "content_security_policy": "script-src 'self' 'unsafe-eval' https://kit.fontawesome.com/; object-src 'self'",
   "default_locale": "en",
   "description": "__MSG_description__",
   "icons": {
      "128": "assets/images/icon_128x128.png",
      "16": "assets/images/icon_16x16.png",
      "48": "assets/images/icon_48x48.png"
   },
   "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3U3U7VGk+xJOJx4GL2CKJ1mSoozkhmgXv0LHLn5Wp7iTBQYhkkaNXZdryaVT08zKu2Koxj+eOsPAYyamlvmv0doPdpUfK9cN9cUu6ySgV9mR3yd3SIQ+41ECuX+31Owp7ShdUzBa6Mjqu1DJLqfJav2R6Df8FAfmuCviuBVDea/sAWGtc9hwsyDRdqG4C6PE4sVkyJbc3thz3Xoepc5zdaOmIOuzZHpIAWk0lceeec30cBVlIq+F6NAh5nanHIATOo+5rZO6yGi8eBV5HRjSQF0ajOHSz07na9jDf6rYJKQXbrhTiwBUKWKx5aAsvI4ltb4VvJlhiE2KABlgblKOOwIDAQAB",
   "manifest_version": 2,
   "name": "PreMiD",
   "permissions": [ "tabs", "\u003Call_urls>", "storage" ],
   "update_url": "https://edge.microsoft.com/extensionwebstorebase/v1/crx",
   "version": "2.2.3",
   "version_name": "2.2.3",
   "web_accessible_resources": [ "js/devHelper.js" ]
}
var pmd;pmd=(()=>{var e={9729:(e,t,a)=>{"use strict";a.r(t);var n=a(9387),s=a(7710),r=a(7899);async function i(){let e=(await(0,s.c)("local","defaultAdded")).defaultAdded;if(e)return;const t=["YouTube","YouTube Music","Netflix","Twitch","SoundCloud"];await(0,r.addPresence)(t),e=!0;let a=(await(0,s.c)("local","presences")).presences.map((e=>e.metadata.service));for(const n of t)if(!a.includes(n)){e=!1;break}(0,s.p)("local",{defaultAdded:e})}var o=a(3216),c=a(3250);function d(){return-1!==navigator.userAgent.indexOf("Safari")&&-1===navigator.userAgent.indexOf("Chrome")}async function l(e){const t=await new Promise((t=>{chrome.tabs.executeScript(e,{code:"try{PreMiD_Presence}catch(_){false}"},t)}));return!!t&&t[0]}var m=a(5069);async function u(e){if(e){const e=await(0,c.Z)("\n\t\tquery {\n\t\t\tversions {\n\t\t\t\tsafari {\n\t\t\t\t\tversion\n\t\t\t\t\turgent\n\t\t\t\t}\n\t\t\t}\n\t\t}");if((0,m.Z)(e.data),e.data.versions.safari.version===chrome.runtime.getManifest().version_name)return chrome.browserAction.setBadgeText({text:""}),{latestVersion:!0,urgentUpdate:!1};{const t=e.data.versions.safari.urgent;return chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#ff5050"}),{latestVersion:!1,urgentUpdate:t}}}return{latestVersion:!0,urgentUpdate:!1}}async function p(e,t){return!((await u(d())).urgentUpdate&&!(await u(d())).latestVersion)&&!await l(e)&&new Promise((async a=>{const n=(await(0,s.c)("local","identifier")).identifier;let r="";t.metadata.readLogs&&(r='\n\t\t\t\tconst PreMiD_consoleLogger = document.createElement("script");\n\t\t\t\tPreMiD_consoleLogger.type = "text/javascript";\n\t\t\t\tPreMiD_consoleLogger.id = "PreMiD_consoleLogger";\n\t\t\t\tPreMiD_consoleLogger.innerText = `\n\t\t\t\tconsole.stdlog = console.log.bind(console);\n\t\t\t\tconsole.logs = [];\n\t\t\t\tconsole.log = function() {\n\t\t\t\t\tlet inc = Array.from(arguments);\n\t\t\t\t\tinc.forEach(arg => {\n\t\t\t\t\t\tconsole.logs.push(arg);\n\t\t\t\t\t});\n\t\t\t\t\twhile (console.logs.length > 100) {\n\t\t\t\t\t\tconsole.logs.shift();\n\t\t\t\t\t}\n\t\t\t\t\tconsole.stdlog.apply(console, arguments);\n\t\t\t\t};\n\t\t\t\t`;\n\t\t\t\tdocument.head.appendChild(PreMiD_consoleLogger);\n\t\t\t\t'.replace(/(\r\n)|\n/g,"")),chrome.tabs.executeScript(e,{code:`let PreMiD_Presence=true;let PreMiD_Identifier="${n}";let PMD_Info={tabId:${e}};let PreMiD_Metadata=${JSON.stringify(t.metadata)};`+t.presence+r,runAt:"document_start"},a),(0,o.Vp)("injectPresence.ts","Injected "+t.metadata.service),t.metadata.readLogs&&(0,o.Vp)("injectPresence.ts","Reading logs")}))}let g,f=null,h=null;async function v(e){let t=await new Promise((e=>chrome.windows.getLastFocused(e))),a=(await new Promise((e=>chrome.tabs.query({active:!0,windowId:t.id},(t=>e(t))))))[0],n=(await(0,s.c)("local","presences")).presences;if(!a?.url||a.url.startsWith("chrome")||a.url.startsWith("edge"))return;let r=await new Promise((e=>chrome.tabs.executeScript(a.id,{code:"try{document.querySelector('meta[name=\"PreMiD_Presence\"]').content}catch(e){false}"},(t=>{e(t?t[0]:void 0)}))));if(n=n.filter((e=>{if(e.metaTag&&e.metadata.service===r)return!1;let t=null;return!!e.enabled&&(void 0!==e.metadata.regExp?(t=a.url.match(new RegExp("^(https?:|file:[/]?)[/]{2}"+e.metadata.regExp)),null!==t&&t.length>0):(t=Array.isArray(e.metadata.url)?e.metadata.url.filter((e=>new URL(a.url).hostname===e)).length>0:new URL(a.url).hostname===e.metadata.url,t))})),0===n.length&&r){const e=(await(0,c.L)(r)).data.metadata,t={metadata:e,presence:null,enabled:!0,metaTag:!0,hidden:!1},a=(await(0,c.Z)(`\n\t\t\tquery {\n\t\t\t\tpresences(service: "${r}") {\n\t\t\t\t\tpresenceJs\n\t\t\t\t\t${e.iframe?"iframeJs":""}\n\t\t\t\t}\n\t\t\t}\n\t\t`)).data.presences[0];t.presence=a.presenceJs,e.iframe&&(t.iframe=a.iframeJs),n=[t],chrome.storage.local.get("presences",(e=>{const a=e.presences.findIndex((e=>e.metadata.service===t.metadata.service&&e.metaTag===t.metaTag));if(a>-1){const n=e.presences[a].enabled,s=t;s.enabled=n,s.hidden=!1,e.presences[a]=s}else e.presences.push(t);chrome.storage.local.set(e)}))}if(n.length>0){const t=await l(a.id);f?g||f===a.id?f===a.id&&!t&&e&&e.status&&"complete"===e.status&&(null!==h&&h.metadata.service!==n[0].metadata.service&&j(),await p(f,n[0]),chrome.tabs.sendMessage(f,{tabPriority:!0}),h=n[0],w()):g=window.setTimeout((async()=>{j(),chrome.tabs.sendMessage(f,{tabPriority:!1}),f=a.id,t||await p(f,n[0]),h=n[0],chrome.tabs.sendMessage(f,{tabPriority:!0}),w(),g=null}),5e3):(h=n[0],f=a.id,t||await p(f,n[0]),chrome.tabs.sendMessage(f,{tabPriority:!0}),w())}else f===a.id&&(h=null,j(!0)),clearTimeout(g),g=null}function w(){chrome.storage.local.get("presences",(({presences:e})=>{const t=e.findIndex((e=>e.metaTag&&e.hidden&&e.metadata.service===h.metadata.service)),a=e.findIndex((e=>e.metaTag&&!e.hidden&&e.metadata.service!==h.metadata.service));t>-1&&(e[t].hidden=!1),a>-1&&(e[a].hidden=!0),chrome.storage.local.set({presences:e})}))}function y(){chrome.storage.local.get("presences",(({presences:e})=>{const t=e.findIndex((e=>e.metaTag&&!e.hidden));t>-1&&(e[t].hidden=!0),chrome.storage.local.set({presences:e})}))}var b=a(6809);function P(e){let t,a={};for(t in e)a[t]=e[t];return a}async function x(e,t){if(["ALPHA","BETA"].includes(n.t0)){const{authorizedBetaAlpha:e}=await(0,s.c)("local","authorizedBetaAlpha");if(!e)return}if((await u(d())).urgentUpdate&&!(await u(d())).latestVersion)return!1;if(t||(t=(await(0,s.c)("sync","settings")).settings),null==e||!t.enabled.value)return;const a=P(e);a.trayTitle&&t.titleMenubar.value&&a.trayTitle.trim()?a.trayTitle=a.trayTitle.trim():a.trayTitle="",t.mediaKeys.value||(a.mediaKeys=!1),a.presenceData.details&&(a.presenceData.details.length<3?a.presenceData.details="   "+a.presenceData.details:a.presenceData.details=a.presenceData.details.slice(0,128).trim()),a.presenceData.state&&(a.presenceData.state.length<3?a.presenceData.state="   "+a.presenceData.state:a.presenceData.state=a.presenceData.state.slice(0,128).trim()),T.connected&&T.emit("setActivity",a),(0,o.um)("setActivity.ts","setActivity")}var L=a(3765);let M=null,A=null;chrome.runtime.onConnect.addListener((function(e){!function(e){if("tabs"===e.name){const t=()=>{e.postMessage({connected:T.connected})};t(),T.on("connect",t),T.on("disconnect",t),e.onDisconnect.addListener((()=>{T.removeListener("connect",t),T.removeListener("disconnect",t)}))}}(e),function(e){if("popup"===e.name){const t=async()=>{e.postMessage({connected:T.connected,appVersionSupported:E(),latestExtensionVersion:await u(d())})};t(),T.on("connect",t),T.on("disconnect",t),e.onDisconnect.addListener((()=>{T.removeListener("connect",t),T.removeListener("disconnect",t)})),e.onMessage.addListener((async e=>{"loadLocalPresence"===e.action&&T.connected?T.emit("selectLocalPresence"):"popupOpened"===e.action&&await(0,L.XP)()}))}}(e),async function(e){"contentScript"===e.name&&e.onMessage.addListener((async e=>{if(void 0===e.presence||void 0===e.presence.presenceData)return;const t=await new Promise((e=>chrome.runtime.getPlatformInfo((t=>e({os:t.os,arch:t.arch}))))),a=String.fromCodePoint(128039);var n;if(void 0!==e.presence.presenceData.largeImageKey&&(e.presence.presenceData.largeImageText=`PreMiD ${"linux"===t.os||"cros"===t.os?a:""} v${n=k,Array.from(String(n)).reverse().map(((e,t)=>t%1==0&&t>0?e+".":e)).reverse().join("")} ${String.fromCharCode(8226)} Ext v${chrome.runtime.getManifest().version_name}`),null==M)return M=P(e.presence.presenceData),A=e.presence,void x(e.presence);const s=P(M);delete s.startTimestamp,delete s.endTimestamp;const r=P(e.presence.presenceData);delete r.startTimestamp,delete r.endTimestamp,(!function(e,t){const a=Object.getOwnPropertyNames(e),n=Object.getOwnPropertyNames(t);if(a.length!=n.length)return!1;for(let n=0;n<a.length;n++){const s=a[n];if(e[s]!==t[s])return!1}return!0}(s,r)||M.endTimestamp+1!==e.presence.presenceData.endTimestamp&&M.endTimestamp-1!==e.presence.presenceData.endTimestamp&&M.endTimestamp!==e.presence.presenceData.endTimestamp)&&(A=e.presence,x(e.presence)),(void 0!==M.startTimestamp&&void 0===e.presence.presenceData.startTimestamp||void 0===M.startTimestamp&&void 0!==e.presence.presenceData.startTimestamp||void 0!==M.endTimestamp&&void 0===e.presence.presenceData.endTimestamp||void 0===M.endTimestamp&&void 0!==e.presence.presenceData.endTimestamp)&&(A=e.presence,x(e.presence)),M=P(e.presence.presenceData)}))}(e),function(e){"app.ts"===e.name&&e.onMessage.addListener((async t=>{if("reinit"===t.action){await(0,s.p)("local",{defaultAdded:!1});let t=!1;if(navigator.onLine)try{await B(),t=!0}catch(e){}e.postMessage({action:"reinit",success:t})}}))}(e)}));let D=[];const T=b.connect("http://localhost:3020",{autoConnect:!1}),_=()=>T.open();let k=0,S=null;function E(){return k>=n.tn||0===k?(chrome.browserAction.setBadgeText({text:""}),!0):(chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#ff5050"}),!1)}function j(e=!1){(0,o.um)("clearActivity.ts","Clear Activity | "+e),e&&(chrome.tabs.sendMessage(f,{tabPriority:!1}),f=null),T.connected&&T.emit("clearActivity")}T.on("connect",(async()=>{chrome.browserAction.setBadgeText({text:""}),T.emit("getVersion"),S=window.setTimeout((()=>{k=-1,(0,o.vU)("socketManager.ts","Unsupported app version")}),5e3);let e=(await(0,s.c)("sync","settings")).settings;e=Object.assign({},...Object.keys(e).map((t=>({[t]:e[t].value})))),T.emit("settingUpdate",e)})),T.on("receiveVersion",(e=>{clearTimeout(S),k=e,E()?((0,o.um)("socketManager.ts","Supported app version"),A&&x(A),(0,o.Vp)("socketManager.ts","Connected to application"),chrome.runtime.sendMessage({socket:T.connected}),null!==f&&chrome.tabs.sendMessage(f,{tabPriority:!0})):(0,o.vU)("socketManager.ts","Unsupported app version")})),T.on("disconnect",(()=>{chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#e1e100"}),(0,o.vU)("socketManager.ts","Disconnected from application"),chrome.runtime.sendMessage({socket:T.connected}),chrome.storage.local.get("presences",(({presences:e})=>{e=e.filter((e=>!e.tmp)),chrome.storage.local.set({presences:e})})),null!==f&&chrome.tabs.sendMessage(f,{tabPriority:!1})})),T.on("localPresence",(async function(e){D=[],(0,o.um)("presenceDevManager.ts","Local Presence update");let t=(e=e.files).find((e=>"metadata.json"===e.file.toLowerCase())),a=e.find((e=>"presence.js"===e.file.toLowerCase())),n=e.find((e=>"iframe.js"===e.file.toLowerCase()));t?(t=t.contents,void 0!==t.iframe&&t.iframe&&!n&&D.push("No iframe.js found."),void 0===t.service&&D.push("property service not defined."),"object"!=typeof t.author?D.push("property author not defined."):(void 0===t.author.name&&D.push("property author.name not defined."),void 0===t.author.id&&D.push("property author.id not defined.")),"object"!=typeof t.description?D.push("property description not defined."):void 0===t.description.en&&D.push("property description.en not defined."),void 0===t.url&&D.push("property url not defined.")):D.push("No metadata.json found."),a||D.push("No presence.js found."),D.map((e=>(0,o.vU)("presenceDevManager.ts",e,!0)));let i=(await(0,s.c)("local","presences")).presences;i=i.filter((e=>!e.tmp));const c=i.find((e=>e.metadata.service===t.service));c&&(c.enabled=!1);const d={enabled:!0,metadata:t,presence:a?.contents,tmp:!0};void 0!==t?.iframe&&t?.iframe&&(d.iframe=n.contents),d.metadata.settings&&(chrome.storage.local.set({["pSettings_"+d.metadata.service]:d.metadata.settings}),(0,r.initPresenceLanguages)(d)),i.push(d),chrome.storage.local.set({presences:i});for(let e=0;e<i.length;e++)if(i[e].tmp){const t=i[e];chrome.tabs.query({windowType:"normal"},(e=>{for(let a=0;a<e.length;a++){let n=new URL(e[a].url);("string"==typeof t.metadata.url&&t.metadata.url===n.hostname||t.metadata.url instanceof Array&&t.metadata.url.includes(n.hostname)||t.metadata.regExp&&new RegExp(t.metadata.regExp).test(n.href))&&chrome.tabs.reload(e[a].id,{bypassCache:!0},(()=>{console.info(`Presence ${t.metadata.service} updated, tab reloaded!`)}))}}))}})),T.on("discordUser",(async e=>{if(!e)return;const{premium_type:t,...a}=e;chrome.storage.local.set({discordUser:a})}));var U=a(9669),I=a.n(U);let $=null;async function C(){(await(0,s.c)("local","presences")).presences||await new Promise((e=>chrome.storage.local.set({presences:[]},e))),$=(await(0,s.c)("sync","settings")).settings,void 0===$&&($={}),F("enabled","popup.setting.enabled",0),F("autoLaunch","popup.setting.autoLaunch",1),F("mediaKeys","popup.setting.mediaControl",2),F("titleMenubar","popup.setting.titleMenubar",3),await new Promise((e=>chrome.storage.sync.set({settings:$},e))),(0,o.um)("initSettings.ts","Initialized settings")}function F(e,t,a,n=!0,s=!0){void 0===$[e]&&function(e,t,a,n,s){$[e]||($[e]={string:t,value:n,position:a},s&&($[e].show=s))}(e,t,a,n,s)}async function B(){await async function(){console.log(`%cPreMiD\n%c${String.fromCharCode(169)} 2018-${(new Date).getFullYear()} Timeraa\n\n%cVersion: %c${chrome.runtime.getManifest().version_name}\n%cRelease type: %c${n.t0}\n%cReq App build: %c${n.tn}\n%cScience Id: %c${(await(0,s.c)("local","identifier")).identifier}`,"font-family:sans-serif;font-size:2.5rem;font-weight:bold;color: #596cae","font-size:1rem;font-weight:bold;color:rgb(70,200,70);","font-size:1rem;","font-size:1rem;color:#99AAB5;","font-size:1rem;","font-size:1rem;color:#99AAB5;","font-size:1rem;","font-size:1rem;color:#99AAB5;","font-size:1rem;","font-size:1rem;color:#99AAB5;")}(),["ALPHA","BETA"].includes(n.t0)&&await async function(){const{authorizedBetaAlpha:e}=await(0,s.c)("local","authorizedBetaAlpha");if(!e){let e="https://cpoegcmgabanfledhkjdicdclgpmghog.chromiumapp.org";"undefined"!=typeof browser&&(e=await browser.identity.getRedirectURL());const t=await new Promise((t=>chrome.identity.launchWebAuthFlow({url:"https://discordapp.com/api/oauth2/authorize?response_type=token&client_id=503557087041683458&scope=identify&redirect_uri="+e,interactive:!0},(async e=>{if(!e||!e.match(/(&access_token=[\d\w]+)/g))return chrome.runtime.lastError,void t();const a=e.match(/(&access_token=[\d\w]+)/g)[0].replace("&access_token=",""),s=(await I()("https://discordapp.com/api/users/@me",{headers:{Authorization:"Bearer "+a}})).data,r=(await(0,c.Z)(`\n\t\t\t\t\t\tquery {\n\t\t\t\t\t\t\talphaBetaAccess(userId: "${s.id}") {\n\t\t\t\t\t\t\t\tbetaAccess\n\t\t\t\t\t\t\t\talphaAccess\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t`)).data.alphaBetaAccess[0];let i;switch(n.t0){case"BETA":i=r.betaAccess;break;case"ALPHA":i=r.alphaAccess}t(i)}))));chrome.storage.local.set({authorizedBetaAlpha:t})}}(),chrome.browserAction.setBadgeText({text:"!"}),chrome.browserAction.setBadgeBackgroundColor({color:"#e1e100"}),await Promise.all([C(),i(),(0,r.updatePresences)(),(0,L.IG)(chrome.i18n.getUILanguage()),(0,r.presenceScience)()]),setInterval((function(){(0,r.presenceScience)()}),18e5),_()}chrome.storage.onChanged.addListener((e=>{if(e.settings){const t=Object.assign({},...Object.keys(e.settings.newValue).map((t=>({[t]:e.settings.newValue[t].value}))));t.enabled?x(A,e.settings.newValue):null!==f&&j(!0),T.connected&&T.emit("settingUpdate",t),(0,o.um)("initSettings.ts","Settings update")}if(e.presences&&e.presences.newValue!==e.presences.oldValue){const t=e.presences.oldValue;e.presences.newValue.filter((e=>t.find((t=>t.metadata.service===e.metadata.service&&(t.metadata.version!==e.metadata.version||t.tmp))))).forEach((e=>{const t=e.metadata.settings;chrome.storage.local.get("pSettings_"+e.metadata.service,(a=>{a=a["pSettings_"+e.metadata.service]||[],t.forEach((e=>{const t=a.find((t=>t.id===e.id));t&&null!==t.value&&(typeof e.value==typeof t.value?e.value=t.value:t.multiLanguage&&(e=t))})),chrome.storage.local.set(JSON.parse(JSON.stringify({["pSettings_"+e.metadata.service]:t})),(()=>{(0,o.um)("initSettings.ts","Updated setting storage of "+e.metadata.service)}))}))}))}})),!d()&&chrome.runtime.onUpdateAvailable.addListener((()=>chrome.runtime.reload())),chrome.tabs.onActivated.addListener((()=>v())),chrome.tabs.onReplaced.addListener(((e,t)=>{f===t&&(j(!0),y())})),chrome.tabs.onRemoved.addListener((e=>{f===e&&(j(!0),y())})),chrome.tabs.onUpdated.addListener(((e,t)=>v(t))),chrome.windows.onFocusChanged.addListener((e=>{-1!==e&&v()})),(0,r.updatePresences)(),(0,L.IG)(chrome.i18n.getUILanguage());const V=setTimeout((()=>B().then(_)),100);chrome.runtime.onInstalled.addListener((async e=>{switch(clearTimeout(V),await B(),e.reason){case"install":chrome.tabs.create({active:!0,index:0,url:chrome.runtime.getURL("html/tabs/index.html#/installed")}),chrome.storage.local.set({lastVersion:chrome.runtime.getManifest().version_name});break;case"update":!async function(){parseInt((await(0,s.c)("local","lastVersion")).lastVersion?(await(0,s.c)("local","lastVersion")).lastVersion.replace(/\./g,"").slice(0,3):0)<parseInt(chrome.runtime.getManifest().version_name.replace(/\./g,"").slice(0,3))&&(chrome.storage.local.set({lastVersion:chrome.runtime.getManifest().version_name}),await(0,L.XP)(),chrome.tabs.create({active:!0,index:0,url:chrome.runtime.getURL("html/tabs/index.html#/updated")}))}()}})),chrome.runtime.onMessage.addListener(((e,t)=>function(e,t){h&&(e.iFrameUpdateData&&void 0!==h.metadata.iframe&&h.metadata.iframe&&chrome.tabs.sendMessage(t.tab.id,{iFrameUpdateData:!0}),e.iFrameData&&chrome.tabs.sendMessage(t.tab.id,{iFrameData:e.iFrameData}),e.iFrame&&(null!==h&&void 0!==h.metadata.iframe&&h.metadata.iframe?chrome.tabs.sendMessage(t.tab.id,{iFrame:h.iframe,iFrameRegExp:h.metadata.iFrameRegExp||""}):chrome.tabs.sendMessage(t.tab.id,{iFrame:!1})))}(e,t))),chrome.storage.onChanged.addListener((async e=>{if(!e.presences||!h||!f)return;const t=(await(0,s.c)("local","presences")).presences.find((e=>e.metadata.service===h.metadata.service));t&&t.enabled?(M=null,chrome.tabs.sendMessage(f,{tabPriority:!0})):(chrome.tabs.sendMessage(f,{tabPriority:!1}),j(!0))})),chrome.storage.local.get("identifier",(e=>{e.identifier&&chrome.runtime.setUninstallURL(`${n.XJ.replace("/v3/","/v2/")}science/${e.identifier}`)}))},9387:(e,t,a)=>{"use strict";a.d(t,{XJ:()=>n,t0:()=>s,tn:()=>r});const n="https://api.premid.app/v3/",s="RELEASE",r=214},3216:(e,t,a)=>{"use strict";a.d(t,{um:()=>o,Vp:()=>c,vU:()=>d});var n=a(9387);const s="font-weight: 800; padding: 2px 5px; color: white;",r="RELEASE"!==n.t0;let i;function o(e,t,a=!1){(r||a)&&(l(e),console.log("%cPreMiD%cINFO%c "+t,s+"border-radius: 25px 0 0 25px; background: #596cae;",s+"border-radius: 0 25px 25px 0; background: #5050ff;","color: unset;"))}function c(e,t,a=!1){(r||a)&&(l(e),console.log("%cPreMiD%cSUCCESS%c "+t,s+"border-radius: 25px 0 0 25px; background: #596cae;",s+"border-radius: 0 25px 25px 0; background: #50ff50; color: black;","color: unset;"))}function d(e,t,a=!1){(r||a)&&(l(e),console.log("%cPreMiD%cERROR%c "+t,s+"border-radius: 25px 0 0 25px; background: #596cae;",s+"border-radius: 0 25px 25px 0; background: #ff5050;","color: unset;"))}function l(e){i!==e&&(console.groupEnd(),console.group(e),i=e)}},7710:(e,t,a)=>{"use strict";function n(e,t){return new Promise((a=>chrome.storage[e].get(t,(e=>a(e)))))}function s(e,t){return new Promise((a=>chrome.storage[e].set(t,a)))}a.d(t,{c:()=>n,p:()=>s})},5069:(e,t,a)=>{"use strict";function n(e){for(const t in e)"object"==typeof e[t]&&n(e[t]),null!==e[t]&&void 0!==e[t]||delete e[t]}a.d(t,{Z:()=>n})},3250:(e,t,a)=>{"use strict";a.d(t,{Z:()=>o,L:()=>c});var n=a(9669),s=a.n(n),r=a(9387),i=a(5069);async function o(e){const t=await s()({url:r.XJ,method:"post",data:{query:e}});return(0,i.Z)(t.data),t.data}async function c(e){const t=await o(`\n    query {\n      presences(service: "${e}") {\n        url\n        metadata {\n          author {\n            id\n            name\n          }\n          contributors {\n            id\n            name\n          }\n          altnames\n          warning\n          readLogs\n          button\n          service\n          description\n          url\n          version\n          logo\n          thumbnail\n          color\n          tags\n          category\n          iframe\n          regExp\n          iframeRegExp\n          settings {\n            id\n            title\n            icon\n            if {\n              propretyNames\n              patternProprties\n            }\n            placeholder\n            value\n            values\n            multiLanguage\n          }\n        }\n      }\n    }`);return(0,i.Z)(t.data),{data:{name:t.data.presences[0].metadata.service,url:t.data.presences[0].url,metadata:t.data.presences[0].metadata}}}},3765:(e,t,a)=>{"use strict";a.d(t,{ZW:()=>i,IG:()=>l,XP:()=>m,cc:()=>p,KF:()=>g,r2:()=>f});var n=a(3216),s=a(7710),r=a(3250);const i="en",o=3e5;let c={};function d(e){return e.split("-")[0]}async function l(e){e||(e=i),e.includes("ja")||e.includes("zh")||e.includes("ko")||(e=d(e));let t=e,a=e,s=e;switch(e){case"ja":t="ja_JP",s="ja_JP";break;case"ja_JP":a="ja";break;case"ko":t="ko_KR",s="ko_KR";break;case"ko_KR":a="ko";break;case"zh-CN":t="zh_CN",s="zh_CN";break;case"zh_CN":a="zh-CN";break;case"zh-TW":t="zh_TW",s="zh_TW";break;case"zh_TW":a="zh-TW";break;default:const e=(await(0,r.Z)('\n\t\t\tquery {\n\t\t\t\tlangFiles(project: "extension") {\n\t\t\t\t\tlang\n\t\t\t\t}\n\t\t\t}\n\t\t\t')).data.langFiles.map((e=>e.lang));if(!e.includes(a)){const n=e.findIndex((e=>e.includes(a+"_")));n>=0&&(t=e[n],a=e[n],s=e[n])}}try{const i=await(0,r.Z)(`\n\t\t\tquery {\n\t\t\t\twebsite: langFiles(project: "website", lang: "${t}") {\n\t\t\t\t\ttranslations\n\t\t\t\t}\n\t\t\t\textension: langFiles(project: "extension", lang: "${a}") {\n\t\t\t\t\ttranslations\n\t\t\t\t}\n\t\t\t\tpresence: langFiles(project: "presence", lang: "${s}") {\n\t\t\t\t\ttranslations\n\t\t\t\t}\n\t\t\t}\n\t\t`);c[e]={name:i.data.website[0].translations["header.language"],loading:i.data.website[0].translations["header.loader.phrases"],extension:i.data.extension[0].translations,presence:i.data.presence[0].translations,updatedAt:Date.now()},(0,n.Vp)("langManager.ts",`Updated ${e} translations`)}catch(t){return void(0,n.vU)("langManager.ts",`Error while fetching langFiles of ${e} language: ${t.message}`)}c[e]&&c[e].error?c[e]=void 0:await chrome.storage.local.set({languages:c})}async function m(){const e=Object.keys((await(0,s.c)("local","languages")).languages);await Promise.all(e.map((e=>p(e,!0))))}const u=[];async function p(e,t){return e||(e=i),t||(t=!1),e=d(e),new Promise((a=>{if(void 0!==c[e]&&a(),u.includes(e)){let t=setInterval((()=>{void 0!==c&&void 0!==c[e]&&(clearInterval(t),a())}),5)}else u.push(e),chrome.storage.local.get("languages",(async n=>{n.languages||(n.languages={});const s=[];(t&&void 0!==n.languages[i]&&Date.now()-n.languages[i].updatedAt>=o||e!==i&&void 0===n.languages[i])&&s.push(l(i)),(void 0===n.languages[e]||t&&Date.now()-n.languages[e].updatedAt>=o)&&s.push(l(e)),await Promise.all(s),c={...c,...n.languages},u.splice(u.indexOf(e),1),a()}))}))}function g(e,t){return t||(t=chrome.i18n.getUILanguage()),t=d(t),new Promise((async a=>{if(await p(t),void 0!==c[t]){if(["name","header.language"].includes(e)&&void 0!==c[t].name)return a(c[t].name);if(["loading","header.loader.phrases"].includes(e)&&void 0!==c[t].loading)return a(c[t].loading);if(void 0!==c[t].extension&&void 0!==c[t].extension[e])return a(c[t].extension[e]);if(void 0!==c[t].presence&&void 0!==c[t].presence[e])return a(c[t].presence[e])}return a(t===i?e:await g(e,i))}))}async function f(e){try{const t=await(0,r.Z)(`\n\t\t\tquery {\n\t\t\t\tlangFiles(presence: "${e.toLowerCase()}") {\n\t\t\t\t\tlang\n\t\t\t\t}\n\t\t\t\tgeneralLangFiles: langFiles(presence: "general") {\n\t\t\t\t\tlang\n\t\t\t\t}\n\t\t\t}\n\t\t`),a=[];return t.data.langFiles.length>0&&t.data.generalLangFiles.length>0?t.data.generalLangFiles.forEach((e=>{t.data.langFiles.find((t=>t.lang===e.lang))&&a.push(e.lang)})):t.data.generalLangFiles.length>0&&t.data.generalLangFiles.forEach((e=>{a.push(e.lang)})),a}catch(e){return[]}}},7899:(e,t,a)=>{"use strict";a.d(t,{presenceScience:()=>c,updatePresences:()=>d,addPresence:()=>l,initPresenceLanguages:()=>u});var n=a(3765),s=a(3216),r=a(3250),i=a(7710),o=a(4586);async function c(){let e=(await(0,i.c)("local","identifier")).identifier,t=(await(0,i.c)("local","presences")).presences;e||(e=(0,o.Z)(),chrome.storage.local.set({identifier:e}));const a=await new Promise((e=>chrome.runtime.getPlatformInfo((t=>e({os:t.os,arch:t.arch}))))),n=t.filter((e=>!e.tmp)).map((e=>e.metadata.service));(0,r.Z)(`\n\tmutation {\n\t\taddScience(identifier: "${e}", presences: ["${n.toString().split(",").join('", "')}"], os: "${a.os}", arch:"${a.arch}") {\n\t\t\tidentifier\n\t\t}\n\t}\n\t`)}async function d(){let e,t=(await(0,i.c)("local","presences")).presences;if(!t||0===t.length)return;try{const t=(await(0,r.Z)("\n\t\t\tquery {\n  \t\t\tpresences {\n    \t\t\turl\n    \t\t\tmetadata {\n      \t\t\tservice\n      \t\t\tversion\n    \t\t\t}\n  \t\t\t}\n\t\t\t}\n\t\t")).data,a=[];t.presences.forEach((e=>{a.push({name:e.metadata.service,url:e.url,version:e.metadata.version})})),e=a}catch(e){return void(0,s.vU)("presenceManager.ts","Error while updating presences: "+e.message)}let a=t.filter((e=>!e.tmp)).map((e=>({name:e.metadata.service,version:e.metadata.version}))).filter((t=>e.find((e=>e.name==t.name&&e.version!==t.version))));Promise.all(a.map((async e=>{const a=t.findIndex((t=>t.metadata.service===e.name&&!e.tmp)),n=(await(0,r.Z)(`\n\t\t\tquery {\n\t\t\t\tpresences(service: "${e.name}") {\n\t\t\t\t\tpresenceJs\n\t\t\t\t\tiframeJs\n\t\t\t\t\tmetadata {\n\t\t\t\t\t\tauthor {\n\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontributors {\n\t\t\t\t\t\t\tname\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t}\n\t\t\t\t\t\taltnames\n\t\t\t\t\t\twarning\n\t\t\t\t\t\treadLogs\n\t\t\t\t\t\tservice\n\t\t\t\t\t\tdescription\n\t\t\t\t\t\turl\n\t\t\t\t\t\tversion\n\t\t\t\t\t\tlogo\n\t\t\t\t\t\tthumbnail\n\t\t\t\t\t\tcolor\n\t\t\t\t\t\ttags\n\t\t\t\t\t\tcategory\n\t\t\t\t\t\tiframe\n\t\t\t\t\t\tregExp\n\t\t\t\t\t\tiframeRegExp\n\t\t\t\t\t\tbutton\n\t\t\t\t\t\twarning\n\t\t\t\t\t\tsettings {\n\t\t\t\t\t\t\tid\n\t\t\t\t\t\t\ttitle\n\t\t\t\t\t\t\ticon\n\t\t\t\t\t\t\tif {\n\t\t\t\t\t\t\t\tpropretyNames\n\t\t\t\t\t\t\t\tpatternProprties\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tplaceholder\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t\tvalues\n\t\t\t\t\t\t\tmultiLanguage\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t`)).data,s=n.presences[0].metadata,i=[n.presences[0].presenceJs,s.iframe?n.presences[0].iframeJs:void 0].filter((e=>e));t[a].metadata=s,t[a].presence=i[0],2==i.length&&(t[a].iframe=i[1])}))).then((()=>{chrome.storage.local.set({presences:[...t]},(()=>{a.map((t=>(0,s.Vp)("presenceDevManager.ts",`Updated ${t.name} from v${t.version} to v${e.find((e=>e.name===t.name)).version}`)))}));const r=a.map((e=>e.name));t.filter((e=>r.includes(e.metadata.service))).forEach((async e=>{await u(e);const t="pSettings_"+e.metadata.service,a=(await(0,i.c)("local",t))[t];if(a){const e=a.find((e=>void 0!==e.multiLanguage));if(e&&e.values){const t=e.values.map((e=>e.value));await Promise.all(t.map((e=>(0,n.cc)(e,!0))))}}}))}))}async function l(e){let t=(await(0,i.c)("local","presences")).presences;if(t||(t=[]),"string"==typeof e){if(t.filter((e=>!e.tmp)).find((t=>t.metadata.service===e)))return void(0,s.vU)("presenceManager",`Presence ${e} already added.`)}else{const a=e.filter((e=>!t.map((e=>e.metadata.service)).includes(e)));if(0===a.length)return void(0,s.vU)("presenceManager","Presences already added.");e=a}if("string"==typeof e)(0,r.L)(e).then((async({data:e})=>{if(void 0!==e.metadata.button&&!e.metadata.button)return;const a=(await(0,r.Z)(`\n\t\t\t\t\t\tquery {\n\t\t\t\t\t\t\tpresences(service: "${e.metadata.service}") {\n    \t\t\t\t\tpresenceJs\n    \t\t\t\t\tiframeJs\n    \t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t`)).data.presences[0],n={metadata:e.metadata,presence:a.presenceJs,enabled:!0};void 0!==e.metadata.iframe&&e.metadata.iframe&&(n.iframe=a.iframeJs),t.push(n),chrome.storage.local.set({presences:t}),t.map((e=>{e.metadata.settings&&chrome.storage.local.set({["pSettings_"+e.metadata.service]:e.metadata.settings})}))})).catch((()=>{}));else{const a=(await Promise.all((await Promise.all(e.map((e=>(0,r.L)(e))))).map((async({data:e})=>{if(void 0!==e.metadata.button&&!e.metadata.button)return;const t=(await(0,r.Z)(`\n\t\t\t\t\t\tquery {\n\t\t\t\t\t\t\tpresences(service: "${e.metadata.service}") {\n    \t\t\t\t\tpresenceJs\n    \t\t\t\t\tiframeJs\n    \t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t`)).data.presences[0],a={metadata:e.metadata,presence:t.presenceJs,enabled:!0};return void 0!==e.metadata.iframe&&e.metadata.iframe&&(a.iframe=t.iframeJs),a})))).filter((e=>void 0!==e));chrome.storage.local.set({presences:t.concat(a)}),t.concat(a).map((e=>{e.metadata.settings&&(chrome.storage.local.set({["pSettings_"+e.metadata.service]:e.metadata.settings}),u(e))}))}d(),(0,n.IG)(chrome.i18n.getUILanguage())}async function m(){let e={detail:(await(0,i.c)("local","presences")).presences.filter((e=>!e.tmp)).map((e=>e.metadata.service))};"function"==typeof cloneInto&&(e=cloneInto(e,document.defaultView));const t=new CustomEvent("PreMiD_GetWebisteFallback",e);window.dispatchEvent(t)}async function u(e){if(e.metadata.settings){const t=e.metadata.settings.findIndex((e=>void 0!==e.multiLanguage));if(t>=0){const a=e.metadata.settings[t],s=await async function(e,t){switch(typeof e){case"boolean":if(!0===e)return await p(t);break;case"string":return await p(e);case"object":if(e instanceof Array){let t=[];for(const a of e)if("string"==typeof a&&a.trim().length>0){const e=await p(a);t=0===t.length?e:t.filter((t=>e.findIndex((e=>e===t))>=0))}return t}}}(a.multiLanguage,e.metadata.service);Object.keys(s).length>1?await async function(e,t){const a=e.metadata.settings.find((e=>void 0!==e.multiLanguage));let s=(await(0,i.c)("local","pSettings_"+e.metadata.service))["pSettings_"+e.metadata.service];if(!s&&e.metadata.settings&&(s=e.metadata.settings),!s.find((e=>e.id===a.id&&e.values&&e.values.length>0))){const r=chrome.i18n.getUILanguage(),i=t.find((e=>e.value===r));a.title=await(0,n.KF)("general.language",r),a.icon="fas fa-language",a.value=i?i.value:n.ZW,a.values=t;const o=s.findIndex((e=>e.id===a.id));s[o]=a,chrome.storage.local.set(JSON.parse(JSON.stringify({["pSettings_"+e.metadata.service]:s})))}}(e,s):e.metadata.settings.splice(t,1)}}}async function p(e){const t=[],a=await(0,n.r2)(e);for(const e of a)t.push({name:await(0,n.KF)("name",e),value:e});return t}"/_generated_background_page.html"!==document.location.pathname&&(document.addEventListener("DOMContentLoaded",(()=>{document.querySelector("#app")&&document.querySelector("#app").setAttribute("extension-ready","true")})),window.addEventListener("PreMiD_AddPresence",(function(e){l([e.detail])})),window.addEventListener("PreMiD_RemovePresence",(async function(e){const{presences:t}=await(0,i.c)("local","presences");chrome.storage.local.set({presences:t.filter((t=>t.metadata.service!==e.detail))}),d(),(0,n.IG)(chrome.i18n.getUILanguage())})),window.addEventListener("PreMiD_GetPresenceList",m),chrome.storage.onChanged.addListener((e=>{"presences"===Object.keys(e)[0]&&m()})))},418:()=>{}},t={};function a(n){if(t[n])return t[n].exports;var s=t[n]={exports:{}};return e[n].call(s.exports,s,s.exports,a),s.exports}return a.m=e,a.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return a.d(t,{a:t}),t},a.d=(e,t)=>{for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e={464:0,293:0},t=[[9729,999]],n=()=>{};function s(){for(var n,s=0;s<t.length;s++){for(var r=t[s],i=!0,o=1;o<r.length;o++){var c=r[o];0!==e[c]&&(i=!1)}i&&(t.splice(s--,1),n=a(a.s=r[0]))}return 0===t.length&&(a.x(),a.x=()=>{}),n}a.x=()=>{a.x=()=>{},i=i.slice();for(var e=0;e<i.length;e++)r(i[e]);return(n=s)()};var r=s=>{for(var r,i,[c,d,l,m]=s,u=0,p=[];u<c.length;u++)i=c[u],a.o(e,i)&&e[i]&&p.push(e[i][0]),e[i]=0;for(r in d)a.o(d,r)&&(a.m[r]=d[r]);for(l&&l(a),o(s);p.length;)p.shift()();return m&&t.push.apply(t,m),n()},i=self.webpackChunkpmd=self.webpackChunkpmd||[],o=i.push.bind(i);i.push=r})(),a.x()})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvYWRkRGVmYXVsdFByZXNlbmNlcy50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvZGV0ZWN0U2FmYXJpLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2Z1bmN0aW9ucy90YWJIYXNQcmVzZW5jZS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvdXBkYXRlQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaW5qZWN0UHJlc2VuY2UudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvdGFiUHJpb3JpdHkudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZnVuY3Rpb25zL2NwT2JqLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2Z1bmN0aW9ucy9zZXRBY3Rpdml0eS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9iYWNrZ3JvdW5kL29uQ29ubmVjdC50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaXNFcXVpdmFsZW50LnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2Z1bmN0aW9ucy9wcmVzZW5jZURldk1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvc29ja2V0TWFuYWdlci50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvY2xlYXJBY3Rpdml0eS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaW5pdFNldHRpbmdzLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2JhY2tncm91bmQvZ2VuZXJpYy50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvY29uc29sZUhlYWRlci50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvaGFzQWxwaGFCZXRhQWNjZXNzLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy91dGlsL2JhY2tncm91bmQvb25JbnN0YWxsZWQudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvYmFja2dyb3VuZC9vbk1lc3NhZ2UudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvYmFja2dyb3VuZC9vblN0b3JhZ2VDaGFuZ2UudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvYmFja2dyb3VuZC9vblVuaW5zdGFsbGVkLnRzIiwid2VicGFjazovL3BtZC8uL3NyYy9jb25maWcudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZGVidWcudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZnVuY3Rpb25zL2FzeW5jU3RvcmFnZS50cyIsIndlYnBhY2s6Ly9wbWQvLi9zcmMvdXRpbC9mdW5jdGlvbnMvY2xlYW5PYmplY3QudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvZnVuY3Rpb25zL2dyYXBocWwudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvbGFuZ01hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vcG1kLy4vc3JjL3V0aWwvcHJlc2VuY2VNYW5hZ2VyLnRzIiwid2VicGFjazovL3BtZC93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9wbWQvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvY29tcGF0IGdldCBkZWZhdWx0IGV4cG9ydCIsIndlYnBhY2s6Ly9wbWQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvZ2xvYmFsIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3BtZC93ZWJwYWNrL3J1bnRpbWUvanNvbnAgY2h1bmsgbG9hZGluZyJdLCJuYW1lcyI6WyJhc3luYyIsImFkZERlZmF1bHRQcmVzZW5jZXMiLCJkZWZhdWx0QWRkZWQiLCJkZWZhdWx0UHJlc2VuY2VzIiwiYWRkUHJlc2VuY2UiLCJwcmVzZW5jZXMiLCJtYXAiLCJwIiwibWV0YWRhdGEiLCJzZXJ2aWNlIiwicHJlc2VuY2UiLCJpbmNsdWRlcyIsImRldGVjdFNhZmFyaSIsIm5hdmlnYXRvciIsInVzZXJBZ2VudCIsImluZGV4T2YiLCJ0YWJIYXNQcmVzZW5jZSIsInRhYklkIiwicmVzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjaHJvbWUiLCJ0YWJzIiwiZXhlY3V0ZVNjcmlwdCIsImNvZGUiLCJjaGVja1VwZGF0ZSIsInNhZmFyaSIsInJlc3VsdCIsImdyYXBocWwiLCJjbGVhbk9iamVjdCIsImRhdGEiLCJ2ZXJzaW9ucyIsInZlcnNpb24iLCJydW50aW1lIiwiZ2V0TWFuaWZlc3QiLCJ2ZXJzaW9uX25hbWUiLCJicm93c2VyQWN0aW9uIiwic2V0QmFkZ2VUZXh0IiwidGV4dCIsImxhdGVzdFZlcnNpb24iLCJ1cmdlbnRVcGRhdGUiLCJ1cmdlbnQiLCJzZXRCYWRnZUJhY2tncm91bmRDb2xvciIsImNvbG9yIiwiaW5qZWN0UHJlc2VuY2UiLCJpZGVudGlmaWVyIiwibG9nZ2VyIiwicmVhZExvZ3MiLCJyZXBsYWNlIiwiSlNPTiIsInN0cmluZ2lmeSIsInJ1bkF0IiwiY3VyclRpbWVvdXQiLCJwcmlvcml0eVRhYiIsIm9sZFByZXNlbmNlIiwidGFiUHJpb3JpdHkiLCJpbmZvIiwibGFzdEZvY3VzZWRXaW5kb3ciLCJ3aW5kb3dzIiwiZ2V0TGFzdEZvY3VzZWQiLCJhY3RpdmVUYWIiLCJxdWVyeSIsImFjdGl2ZSIsIndpbmRvd0lkIiwiaWQiLCJ1cmwiLCJzdGFydHNXaXRoIiwicG1kTWV0YVRhZyIsInVuZGVmaW5lZCIsImZpbHRlciIsIm1ldGFUYWciLCJlbmFibGVkIiwicmVnRXhwIiwibWF0Y2giLCJSZWdFeHAiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJVUkwiLCJob3N0bmFtZSIsInBycyIsImhpZGRlbiIsInByZXNlbmNlSnNDb2RlIiwiaWZyYW1lIiwicHJlc2VuY2VKcyIsImlmcmFtZUpzIiwic3RvcmFnZSIsImxvY2FsIiwiZ2V0IiwiZXhQcmVzZW5jZSIsImZpbmRJbmRleCIsInByZXNlbmNlMSIsInB1c2giLCJzZXQiLCJ0YWJIYXNQcnMiLCJzdGF0dXMiLCJjbGVhckFjdGl2aXR5Iiwic2VuZE1lc3NhZ2UiLCJ1cGRhdGVQb3B1cFZpc2liaWxpdHkiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiY2xlYXJUaW1lb3V0IiwicHJlc2VuY2VUb1Nob3ciLCJwcmVzZW5jZVRvSGlkZSIsImhpZGVNZXRhVGFnUHJlc2VuY2VzIiwiY3BPYmoiLCJtYWluT2JqIiwia2V5Iiwib2JqQ29weSIsInNldEFjdGl2aXR5Iiwic2V0dGluZ3MiLCJhdXRob3JpemVkQmV0YUFscGhhIiwidmFsdWUiLCJwVFMiLCJ0cmF5VGl0bGUiLCJ0aXRsZU1lbnViYXIiLCJ0cmltIiwibWVkaWFLZXlzIiwicHJlc2VuY2VEYXRhIiwiZGV0YWlscyIsInNsaWNlIiwic3RhdGUiLCJzb2NrZXQiLCJjb25uZWN0ZWQiLCJlbWl0Iiwib2xkT2JqZWN0Iiwib2xkQWN0aXZpdHkiLCJvbkNvbm5lY3QiLCJhZGRMaXN0ZW5lciIsInBvcnQiLCJuYW1lIiwic2VuZFJlc3BvbnNlIiwicG9zdE1lc3NhZ2UiLCJvbiIsIm9uRGlzY29ubmVjdCIsInJlbW92ZUxpc3RlbmVyIiwiaGFuZGxlVGFicyIsImFwcFZlcnNpb25TdXBwb3J0ZWQiLCJzdXBwb3J0ZWRBcHBWZXJzaW9uIiwibGF0ZXN0RXh0ZW5zaW9uVmVyc2lvbiIsIm9uTWVzc2FnZSIsIm1zZyIsImFjdGlvbiIsImhhbmRsZVBvcHVwIiwicGxhdGZvcm0iLCJnZXRQbGF0Zm9ybUluZm8iLCJvcyIsImFyY2giLCJwZW5ndWluRW1vamkiLCJTdHJpbmciLCJmcm9tQ29kZVBvaW50IiwibiIsImxhcmdlSW1hZ2VLZXkiLCJsYXJnZUltYWdlVGV4dCIsImFwcFZlcnNpb24iLCJmcm9tIiwicmV2ZXJzZSIsImEiLCJpIiwiam9pbiIsImZyb21DaGFyQ29kZSIsImNoZWNrIiwic3RhcnRUaW1lc3RhbXAiLCJlbmRUaW1lc3RhbXAiLCJjaGVjazEiLCJiIiwiYVByb3BzIiwiT2JqZWN0IiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImJQcm9wcyIsInByb3BOYW1lIiwiaXNFcXVpdmFsZW50IiwiaGFuZGxlUHJlc2VuY2UiLCJzdWNjZXNzIiwib25MaW5lIiwic3RhcnQiLCJlIiwiaGFuZGxlQXBwVHMiLCJlcnJvcnMiLCJhdXRvQ29ubmVjdCIsImNvbm5lY3QiLCJvcGVuIiwiYXBwVmVyc2lvblRpbWVvdXQiLCJyZXNldFRhYlByaW9yaXR5IiwiYXNzaWduIiwia2V5cyIsImsiLCJ0bXAiLCJmaWxlcyIsImZpbmQiLCJmIiwiZmlsZSIsInRvTG93ZXJDYXNlIiwiY29udGVudHMiLCJhdXRob3IiLCJkZXNjcmlwdGlvbiIsImVuIiwiZXJyIiwiYWRkZWRQcmVzZW5jZSIsInRtcFByIiwiaW5pdFByZXNlbmNlTGFuZ3VhZ2VzIiwidXBkYXRlZFByZXNlbmNlIiwid2luZG93VHlwZSIsImoiLCJ0YWJVcmwiLCJ0ZXN0IiwiaHJlZiIsInJlbG9hZCIsImJ5cGFzc0NhY2hlIiwiY29uc29sZSIsInVzZXIiLCJwcmVtaXVtX3R5cGUiLCJuZXdVc2VyIiwiZGlzY29yZFVzZXIiLCJpbml0U2V0dGluZyIsInN5bmMiLCJzZXR0aW5nIiwic3RyaW5nIiwicG9zaXRpb24iLCJvcHRpb24iLCJzaG93IiwiY09wdGlvbiIsImxvZyIsIkRhdGUiLCJnZXRGdWxsWWVhciIsImNvbnNvbGVIZWFkZXIiLCJyZWRpcmVjdFVSTCIsImJyb3dzZXIiLCJpZGVudGl0eSIsImdldFJlZGlyZWN0VVJMIiwiYWxsb3dlZEFjY2VzcyIsImxhdW5jaFdlYkF1dGhGbG93IiwiaW50ZXJhY3RpdmUiLCJyZXNwb25zZVVybCIsImxhc3RFcnJvciIsImFjY2Vzc1Rva2VuIiwiZFVzZXIiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsImFjY2Vzc1R5cGUiLCJhbHBoYUJldGFBY2Nlc3MiLCJiZXRhQWNjZXNzIiwiYWxwaGFBY2Nlc3MiLCJoYXNBbHBoYUJldGFBY2Nlc3MiLCJhbGwiLCJpbml0U2V0dGluZ3MiLCJ1cGRhdGVQcmVzZW5jZXMiLCJpMThuIiwiZ2V0VUlMYW5ndWFnZSIsInByZXNlbmNlU2NpZW5jZSIsInNldEludGVydmFsIiwib25DaGFuZ2VkIiwiY2hhbmdlcyIsIm5TZXR0aW5ncyIsIm5ld1ZhbHVlIiwib2xkVmFsdWUiLCJucCIsIm92IiwiZm9yRWFjaCIsInN0b3JhZ2VTZXR0aW5ncyIsInN0b3JhZ2VTZXR0aW5nIiwicyIsIm11bHRpTGFuZ3VhZ2UiLCJwYXJzZSIsIm9uVXBkYXRlQXZhaWxhYmxlIiwib25BY3RpdmF0ZWQiLCJvblJlcGxhY2VkIiwiXyIsIm9uUmVtb3ZlZCIsIm9uVXBkYXRlZCIsImNoYW5nZUluZm8iLCJvbkZvY3VzQ2hhbmdlZCIsIm9uRXh0RW5hYmxlIiwidGhlbiIsIm9uSW5zdGFsbGVkIiwicmVhc29uIiwiY3JlYXRlIiwiaW5kZXgiLCJnZXRVUkwiLCJsYXN0VmVyc2lvbiIsInBhcnNlSW50IiwidXBkYXRlIiwic2VuZGVyIiwiaUZyYW1lVXBkYXRlRGF0YSIsInRhYiIsImlGcmFtZURhdGEiLCJpRnJhbWUiLCJpRnJhbWVSZWdFeHAiLCJoYW5kbGVpRnJhbWUiLCJzZXRVbmluc3RhbGxVUkwiLCJhcGlCYXNlIiwicmVsZWFzZVR5cGUiLCJyZXF1aXJlZEFwcFZlcnNpb24iLCJnZW5lcmljU3R5bGUiLCJkZWJ1Z2dpbmciLCJsYXN0RmlsZSIsIm1lc3NhZ2UiLCJmb3JjZSIsImdyb3VwRmlsZSIsImVycm9yIiwiZ3JvdXBFbmQiLCJncm91cCIsImdldFN0b3JhZ2UiLCJ0eXBlIiwiaXRlbXMiLCJzZXRTdG9yYWdlIiwib2JqIiwiZ3JhcGhxbFJlcXVlc3QiLCJtZXRob2QiLCJnZXRQcmVzZW5jZU1ldGFkYXRhIiwiREVGQVVMVF9MT0NBTEUiLCJNSU5fVVBEQVRFX1RJTUUiLCJsYW5ndWFnZXMiLCJub3JtYWxpemVMYW5ndWFnZUNvZGUiLCJsYW5ndWFnZUNvZGUiLCJzcGxpdCIsInVwZGF0ZVN0cmluZ3MiLCJ3ZWJzaXRlTGFuZ3VhZ2UiLCJleHRlbnNpb25MYW5ndWFnZSIsInByZXNlbmNlTGFuZ3VhZ2UiLCJhdmFpbGFibGVMYW5ncyIsImxhbmdGaWxlcyIsImxmIiwibGFuZyIsImMiLCJncmFwaHFsUmVzdWx0Iiwid2Vic2l0ZSIsInRyYW5zbGF0aW9ucyIsImxvYWRpbmciLCJleHRlbnNpb24iLCJ1cGRhdGVkQXQiLCJub3ciLCJ1cGRhdGVBbGxTdHJpbmdzIiwibG5nIiwibG9hZFN0cmluZ3MiLCJsb2FkaW5nTGFuZ3MiLCJsb2FkU3RhdHVzIiwiY2xlYXJJbnRlcnZhbCIsImxuZ3MiLCJ1cGRhdGVQcm9taXNlcyIsInNwbGljZSIsImdldFN0cmluZyIsImdldFByZXNlbmNlTGFuZ3VhZ2VzIiwicHJlc2VuY2VOYW1lIiwibGFuZ3MiLCJmaW5hbEFycmF5IiwiZ2VuZXJhbExhbmdGaWxlcyIsInByZXNlbmNlc0FycmF5IiwidG9TdHJpbmciLCJwcmVzZW5jZVZlcnNpb25zIiwiZWxlbWVudCIsInByZXNlbmNlc1RvVXBkYXRlIiwicDEiLCJwcmVzZW5jZUluZGV4IiwicHJlc2VuY2VOYW1lc1RvVXBkYXRlIiwic2V0dGluZ05hbWUiLCJsYW5nU2V0dGluZ3MiLCJ2YWx1ZXMiLCJ2IiwiYnV0dG9uIiwicHJlc2VuY2VBbmRJZnJhbWUiLCJjYXRjaCIsInByZXNlbmNlc1RvQWRkIiwiY29uY2F0Iiwic2VuZEJhY2tQcmVzZW5jZXMiLCJkZXRhaWwiLCJjbG9uZUludG8iLCJkb2N1bWVudCIsImRlZmF1bHRWaWV3IiwiZXZlbnQiLCJDdXN0b21FdmVudCIsImRpc3BhdGNoRXZlbnQiLCJsbmdTZXR0aW5nSWR4IiwibG5nU2V0dGluZyIsImNvbW1vbkxuZ3MiLCJwcmVmaXgiLCJjbCIsImwiLCJwcmVzZW5jZU11bHRpTGFuZ3VhZ2VMYW5ndWFnZXMiLCJwcmVzZW5jZVNldHRpbmdzIiwidWlMYW5nIiwicHJlZmVycmVkVmFsdWUiLCJ0aXRsZSIsImljb24iLCJzdG9yZURlZmF1bHRMYW5ndWFnZU9mUHJlc2VuY2UiLCJzZXJ2aWNlTmFtZSIsImxhbmd1YWdlIiwibG9jYXRpb24iLCJwYXRobmFtZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJxdWVyeVNlbGVjdG9yIiwic2V0QXR0cmlidXRlIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiZXhwb3J0cyIsIm1vZHVsZSIsIl9fd2VicGFja19tb2R1bGVzX18iLCJjYWxsIiwibSIsImdldHRlciIsIl9fZXNNb2R1bGUiLCJkIiwiZGVmaW5pdGlvbiIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnIiwiZ2xvYmFsVGhpcyIsInRoaXMiLCJGdW5jdGlvbiIsInByb3AiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInIiLCJTeW1ib2wiLCJ0b1N0cmluZ1RhZyIsImluc3RhbGxlZENodW5rcyIsIjQ2NCIsIjI5MyIsImRlZmVycmVkTW9kdWxlcyIsImNoZWNrRGVmZXJyZWRNb2R1bGVzIiwiY2hlY2tEZWZlcnJlZE1vZHVsZXNJbXBsIiwiZGVmZXJyZWRNb2R1bGUiLCJmdWxmaWxsZWQiLCJkZXBJZCIsIngiLCJjaHVua0xvYWRpbmdHbG9iYWwiLCJ3ZWJwYWNrSnNvbnBDYWxsYmFjayIsImNodW5rSWQiLCJjaHVua0lkcyIsIm1vcmVNb2R1bGVzIiwiZXhlY3V0ZU1vZHVsZXMiLCJyZXNvbHZlcyIsInBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uIiwic2hpZnQiLCJhcHBseSIsInNlbGYiLCJiaW5kIl0sIm1hcHBpbmdzIjoiOEZBSWVBLGVBQWVDLElBRTdCLElBQUlDLFNBQXNCLE9BQVcsUUFBUyxpQkFBaUJBLGFBRy9ELEdBQUlBLEVBQWMsT0FDbEIsTUFBTUMs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RUFBb0JpQyxJQUNwQmpDLEVBQW9CaUMsRUFBSSxRQUlsQi9ZLEVBRVI4VyxFQUFvQmlDLEVBQUksS0FFdkJqQyxFQUFvQmlDLEVBQUksT0FHeEJDLEVBQXFCQSxFQUFtQm5ULFFBQ3hDLElBQUksSUFBSXNDLEVBQUksRUFBR0EsRUFBSTZRLEVBQW1CaFcsT0FBUW1GLElBQUs4USxFQUFxQkQsRUFBbUI3USxJQUMzRixPQUFRdVEsRUFBdUJDLE1BSWhDLElBQUlNLEVBQXdCOVksSUFLM0IsSUFKQSxJQUdJNFcsRUFBVW1DLEdBSFRDLEVBQVVDLEVBQWE5WSxFQUFTK1ksR0FBa0JsWixFQUdoQ2dJLEVBQUksRUFBR21SLEVBQVcsR0FDcENuUixFQUFJZ1IsRUFBU25XLE9BQVFtRixJQUN6QitRLEVBQVVDLEVBQVNoUixHQUNoQjJPLEVBQW9CVyxFQUFFYSxFQUFpQlksSUFBWVosRUFBZ0JZLElBQ3JFSSxFQUFTclYsS0FBS3FVLEVBQWdCWSxHQUFTLElBRXhDWixFQUFnQlksR0FBVyxFQUU1QixJQUFJbkMsS0FBWXFDLEVBQ1p0QyxFQUFvQlcsRUFBRTJCLEVBQWFyQyxLQUNyQ0QsRUFBb0JNLEVBQUVMLEdBQVlxQyxFQUFZckMsSUFLaEQsSUFGR3pXLEdBQVNBLEVBQVF3VyxHQUNwQnlDLEVBQTJCcFosR0FDckJtWixFQUFTdFcsUUFDZHNXLEVBQVNFLE9BQVRGLEdBT0QsT0FIR0QsR0FBZ0JaLEVBQWdCeFUsS0FBS3dWLE1BQU1oQixFQUFpQlksR0FHeERYLEtBR0pNLEVBQXFCVSxLQUFzQixnQkFBSUEsS0FBc0IsaUJBQUssR0FDMUVILEVBQTZCUCxFQUFtQi9VLEtBQUswVixLQUFLWCxHQUM5REEsRUFBbUIvVSxLQUFPZ1YsRyxHTnpGbkJuQyxFQUFvQmlDLEsiLCJmaWxlIjoianMvYmFja2dyb3VuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldFN0b3JhZ2UsIHNldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuXHJcbmltcG9ydCB7IGFkZFByZXNlbmNlIH0gZnJvbSBcIi4uL3ByZXNlbmNlTWFuYWdlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gYWRkRGVmYXVsdFByZXNlbmNlcygpIHtcclxuXHQvLyogQWRkIGRlZmF1bHQgcHJlc2VuY2VzXHJcblx0bGV0IGRlZmF1bHRBZGRlZCA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJkZWZhdWx0QWRkZWRcIikpLmRlZmF1bHRBZGRlZFxyXG5cdC8vKiByZXR1cm4gaWYgYWxyZWFkeSBhZGRlZFxyXG5cdC8vKiBBZGQgZGVmYXVsdCBwcmVzZW5jZXNcclxuXHRpZiAoZGVmYXVsdEFkZGVkKSByZXR1cm47XHJcblx0Y29uc3QgZGVmYXVsdFByZXNlbmNlcyA9IFtcclxuXHRcdFwiWW91VHViZVwiLFxyXG5cdFx0XCJZb3VUdWJlIE11c2ljXCIsXHJcblx0XHRcIk5ldGZsaXhcIixcclxuXHRcdFwiVHdpdGNoXCIsXHJcblx0XHRcIlNvdW5kQ2xvdWRcIlxyXG5cdF07XHJcblx0YXdhaXQgYWRkUHJlc2VuY2UoZGVmYXVsdFByZXNlbmNlcyk7XHJcblx0ZGVmYXVsdEFkZGVkID0gdHJ1ZTtcclxuXHJcblx0bGV0IHByZXNlbmNlcyA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpLnByZXNlbmNlc1xyXG5cdFx0Lm1hcChwID0+IHAubWV0YWRhdGEuc2VydmljZSk7XHJcblxyXG5cdC8vKiBjaGVjayB0aGF0IGFsbCByZXF1ZXN0ZWQgcHJlc2VuY2VzIGhhdmUgYmVlbiBpbnN0YWxsZWRcclxuXHRmb3IgKGNvbnN0IHByZXNlbmNlIG9mIGRlZmF1bHRQcmVzZW5jZXMpIHtcclxuXHRcdGlmICghcHJlc2VuY2VzLmluY2x1ZGVzKHByZXNlbmNlKSkge1xyXG5cdFx0XHRkZWZhdWx0QWRkZWQgPSBmYWxzZTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRzZXRTdG9yYWdlKFwibG9jYWxcIiwge1xyXG5cdFx0ZGVmYXVsdEFkZGVkXHJcblx0fSk7XHJcbn1cclxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZGV0ZWN0U2FmYXJpKCkge1xyXG5cdC8vKiBEZXRlY3QgU2FmYXJpIEJyb3dzZXIgYW5kIHJldHVybiB0cnVlL2ZhbHNlLlxyXG5cdHJldHVybiAoXHJcblx0XHRuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJTYWZhcmlcIikgIT09IC0xICYmXHJcblx0XHRuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJDaHJvbWVcIikgPT09IC0xXHJcblx0KTtcclxufVxyXG4iLCJleHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiB0YWJIYXNQcmVzZW5jZSh0YWJJZDogbnVtYmVyKSB7XHJcblx0Y29uc3QgcmVzID0gYXdhaXQgbmV3IFByb21pc2U8Ym9vbGVhbltdPihyZXNvbHZlID0+IHtcclxuXHRcdGNocm9tZS50YWJzLmV4ZWN1dGVTY3JpcHQoXHJcblx0XHRcdHRhYklkLFxyXG5cdFx0XHR7XHJcblx0XHRcdFx0Y29kZTogXCJ0cnl7UHJlTWlEX1ByZXNlbmNlfWNhdGNoKF8pe2ZhbHNlfVwiXHJcblx0XHRcdH0sXHJcblx0XHRcdHJlc29sdmVcclxuXHRcdCk7XHJcblx0fSk7XHJcblxyXG5cdGlmICghcmVzKSByZXR1cm4gZmFsc2U7XHJcblx0ZWxzZSByZXR1cm4gcmVzWzBdO1xyXG59XHJcbiIsImltcG9ydCBjbGVhbk9iamVjdCBmcm9tIFwiLi9jbGVhbk9iamVjdFwiO1xyXG5pbXBvcnQgZ3JhcGhxbFJlcXVlc3QgZnJvbSBcIi4vZ3JhcGhxbFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gY2hlY2tVcGRhdGUoc2FmYXJpOiBib29sZWFuKSB7XHJcblx0aWYgKHNhZmFyaSkge1xyXG5cdFx0Y29uc3QgcmVzdWx0ID0gYXdhaXQgZ3JhcGhxbFJlcXVlc3QoYFxyXG5cdFx0cXVlcnkge1xyXG5cdFx0XHR2ZXJzaW9ucyB7XHJcblx0XHRcdFx0c2FmYXJpIHtcclxuXHRcdFx0XHRcdHZlcnNpb25cclxuXHRcdFx0XHRcdHVyZ2VudFxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fWApO1xyXG5cdFx0Y2xlYW5PYmplY3QocmVzdWx0LmRhdGEpO1xyXG5cdFx0aWYgKFxyXG5cdFx0XHRyZXN1bHQuZGF0YS52ZXJzaW9ucy5zYWZhcmkudmVyc2lvbiA9PT1cclxuXHRcdFx0Y2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3QoKS52ZXJzaW9uX25hbWVcclxuXHRcdCkge1xyXG5cdFx0XHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIlwiIH0pO1xyXG5cdFx0XHRyZXR1cm4geyBsYXRlc3RWZXJzaW9uOiB0cnVlLCB1cmdlbnRVcGRhdGU6IGZhbHNlIH07XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRjb25zdCB1cmdlbnRVcGRhdGUgPSByZXN1bHQuZGF0YS52ZXJzaW9ucy5zYWZhcmkudXJnZW50O1xyXG5cdFx0XHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIiFcIiB9KTtcclxuXHRcdFx0Y2hyb21lLmJyb3dzZXJBY3Rpb24uc2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3IoeyBjb2xvcjogXCIjZmY1MDUwXCIgfSk7XHJcblx0XHRcdHJldHVybiB7IGxhdGVzdFZlcnNpb246IGZhbHNlLCB1cmdlbnRVcGRhdGUgfTtcclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0cmV0dXJuIHsgbGF0ZXN0VmVyc2lvbjogdHJ1ZSwgdXJnZW50VXBkYXRlOiBmYWxzZSB9O1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBzdWNjZXNzIH0gZnJvbSBcIi4uL2RlYnVnXCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGRldGVjdFNhZmFyaSBmcm9tIFwiLi9kZXRlY3RTYWZhcmlcIjtcclxuaW1wb3J0IHRhYkhhc1ByZXNlbmNlIGZyb20gXCIuL3RhYkhhc1ByZXNlbmNlXCI7XHJcbmltcG9ydCBjaGVja1VwZGF0ZSBmcm9tIFwiLi91cGRhdGVDaGVja2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBpbmplY3RQcmVzZW5jZShcclxuXHR0YWJJZDogbnVtYmVyLFxyXG5cdHByZXNlbmNlOiBwcmVzZW5jZVN0b3JhZ2VbMF1cclxuKSB7XHJcblx0aWYgKFxyXG5cdFx0KGF3YWl0IGNoZWNrVXBkYXRlKGRldGVjdFNhZmFyaSgpKSkudXJnZW50VXBkYXRlICYmXHJcblx0XHQhKGF3YWl0IGNoZWNrVXBkYXRlKGRldGVjdFNhZmFyaSgpKSkubGF0ZXN0VmVyc2lvblxyXG5cdClcclxuXHRcdHJldHVybiBmYWxzZTtcclxuXHRpZiAoYXdhaXQgdGFiSGFzUHJlc2VuY2UodGFiSWQpKSByZXR1cm4gZmFsc2U7XHJcblxyXG5cdHJldHVybiBuZXcgUHJvbWlzZShhc3luYyByZXNvbHZlID0+IHtcclxuXHRcdGNvbnN0IGlkZW50aWZpZXIgPSAoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIFwiaWRlbnRpZmllclwiKSkuaWRlbnRpZmllcjtcclxuXHJcblx0XHRsZXQgbG9nZ2VyID0gXCJcIjtcclxuXHJcblx0XHRpZiAocHJlc2VuY2UubWV0YWRhdGEucmVhZExvZ3MpIHtcclxuXHRcdFx0Y29uc3QgTUFYX0xPR19FTlRSSUVTID0gMTAwO1xyXG5cdFx0XHRsb2dnZXIgPSBgXHJcblx0XHRcdFx0Y29uc3QgUHJlTWlEX2NvbnNvbGVMb2dnZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG5cdFx0XHRcdFByZU1pRF9jb25zb2xlTG9nZ2VyLnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG5cdFx0XHRcdFByZU1pRF9jb25zb2xlTG9nZ2VyLmlkID0gXCJQcmVNaURfY29uc29sZUxvZ2dlclwiO1xyXG5cdFx0XHRcdFByZU1pRF9jb25zb2xlTG9nZ2VyLmlubmVyVGV4dCA9IFxcYFxyXG5cdFx0XHRcdGNvbnNvbGUuc3RkbG9nwqA9wqBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpO1xyXG5cdFx0XHRcdGNvbnNvbGUubG9nc8KgPcKgW107XHJcblx0XHRcdFx0Y29uc29sZS5sb2fCoD3CoGZ1bmN0aW9uKCkge1xyXG5cdFx0XHRcdFx0bGV0IGluYyA9IEFycmF5LmZyb20oYXJndW1lbnRzKTtcclxuXHRcdFx0XHRcdGluYy5mb3JFYWNoKGFyZyA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9ncy5wdXNoKGFyZyk7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdHdoaWxlIChjb25zb2xlLmxvZ3MubGVuZ3RoID4gJHtNQVhfTE9HX0VOVFJJRVN9KSB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9ncy5zaGlmdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Y29uc29sZS5zdGRsb2cuYXBwbHkoY29uc29sZSzCoGFyZ3VtZW50cyk7XHJcblx0XHRcdFx0fTtcclxuXHRcdFx0XHRcXGA7XHJcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChQcmVNaURfY29uc29sZUxvZ2dlcik7XHJcblx0XHRcdFx0YC5yZXBsYWNlKC8oXFxyXFxuKXxcXG4vZywgXCJcIik7XHJcblx0XHR9XHJcblxyXG5cdFx0Y2hyb21lLnRhYnMuZXhlY3V0ZVNjcmlwdChcclxuXHRcdFx0dGFiSWQsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRjb2RlOlxyXG5cdFx0XHRcdFx0YGxldCBQcmVNaURfUHJlc2VuY2U9dHJ1ZTtsZXQgUHJlTWlEX0lkZW50aWZpZXI9XCIke2lkZW50aWZpZXJ9XCI7bGV0IFBNRF9JbmZvPXt0YWJJZDoke3RhYklkfX07bGV0IFByZU1pRF9NZXRhZGF0YT0ke0pTT04uc3RyaW5naWZ5KFxyXG5cdFx0XHRcdFx0XHRwcmVzZW5jZS5tZXRhZGF0YVxyXG5cdFx0XHRcdFx0KX07YCArXHJcblx0XHRcdFx0XHRwcmVzZW5jZS5wcmVzZW5jZSArXHJcblx0XHRcdFx0XHRsb2dnZXIsXHJcblx0XHRcdFx0cnVuQXQ6IFwiZG9jdW1lbnRfc3RhcnRcIlxyXG5cdFx0XHR9LFxyXG5cdFx0XHRyZXNvbHZlXHJcblx0XHQpO1xyXG5cclxuXHRcdHN1Y2Nlc3MoXCJpbmplY3RQcmVzZW5jZS50c1wiLCBgSW5qZWN0ZWQgJHtwcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlfWApO1xyXG5cdFx0aWYgKHByZXNlbmNlLm1ldGFkYXRhLnJlYWRMb2dzKSB7XHJcblx0XHRcdHN1Y2Nlc3MoXCJpbmplY3RQcmVzZW5jZS50c1wiLCBgUmVhZGluZyBsb2dzYCk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuIiwiaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGNsZWFyQWN0aXZpdHkgZnJvbSBcIi4vZnVuY3Rpb25zL2NsZWFyQWN0aXZpdHlcIjtcclxuaW1wb3J0IGdyYXBocWwsIHsgZ2V0UHJlc2VuY2VNZXRhZGF0YSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9ncmFwaHFsXCI7XHJcbmltcG9ydCBpbmplY3RQcmVzZW5jZSBmcm9tIFwiLi9mdW5jdGlvbnMvaW5qZWN0UHJlc2VuY2VcIjtcclxuaW1wb3J0IHRhYkhhc1ByZXNlbmNlIGZyb20gXCIuL2Z1bmN0aW9ucy90YWJIYXNQcmVzZW5jZVwiO1xyXG5cclxuZXhwb3J0IGxldCBwcmlvcml0eVRhYjogbnVtYmVyID0gbnVsbDtcclxuZXhwb3J0IGxldCBvbGRQcmVzZW5jZTogYW55ID0gbnVsbDtcclxuXHJcbmV4cG9ydCBsZXQgY3VycmVudFByZXNlbmNlID0gbnVsbDtcclxuXHJcbmxldCBjdXJyVGltZW91dDogbnVtYmVyO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhYlByaW9yaXR5KGluZm86IGFueSA9IHVuZGVmaW5lZCkge1xyXG5cdC8vKiBHZXQgbGFzdCBmb2N1c2VkIHdpbmRvd1xyXG5cdGxldCBsYXN0Rm9jdXNlZFdpbmRvdyA9IGF3YWl0IG5ldyBQcm9taXNlPGNocm9tZS53aW5kb3dzLldpbmRvdz4ocmVzb2x2ZSA9PlxyXG5cdFx0XHRjaHJvbWUud2luZG93cy5nZXRMYXN0Rm9jdXNlZChyZXNvbHZlKVxyXG5cdFx0KSxcclxuXHRcdGFjdGl2ZVRhYiA9IChcclxuXHRcdFx0YXdhaXQgbmV3IFByb21pc2U8Y2hyb21lLnRhYnMuVGFiW10+KHJlc29sdmUgPT5cclxuXHRcdFx0XHRjaHJvbWUudGFicy5xdWVyeShcclxuXHRcdFx0XHRcdHsgYWN0aXZlOiB0cnVlLCB3aW5kb3dJZDogbGFzdEZvY3VzZWRXaW5kb3cuaWQgfSxcclxuXHRcdFx0XHRcdHRhYnMgPT4gcmVzb2x2ZSh0YWJzKVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KVxyXG5cdFx0KVswXSxcclxuXHRcdHByZXNlbmNlOiBwcmVzZW5jZVN0b3JhZ2UgPSAoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIFwicHJlc2VuY2VzXCIpKVxyXG5cdFx0XHQucHJlc2VuY2VzO1xyXG5cclxuXHQvLyogTm8gcG9pbnQgdG8gY29udGludWUgaWYgdGhlcmVzIG5vIHVybFxyXG5cdGlmIChcclxuXHRcdCFhY3RpdmVUYWI/LnVybCB8fFxyXG5cdFx0YWN0aXZlVGFiLnVybC5zdGFydHNXaXRoKFwiY2hyb21lXCIpIHx8XHJcblx0XHRhY3RpdmVUYWIudXJsLnN0YXJ0c1dpdGgoXCJlZGdlXCIpXHJcblx0KVxyXG5cdFx0cmV0dXJuO1xyXG5cclxuXHQvLyogQ2hlY2sgaWYgdGhpcyB3ZWJzaXRlIHVzZXMgdGhlIFByZU1pRF9QcmVzZW5jZSBtZXRhIHRhZ1xyXG5cdGxldCBwbWRNZXRhVGFnOiBzdHJpbmcgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+XHJcblx0XHRjaHJvbWUudGFicy5leGVjdXRlU2NyaXB0KFxyXG5cdFx0XHRhY3RpdmVUYWIuaWQsXHJcblx0XHRcdHtcclxuXHRcdFx0XHRjb2RlOiBgdHJ5e2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cIlByZU1pRF9QcmVzZW5jZVwiXScpLmNvbnRlbnR9Y2F0Y2goZSl7ZmFsc2V9YFxyXG5cdFx0XHR9LFxyXG5cdFx0XHRyZXMgPT4ge1xyXG5cdFx0XHRcdGlmICghcmVzKSB7XHJcblx0XHRcdFx0XHRyZXNvbHZlKHVuZGVmaW5lZCk7XHJcblx0XHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRyZXNvbHZlKHJlc1swXSk7XHJcblx0XHRcdH1cclxuXHRcdClcclxuXHQpO1xyXG5cclxuXHRwcmVzZW5jZSA9IHByZXNlbmNlLmZpbHRlcihwID0+IHtcclxuXHRcdGlmIChwLm1ldGFUYWcgJiYgcC5tZXRhZGF0YS5zZXJ2aWNlID09PSBwbWRNZXRhVGFnKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRsZXQgcmVzID0gbnVsbDtcclxuXHJcblx0XHQvLyogSWYgbm90IGVuYWJsZWQgcmV0dXJuIGZhbHNlXHJcblx0XHRpZiAoIXAuZW5hYmxlZCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgcC5tZXRhZGF0YS5yZWdFeHAgIT09IFwidW5kZWZpbmVkXCIpIHtcclxuXHRcdFx0cmVzID0gYWN0aXZlVGFiLnVybC5tYXRjaChcclxuXHRcdFx0XHRuZXcgUmVnRXhwKFwiXihodHRwcz86fGZpbGU6Wy9dPylbL117Mn1cIiArIHAubWV0YWRhdGEucmVnRXhwKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0aWYgKHJlcyA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xyXG5cdFx0XHRlbHNlIHJldHVybiByZXMubGVuZ3RoID4gMDtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoQXJyYXkuaXNBcnJheShwLm1ldGFkYXRhLnVybCkpXHJcblx0XHRcdHJlcyA9XHJcblx0XHRcdFx0cC5tZXRhZGF0YS51cmwuZmlsdGVyKHVybCA9PiBuZXcgVVJMKGFjdGl2ZVRhYi51cmwpLmhvc3RuYW1lID09PSB1cmwpXHJcblx0XHRcdFx0XHQubGVuZ3RoID4gMDtcclxuXHRcdGVsc2UgcmVzID0gbmV3IFVSTChhY3RpdmVUYWIudXJsKS5ob3N0bmFtZSA9PT0gcC5tZXRhZGF0YS51cmw7XHJcblxyXG5cdFx0cmV0dXJuIHJlcztcclxuXHR9KTtcclxuXHJcblx0Ly8qIElmIFByZU1pRCBoYXMgbm8gcHJlc2VuY2UgdG8gaW5qZWN0IGhlcmUsIGluamVjdCBvbmUgaWYgcG1kTWV0YVRhZyBoYXMgb25lXHJcblx0aWYgKHByZXNlbmNlLmxlbmd0aCA9PT0gMCAmJiBwbWRNZXRhVGFnKSB7XHJcblx0XHRjb25zdCBtZXRhZGF0YSA9IChhd2FpdCBnZXRQcmVzZW5jZU1ldGFkYXRhKHBtZE1ldGFUYWcpKS5kYXRhLm1ldGFkYXRhLFxyXG5cdFx0XHRwcnM6IGFueSA9IHtcclxuXHRcdFx0XHRtZXRhZGF0YTogbWV0YWRhdGEsXHJcblx0XHRcdFx0cHJlc2VuY2U6IG51bGwsXHJcblx0XHRcdFx0ZW5hYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRtZXRhVGFnOiB0cnVlLFxyXG5cdFx0XHRcdGhpZGRlbjogZmFsc2VcclxuXHRcdFx0fTtcclxuXHJcblx0XHRjb25zdCBwcmVzZW5jZUpzQ29kZSA9IChcclxuXHRcdFx0YXdhaXQgZ3JhcGhxbChgXHJcblx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRwcmVzZW5jZXMoc2VydmljZTogXCIke3BtZE1ldGFUYWd9XCIpIHtcclxuXHRcdFx0XHRcdHByZXNlbmNlSnNcclxuXHRcdFx0XHRcdCR7bWV0YWRhdGEuaWZyYW1lID8gXCJpZnJhbWVKc1wiIDogXCJcIn1cclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdGApXHJcblx0XHQpLmRhdGEucHJlc2VuY2VzWzBdO1xyXG5cdFx0cHJzLnByZXNlbmNlID0gcHJlc2VuY2VKc0NvZGUucHJlc2VuY2VKcztcclxuXHJcblx0XHRpZiAobWV0YWRhdGEuaWZyYW1lKSB7XHJcblx0XHRcdHBycy5pZnJhbWUgPSBwcmVzZW5jZUpzQ29kZS5pZnJhbWVKcztcclxuXHRcdH1cclxuXHRcdHByZXNlbmNlID0gW3Byc107XHJcblxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFwicHJlc2VuY2VzXCIsIGRhdGEgPT4ge1xyXG5cdFx0XHRjb25zdCBleFByZXNlbmNlID0gZGF0YS5wcmVzZW5jZXMuZmluZEluZGV4KFxyXG5cdFx0XHRcdHAgPT5cclxuXHRcdFx0XHRcdHAubWV0YWRhdGEuc2VydmljZSA9PT0gcHJzLm1ldGFkYXRhLnNlcnZpY2UgJiZcclxuXHRcdFx0XHRcdHAubWV0YVRhZyA9PT0gcHJzLm1ldGFUYWdcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGlmIChleFByZXNlbmNlID4gLTEpIHtcclxuXHRcdFx0XHRjb25zdCBlbmFibGVkID0gZGF0YS5wcmVzZW5jZXNbZXhQcmVzZW5jZV0uZW5hYmxlZCxcclxuXHRcdFx0XHRcdHByZXNlbmNlMSA9IHBycztcclxuXHRcdFx0XHRwcmVzZW5jZTEuZW5hYmxlZCA9IGVuYWJsZWQ7XHJcblx0XHRcdFx0cHJlc2VuY2UxLmhpZGRlbiA9IGZhbHNlO1xyXG5cdFx0XHRcdGRhdGEucHJlc2VuY2VzW2V4UHJlc2VuY2VdID0gcHJlc2VuY2UxO1xyXG5cdFx0XHR9IGVsc2UgZGF0YS5wcmVzZW5jZXMucHVzaChwcnMpO1xyXG5cdFx0XHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoZGF0YSk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8vKiBQcmVzZW5jZSBhdmFpbGFibGUgZm9yIGN1cnJVcmxcclxuXHRpZiAocHJlc2VuY2UubGVuZ3RoID4gMCkge1xyXG5cdFx0Ly8qIENoZWNrIGlmIHRoaXMgdGFiIGFscmVhZHkgaGFzIGEgcHJlc2VuY2UgaW5qZWN0ZWRcclxuXHRcdGNvbnN0IHRhYkhhc1BycyA9IGF3YWl0IHRhYkhhc1ByZXNlbmNlKGFjdGl2ZVRhYi5pZCk7XHJcblxyXG5cdFx0Ly8qIElmIGEgdGFiIGlzIGFscmVhZHkgcHJpb3JpdGl6ZWQsIHJ1biA1IHNlYyB0aW1lb3V0XHJcblx0XHRpZiAocHJpb3JpdHlUYWIpIHtcclxuXHRcdFx0Ly8qIElmIHRpbWVvdXQgZW5kcyBjaGFuZ2UgcHJpb3JpdHlUYWJcclxuXHRcdFx0aWYgKCFjdXJyVGltZW91dCAmJiBwcmlvcml0eVRhYiAhPT0gYWN0aXZlVGFiLmlkKVxyXG5cdFx0XHRcdGN1cnJUaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdFx0Ly8qIENsZWFyIG9sZCBhY3Rpdml0eVxyXG5cdFx0XHRcdFx0Y2xlYXJBY3Rpdml0eSgpO1xyXG5cdFx0XHRcdFx0Ly8qIERpc2FibGUgdGFiUHJpb3JpdHkgb24gb2xkIHByaW9yaXR5VGFiXHJcblx0XHRcdFx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwgeyB0YWJQcmlvcml0eTogZmFsc2UgfSk7XHJcblx0XHRcdFx0XHQvLyogVXBkYXRlIHRhYiB0byBiZSB0aGlzIG9uZVxyXG5cdFx0XHRcdFx0cHJpb3JpdHlUYWIgPSBhY3RpdmVUYWIuaWQ7XHJcblxyXG5cdFx0XHRcdFx0Ly8qIElmIHRhYiBkb2Vzbid0IGhhdmUgcHJlc2VuY2UsIGluamVjdFxyXG5cdFx0XHRcdFx0aWYgKCF0YWJIYXNQcnMpIGF3YWl0IGluamVjdFByZXNlbmNlKHByaW9yaXR5VGFiLCBwcmVzZW5jZVswXSk7XHJcblxyXG5cdFx0XHRcdFx0b2xkUHJlc2VuY2UgPSBwcmVzZW5jZVswXTtcclxuXHRcdFx0XHRcdGNocm9tZS50YWJzLnNlbmRNZXNzYWdlKHByaW9yaXR5VGFiLCB7IHRhYlByaW9yaXR5OiB0cnVlIH0pO1xyXG5cclxuXHRcdFx0XHRcdHVwZGF0ZVBvcHVwVmlzaWJpbGl0eSgpO1xyXG5cclxuXHRcdFx0XHRcdC8vKiBSZXNldCBUaW1lb3V0XHJcblx0XHRcdFx0XHRjdXJyVGltZW91dCA9IG51bGw7XHJcblx0XHRcdFx0fSwgNSAqIDEwMDApO1xyXG5cdFx0XHRlbHNlIHtcclxuXHRcdFx0XHQvLyogQ2hlY2sgaWYgcHJlc2VuY2UgaW5qZWN0ZWQsIGlmIG5vdCBpbmplY3QgYW5kIHNlbmQgVGFiUHJpb3JpdHlcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRwcmlvcml0eVRhYiA9PT0gYWN0aXZlVGFiLmlkICYmXHJcblx0XHRcdFx0XHQhdGFiSGFzUHJzICYmXHJcblx0XHRcdFx0XHRpbmZvICYmXHJcblx0XHRcdFx0XHRpbmZvLnN0YXR1cyAmJlxyXG5cdFx0XHRcdFx0aW5mby5zdGF0dXMgPT09IFwiY29tcGxldGVcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Ly8qIE9ubHkgY2xlYXIgcHJlc2VuY2UgaWYgb2xkIHByZXNlbmNlICE9IG5ldyBwcmVzZW5jZVxyXG5cdFx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0XHRvbGRQcmVzZW5jZSAhPT0gbnVsbCAmJlxyXG5cdFx0XHRcdFx0XHRvbGRQcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlICE9PSBwcmVzZW5jZVswXS5tZXRhZGF0YS5zZXJ2aWNlXHJcblx0XHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdFx0Ly8qIENsZWFyIG9sZCBwcmVzZW5jZSBmcm9tIHByZXZpb3VzIHBhZ2VcclxuXHRcdFx0XHRcdFx0Y2xlYXJBY3Rpdml0eSgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0Ly8qIGluamVjdCBuZXcgcHJlc2VuY2VcclxuXHRcdFx0XHRcdGF3YWl0IGluamVjdFByZXNlbmNlKHByaW9yaXR5VGFiLCBwcmVzZW5jZVswXSk7XHJcblx0XHRcdFx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwge1xyXG5cdFx0XHRcdFx0XHR0YWJQcmlvcml0eTogdHJ1ZVxyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRvbGRQcmVzZW5jZSA9IHByZXNlbmNlWzBdO1xyXG5cdFx0XHRcdFx0dXBkYXRlUG9wdXBWaXNpYmlsaXR5KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRvbGRQcmVzZW5jZSA9IHByZXNlbmNlWzBdO1xyXG5cdFx0XHRwcmlvcml0eVRhYiA9IGFjdGl2ZVRhYi5pZDtcclxuXHJcblx0XHRcdGlmICghdGFiSGFzUHJzKSBhd2FpdCBpbmplY3RQcmVzZW5jZShwcmlvcml0eVRhYiwgcHJlc2VuY2VbMF0pO1xyXG5cclxuXHRcdFx0Y2hyb21lLnRhYnMuc2VuZE1lc3NhZ2UocHJpb3JpdHlUYWIsIHtcclxuXHRcdFx0XHR0YWJQcmlvcml0eTogdHJ1ZVxyXG5cdFx0XHR9KTtcclxuXHRcdFx0dXBkYXRlUG9wdXBWaXNpYmlsaXR5KCk7XHJcblx0XHR9XHJcblx0fSBlbHNlIHtcclxuXHRcdGlmIChwcmlvcml0eVRhYiA9PT0gYWN0aXZlVGFiLmlkKSB7XHJcblx0XHRcdG9sZFByZXNlbmNlID0gbnVsbDtcclxuXHRcdFx0Y2xlYXJBY3Rpdml0eSh0cnVlKTtcclxuXHRcdH1cclxuXHRcdGNsZWFyVGltZW91dChjdXJyVGltZW91dCk7XHJcblx0XHRjdXJyVGltZW91dCA9IG51bGw7XHJcblx0fVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJpb3JpdHlUYWIodmFsdWU6IGFueSkge1xyXG5cdHByaW9yaXR5VGFiID0gdmFsdWU7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHVwZGF0ZVBvcHVwVmlzaWJpbGl0eSgpIHtcclxuXHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoXCJwcmVzZW5jZXNcIiwgKHsgcHJlc2VuY2VzIH0pID0+IHtcclxuXHRcdGNvbnN0IHByZXNlbmNlVG9TaG93ID0gcHJlc2VuY2VzLmZpbmRJbmRleChcclxuXHRcdFx0XHRwID0+XHJcblx0XHRcdFx0XHRwLm1ldGFUYWcgJiZcclxuXHRcdFx0XHRcdHAuaGlkZGVuICYmXHJcblx0XHRcdFx0XHRwLm1ldGFkYXRhLnNlcnZpY2UgPT09IG9sZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2VcclxuXHRcdFx0KSxcclxuXHRcdFx0cHJlc2VuY2VUb0hpZGUgPSBwcmVzZW5jZXMuZmluZEluZGV4KFxyXG5cdFx0XHRcdHAgPT5cclxuXHRcdFx0XHRcdHAubWV0YVRhZyAmJlxyXG5cdFx0XHRcdFx0IXAuaGlkZGVuICYmXHJcblx0XHRcdFx0XHRwLm1ldGFkYXRhLnNlcnZpY2UgIT09IG9sZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2VcclxuXHRcdFx0KTtcclxuXHJcblx0XHRpZiAocHJlc2VuY2VUb1Nob3cgPiAtMSkgcHJlc2VuY2VzW3ByZXNlbmNlVG9TaG93XS5oaWRkZW4gPSBmYWxzZTtcclxuXHRcdGlmIChwcmVzZW5jZVRvSGlkZSA+IC0xKSBwcmVzZW5jZXNbcHJlc2VuY2VUb0hpZGVdLmhpZGRlbiA9IHRydWU7XHJcblxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBwcmVzZW5jZXMgfSk7XHJcblx0fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoaWRlTWV0YVRhZ1ByZXNlbmNlcygpIHtcclxuXHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5nZXQoXCJwcmVzZW5jZXNcIiwgKHsgcHJlc2VuY2VzIH0pID0+IHtcclxuXHRcdGNvbnN0IHByZXNlbmNlVG9IaWRlID0gcHJlc2VuY2VzLmZpbmRJbmRleChwID0+IHAubWV0YVRhZyAmJiAhcC5oaWRkZW4pO1xyXG5cclxuXHRcdGlmIChwcmVzZW5jZVRvSGlkZSA+IC0xKSBwcmVzZW5jZXNbcHJlc2VuY2VUb0hpZGVdLmhpZGRlbiA9IHRydWU7XHJcblxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBwcmVzZW5jZXMgfSk7XHJcblx0fSk7XHJcbn1cclxuIiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3BPYmoobWFpbk9iajogYW55KSB7XHJcblx0Ly8qIG9iakNvcHkgd2lsbCBzdG9yZSBhIGNvcHkgb2YgdGhlIG1haW5PYmpcclxuXHRsZXQgb2JqQ29weTogYW55ID0ge30sXHJcblx0XHRrZXk6IGFueTtcclxuXHJcblx0Zm9yIChrZXkgaW4gbWFpbk9iaikge1xyXG5cdFx0Ly8qIGNvcGllcyBlYWNoIHByb3BlcnR5IHRvIHRoZSBvYmpDb3B5IG9iamVjdFxyXG5cdFx0b2JqQ29weVtrZXldID0gbWFpbk9ialtrZXldO1xyXG5cdH1cclxuXHRyZXR1cm4gb2JqQ29weTtcclxufVxyXG4iLCJpbXBvcnQgeyByZWxlYXNlVHlwZSB9IGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuaW1wb3J0IHsgaW5mbyB9IGZyb20gXCIuLi9kZWJ1Z1wiO1xyXG5pbXBvcnQgeyBzb2NrZXQgfSBmcm9tIFwiLi4vc29ja2V0TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBnZXRTdG9yYWdlIH0gZnJvbSBcIi4vYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCBjcE9iaiBmcm9tIFwiLi9jcE9ialwiO1xyXG5pbXBvcnQgZGV0ZWN0U2FmYXJpIGZyb20gXCIuL2RldGVjdFNhZmFyaVwiO1xyXG5pbXBvcnQgY2hlY2tVcGRhdGUgZnJvbSBcIi4vdXBkYXRlQ2hlY2tlclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc2V0QWN0aXZpdHkoXHJcblx0cHJlc2VuY2U6IGFueSxcclxuXHRzZXR0aW5nczogYW55ID0gdW5kZWZpbmVkXHJcbikge1xyXG5cdGlmIChbXCJBTFBIQVwiLCBcIkJFVEFcIl0uaW5jbHVkZXMocmVsZWFzZVR5cGUpKSB7XHJcblx0XHRjb25zdCB7IGF1dGhvcml6ZWRCZXRhQWxwaGEgfSA9IGF3YWl0IGdldFN0b3JhZ2UoXHJcblx0XHRcdFwibG9jYWxcIixcclxuXHRcdFx0XCJhdXRob3JpemVkQmV0YUFscGhhXCJcclxuXHRcdCk7XHJcblxyXG5cdFx0aWYgKCFhdXRob3JpemVkQmV0YUFscGhhKSByZXR1cm47XHJcblx0fVxyXG5cclxuXHRpZiAoXHJcblx0XHQoYXdhaXQgY2hlY2tVcGRhdGUoZGV0ZWN0U2FmYXJpKCkpKS51cmdlbnRVcGRhdGUgJiZcclxuXHRcdCEoYXdhaXQgY2hlY2tVcGRhdGUoZGV0ZWN0U2FmYXJpKCkpKS5sYXRlc3RWZXJzaW9uXHJcblx0KVxyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cclxuXHRpZiAoIXNldHRpbmdzKSBzZXR0aW5ncyA9IChhd2FpdCBnZXRTdG9yYWdlKFwic3luY1wiLCBcInNldHRpbmdzXCIpKS5zZXR0aW5ncztcclxuXHRpZiAocHJlc2VuY2UgPT0gbnVsbCB8fCAhc2V0dGluZ3MuZW5hYmxlZC52YWx1ZSkgcmV0dXJuO1xyXG5cclxuXHRjb25zdCBwVFMgPSBjcE9iaihwcmVzZW5jZSk7XHJcblxyXG5cdGlmIChwVFMudHJheVRpdGxlICYmIHNldHRpbmdzLnRpdGxlTWVudWJhci52YWx1ZSAmJiBwVFMudHJheVRpdGxlLnRyaW0oKSlcclxuXHRcdHBUUy50cmF5VGl0bGUgPSBwVFMudHJheVRpdGxlLnRyaW0oKTtcclxuXHRlbHNlIHBUUy50cmF5VGl0bGUgPSBcIlwiO1xyXG5cclxuXHRpZiAoIXNldHRpbmdzLm1lZGlhS2V5cy52YWx1ZSkgcFRTLm1lZGlhS2V5cyA9IGZhbHNlO1xyXG5cclxuXHRpZiAocFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzKVxyXG5cdFx0cFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzLmxlbmd0aCA8IDNcclxuXHRcdFx0PyAocFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzID0gXCIgICBcIiArIHBUUy5wcmVzZW5jZURhdGEuZGV0YWlscylcclxuXHRcdFx0OiAocFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzID0gcFRTLnByZXNlbmNlRGF0YS5kZXRhaWxzXHJcblx0XHRcdFx0XHQuc2xpY2UoMCwgMTI4KVxyXG5cdFx0XHRcdFx0LnRyaW0oKSk7XHJcblx0aWYgKHBUUy5wcmVzZW5jZURhdGEuc3RhdGUpXHJcblx0XHRwVFMucHJlc2VuY2VEYXRhLnN0YXRlLmxlbmd0aCA8IDNcclxuXHRcdFx0PyAocFRTLnByZXNlbmNlRGF0YS5zdGF0ZSA9IFwiICAgXCIgKyBwVFMucHJlc2VuY2VEYXRhLnN0YXRlKVxyXG5cdFx0XHQ6IChwVFMucHJlc2VuY2VEYXRhLnN0YXRlID0gcFRTLnByZXNlbmNlRGF0YS5zdGF0ZS5zbGljZSgwLCAxMjgpLnRyaW0oKSk7XHJcblxyXG5cdGlmIChzb2NrZXQuY29ubmVjdGVkKSBzb2NrZXQuZW1pdChcInNldEFjdGl2aXR5XCIsIHBUUyk7XHJcblx0aW5mbyhcInNldEFjdGl2aXR5LnRzXCIsIFwic2V0QWN0aXZpdHlcIik7XHJcbn1cclxuIiwiaW1wb3J0IHsgc2V0U3RvcmFnZSB9IGZyb20gXCIuLi9mdW5jdGlvbnMvYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCBjcE9iaiBmcm9tIFwiLi4vZnVuY3Rpb25zL2NwT2JqXCI7XHJcbmltcG9ydCBkZXRlY3RTYWZhcmkgZnJvbSBcIi4uL2Z1bmN0aW9ucy9kZXRlY3RTYWZhcmlcIjtcclxuaW1wb3J0IGlzRXF1aXZhbGVudCBmcm9tIFwiLi4vZnVuY3Rpb25zL2lzRXF1aXZhbGVudFwiO1xyXG5pbXBvcnQgc2V0QWN0aXZpdHkgZnJvbSBcIi4uL2Z1bmN0aW9ucy9zZXRBY3Rpdml0eVwiO1xyXG5pbXBvcnQgY2hlY2tVcGRhdGUgZnJvbSBcIi4uL2Z1bmN0aW9ucy91cGRhdGVDaGVja2VyXCI7XHJcbmltcG9ydCB7IHVwZGF0ZUFsbFN0cmluZ3MgfSBmcm9tIFwiLi4vbGFuZ01hbmFnZXJcIjtcclxuaW1wb3J0IHsgcGxhdGZvcm1UeXBlIH0gZnJvbSBcIi4uL3ByZXNlbmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBhcHBWZXJzaW9uLCBzb2NrZXQsIHN1cHBvcnRlZEFwcFZlcnNpb24gfSBmcm9tIFwiLi4vc29ja2V0TWFuYWdlclwiO1xyXG5pbXBvcnQgeyBzdGFydCB9IGZyb20gXCIuL2dlbmVyaWNcIjtcclxuXHJcbi8vKiBTb21lIGRlYnVnIHN0dWZmIHRvIHByZXZlbnQgdGltZXN0YW1wIGp1bXBpbmdcclxuZXhwb3J0IGxldCBvbGRPYmplY3Q6IGFueSA9IG51bGw7XHJcbmV4cG9ydCBsZXQgb2xkQWN0aXZpdHk6IGFueSA9IG51bGw7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc2V0T2xkT2JqZWN0KG9iamVjdDogYW55KSB7XHJcblx0b2xkT2JqZWN0ID0gb2JqZWN0O1xyXG59XHJcblxyXG5jb25zdCBmb3JtYXROdW0gPSBuID0+XHJcblx0QXJyYXkuZnJvbShTdHJpbmcobikpXHJcblx0XHQucmV2ZXJzZSgpXHJcblx0XHQubWFwKChhLCBpKSA9PiB7XHJcblx0XHRcdGlmIChpICUgMSA9PSAwICYmIGkgPiAwKSByZXR1cm4gYSArIFwiLlwiO1xyXG5cdFx0XHRyZXR1cm4gYTtcclxuXHRcdH0pXHJcblx0XHQucmV2ZXJzZSgpXHJcblx0XHQuam9pbihcIlwiKTtcclxuXHJcbmNocm9tZS5ydW50aW1lLm9uQ29ubmVjdC5hZGRMaXN0ZW5lcihmdW5jdGlvbihwb3J0KSB7XHJcblx0aGFuZGxlVGFicyhwb3J0KTtcclxuXHRoYW5kbGVQb3B1cChwb3J0KTtcclxuXHRoYW5kbGVQcmVzZW5jZShwb3J0KTtcclxuXHRoYW5kbGVBcHBUcyhwb3J0KTtcclxufSk7XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVUYWJzKHBvcnQ6IGNocm9tZS5ydW50aW1lLlBvcnQpIHtcclxuXHRpZiAocG9ydC5uYW1lID09PSBcInRhYnNcIikge1xyXG5cdFx0Y29uc3Qgc2VuZFJlc3BvbnNlID0gKCkgPT4ge1xyXG5cdFx0XHRwb3J0LnBvc3RNZXNzYWdlKHtcclxuXHRcdFx0XHRjb25uZWN0ZWQ6IHNvY2tldC5jb25uZWN0ZWRcclxuXHRcdFx0fSk7XHJcblx0XHR9O1xyXG5cclxuXHRcdHNlbmRSZXNwb25zZSgpO1xyXG5cclxuXHRcdHNvY2tldC5vbihcImNvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHRcdHNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHJcblx0XHRwb3J0Lm9uRGlzY29ubmVjdC5hZGRMaXN0ZW5lcigoKSA9PiB7XHJcblx0XHRcdHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcImNvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHRcdFx0c29ja2V0LnJlbW92ZUxpc3RlbmVyKFwiZGlzY29ubmVjdFwiLCBzZW5kUmVzcG9uc2UpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5mdW5jdGlvbiBoYW5kbGVQb3B1cChwb3J0OiBjaHJvbWUucnVudGltZS5Qb3J0KSB7XHJcblx0aWYgKHBvcnQubmFtZSA9PT0gXCJwb3B1cFwiKSB7XHJcblx0XHRjb25zdCBzZW5kUmVzcG9uc2UgPSBhc3luYyAoKSA9PiB7XHJcblx0XHRcdHBvcnQucG9zdE1lc3NhZ2Uoe1xyXG5cdFx0XHRcdGNvbm5lY3RlZDogc29ja2V0LmNvbm5lY3RlZCxcclxuXHRcdFx0XHRhcHBWZXJzaW9uU3VwcG9ydGVkOiBzdXBwb3J0ZWRBcHBWZXJzaW9uKCksXHJcblx0XHRcdFx0bGF0ZXN0RXh0ZW5zaW9uVmVyc2lvbjogYXdhaXQgY2hlY2tVcGRhdGUoZGV0ZWN0U2FmYXJpKCkpXHJcblx0XHRcdH0pO1xyXG5cdFx0fTtcclxuXHJcblx0XHRzZW5kUmVzcG9uc2UoKTtcclxuXHJcblx0XHRzb2NrZXQub24oXCJjb25uZWN0XCIsIHNlbmRSZXNwb25zZSk7XHJcblx0XHRzb2NrZXQub24oXCJkaXNjb25uZWN0XCIsIHNlbmRSZXNwb25zZSk7XHJcblxyXG5cdFx0cG9ydC5vbkRpc2Nvbm5lY3QuYWRkTGlzdGVuZXIoKCkgPT4ge1xyXG5cdFx0XHRzb2NrZXQucmVtb3ZlTGlzdGVuZXIoXCJjb25uZWN0XCIsIHNlbmRSZXNwb25zZSk7XHJcblx0XHRcdHNvY2tldC5yZW1vdmVMaXN0ZW5lcihcImRpc2Nvbm5lY3RcIiwgc2VuZFJlc3BvbnNlKTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHBvcnQub25NZXNzYWdlLmFkZExpc3RlbmVyKGFzeW5jIG1zZyA9PiB7XHJcblx0XHRcdGlmIChtc2cuYWN0aW9uID09PSBcImxvYWRMb2NhbFByZXNlbmNlXCIgJiYgc29ja2V0LmNvbm5lY3RlZClcclxuXHRcdFx0XHRzb2NrZXQuZW1pdChcInNlbGVjdExvY2FsUHJlc2VuY2VcIik7XHJcblx0XHRcdGVsc2UgaWYgKG1zZy5hY3Rpb24gPT09IFwicG9wdXBPcGVuZWRcIikgYXdhaXQgdXBkYXRlQWxsU3RyaW5ncygpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVQcmVzZW5jZShwb3J0OiBjaHJvbWUucnVudGltZS5Qb3J0KSB7XHJcblx0aWYgKHBvcnQubmFtZSA9PT0gXCJjb250ZW50U2NyaXB0XCIpIHtcclxuXHRcdHBvcnQub25NZXNzYWdlLmFkZExpc3RlbmVyKGFzeW5jIG1zZyA9PiB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHR0eXBlb2YgbXNnLnByZXNlbmNlID09PSBcInVuZGVmaW5lZFwiIHx8XHJcblx0XHRcdFx0dHlwZW9mIG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEgPT09IFwidW5kZWZpbmVkXCJcclxuXHRcdFx0KVxyXG5cdFx0XHRcdHJldHVybjtcclxuXHJcblx0XHRcdGNvbnN0IHBsYXRmb3JtOiBwbGF0Zm9ybVR5cGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+XHJcblx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUuZ2V0UGxhdGZvcm1JbmZvKGluZm8gPT5cclxuXHRcdFx0XHRcdHJlc29sdmUoe1xyXG5cdFx0XHRcdFx0XHRvczogaW5mby5vcyxcclxuXHRcdFx0XHRcdFx0YXJjaDogaW5mby5hcmNoXHJcblx0XHRcdFx0XHR9KVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KTtcclxuXHJcblx0XHRcdGNvbnN0IHBlbmd1aW5FbW9qaSA9IFN0cmluZy5mcm9tQ29kZVBvaW50KDEyODAzOSk7IC8vID8/XHJcblxyXG5cdFx0XHRpZiAodHlwZW9mIG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEubGFyZ2VJbWFnZUtleSAhPT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0XHRtc2cucHJlc2VuY2UucHJlc2VuY2VEYXRhLmxhcmdlSW1hZ2VUZXh0ID0gYFByZU1pRCAke1xyXG5cdFx0XHRcdFx0cGxhdGZvcm0ub3MgPT09IFwibGludXhcIiB8fCBwbGF0Zm9ybS5vcyA9PT0gXCJjcm9zXCIgPyBwZW5ndWluRW1vamkgOiBcIlwiXHJcblx0XHRcdFx0fSB2JHtmb3JtYXROdW0oYXBwVmVyc2lvbil9ICR7U3RyaW5nLmZyb21DaGFyQ29kZSg4MjI2KX0gRXh0IHYke1xyXG5cdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3QoKS52ZXJzaW9uX25hbWVcclxuXHRcdFx0XHR9YDtcclxuXHJcblx0XHRcdGlmIChvbGRPYmplY3QgPT0gbnVsbCkge1xyXG5cdFx0XHRcdG9sZE9iamVjdCA9IGNwT2JqKG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEpO1xyXG5cdFx0XHRcdG9sZEFjdGl2aXR5ID0gbXNnLnByZXNlbmNlO1xyXG5cdFx0XHRcdHNldEFjdGl2aXR5KG1zZy5wcmVzZW5jZSk7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvLyogQ2hlY2sgZGlmZmVyZW5jZXMgYW5kIGlmIHRoZXJlIGFyZW4ndCBhbnkgcmV0dXJuXHJcblxyXG5cdFx0XHRjb25zdCBjaGVjayA9IGNwT2JqKG9sZE9iamVjdCk7XHJcblx0XHRcdGRlbGV0ZSBjaGVjay5zdGFydFRpbWVzdGFtcDtcclxuXHRcdFx0ZGVsZXRlIGNoZWNrLmVuZFRpbWVzdGFtcDtcclxuXHJcblx0XHRcdGNvbnN0IGNoZWNrMSA9IGNwT2JqKG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEpO1xyXG5cdFx0XHRkZWxldGUgY2hlY2sxLnN0YXJ0VGltZXN0YW1wO1xyXG5cdFx0XHRkZWxldGUgY2hlY2sxLmVuZFRpbWVzdGFtcDtcclxuXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQhKFxyXG5cdFx0XHRcdFx0aXNFcXVpdmFsZW50KGNoZWNrLCBjaGVjazEpICYmXHJcblx0XHRcdFx0XHQob2xkT2JqZWN0LmVuZFRpbWVzdGFtcCArIDEgPT09XHJcblx0XHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wIHx8XHJcblx0XHRcdFx0XHRcdG9sZE9iamVjdC5lbmRUaW1lc3RhbXAgLSAxID09PVxyXG5cdFx0XHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wIHx8XHJcblx0XHRcdFx0XHRcdG9sZE9iamVjdC5lbmRUaW1lc3RhbXAgPT09IG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wKVxyXG5cdFx0XHRcdClcclxuXHRcdFx0KSB7XHJcblx0XHRcdFx0b2xkQWN0aXZpdHkgPSBtc2cucHJlc2VuY2U7XHJcblx0XHRcdFx0c2V0QWN0aXZpdHkobXNnLnByZXNlbmNlKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8qIE5vIHByZXNlbmNlIHVwZGF0ZSB3aGVuIGVpdGhlciBzdGFydFRpbWVzdGFtcCAvIGVuZFRpbWVzdGFtcCByZW1vdmVkXHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHQob2xkT2JqZWN0LnN0YXJ0VGltZXN0YW1wICE9PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuc3RhcnRUaW1lc3RhbXAgPT09IHVuZGVmaW5lZCkgfHxcclxuXHRcdFx0XHQob2xkT2JqZWN0LnN0YXJ0VGltZXN0YW1wID09PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuc3RhcnRUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCkgfHxcclxuXHRcdFx0XHQob2xkT2JqZWN0LmVuZFRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmXHJcblx0XHRcdFx0XHRtc2cucHJlc2VuY2UucHJlc2VuY2VEYXRhLmVuZFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB8fFxyXG5cdFx0XHRcdChvbGRPYmplY3QuZW5kVGltZXN0YW1wID09PSB1bmRlZmluZWQgJiZcclxuXHRcdFx0XHRcdG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEuZW5kVGltZXN0YW1wICE9PSB1bmRlZmluZWQpXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdG9sZEFjdGl2aXR5ID0gbXNnLnByZXNlbmNlO1xyXG5cdFx0XHRcdHNldEFjdGl2aXR5KG1zZy5wcmVzZW5jZSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdG9sZE9iamVjdCA9IGNwT2JqKG1zZy5wcmVzZW5jZS5wcmVzZW5jZURhdGEpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhbmRsZUFwcFRzKHBvcnQ6IGNocm9tZS5ydW50aW1lLlBvcnQpIHtcclxuXHRpZiAocG9ydC5uYW1lID09PSBcImFwcC50c1wiKSB7XHJcblx0XHRwb3J0Lm9uTWVzc2FnZS5hZGRMaXN0ZW5lcihhc3luYyBtc2cgPT4ge1xyXG5cdFx0XHRpZiAobXNnLmFjdGlvbiA9PT0gXCJyZWluaXRcIikge1xyXG5cdFx0XHRcdGF3YWl0IHNldFN0b3JhZ2UoXCJsb2NhbFwiLCB7XHJcblx0XHRcdFx0XHRkZWZhdWx0QWRkZWQ6IGZhbHNlXHJcblx0XHRcdFx0fSk7XHJcblxyXG5cdFx0XHRcdGxldCBzdWNjZXNzID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdGlmIChuYXZpZ2F0b3Iub25MaW5lKSB7XHJcblx0XHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0XHRhd2FpdCBzdGFydCgpO1xyXG5cdFx0XHRcdFx0XHRzdWNjZXNzID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH0gY2F0Y2ggKGUpIHtcclxuXHRcdFx0XHRcdFx0Ly8gZXJyb3JcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHBvcnQucG9zdE1lc3NhZ2Uoe1xyXG5cdFx0XHRcdFx0YWN0aW9uOiBcInJlaW5pdFwiLFxyXG5cdFx0XHRcdFx0c3VjY2Vzc1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuIiwiLy8qIENyZWRpdCBodHRwOi8vYWRyaXBvZmphdmFzY3JpcHQuY29tL2Jsb2cvZHJpcHMvb2JqZWN0LWVxdWFsaXR5LWluLWphdmFzY3JpcHQuaHRtbFxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0VxdWl2YWxlbnQoYTogYW55LCBiOiBhbnkpIHtcclxuXHQvLyogQ3JlYXRlIGFycmF5cyBvZiBwcm9wZXJ0eSBuYW1lc1xyXG5cdGNvbnN0IGFQcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGEpLFxyXG5cdFx0YlByb3BzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYik7XHJcblxyXG5cdC8vKiBJZiBudW1iZXIgb2YgcHJvcGVydGllcyBpcyBkaWZmZXJlbnQsXHJcblx0Ly8qIG9iamVjdHMgYXJlIG5vdCBlcXVpdmFsZW50XHJcblx0aWYgKGFQcm9wcy5sZW5ndGggIT0gYlByb3BzLmxlbmd0aCkge1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBhUHJvcHMubGVuZ3RoOyBpKyspIHtcclxuXHRcdGNvbnN0IHByb3BOYW1lID0gYVByb3BzW2ldO1xyXG5cclxuXHRcdC8vKiBJZiB2YWx1ZXMgb2Ygc2FtZSBwcm9wZXJ0eSBhcmUgbm90IGVxdWFsLFxyXG5cdFx0Ly8qIG9iamVjdHMgYXJlIG5vdCBlcXVpdmFsZW50XHJcblx0XHRpZiAoYVtwcm9wTmFtZV0gIT09IGJbcHJvcE5hbWVdKSB7XHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8vKiBJZiB3ZSBtYWRlIGl0IHRoaXMgZmFyLCBvYmplY3RzXHJcblx0Ly8qIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnRcclxuXHRyZXR1cm4gdHJ1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBlcnJvciwgaW5mbyB9IGZyb20gXCIuLi9kZWJ1Z1wiO1xyXG5pbXBvcnQgeyBpbml0UHJlc2VuY2VMYW5ndWFnZXMgfSBmcm9tIFwiLi4vcHJlc2VuY2VNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuXHJcbi8vIGltcG9ydCB7IG9sZFByZXNlbmNlLCBwcmlvcml0eVRhYiB9IGZyb20gXCIuLi90YWJQcmlvcml0eVwiO1xyXG4vL1RPRE8gUkVDT0RFXHJcbi8vIEB0cy1ub2NoZWNrXHJcblxyXG5sZXQgZXJyb3JzID0gW107XHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uKGZpbGVzOiBhbnkpIHtcclxuXHRlcnJvcnMgPSBbXTtcclxuXHRpbmZvKFwicHJlc2VuY2VEZXZNYW5hZ2VyLnRzXCIsIFwiTG9jYWwgUHJlc2VuY2UgdXBkYXRlXCIpO1xyXG5cclxuXHRmaWxlcyA9IGZpbGVzLmZpbGVzO1xyXG5cdGxldCBtZXRhZGF0YSA9IGZpbGVzLmZpbmQoZiA9PiBmLmZpbGUudG9Mb3dlckNhc2UoKSA9PT0gXCJtZXRhZGF0YS5qc29uXCIpLFxyXG5cdFx0cHJlc2VuY2UgPSBmaWxlcy5maW5kKGYgPT4gZi5maWxlLnRvTG93ZXJDYXNlKCkgPT09IFwicHJlc2VuY2UuanNcIiksXHJcblx0XHRpZnJhbWUgPSBmaWxlcy5maW5kKGYgPT4gZi5maWxlLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lLmpzXCIpO1xyXG5cclxuXHRpZiAoIW1ldGFkYXRhKSBlcnJvcnMucHVzaChcIk5vIG1ldGFkYXRhLmpzb24gZm91bmQuXCIpO1xyXG5cdGVsc2Uge1xyXG5cdFx0bWV0YWRhdGEgPSBtZXRhZGF0YS5jb250ZW50cztcclxuXHJcblx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLmlmcmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBtZXRhZGF0YS5pZnJhbWUgJiYgIWlmcmFtZSlcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJObyBpZnJhbWUuanMgZm91bmQuXCIpO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgbWV0YWRhdGEuc2VydmljZSA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBzZXJ2aWNlIG5vdCBkZWZpbmVkLlwiKTtcclxuXHJcblx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLmF1dGhvciAhPT0gXCJvYmplY3RcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBhdXRob3Igbm90IGRlZmluZWQuXCIpO1xyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGlmICh0eXBlb2YgbWV0YWRhdGEuYXV0aG9yLm5hbWUgPT09IFwidW5kZWZpbmVkXCIpXHJcblx0XHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBhdXRob3IubmFtZSBub3QgZGVmaW5lZC5cIik7XHJcblxyXG5cdFx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLmF1dGhvci5pZCA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0XHRlcnJvcnMucHVzaChcInByb3BlcnR5IGF1dGhvci5pZCBub3QgZGVmaW5lZC5cIik7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHR5cGVvZiBtZXRhZGF0YS5kZXNjcmlwdGlvbiAhPT0gXCJvYmplY3RcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSBkZXNjcmlwdGlvbiBub3QgZGVmaW5lZC5cIik7XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0aWYgKHR5cGVvZiBtZXRhZGF0YS5kZXNjcmlwdGlvbi5lbiA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0XHRlcnJvcnMucHVzaChcInByb3BlcnR5IGRlc2NyaXB0aW9uLmVuIG5vdCBkZWZpbmVkLlwiKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodHlwZW9mIG1ldGFkYXRhLnVybCA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdFx0ZXJyb3JzLnB1c2goXCJwcm9wZXJ0eSB1cmwgbm90IGRlZmluZWQuXCIpO1xyXG5cdH1cclxuXHRpZiAoIXByZXNlbmNlKSBlcnJvcnMucHVzaChcIk5vIHByZXNlbmNlLmpzIGZvdW5kLlwiKTtcclxuXHJcblx0ZXJyb3JzLm1hcChlcnIgPT4gZXJyb3IoXCJwcmVzZW5jZURldk1hbmFnZXIudHNcIiwgZXJyLCB0cnVlKSk7XHJcblxyXG5cdGxldCBwcmVzZW5jZXM6IHByZXNlbmNlU3RvcmFnZSA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpXHJcblx0XHQucHJlc2VuY2VzO1xyXG5cclxuXHRwcmVzZW5jZXMgPSBwcmVzZW5jZXMuZmlsdGVyKHAgPT4gIXAudG1wKTtcclxuXHJcblx0Y29uc3QgYWRkZWRQcmVzZW5jZSA9IHByZXNlbmNlcy5maW5kKFxyXG5cdFx0cCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UgPT09IG1ldGFkYXRhLnNlcnZpY2VcclxuXHQpO1xyXG5cdGlmIChhZGRlZFByZXNlbmNlKSBhZGRlZFByZXNlbmNlLmVuYWJsZWQgPSBmYWxzZTtcclxuXHJcblx0Y29uc3QgdG1wUHI6IGFueSA9IHtcclxuXHRcdGVuYWJsZWQ6IHRydWUsXHJcblx0XHRtZXRhZGF0YTogbWV0YWRhdGEsXHJcblx0XHRwcmVzZW5jZTogcHJlc2VuY2U/LmNvbnRlbnRzLFxyXG5cdFx0dG1wOiB0cnVlXHJcblx0fTtcclxuXHJcblx0aWYgKHR5cGVvZiBtZXRhZGF0YT8uaWZyYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIG1ldGFkYXRhPy5pZnJhbWUpXHJcblx0XHR0bXBQci5pZnJhbWUgPSBpZnJhbWUuY29udGVudHM7XHJcblxyXG5cdGlmICh0bXBQci5tZXRhZGF0YS5zZXR0aW5ncykge1xyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHtcclxuXHRcdFx0W2BwU2V0dGluZ3NfJHt0bXBQci5tZXRhZGF0YS5zZXJ2aWNlfWBdOiB0bXBQci5tZXRhZGF0YS5zZXR0aW5nc1xyXG5cdFx0fSk7XHJcblx0XHRpbml0UHJlc2VuY2VMYW5ndWFnZXModG1wUHIpO1xyXG5cdH1cclxuXHJcblx0cHJlc2VuY2VzLnB1c2godG1wUHIpO1xyXG5cclxuXHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoeyBwcmVzZW5jZXM6IHByZXNlbmNlcyB9KTtcclxuXHJcblx0Ly8gcmVsb2FkIGFsbCB0YWJzIG9mIGFueSBwcmVzZW5jZSBpbiBkZXZlbG9wbWVudCBtb2RlXHJcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwcmVzZW5jZXMubGVuZ3RoOyBpKyspIHtcclxuXHRcdGlmIChwcmVzZW5jZXNbaV0udG1wKSB7XHJcblx0XHRcdGNvbnN0IHVwZGF0ZWRQcmVzZW5jZSA9IHByZXNlbmNlc1tpXTtcclxuXHJcblx0XHRcdGNocm9tZS50YWJzLnF1ZXJ5KFxyXG5cdFx0XHRcdHtcclxuXHRcdFx0XHRcdHdpbmRvd1R5cGU6IFwibm9ybWFsXCJcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdHRhYnMgPT4ge1xyXG5cdFx0XHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB0YWJzLmxlbmd0aDsgaisrKSB7XHJcblx0XHRcdFx0XHRcdGxldCB0YWJVcmwgPSBuZXcgVVJMKHRhYnNbal0udXJsKTtcclxuXHJcblx0XHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0XHQodHlwZW9mIHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS51cmwgPT09IFwic3RyaW5nXCIgJiZcclxuXHRcdFx0XHRcdFx0XHRcdHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS51cmwgPT09IHRhYlVybC5ob3N0bmFtZSkgfHxcclxuXHRcdFx0XHRcdFx0XHQodXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnVybCBpbnN0YW5jZW9mIEFycmF5ICYmXHJcblx0XHRcdFx0XHRcdFx0XHR1cGRhdGVkUHJlc2VuY2UubWV0YWRhdGEudXJsLmluY2x1ZGVzKHRhYlVybC5ob3N0bmFtZSkpIHx8XHJcblx0XHRcdFx0XHRcdFx0KHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5yZWdFeHAgJiZcclxuXHRcdFx0XHRcdFx0XHRcdG5ldyBSZWdFeHAodXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnJlZ0V4cCkudGVzdCh0YWJVcmwuaHJlZikpXHJcblx0XHRcdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0XHRcdGNocm9tZS50YWJzLnJlbG9hZCh0YWJzW2pdLmlkLCB7IGJ5cGFzc0NhY2hlOiB0cnVlIH0sICgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuaW5mbyhcclxuXHRcdFx0XHRcdFx0XHRcdFx0YFByZXNlbmNlICR7dXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2V9IHVwZGF0ZWQsIHRhYiByZWxvYWRlZCFgXHJcblx0XHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Ly8gaWYgKG9sZFByZXNlbmNlICYmIHByaW9yaXR5VGFiKSBjaHJvbWUudGFicy5yZWxvYWQocHJpb3JpdHlUYWIpO1xyXG59XHJcbiIsImltcG9ydCAqIGFzIHNvY2tldElvIGZyb20gXCJzb2NrZXQuaW8tY2xpZW50XCI7XHJcblxyXG5pbXBvcnQgeyByZXF1aXJlZEFwcFZlcnNpb24gfSBmcm9tIFwiLi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IG9sZEFjdGl2aXR5IH0gZnJvbSBcIi4vYmFja2dyb3VuZC9vbkNvbm5lY3RcIjtcclxuaW1wb3J0IHsgZXJyb3IsIGluZm8sIHN1Y2Nlc3MgfSBmcm9tIFwiLi9kZWJ1Z1wiO1xyXG5pbXBvcnQgeyBnZXRTdG9yYWdlIH0gZnJvbSBcIi4vZnVuY3Rpb25zL2FzeW5jU3RvcmFnZVwiO1xyXG5pbXBvcnQgcHJlc2VuY2VEZXZNYW5hZ2VyIGZyb20gXCIuL2Z1bmN0aW9ucy9wcmVzZW5jZURldk1hbmFnZXJcIjtcclxuaW1wb3J0IHNldEFjdGl2aXR5IGZyb20gXCIuL2Z1bmN0aW9ucy9zZXRBY3Rpdml0eVwiO1xyXG5pbXBvcnQgeyBwcmlvcml0eVRhYiB9IGZyb20gXCIuL3RhYlByaW9yaXR5XCI7XHJcblxyXG4vLyogQ3JlYXRlIHNvY2tldFxyXG5leHBvcnQgY29uc3Qgc29ja2V0ID0gc29ja2V0SW8uY29ubmVjdChcImh0dHA6Ly9sb2NhbGhvc3Q6MzAyMFwiLCB7XHJcblx0YXV0b0Nvbm5lY3Q6IGZhbHNlXHJcbn0pO1xyXG5cclxuZXhwb3J0IGNvbnN0IGNvbm5lY3QgPSAoKSA9PiBzb2NrZXQub3BlbigpO1xyXG5cclxuZXhwb3J0IGxldCBhcHBWZXJzaW9uID0gMDtcclxuXHJcbmxldCBhcHBWZXJzaW9uVGltZW91dDogbnVtYmVyID0gbnVsbDtcclxuXHJcbnNvY2tldC5vbihcImNvbm5lY3RcIiwgYXN5bmMgKCkgPT4ge1xyXG5cdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlVGV4dCh7IHRleHQ6IFwiXCIgfSk7XHJcblxyXG5cdC8vKiBUZWxsIGFwcCB0byBnaXZlIHVzIGl0cyB2ZXJzaW9uXHJcblx0Ly8qIFN0YXJ0IHRpbWVvdXQgaWYgd2UgZG9uJ3QgcmVjZWl2ZSB2ZXJzaW9uIHJlc3BvbnNlXHJcblx0c29ja2V0LmVtaXQoXCJnZXRWZXJzaW9uXCIpO1xyXG5cdGFwcFZlcnNpb25UaW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG5cdFx0Ly8qIE5vIHJlc3BvbnNlIGdvdCwgbW9zdCBsaWtlbHkgb2xkIHZlcnNpb25cclxuXHRcdGFwcFZlcnNpb24gPSAtMTtcclxuXHRcdGVycm9yKFwic29ja2V0TWFuYWdlci50c1wiLCBcIlVuc3VwcG9ydGVkIGFwcCB2ZXJzaW9uXCIpO1xyXG5cdH0sIDUwMDApO1xyXG5cclxuXHQvL1RPRE8gbW92ZSB0aGlzIGluIGEgZmlsZSBvciBzb1xyXG5cdGxldCBzZXR0aW5ncyA9IChhd2FpdCBnZXRTdG9yYWdlKFwic3luY1wiLCBcInNldHRpbmdzXCIpKS5zZXR0aW5ncztcclxuXHRzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcblx0XHR7fSxcclxuXHRcdC4uLk9iamVjdC5rZXlzKHNldHRpbmdzKS5tYXAoayA9PiB7XHJcblx0XHRcdHJldHVybiB7IFtrXTogc2V0dGluZ3Nba10udmFsdWUgfTtcclxuXHRcdH0pXHJcblx0KTtcclxuXHRzb2NrZXQuZW1pdChcInNldHRpbmdVcGRhdGVcIiwgc2V0dGluZ3MpO1xyXG59KTtcclxuXHJcbnNvY2tldC5vbihcInJlY2VpdmVWZXJzaW9uXCIsICh2ZXJzaW9uOiBudW1iZXIpID0+IHtcclxuXHRjbGVhclRpbWVvdXQoYXBwVmVyc2lvblRpbWVvdXQpO1xyXG5cdGFwcFZlcnNpb24gPSB2ZXJzaW9uO1xyXG5cclxuXHRpZiAoIXN1cHBvcnRlZEFwcFZlcnNpb24oKSkge1xyXG5cdFx0ZXJyb3IoXCJzb2NrZXRNYW5hZ2VyLnRzXCIsIFwiVW5zdXBwb3J0ZWQgYXBwIHZlcnNpb25cIik7XHJcblx0XHRyZXR1cm47XHJcblx0fSBlbHNlIGluZm8oXCJzb2NrZXRNYW5hZ2VyLnRzXCIsIFwiU3VwcG9ydGVkIGFwcCB2ZXJzaW9uXCIpO1xyXG5cclxuXHRpZiAob2xkQWN0aXZpdHkpIHNldEFjdGl2aXR5KG9sZEFjdGl2aXR5KTtcclxuXHJcblx0c3VjY2VzcyhcInNvY2tldE1hbmFnZXIudHNcIiwgXCJDb25uZWN0ZWQgdG8gYXBwbGljYXRpb25cIik7XHJcblx0Y2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBzb2NrZXQ6IHNvY2tldC5jb25uZWN0ZWQgfSk7XHJcblxyXG5cdGlmIChwcmlvcml0eVRhYiAhPT0gbnVsbClcclxuXHRcdGNocm9tZS50YWJzLnNlbmRNZXNzYWdlKHByaW9yaXR5VGFiLCB7IHRhYlByaW9yaXR5OiB0cnVlIH0pO1xyXG59KTtcclxuXHJcbnNvY2tldC5vbihcImRpc2Nvbm5lY3RcIiwgKCkgPT4ge1xyXG5cdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlVGV4dCh7IHRleHQ6IFwiIVwiIH0pO1xyXG5cdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlQmFja2dyb3VuZENvbG9yKHsgY29sb3I6IFwiI2UxZTEwMFwiIH0pO1xyXG5cclxuXHRlcnJvcihcInNvY2tldE1hbmFnZXIudHNcIiwgXCJEaXNjb25uZWN0ZWQgZnJvbSBhcHBsaWNhdGlvblwiKTtcclxuXHRjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IHNvY2tldDogc29ja2V0LmNvbm5lY3RlZCB9KTtcclxuXHJcblx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFwicHJlc2VuY2VzXCIsICh7IHByZXNlbmNlcyB9KSA9PiB7XHJcblx0XHRwcmVzZW5jZXMgPSAocHJlc2VuY2VzIGFzIHByZXNlbmNlU3RvcmFnZSkuZmlsdGVyKHAgPT4gIXAudG1wKTtcclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IHByZXNlbmNlczogcHJlc2VuY2VzIH0pO1xyXG5cdH0pO1xyXG5cclxuXHRpZiAocHJpb3JpdHlUYWIgIT09IG51bGwpXHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwgeyB0YWJQcmlvcml0eTogZmFsc2UgfSk7XHJcbn0pO1xyXG5cclxuc29ja2V0Lm9uKFwibG9jYWxQcmVzZW5jZVwiLCBwcmVzZW5jZURldk1hbmFnZXIpO1xyXG5cclxuc29ja2V0Lm9uKFxyXG5cdFwiZGlzY29yZFVzZXJcIixcclxuXHRhc3luYyAoXHJcblx0XHR1c2VyOiB7XHJcblx0XHRcdGF2YXRhcjogc3RyaW5nO1xyXG5cdFx0XHRib3Q6IGJvb2xlYW47XHJcblx0XHRcdGRpc2NyaW1pbmF0b3I6IHN0cmluZztcclxuXHRcdFx0ZmxhZ3M6IG51bWJlcjtcclxuXHRcdFx0aWQ6IHN0cmluZztcclxuXHRcdFx0cHJlbWl1bV90eXBlOiBzdHJpbmc7XHJcblx0XHRcdHVzZXJuYW1lOiBzdHJpbmc7XHJcblx0XHR9IHwgbnVsbFxyXG5cdCkgPT4ge1xyXG5cdFx0aWYgKCF1c2VyKSByZXR1cm47XHJcblx0XHRjb25zdCB7IHByZW1pdW1fdHlwZSwgLi4ubmV3VXNlciB9ID0gdXNlcjtcclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IGRpc2NvcmRVc2VyOiBuZXdVc2VyIH0pO1xyXG5cdH1cclxuKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0ZWRBcHBWZXJzaW9uKCkge1xyXG5cdGlmIChhcHBWZXJzaW9uID49IHJlcXVpcmVkQXBwVmVyc2lvbiB8fCBhcHBWZXJzaW9uID09PSAwKSB7XHJcblx0XHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIlwiIH0pO1xyXG5cdFx0cmV0dXJuIHRydWU7XHJcblx0fSBlbHNlIHtcclxuXHRcdGNocm9tZS5icm93c2VyQWN0aW9uLnNldEJhZGdlVGV4dCh7IHRleHQ6IFwiIVwiIH0pO1xyXG5cdFx0Y2hyb21lLmJyb3dzZXJBY3Rpb24uc2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3IoeyBjb2xvcjogXCIjZmY1MDUwXCIgfSk7XHJcblx0XHRyZXR1cm4gZmFsc2U7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IGluZm8gfSBmcm9tIFwiLi4vZGVidWdcIjtcclxuaW1wb3J0IHsgcHJpb3JpdHlUYWIsIHNldFByaW9yaXR5VGFiIH0gZnJvbSBcIi4uL3RhYlByaW9yaXR5XCI7XHJcbmltcG9ydCB7IHNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXRNYW5hZ2VyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjbGVhckFjdGl2aXR5KHJlc2V0VGFiUHJpb3JpdHkgPSBmYWxzZSkge1xyXG5cdC8vKiBTZW5kIGRlYnVnXHJcblx0Ly8qIElmIHJlc2V0VGFiUHJpb3JpdHlcclxuXHQvLyogRW1pdCBjbGVhckFjdGl2aXR5IHRvIGFwcFxyXG5cdGluZm8oXCJjbGVhckFjdGl2aXR5LnRzXCIsIGBDbGVhciBBY3Rpdml0eSB8ICR7cmVzZXRUYWJQcmlvcml0eX1gKTtcclxuXHRpZiAocmVzZXRUYWJQcmlvcml0eSkge1xyXG5cdFx0Ly8qIFRyeSB0byBjbGVhckludGVydmFsXHJcblx0XHQvLyogU2V0IHByaW9yaXR5IHRhYiB0byBudWxsXHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShwcmlvcml0eVRhYiwgeyB0YWJQcmlvcml0eTogZmFsc2UgfSk7XHJcblx0XHRzZXRQcmlvcml0eVRhYihudWxsKTtcclxuXHR9XHJcblx0aWYgKHNvY2tldC5jb25uZWN0ZWQpIHNvY2tldC5lbWl0KFwiY2xlYXJBY3Rpdml0eVwiKTtcclxufVxyXG4iLCJpbXBvcnQgeyBvbGRBY3Rpdml0eSB9IGZyb20gXCIuLi9iYWNrZ3JvdW5kL29uQ29ubmVjdFwiO1xyXG5pbXBvcnQgeyBpbmZvIH0gZnJvbSBcIi4uL2RlYnVnXCI7XHJcbmltcG9ydCB7IHNvY2tldCB9IGZyb20gXCIuLi9zb2NrZXRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHByaW9yaXR5VGFiIH0gZnJvbSBcIi4uL3RhYlByaW9yaXR5XCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGNsZWFyQWN0aXZpdHkgZnJvbSBcIi4vY2xlYXJBY3Rpdml0eVwiO1xyXG5pbXBvcnQgc2V0QWN0aXZpdHkgZnJvbSBcIi4vc2V0QWN0aXZpdHlcIjtcclxuXHJcbmxldCBzZXR0aW5nczogYW55ID0gbnVsbDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG5cdGNvbnN0IHByZXNlbmNlcyA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpLnByZXNlbmNlcztcclxuXHRpZiAoIXByZXNlbmNlcylcclxuXHRcdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT5cclxuXHRcdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBbXSB9LCByZXNvbHZlKVxyXG5cdFx0KTtcclxuXHJcblx0c2V0dGluZ3MgPSAoYXdhaXQgZ2V0U3RvcmFnZShcInN5bmNcIiwgXCJzZXR0aW5nc1wiKSkuc2V0dGluZ3M7XHJcblx0aWYgKHR5cGVvZiBzZXR0aW5ncyA9PT0gXCJ1bmRlZmluZWRcIikgc2V0dGluZ3MgPSB7fTtcclxuXHJcblx0aW5pdFNldHRpbmcoXCJlbmFibGVkXCIsIFwicG9wdXAuc2V0dGluZy5lbmFibGVkXCIsIDApO1xyXG5cdGluaXRTZXR0aW5nKFwiYXV0b0xhdW5jaFwiLCBcInBvcHVwLnNldHRpbmcuYXV0b0xhdW5jaFwiLCAxKTtcclxuXHRpbml0U2V0dGluZyhcIm1lZGlhS2V5c1wiLCBcInBvcHVwLnNldHRpbmcubWVkaWFDb250cm9sXCIsIDIpO1xyXG5cdGluaXRTZXR0aW5nKFwidGl0bGVNZW51YmFyXCIsIFwicG9wdXAuc2V0dGluZy50aXRsZU1lbnViYXJcIiwgMyk7XHJcblxyXG5cdGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT5cclxuXHRcdGNocm9tZS5zdG9yYWdlLnN5bmMuc2V0KHsgc2V0dGluZ3M6IHNldHRpbmdzIH0sIHJlc29sdmUpXHJcblx0KTtcclxuXHJcblx0aW5mbyhcImluaXRTZXR0aW5ncy50c1wiLCBcIkluaXRpYWxpemVkIHNldHRpbmdzXCIpO1xyXG59XHJcblxyXG5jaHJvbWUuc3RvcmFnZS5vbkNoYW5nZWQuYWRkTGlzdGVuZXIoY2hhbmdlcyA9PiB7XHJcblx0aWYgKGNoYW5nZXMuc2V0dGluZ3MpIHtcclxuXHRcdGNvbnN0IG5TZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oXHJcblx0XHRcdHt9LFxyXG5cdFx0XHQuLi5PYmplY3Qua2V5cyhjaGFuZ2VzLnNldHRpbmdzLm5ld1ZhbHVlKS5tYXAoayA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIHsgW2tdOiBjaGFuZ2VzLnNldHRpbmdzLm5ld1ZhbHVlW2tdLnZhbHVlIH07XHJcblx0XHRcdH0pXHJcblx0XHQpO1xyXG5cclxuXHRcdGlmIChuU2V0dGluZ3MuZW5hYmxlZCkgc2V0QWN0aXZpdHkob2xkQWN0aXZpdHksIGNoYW5nZXMuc2V0dGluZ3MubmV3VmFsdWUpO1xyXG5cdFx0ZWxzZSBpZiAocHJpb3JpdHlUYWIgIT09IG51bGwpIGNsZWFyQWN0aXZpdHkodHJ1ZSk7XHJcblxyXG5cdFx0aWYgKHNvY2tldC5jb25uZWN0ZWQpIHNvY2tldC5lbWl0KFwic2V0dGluZ1VwZGF0ZVwiLCBuU2V0dGluZ3MpO1xyXG5cdFx0aW5mbyhcImluaXRTZXR0aW5ncy50c1wiLCBcIlNldHRpbmdzIHVwZGF0ZVwiKTtcclxuXHR9XHJcblxyXG5cdGlmIChcclxuXHRcdGNoYW5nZXMucHJlc2VuY2VzICYmXHJcblx0XHRjaGFuZ2VzLnByZXNlbmNlcy5uZXdWYWx1ZSAhPT0gY2hhbmdlcy5wcmVzZW5jZXMub2xkVmFsdWVcclxuXHQpIHtcclxuXHRcdGNvbnN0IG9sZFZhbHVlID0gY2hhbmdlcy5wcmVzZW5jZXMub2xkVmFsdWUsXHJcblx0XHRcdGNoYW5nZWRQcmVzZW5jZXMgPSBjaGFuZ2VzLnByZXNlbmNlcy5uZXdWYWx1ZS5maWx0ZXIobnAgPT5cclxuXHRcdFx0XHRvbGRWYWx1ZS5maW5kKFxyXG5cdFx0XHRcdFx0b3YgPT5cclxuXHRcdFx0XHRcdFx0b3YubWV0YWRhdGEuc2VydmljZSA9PT0gbnAubWV0YWRhdGEuc2VydmljZSAmJlxyXG5cdFx0XHRcdFx0XHQob3YubWV0YWRhdGEudmVyc2lvbiAhPT0gbnAubWV0YWRhdGEudmVyc2lvbiB8fCBvdi50bXApXHJcblx0XHRcdFx0KVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdGNoYW5nZWRQcmVzZW5jZXMuZm9yRWFjaCh1cGRhdGVkUHJlc2VuY2UgPT4ge1xyXG5cdFx0XHRjb25zdCBzZXR0aW5ncyA9IHVwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5zZXR0aW5ncztcclxuXHJcblx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChcclxuXHRcdFx0XHRgcFNldHRpbmdzXyR7dXBkYXRlZFByZXNlbmNlLm1ldGFkYXRhLnNlcnZpY2V9YCxcclxuXHRcdFx0XHRzdG9yYWdlU2V0dGluZ3MgPT4ge1xyXG5cdFx0XHRcdFx0c3RvcmFnZVNldHRpbmdzID1cclxuXHRcdFx0XHRcdFx0c3RvcmFnZVNldHRpbmdzW2BwU2V0dGluZ3NfJHt1cGRhdGVkUHJlc2VuY2UubWV0YWRhdGEuc2VydmljZX1gXSB8fFxyXG5cdFx0XHRcdFx0XHRbXTtcclxuXHJcblx0XHRcdFx0XHRzZXR0aW5ncy5mb3JFYWNoKHNldHRpbmcgPT4ge1xyXG5cdFx0XHRcdFx0XHRjb25zdCBzdG9yYWdlU2V0dGluZyA9IHN0b3JhZ2VTZXR0aW5ncy5maW5kKFxyXG5cdFx0XHRcdFx0XHRcdHMgPT4gcy5pZCA9PT0gc2V0dGluZy5pZFxyXG5cdFx0XHRcdFx0XHQpO1xyXG5cclxuXHRcdFx0XHRcdFx0aWYgKHN0b3JhZ2VTZXR0aW5nICYmIHN0b3JhZ2VTZXR0aW5nLnZhbHVlICE9PSBudWxsKSB7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBzZXR0aW5nLnZhbHVlID09PSB0eXBlb2Ygc3RvcmFnZVNldHRpbmcudmFsdWUpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmcudmFsdWUgPSBzdG9yYWdlU2V0dGluZy52YWx1ZTtcclxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHN0b3JhZ2VTZXR0aW5nLm11bHRpTGFuZ3VhZ2UpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmcgPSBzdG9yYWdlU2V0dGluZztcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldChcclxuXHRcdFx0XHRcdFx0SlNPTi5wYXJzZShcclxuXHRcdFx0XHRcdFx0XHRKU09OLnN0cmluZ2lmeSh7XHJcblx0XHRcdFx0XHRcdFx0XHRbYHBTZXR0aW5nc18ke3VwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlfWBdOiBzZXR0aW5nc1xyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdCksXHJcblx0XHRcdFx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRcdFx0XHRpbmZvKFxyXG5cdFx0XHRcdFx0XHRcdFx0XCJpbml0U2V0dGluZ3MudHNcIixcclxuXHRcdFx0XHRcdFx0XHRcdGBVcGRhdGVkIHNldHRpbmcgc3RvcmFnZSBvZiAke3VwZGF0ZWRQcmVzZW5jZS5tZXRhZGF0YS5zZXJ2aWNlfWBcclxuXHRcdFx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHQpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxufSk7XHJcblxyXG5mdW5jdGlvbiBpbml0U2V0dGluZyhcclxuXHRzZXR0aW5nOiBzdHJpbmcsXHJcblx0c3RyaW5nOiBzdHJpbmcsXHJcblx0cG9zaXRpb246IG51bWJlcixcclxuXHRvcHRpb246IGFueSA9IHRydWUsXHJcblx0c2hvdyA9IHRydWVcclxuKSB7XHJcblx0aWYgKHR5cGVvZiBzZXR0aW5nc1tzZXR0aW5nXSA9PT0gXCJ1bmRlZmluZWRcIilcclxuXHRcdGNPcHRpb24oc2V0dGluZywgc3RyaW5nLCBwb3NpdGlvbiwgb3B0aW9uLCBzaG93KTtcclxufVxyXG5cclxuZnVuY3Rpb24gY09wdGlvbihcclxuXHRzZXR0aW5nOiBzdHJpbmcsXHJcblx0c3RyaW5nOiBzdHJpbmcsXHJcblx0cG9zaXRpb246IG51bWJlcixcclxuXHRvcHRpb246IGJvb2xlYW4sXHJcblx0c2hvdzogYm9vbGVhblxyXG4pIHtcclxuXHRpZiAoIXNldHRpbmdzW3NldHRpbmddKSB7XHJcblx0XHRzZXR0aW5nc1tzZXR0aW5nXSA9IHtcclxuXHRcdFx0c3RyaW5nOiBzdHJpbmcsXHJcblx0XHRcdHZhbHVlOiBvcHRpb24sXHJcblx0XHRcdHBvc2l0aW9uOiBwb3NpdGlvblxyXG5cdFx0fTtcclxuXHJcblx0XHRpZiAoc2hvdykgc2V0dGluZ3Nbc2V0dGluZ10uc2hvdyA9IHNob3c7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IHJlbGVhc2VUeXBlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgYWRkRGVmYXVsdFByZXNlbmNlcyBmcm9tIFwiLi4vZnVuY3Rpb25zL2FkZERlZmF1bHRQcmVzZW5jZXNcIjtcclxuaW1wb3J0IGNsZWFyQWN0aXZpdHkgZnJvbSBcIi4uL2Z1bmN0aW9ucy9jbGVhckFjdGl2aXR5XCI7XHJcbmltcG9ydCBjb25zb2xlSGVhZGVyIGZyb20gXCIuLi9mdW5jdGlvbnMvY29uc29sZUhlYWRlclwiO1xyXG5pbXBvcnQgZGV0ZWN0U2FmYXJpIGZyb20gXCIuLi9mdW5jdGlvbnMvZGV0ZWN0U2FmYXJpXCI7XHJcbmltcG9ydCBoYXNBbHBoYUJldGFBY2Nlc3MgZnJvbSBcIi4uL2Z1bmN0aW9ucy9oYXNBbHBoYUJldGFBY2Nlc3NcIjtcclxuaW1wb3J0IGluaXRTZXR0aW5ncyBmcm9tIFwiLi4vZnVuY3Rpb25zL2luaXRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyB1cGRhdGVTdHJpbmdzIH0gZnJvbSBcIi4uL2xhbmdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHByZXNlbmNlU2NpZW5jZSwgdXBkYXRlUHJlc2VuY2VzIH0gZnJvbSBcIi4uL3ByZXNlbmNlTWFuYWdlclwiO1xyXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIi4uL3NvY2tldE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgaGlkZU1ldGFUYWdQcmVzZW5jZXMsIHByaW9yaXR5VGFiLCB0YWJQcmlvcml0eSB9IGZyb20gXCIuLi90YWJQcmlvcml0eVwiO1xyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xyXG5cdGF3YWl0IGNvbnNvbGVIZWFkZXIoKTtcclxuXHJcblx0Ly8qIENoZWNrIGFscGhhL2JldGEgYWNjZXNzIGlmIHJlbGVhc3lUeXBlIGVxdWFscyBBTFBIQS9CRVRBXHJcblx0aWYgKFtcIkFMUEhBXCIsIFwiQkVUQVwiXS5pbmNsdWRlcyhyZWxlYXNlVHlwZSkpIGF3YWl0IGhhc0FscGhhQmV0YUFjY2VzcygpO1xyXG5cclxuXHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZVRleHQoeyB0ZXh0OiBcIiFcIiB9KTtcclxuXHRjaHJvbWUuYnJvd3NlckFjdGlvbi5zZXRCYWRnZUJhY2tncm91bmRDb2xvcih7IGNvbG9yOiBcIiNlMWUxMDBcIiB9KTtcclxuXHJcblx0Ly8qIEluaXRpYWxpemUgc2V0dGluZ3MsIEFkZCBkZWZhdWx0IHByZXNlbmNlcywgVXBkYXRlIHN0cmluZ3MsIFVwZGF0ZSBwcmVzZW5jZXNcclxuXHQvLyogU3RhcnQgdXBkYXRlciBpbnRlcnZhbHNcclxuXHQvLypcclxuXHQvLyogQ29ubmVjdCB0byBhcHBcclxuXHRhd2FpdCBQcm9taXNlLmFsbChbXHJcblx0XHRpbml0U2V0dGluZ3MoKSxcclxuXHRcdGFkZERlZmF1bHRQcmVzZW5jZXMoKSxcclxuXHRcdHVwZGF0ZVByZXNlbmNlcygpLFxyXG5cdFx0dXBkYXRlU3RyaW5ncyhjaHJvbWUuaTE4bi5nZXRVSUxhbmd1YWdlKCkpLFxyXG5cdFx0cHJlc2VuY2VTY2llbmNlKClcclxuXHRdKTtcclxuXHRzZXRJbnRlcnZhbChmdW5jdGlvbigpIHtcclxuXHRcdHByZXNlbmNlU2NpZW5jZSgpO1xyXG5cdH0sIDYwICogMzAgKiAxMDAwKTtcclxuXHRjb25uZWN0KCk7XHJcbn1cclxuXHJcbi8vKiBVcGRhdGUgaWYgdXBkYXRlIGF2YWlsYWJsZVxyXG4vLyogT24gVGFiIGFjdGl2ZVxyXG4vLyogT24gVGFiIHJlcGxhY2VcclxuLy8qIE9uIFRhYiByZW1vdmVcclxuLy8qIE9uIFRhYiB1cGRhdGVcclxuLy8qIE9uIFRhYiBmb2N1cyBjaGFuZ2VcclxuZGV0ZWN0U2FmYXJpKClcclxuXHQ/IFwiXCJcclxuXHQ6IGNocm9tZS5ydW50aW1lLm9uVXBkYXRlQXZhaWxhYmxlLmFkZExpc3RlbmVyKCgpID0+IGNocm9tZS5ydW50aW1lLnJlbG9hZCgpKTtcclxuY2hyb21lLnRhYnMub25BY3RpdmF0ZWQuYWRkTGlzdGVuZXIoKCkgPT4gdGFiUHJpb3JpdHkoKSk7XHJcbmNocm9tZS50YWJzLm9uUmVwbGFjZWQuYWRkTGlzdGVuZXIoKF8sIHRhYklkKSA9PiB7XHJcblx0Ly8qIE9ubHkgY2xlYXIgaWYgdGFiIGlzIHByaW9yaXR5VGFiXHJcblx0aWYgKHByaW9yaXR5VGFiID09PSB0YWJJZCkge1xyXG5cdFx0Y2xlYXJBY3Rpdml0eSh0cnVlKTtcclxuXHRcdGhpZGVNZXRhVGFnUHJlc2VuY2VzKCk7XHJcblx0fVxyXG59KTtcclxuY2hyb21lLnRhYnMub25SZW1vdmVkLmFkZExpc3RlbmVyKHRhYklkID0+IHtcclxuXHQvLyogT25seSBjbGVhciBpZiB0YWIgaXMgcHJpb3JpdHlUYWJcclxuXHRpZiAocHJpb3JpdHlUYWIgPT09IHRhYklkKSB7XHJcblx0XHRjbGVhckFjdGl2aXR5KHRydWUpO1xyXG5cdFx0aGlkZU1ldGFUYWdQcmVzZW5jZXMoKTtcclxuXHR9XHJcbn0pO1xyXG5jaHJvbWUudGFicy5vblVwZGF0ZWQuYWRkTGlzdGVuZXIoKF8sIGNoYW5nZUluZm8pID0+IHRhYlByaW9yaXR5KGNoYW5nZUluZm8pKTtcclxuY2hyb21lLndpbmRvd3Mub25Gb2N1c0NoYW5nZWQuYWRkTGlzdGVuZXIod2luZG93SWQgPT4ge1xyXG5cdC8vKiBDYW4ndCBjaGFuZ2Ugd2luZG93XHJcblx0Ly8qIFJ1biB0YWJQcmlvcml0eVxyXG5cdGlmICh3aW5kb3dJZCA9PT0gLTEpIHJldHVybjtcclxuXHR0YWJQcmlvcml0eSgpO1xyXG59KTtcclxuXHJcbnVwZGF0ZVByZXNlbmNlcygpLCB1cGRhdGVTdHJpbmdzKGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKSk7XHJcbiIsImltcG9ydCB7IHJlbGVhc2VUeXBlLCByZXF1aXJlZEFwcFZlcnNpb24gfSBmcm9tIFwiLi4vLi4vY29uZmlnXCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi9hc3luY1N0b3JhZ2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGNvbnNvbGVIZWFkZXIoKSB7XHJcblx0Y29uc29sZS5sb2coXHJcblx0XHRgJWNQcmVNaURcXG4lYyR7U3RyaW5nLmZyb21DaGFyQ29kZShcclxuXHRcdFx0MTY5XHJcblx0XHQpfSAyMDE4LSR7bmV3IERhdGUoKS5nZXRGdWxsWWVhcigpfSBUaW1lcmFhXFxuXFxuJWNWZXJzaW9uOiAlYyR7XHJcblx0XHRcdGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCkudmVyc2lvbl9uYW1lXHJcblx0XHR9XFxuJWNSZWxlYXNlIHR5cGU6ICVjJHtyZWxlYXNlVHlwZX1cXG4lY1JlcSBBcHAgYnVpbGQ6ICVjJHtyZXF1aXJlZEFwcFZlcnNpb259XFxuJWNTY2llbmNlIElkOiAlYyR7XHJcblx0XHRcdChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJpZGVudGlmaWVyXCIpKS5pZGVudGlmaWVyXHJcblx0XHR9YCxcclxuXHRcdFwiZm9udC1mYW1pbHk6c2Fucy1zZXJpZjtmb250LXNpemU6Mi41cmVtO2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6ICM1OTZjYWVcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjpyZ2IoNzAsMjAwLDcwKTtcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07XCIsXHJcblx0XHRcImZvbnQtc2l6ZToxcmVtO2NvbG9yOiM5OUFBQjU7XCIsXHJcblx0XHRcImZvbnQtc2l6ZToxcmVtO1wiLFxyXG5cdFx0XCJmb250LXNpemU6MXJlbTtjb2xvcjojOTlBQUI1O1wiLFxyXG5cdFx0XCJmb250LXNpemU6MXJlbTtcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07Y29sb3I6Izk5QUFCNTtcIixcclxuXHRcdFwiZm9udC1zaXplOjFyZW07XCIsXHJcblx0XHRcImZvbnQtc2l6ZToxcmVtO2NvbG9yOiM5OUFBQjU7XCJcclxuXHQpO1xyXG59XHJcbiIsImltcG9ydCBheGlvcyBmcm9tIFwiYXhpb3NcIjtcclxuXHJcbmltcG9ydCB7IHJlbGVhc2VUeXBlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgeyBnZXRTdG9yYWdlIH0gZnJvbSBcIi4vYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCBncmFwaHFsUmVxdWVzdCBmcm9tIFwiLi9ncmFwaHFsXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBoYXNBbHBoYUJldGFBY2Nlc3MoKSB7XHJcblx0Y29uc3QgeyBhdXRob3JpemVkQmV0YUFscGhhIH0gPSBhd2FpdCBnZXRTdG9yYWdlKFxyXG5cdFx0XCJsb2NhbFwiLFxyXG5cdFx0XCJhdXRob3JpemVkQmV0YUFscGhhXCJcclxuXHQpO1xyXG5cclxuXHRpZiAoIWF1dGhvcml6ZWRCZXRhQWxwaGEpIHtcclxuXHRcdGxldCByZWRpcmVjdFVSTCA9XHJcblx0XHRcdFwiaHR0cHM6Ly9jcG9lZ2NtZ2FiYW5mbGVkaGtqZGljZGNsZ3BtZ2hvZy5jaHJvbWl1bWFwcC5vcmdcIjtcclxuXHRcdC8vIEB0cy1pZ25vcmUgLy8qIEZpcmVmb3ggZGV0ZWN0aW9uXHJcblx0XHRpZiAodHlwZW9mIGJyb3dzZXIgIT09IFwidW5kZWZpbmVkXCIpXHJcblx0XHRcdC8vIEB0cy1pZ25vcmVcclxuXHRcdFx0cmVkaXJlY3RVUkwgPSBhd2FpdCBicm93c2VyLmlkZW50aXR5LmdldFJlZGlyZWN0VVJMKCk7XHJcblxyXG5cdFx0Y29uc3QgYWxsb3dlZEFjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlPHZvaWQgfCBib29sZWFuPihyZXNvbHZlID0+XHJcblx0XHRcdGNocm9tZS5pZGVudGl0eS5sYXVuY2hXZWJBdXRoRmxvdyhcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR1cmw6IGBodHRwczovL2Rpc2NvcmRhcHAuY29tL2FwaS9vYXV0aDIvYXV0aG9yaXplP3Jlc3BvbnNlX3R5cGU9dG9rZW4mY2xpZW50X2lkPTUwMzU1NzA4NzA0MTY4MzQ1OCZzY29wZT1pZGVudGlmeSZyZWRpcmVjdF91cmk9JHtyZWRpcmVjdFVSTH1gLFxyXG5cdFx0XHRcdFx0aW50ZXJhY3RpdmU6IHRydWVcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdGFzeW5jIHJlc3BvbnNlVXJsID0+IHtcclxuXHRcdFx0XHRcdGlmICghcmVzcG9uc2VVcmwgfHwgIXJlc3BvbnNlVXJsLm1hdGNoKC8oJmFjY2Vzc190b2tlbj1bXFxkXFx3XSspL2cpKSB7XHJcblx0XHRcdFx0XHRcdC8vKiBTbyBjaHJvbWUgc2h1dHMgdXBcclxuXHRcdFx0XHRcdFx0Y2hyb21lLnJ1bnRpbWUubGFzdEVycm9yO1xyXG5cdFx0XHRcdFx0XHRyZXNvbHZlKCk7XHJcblx0XHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRjb25zdCBhY2Nlc3NUb2tlbiA9IHJlc3BvbnNlVXJsXHJcblx0XHRcdFx0XHRcdFx0Lm1hdGNoKC8oJmFjY2Vzc190b2tlbj1bXFxkXFx3XSspL2cpWzBdXHJcblx0XHRcdFx0XHRcdFx0LnJlcGxhY2UoXCImYWNjZXNzX3Rva2VuPVwiLCBcIlwiKSxcclxuXHRcdFx0XHRcdFx0ZFVzZXIgPSAoXHJcblx0XHRcdFx0XHRcdFx0YXdhaXQgYXhpb3MoXCJodHRwczovL2Rpc2NvcmRhcHAuY29tL2FwaS91c2Vycy9AbWVcIiwge1xyXG5cdFx0XHRcdFx0XHRcdFx0aGVhZGVyczoge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YFxyXG5cdFx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRcdH0pXHJcblx0XHRcdFx0XHRcdCkuZGF0YSxcclxuXHRcdFx0XHRcdFx0YWNjZXNzVHlwZSA9IChcclxuXHRcdFx0XHRcdFx0XHRhd2FpdCBncmFwaHFsUmVxdWVzdChgXHJcblx0XHRcdFx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRcdFx0XHRhbHBoYUJldGFBY2Nlc3ModXNlcklkOiBcIiR7ZFVzZXIuaWR9XCIpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGJldGFBY2Nlc3NcclxuXHRcdFx0XHRcdFx0XHRcdGFscGhhQWNjZXNzXHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRgKVxyXG5cdFx0XHRcdFx0XHQpLmRhdGEuYWxwaGFCZXRhQWNjZXNzWzBdO1xyXG5cclxuXHRcdFx0XHRcdGxldCBhbGxvd2VkQWNjZXNzOiBib29sZWFuO1xyXG5cdFx0XHRcdFx0c3dpdGNoIChyZWxlYXNlVHlwZSkge1xyXG5cdFx0XHRcdFx0XHRjYXNlIFwiQkVUQVwiOlxyXG5cdFx0XHRcdFx0XHRcdGFsbG93ZWRBY2Nlc3MgPSBhY2Nlc3NUeXBlLmJldGFBY2Nlc3M7XHJcblx0XHRcdFx0XHRcdFx0YnJlYWs7XHJcblx0XHRcdFx0XHRcdGNhc2UgXCJBTFBIQVwiOlxyXG5cdFx0XHRcdFx0XHRcdGFsbG93ZWRBY2Nlc3MgPSBhY2Nlc3NUeXBlLmFscGhhQWNjZXNzO1xyXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHJlc29sdmUoYWxsb3dlZEFjY2Vzcyk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHQpXHJcblx0XHQpO1xyXG5cclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRcdGF1dGhvcml6ZWRCZXRhQWxwaGE6IGFsbG93ZWRBY2Nlc3NcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgeyBjb25uZWN0IH0gZnJvbSBcIi4uL3NvY2tldE1hbmFnZXJcIjtcclxuaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuLi9mdW5jdGlvbnMvYXN5bmNTdG9yYWdlXCI7XHJcbmltcG9ydCB7IHN0YXJ0IH0gZnJvbSBcIi4vZ2VuZXJpY1wiO1xyXG5pbXBvcnQgeyB1cGRhdGVBbGxTdHJpbmdzIH0gZnJvbSBcIi4uL2xhbmdNYW5hZ2VyXCI7XHJcblxyXG5jb25zdCBlbmFibGUgPSAoKSA9PiBzdGFydCgpLnRoZW4oY29ubmVjdCk7XHJcbi8vKiBSdW4gdGhpcyB3aGVuIGV4dGVuc2lvbiBlbmFibGVzIChvbmx5IGlmIHdhcyBkaXNhYmxlZClcclxuY29uc3Qgb25FeHRFbmFibGUgPSBzZXRUaW1lb3V0KGVuYWJsZSwgMTAwKTtcclxuXHJcbmNocm9tZS5ydW50aW1lLm9uSW5zdGFsbGVkLmFkZExpc3RlbmVyKGFzeW5jIGRldGFpbHMgPT4ge1xyXG5cdC8vKiBFeHRFbmFibGVcclxuXHQvLyogQ2hlY2sgYWNjZXNzIChiZXRhKVxyXG5cdGNsZWFyVGltZW91dChvbkV4dEVuYWJsZSk7XHJcblxyXG5cdGF3YWl0IHN0YXJ0KCk7XHJcblxyXG5cdHN3aXRjaCAoZGV0YWlscy5yZWFzb24pIHtcclxuXHRcdGNhc2UgXCJpbnN0YWxsXCI6XHJcblx0XHRcdGluc3RhbGwoKTtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwidXBkYXRlXCI6XHJcblx0XHRcdHVwZGF0ZSgpO1xyXG5cdFx0XHRicmVhaztcclxuXHR9XHJcbn0pO1xyXG5cclxuZnVuY3Rpb24gaW5zdGFsbCgpIHtcclxuXHQvLyogT3BlbiBpbnN0YWxsZWQgdGFiXHJcblx0Ly8qIFNldCBsYXN0VmVyc2lvblxyXG5cdGNocm9tZS50YWJzLmNyZWF0ZSh7XHJcblx0XHRhY3RpdmU6IHRydWUsXHJcblx0XHRpbmRleDogMCxcclxuXHRcdHVybDogY2hyb21lLnJ1bnRpbWUuZ2V0VVJMKFwiaHRtbC90YWJzL2luZGV4Lmh0bWwjL2luc3RhbGxlZFwiKVxyXG5cdH0pO1xyXG5cdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRsYXN0VmVyc2lvbjogY2hyb21lLnJ1bnRpbWUuZ2V0TWFuaWZlc3QoKS52ZXJzaW9uX25hbWVcclxuXHR9KTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlKCkge1xyXG5cdC8vKiBDaGVjayBleHRlbnNpb24gdXBkYXRlXHJcblx0Ly8qIFVwZGF0ZWRcclxuXHQvLyogU2F2ZSB1cGRhdGUgdmVyc2lvblxyXG5cdC8vKiBPcGVuIHVwZGF0ZWQgdGFiXHJcblx0aWYgKFxyXG5cdFx0cGFyc2VJbnQoXHJcblx0XHRcdChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJsYXN0VmVyc2lvblwiKSkubGFzdFZlcnNpb25cclxuXHRcdFx0XHQ/IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJsYXN0VmVyc2lvblwiKSkubGFzdFZlcnNpb25cclxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoL1xcLi9nLCBcIlwiKVxyXG5cdFx0XHRcdFx0XHQuc2xpY2UoMCwgMylcclxuXHRcdFx0XHQ6IDBcclxuXHRcdCkgPFxyXG5cdFx0cGFyc2VJbnQoXHJcblx0XHRcdGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCkudmVyc2lvbl9uYW1lLnJlcGxhY2UoL1xcLi9nLCBcIlwiKS5zbGljZSgwLCAzKVxyXG5cdFx0KVxyXG5cdCkge1xyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHtcclxuXHRcdFx0bGFzdFZlcnNpb246IGNocm9tZS5ydW50aW1lLmdldE1hbmlmZXN0KCkudmVyc2lvbl9uYW1lXHJcblx0XHR9KTtcclxuXHJcblx0XHRhd2FpdCB1cGRhdGVBbGxTdHJpbmdzKCk7XHJcblxyXG5cdFx0Y2hyb21lLnRhYnMuY3JlYXRlKHtcclxuXHRcdFx0YWN0aXZlOiB0cnVlLFxyXG5cdFx0XHRpbmRleDogMCxcclxuXHRcdFx0dXJsOiBjaHJvbWUucnVudGltZS5nZXRVUkwoXCJodG1sL3RhYnMvaW5kZXguaHRtbCMvdXBkYXRlZFwiKVxyXG5cdFx0fSk7XHJcblx0fVxyXG59XHJcbiIsImltcG9ydCB7IG9sZFByZXNlbmNlIH0gZnJvbSBcIi4uL3RhYlByaW9yaXR5XCI7XHJcblxyXG5jaHJvbWUucnVudGltZS5vbk1lc3NhZ2UuYWRkTGlzdGVuZXIoKG1zZywgc2VuZGVyKSA9PlxyXG5cdGhhbmRsZWlGcmFtZShtc2csIHNlbmRlcilcclxuKTtcclxuXHJcbmZ1bmN0aW9uIGhhbmRsZWlGcmFtZShtc2c6IGFueSwgc2VuZGVyOiBjaHJvbWUucnVudGltZS5NZXNzYWdlU2VuZGVyKSB7XHJcblx0aWYgKCFvbGRQcmVzZW5jZSkgcmV0dXJuO1xyXG5cclxuXHQvLyogU2VuZCBcIlVwZGF0ZURhdGFcIiB0byBpZnJhbWVcclxuXHRpZiAoXHJcblx0XHRtc2cuaUZyYW1lVXBkYXRlRGF0YSAmJlxyXG5cdFx0dHlwZW9mIG9sZFByZXNlbmNlLm1ldGFkYXRhLmlmcmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxyXG5cdFx0b2xkUHJlc2VuY2UubWV0YWRhdGEuaWZyYW1lXHJcblx0KVxyXG5cdFx0Y2hyb21lLnRhYnMuc2VuZE1lc3NhZ2Uoc2VuZGVyLnRhYi5pZCwgeyBpRnJhbWVVcGRhdGVEYXRhOiB0cnVlIH0pO1xyXG5cclxuXHQvLyogU2VuZCBpRnJhbWVEYXRhIGJhY2sgdG8gcHJlc2VuY2VcclxuXHRpZiAobXNnLmlGcmFtZURhdGEpXHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7IGlGcmFtZURhdGE6IG1zZy5pRnJhbWVEYXRhIH0pO1xyXG5cclxuXHQvLyogaUZyYW1lIHdhbnRzIHRvIGtub3cgd2hhdCBwcmVzZW5jZSBpdCBzaG91bGQgaW5qZWN0IChpZiBhdmFpbGFibGUpXHJcblx0aWYgKCFtc2cuaUZyYW1lKSByZXR1cm47XHJcblx0aWYgKG9sZFByZXNlbmNlID09PSBudWxsKSB7XHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7IGlGcmFtZTogZmFsc2UgfSk7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRpZiAoXHJcblx0XHR0eXBlb2Ygb2xkUHJlc2VuY2UubWV0YWRhdGEuaWZyYW1lID09PSBcInVuZGVmaW5lZFwiIHx8XHJcblx0XHQhb2xkUHJlc2VuY2UubWV0YWRhdGEuaWZyYW1lXHJcblx0KSB7XHJcblx0XHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7IGlGcmFtZTogZmFsc2UgfSk7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cclxuXHRjaHJvbWUudGFicy5zZW5kTWVzc2FnZShzZW5kZXIudGFiLmlkLCB7XHJcblx0XHRpRnJhbWU6IG9sZFByZXNlbmNlLmlmcmFtZSxcclxuXHRcdGlGcmFtZVJlZ0V4cDogb2xkUHJlc2VuY2UubWV0YWRhdGEuaUZyYW1lUmVnRXhwIHx8IFwiXCJcclxuXHR9KTtcclxufVxyXG4iLCJpbXBvcnQgY2xlYXJBY3Rpdml0eSBmcm9tIFwiLi4vZnVuY3Rpb25zL2NsZWFyQWN0aXZpdHlcIjtcclxuaW1wb3J0IHsgc2V0T2xkT2JqZWN0IH0gZnJvbSBcIi4vb25Db25uZWN0XCI7XHJcbmltcG9ydCB7IGdldFN0b3JhZ2UgfSBmcm9tIFwiLi4vZnVuY3Rpb25zL2FzeW5jU3RvcmFnZVwiO1xyXG5pbXBvcnQgeyBvbGRQcmVzZW5jZSwgcHJpb3JpdHlUYWIgfSBmcm9tIFwiLi4vdGFiUHJpb3JpdHlcIjtcclxuXHJcbi8vKiBEaXNhYmxlIGFjdGl2ZSBwcmVzZW5jZSBpZiBpdCBqdXN0IGdvdCBkaXNhYmxlZFxyXG5jaHJvbWUuc3RvcmFnZS5vbkNoYW5nZWQuYWRkTGlzdGVuZXIoYXN5bmMgY2hhbmdlcyA9PiB7XHJcblx0aWYgKCFjaGFuZ2VzLnByZXNlbmNlcyB8fCAhb2xkUHJlc2VuY2UgfHwgIXByaW9yaXR5VGFiKSByZXR1cm47XHJcblxyXG5cdGNvbnN0IHBycyA9ICgoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIFwicHJlc2VuY2VzXCIpKVxyXG5cdFx0LnByZXNlbmNlcyBhcyBwcmVzZW5jZVN0b3JhZ2UpLmZpbmQoXHJcblx0XHRwID0+IHAubWV0YWRhdGEuc2VydmljZSA9PT0gb2xkUHJlc2VuY2UubWV0YWRhdGEuc2VydmljZVxyXG5cdCk7XHJcblxyXG5cdGlmIChwcnMgJiYgcHJzLmVuYWJsZWQpIHtcclxuXHRcdHNldE9sZE9iamVjdChudWxsKTtcclxuXHRcdGNocm9tZS50YWJzLnNlbmRNZXNzYWdlKHByaW9yaXR5VGFiLCB7XHJcblx0XHRcdHRhYlByaW9yaXR5OiB0cnVlXHJcblx0XHR9KTtcclxuXHR9IGVsc2Uge1xyXG5cdFx0Y2hyb21lLnRhYnMuc2VuZE1lc3NhZ2UocHJpb3JpdHlUYWIsIHtcclxuXHRcdFx0dGFiUHJpb3JpdHk6IGZhbHNlXHJcblx0XHR9KTtcclxuXHRcdGNsZWFyQWN0aXZpdHkodHJ1ZSk7XHJcblx0fVxyXG59KTtcclxuIiwiaW1wb3J0IHsgYXBpQmFzZSB9IGZyb20gXCIuLi8uLi9jb25maWdcIjtcclxuXHJcbmNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChcImlkZW50aWZpZXJcIiwgcyA9PiB7XHJcblx0aWYgKHMuaWRlbnRpZmllcikge1xyXG5cdFx0Y2hyb21lLnJ1bnRpbWUuc2V0VW5pbnN0YWxsVVJMKFxyXG5cdFx0XHRgJHthcGlCYXNlLnJlcGxhY2UoXCIvdjMvXCIsIFwiL3YyL1wiKX1zY2llbmNlLyR7cy5pZGVudGlmaWVyfWBcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvLyBUT0RPIFVuaW5zdGFsbCBwYWdlXHJcblx0Ly8gZ3JhcGhxbFJlcXVlc3QoYFxyXG5cdC8vIG11dGF0aW9uIHtcclxuXHQvLyBcdGRlbGV0ZVNjaWVuY2UoaWRlbnRpZmllcjogXCIke3MuaWRlbnRpZmllcn1cIikge1xyXG5cdC8vIFx0XHRpZGVudGlmaWVyXHJcblx0Ly8gXHR9XHJcblx0Ly8gfVxyXG5cdC8vIGApO1xyXG59KTtcclxuIiwiZXhwb3J0IGNvbnN0IGFwaUJhc2UgPSBcImh0dHBzOi8vYXBpLnByZW1pZC5hcHAvdjMvXCI7XHJcbmV4cG9ydCBjb25zdCByZWxlYXNlVHlwZTogXCJCRVRBXCIgfCBcIkFMUEhBXCIgfCBcIlJFTEVBU0VcIiB8IFwiREVWXCIgPSBcIlJFTEVBU0VcIjtcclxuZXhwb3J0IGNvbnN0IHJlcXVpcmVkQXBwVmVyc2lvbiA9IDIxNDtcclxuIiwiaW1wb3J0IHsgcmVsZWFzZVR5cGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XHJcblxyXG5jb25zdCBnZW5lcmljU3R5bGUgPSBcImZvbnQtd2VpZ2h0OiA4MDA7IHBhZGRpbmc6IDJweCA1cHg7IGNvbG9yOiB3aGl0ZTtcIixcclxuXHRkZWJ1Z2dpbmcgPSByZWxlYXNlVHlwZSAhPT0gXCJSRUxFQVNFXCI7XHJcbmxldCBsYXN0RmlsZTogc3RyaW5nO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGluZm8oZmlsZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIGZvcmNlID0gZmFsc2UpIHtcclxuXHRpZiAoIWRlYnVnZ2luZyAmJiAhZm9yY2UpIHJldHVybjtcclxuXHJcblx0Ly8qIEdyb3VwIGJ5IGZpbGVcclxuXHRncm91cEZpbGUoZmlsZSk7XHJcblx0Y29uc29sZS5sb2coXHJcblx0XHRcIiVjUHJlTWlEJWNJTkZPJWMgXCIgKyBtZXNzYWdlLFxyXG5cdFx0Z2VuZXJpY1N0eWxlICsgXCJib3JkZXItcmFkaXVzOiAyNXB4IDAgMCAyNXB4OyBiYWNrZ3JvdW5kOiAjNTk2Y2FlO1wiLFxyXG5cdFx0Z2VuZXJpY1N0eWxlICsgXCJib3JkZXItcmFkaXVzOiAwIDI1cHggMjVweCAwOyBiYWNrZ3JvdW5kOiAjNTA1MGZmO1wiLFxyXG5cdFx0XCJjb2xvcjogdW5zZXQ7XCJcclxuXHQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gc3VjY2VzcyhmaWxlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgZm9yY2UgPSBmYWxzZSkge1xyXG5cdGlmICghZGVidWdnaW5nICYmICFmb3JjZSkgcmV0dXJuO1xyXG5cclxuXHQvLyogR3JvdXAgYnkgZmlsZVxyXG5cdGdyb3VwRmlsZShmaWxlKTtcclxuXHRjb25zb2xlLmxvZyhcclxuXHRcdFwiJWNQcmVNaUQlY1NVQ0NFU1MlYyBcIiArIG1lc3NhZ2UsXHJcblx0XHRnZW5lcmljU3R5bGUgKyBcImJvcmRlci1yYWRpdXM6IDI1cHggMCAwIDI1cHg7IGJhY2tncm91bmQ6ICM1OTZjYWU7XCIsXHJcblx0XHRnZW5lcmljU3R5bGUgK1xyXG5cdFx0XHRcImJvcmRlci1yYWRpdXM6IDAgMjVweCAyNXB4IDA7IGJhY2tncm91bmQ6ICM1MGZmNTA7IGNvbG9yOiBibGFjaztcIixcclxuXHRcdFwiY29sb3I6IHVuc2V0O1wiXHJcblx0KTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVycm9yKGZpbGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBmb3JjZSA9IGZhbHNlKSB7XHJcblx0aWYgKCFkZWJ1Z2dpbmcgJiYgIWZvcmNlKSByZXR1cm47XHJcblxyXG5cdC8vKiBHcm91cCBieSBmaWxlXHJcblx0Z3JvdXBGaWxlKGZpbGUpO1xyXG5cdGNvbnNvbGUubG9nKFxyXG5cdFx0XCIlY1ByZU1pRCVjRVJST1IlYyBcIiArIG1lc3NhZ2UsXHJcblx0XHRnZW5lcmljU3R5bGUgKyBcImJvcmRlci1yYWRpdXM6IDI1cHggMCAwIDI1cHg7IGJhY2tncm91bmQ6ICM1OTZjYWU7XCIsXHJcblx0XHRnZW5lcmljU3R5bGUgKyBcImJvcmRlci1yYWRpdXM6IDAgMjVweCAyNXB4IDA7IGJhY2tncm91bmQ6ICNmZjUwNTA7XCIsXHJcblx0XHRcImNvbG9yOiB1bnNldDtcIlxyXG5cdCk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdyb3VwRmlsZShmaWxlOiBzdHJpbmcpIHtcclxuXHRpZiAobGFzdEZpbGUgIT09IGZpbGUpIHtcclxuXHRcdGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuXHRcdGNvbnNvbGUuZ3JvdXAoZmlsZSk7XHJcblx0XHRsYXN0RmlsZSA9IGZpbGU7XHJcblx0fVxyXG59XHJcbiIsImV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yYWdlKFxyXG5cdHR5cGU6IFwibG9jYWxcIiB8IFwic3luY1wiLFxyXG5cdG5hbWU6IHN0cmluZyB8IEFycmF5PHN0cmluZz5cclxuKSB7XHJcblx0cmV0dXJuIG5ldyBQcm9taXNlPGFueT4ocmVzb2x2ZSA9PlxyXG5cdFx0Y2hyb21lLnN0b3JhZ2VbdHlwZV0uZ2V0KG5hbWUsIGl0ZW1zID0+IHJlc29sdmUoaXRlbXMpKVxyXG5cdCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRTdG9yYWdlKFxyXG5cdHR5cGU6IFwibG9jYWxcIiB8IFwic3luY1wiLFxyXG5cdGl0ZW1zOiBPYmplY3RcclxuKSB7XHJcblx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT5cclxuXHRcdGNocm9tZS5zdG9yYWdlW3R5cGVdLnNldChpdGVtcywgcmVzb2x2ZSlcclxuXHQpO1xyXG59XHJcbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNsZWFuT2JqZWN0KG9iajogb2JqZWN0KTogdm9pZCB7XHJcblx0Zm9yIChjb25zdCBwcm9wTmFtZSBpbiBvYmopIHtcclxuXHRcdGlmICh0eXBlb2Ygb2JqW3Byb3BOYW1lXSA9PSBcIm9iamVjdFwiKSB7XHJcblx0XHRcdGNsZWFuT2JqZWN0KG9ialtwcm9wTmFtZV0pO1xyXG5cdFx0fVxyXG5cdFx0aWYgKG9ialtwcm9wTmFtZV0gPT09IG51bGwgfHwgb2JqW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XHJcblx0XHRcdGRlbGV0ZSBvYmpbcHJvcE5hbWVdO1xyXG5cdFx0fVxyXG5cdH1cclxufVxyXG4iLCJpbXBvcnQgYXhpb3MgZnJvbSBcImF4aW9zXCI7XHJcblxyXG5pbXBvcnQgeyBhcGlCYXNlIH0gZnJvbSBcIi4uLy4uL2NvbmZpZ1wiO1xyXG5pbXBvcnQgY2xlYW5PYmplY3QgZnJvbSBcIi4vY2xlYW5PYmplY3RcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIGdyYXBocWxSZXF1ZXN0KHF1ZXJ5OiBzdHJpbmcpIHtcclxuXHRjb25zdCByZXMgPSBhd2FpdCBheGlvcyh7XHJcblx0XHR1cmw6IGFwaUJhc2UsXHJcblx0XHRtZXRob2Q6IFwicG9zdFwiLFxyXG5cdFx0ZGF0YToge1xyXG5cdFx0XHRxdWVyeTogcXVlcnlcclxuXHRcdH1cclxuXHR9KTtcclxuXHRjbGVhbk9iamVjdChyZXMuZGF0YSk7XHJcblxyXG5cdHJldHVybiByZXMuZGF0YTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFByZXNlbmNlTWV0YWRhdGEocHJlc2VuY2U6IHN0cmluZykge1xyXG5cdGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuICAgIHF1ZXJ5IHtcclxuICAgICAgcHJlc2VuY2VzKHNlcnZpY2U6IFwiJHtwcmVzZW5jZX1cIikge1xyXG4gICAgICAgIHVybFxyXG4gICAgICAgIG1ldGFkYXRhIHtcclxuICAgICAgICAgIGF1dGhvciB7XHJcbiAgICAgICAgICAgIGlkXHJcbiAgICAgICAgICAgIG5hbWVcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGNvbnRyaWJ1dG9ycyB7XHJcbiAgICAgICAgICAgIGlkXHJcbiAgICAgICAgICAgIG5hbWVcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGFsdG5hbWVzXHJcbiAgICAgICAgICB3YXJuaW5nXHJcbiAgICAgICAgICByZWFkTG9nc1xyXG4gICAgICAgICAgYnV0dG9uXHJcbiAgICAgICAgICBzZXJ2aWNlXHJcbiAgICAgICAgICBkZXNjcmlwdGlvblxyXG4gICAgICAgICAgdXJsXHJcbiAgICAgICAgICB2ZXJzaW9uXHJcbiAgICAgICAgICBsb2dvXHJcbiAgICAgICAgICB0aHVtYm5haWxcclxuICAgICAgICAgIGNvbG9yXHJcbiAgICAgICAgICB0YWdzXHJcbiAgICAgICAgICBjYXRlZ29yeVxyXG4gICAgICAgICAgaWZyYW1lXHJcbiAgICAgICAgICByZWdFeHBcclxuICAgICAgICAgIGlmcmFtZVJlZ0V4cFxyXG4gICAgICAgICAgc2V0dGluZ3Mge1xyXG4gICAgICAgICAgICBpZFxyXG4gICAgICAgICAgICB0aXRsZVxyXG4gICAgICAgICAgICBpY29uXHJcbiAgICAgICAgICAgIGlmIHtcclxuICAgICAgICAgICAgICBwcm9wcmV0eU5hbWVzXHJcbiAgICAgICAgICAgICAgcGF0dGVyblByb3BydGllc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyXHJcbiAgICAgICAgICAgIHZhbHVlXHJcbiAgICAgICAgICAgIHZhbHVlc1xyXG4gICAgICAgICAgICBtdWx0aUxhbmd1YWdlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9YCk7XHJcblx0Y2xlYW5PYmplY3QocmVzdWx0LmRhdGEpO1xyXG5cdGNvbnN0IGZpbmFsID0ge1xyXG5cdFx0ZGF0YToge1xyXG5cdFx0XHRuYW1lOiByZXN1bHQuZGF0YS5wcmVzZW5jZXNbMF0ubWV0YWRhdGEuc2VydmljZSxcclxuXHRcdFx0dXJsOiByZXN1bHQuZGF0YS5wcmVzZW5jZXNbMF0udXJsLFxyXG5cdFx0XHRtZXRhZGF0YTogcmVzdWx0LmRhdGEucHJlc2VuY2VzWzBdLm1ldGFkYXRhXHJcblx0XHR9XHJcblx0fTtcclxuXHRyZXR1cm4gZmluYWw7XHJcbn1cclxuIiwiaW1wb3J0IHsgZXJyb3IsIHN1Y2Nlc3MgfSBmcm9tIFwiLi9kZWJ1Z1wiO1xyXG5cclxuaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IGdyYXBocWxSZXF1ZXN0IGZyb20gXCIuL2Z1bmN0aW9ucy9ncmFwaHFsXCI7XHJcblxyXG4vKipcclxuICogRGVmYXVsdCBsYW5ndWFnZSBjb2RlXHJcbiAqL1xyXG5leHBvcnQgY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImVuXCI7XHJcblxyXG4vKipcclxuICogTWluaW11bSB0aW1lIGJldHdlZW4gc3RyaW5ncyB1cGRhdGVcclxuICovXHJcbmNvbnN0IE1JTl9VUERBVEVfVElNRSA9IDEwMDAgKiA2MCAqIDU7XHJcblxyXG5sZXQgbGFuZ3VhZ2VzOiBvYmplY3QgPSB7fTtcclxuXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZUxhbmd1YWdlQ29kZShsYW5ndWFnZUNvZGU6IHN0cmluZyk6IHN0cmluZyB7XHJcblx0cmV0dXJuIGxhbmd1YWdlQ29kZS5zcGxpdChcIi1cIilbMF07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBVcGRhdGUgc3RyaW5ncyB2YWx1ZXMgKGV4dGVuc2lvbiBhbmQgcHJlc2VuY2UgZW5kcG9pbnRzKSBmcm9tIHRoZSBBUEkgd2Vic2l0ZVxyXG4gKlxyXG4gKiBAcGFyYW0gbGFuZ3VhZ2VDb2RlIGxhbmd1YWdlIGNvZGUgZm9sbG93aW5nIElTTzYzOS0xIHNwZWNcclxuICovXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVTdHJpbmdzKGxhbmd1YWdlQ29kZT86IHN0cmluZykge1xyXG5cdGlmICghbGFuZ3VhZ2VDb2RlKSBsYW5ndWFnZUNvZGUgPSBERUZBVUxUX0xPQ0FMRTtcclxuXHRpZiAoXHJcblx0XHQhbGFuZ3VhZ2VDb2RlLmluY2x1ZGVzKFwiamFcIikgJiZcclxuXHRcdCFsYW5ndWFnZUNvZGUuaW5jbHVkZXMoXCJ6aFwiKSAmJlxyXG5cdFx0IWxhbmd1YWdlQ29kZS5pbmNsdWRlcyhcImtvXCIpXHJcblx0KVxyXG5cdFx0bGFuZ3VhZ2VDb2RlID0gbm9ybWFsaXplTGFuZ3VhZ2VDb2RlKGxhbmd1YWdlQ29kZSk7XHJcblxyXG5cdGxldCB3ZWJzaXRlTGFuZ3VhZ2U6IHN0cmluZyA9IGxhbmd1YWdlQ29kZSxcclxuXHRcdGV4dGVuc2lvbkxhbmd1YWdlOiBzdHJpbmcgPSBsYW5ndWFnZUNvZGUsXHJcblx0XHRwcmVzZW5jZUxhbmd1YWdlOiBzdHJpbmcgPSBsYW5ndWFnZUNvZGU7XHJcblxyXG5cdHN3aXRjaCAobGFuZ3VhZ2VDb2RlKSB7XHJcblx0XHRjYXNlIFwiamFcIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJqYV9KUFwiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJqYV9KUFwiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJqYV9KUFwiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwiamFcIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwia29cIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJrb19LUlwiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJrb19LUlwiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJrb19LUlwiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwia29cIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiemgtQ05cIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJ6aF9DTlwiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJ6aF9DTlwiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJ6aF9DTlwiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwiemgtQ05cIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRjYXNlIFwiemgtVFdcIjpcclxuXHRcdFx0d2Vic2l0ZUxhbmd1YWdlID0gXCJ6aF9UV1wiO1xyXG5cdFx0XHRwcmVzZW5jZUxhbmd1YWdlID0gXCJ6aF9UV1wiO1xyXG5cdFx0XHRicmVhaztcclxuXHRcdGNhc2UgXCJ6aF9UV1wiOlxyXG5cdFx0XHRleHRlbnNpb25MYW5ndWFnZSA9IFwiemgtVFdcIjtcclxuXHRcdFx0YnJlYWs7XHJcblx0XHRkZWZhdWx0OlxyXG5cdFx0XHRjb25zdCByZXNwb25zZUxhbmdzID0gYXdhaXQgZ3JhcGhxbFJlcXVlc3QoYFxyXG5cdFx0XHRxdWVyeSB7XHJcblx0XHRcdFx0bGFuZ0ZpbGVzKHByb2plY3Q6IFwiZXh0ZW5zaW9uXCIpIHtcclxuXHRcdFx0XHRcdGxhbmdcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0YCksXHJcblx0XHRcdFx0YXZhaWxhYmxlTGFuZ3M6IHN0cmluZ1tdID0gcmVzcG9uc2VMYW5ncy5kYXRhLmxhbmdGaWxlcy5tYXAoXHJcblx0XHRcdFx0XHRsZiA9PiBsZi5sYW5nXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdGlmICghYXZhaWxhYmxlTGFuZ3MuaW5jbHVkZXMoZXh0ZW5zaW9uTGFuZ3VhZ2UpKSB7XHJcblx0XHRcdFx0Y29uc3QgaW5kZXggPSBhdmFpbGFibGVMYW5ncy5maW5kSW5kZXgoYyA9PlxyXG5cdFx0XHRcdFx0Yy5pbmNsdWRlcyhleHRlbnNpb25MYW5ndWFnZSArIFwiX1wiKVxyXG5cdFx0XHRcdCk7XHJcblx0XHRcdFx0aWYgKGluZGV4ID49IDApIHtcclxuXHRcdFx0XHRcdHdlYnNpdGVMYW5ndWFnZSA9IGF2YWlsYWJsZUxhbmdzW2luZGV4XTtcclxuXHRcdFx0XHRcdGV4dGVuc2lvbkxhbmd1YWdlID0gYXZhaWxhYmxlTGFuZ3NbaW5kZXhdO1xyXG5cdFx0XHRcdFx0cHJlc2VuY2VMYW5ndWFnZSA9IGF2YWlsYWJsZUxhbmdzW2luZGV4XTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdFx0YnJlYWs7XHJcblx0fVxyXG5cclxuXHR0cnkge1xyXG5cdFx0Y29uc3QgZ3JhcGhxbFJlc3VsdCA9IGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0cXVlcnkge1xyXG5cdFx0XHRcdHdlYnNpdGU6IGxhbmdGaWxlcyhwcm9qZWN0OiBcIndlYnNpdGVcIiwgbGFuZzogXCIke3dlYnNpdGVMYW5ndWFnZX1cIikge1xyXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGV4dGVuc2lvbjogbGFuZ0ZpbGVzKHByb2plY3Q6IFwiZXh0ZW5zaW9uXCIsIGxhbmc6IFwiJHtleHRlbnNpb25MYW5ndWFnZX1cIikge1xyXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdHByZXNlbmNlOiBsYW5nRmlsZXMocHJvamVjdDogXCJwcmVzZW5jZVwiLCBsYW5nOiBcIiR7cHJlc2VuY2VMYW5ndWFnZX1cIikge1xyXG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRgKTtcclxuXHJcblx0XHRsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSA9IHtcclxuXHRcdFx0bmFtZTogZ3JhcGhxbFJlc3VsdC5kYXRhLndlYnNpdGVbMF0udHJhbnNsYXRpb25zW1wiaGVhZGVyLmxhbmd1YWdlXCJdLFxyXG5cdFx0XHRsb2FkaW5nOlxyXG5cdFx0XHRcdGdyYXBocWxSZXN1bHQuZGF0YS53ZWJzaXRlWzBdLnRyYW5zbGF0aW9uc1tcImhlYWRlci5sb2FkZXIucGhyYXNlc1wiXSxcclxuXHRcdFx0ZXh0ZW5zaW9uOiBncmFwaHFsUmVzdWx0LmRhdGEuZXh0ZW5zaW9uWzBdLnRyYW5zbGF0aW9ucyxcclxuXHRcdFx0cHJlc2VuY2U6IGdyYXBocWxSZXN1bHQuZGF0YS5wcmVzZW5jZVswXS50cmFuc2xhdGlvbnMsXHJcblx0XHRcdHVwZGF0ZWRBdDogRGF0ZS5ub3coKVxyXG5cdFx0fTtcclxuXHJcblx0XHRzdWNjZXNzKFwibGFuZ01hbmFnZXIudHNcIiwgYFVwZGF0ZWQgJHtsYW5ndWFnZUNvZGV9IHRyYW5zbGF0aW9uc2ApO1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGVycm9yKFxyXG5cdFx0XHRcImxhbmdNYW5hZ2VyLnRzXCIsXHJcblx0XHRcdGBFcnJvciB3aGlsZSBmZXRjaGluZyBsYW5nRmlsZXMgb2YgJHtsYW5ndWFnZUNvZGV9IGxhbmd1YWdlOiAke2UubWVzc2FnZX1gXHJcblx0XHQpO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0aWYgKGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdICYmIGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdLmVycm9yKSB7XHJcblx0XHRsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSA9IHVuZGVmaW5lZDtcclxuXHRcdHJldHVybjtcclxuXHR9XHJcblxyXG5cdGF3YWl0IGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IGxhbmd1YWdlcyB9KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbFN0cmluZ3MoKSB7XHJcblx0Y29uc3QgbGFuZ3VhZ2VzID0gT2JqZWN0LmtleXMoKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcImxhbmd1YWdlc1wiKSkubGFuZ3VhZ2VzKTtcclxuXHRhd2FpdCBQcm9taXNlLmFsbChcclxuXHRcdGxhbmd1YWdlcy5tYXAobG5nID0+IGxvYWRTdHJpbmdzKGxuZywgdHJ1ZSkpXHJcblx0KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIFN0cmluZ3MgdGhhdCBhcmUgYmVpbmcgbG9hZGVkIGJ5IGxvYWRTdHJpbmdzIGZ1bmN0aW9uXHJcbiAqL1xyXG5jb25zdCBsb2FkaW5nTGFuZ3MgPSBbXTtcclxuXHJcbi8qKlxyXG4gKiBMb2FkIHRoZSBzdHJpbmdzIGZyb20gdGhlIGJyb3dzZXIgbG9jYWwgc3RvcmFnZSwgaWYgdGhleSBhcmUgbm90IGZvdW5kIGluIHRoZSBzdG9yYWdlIHRoZXkgd2lsbCBiZVxyXG4gKiBmZXRjaCBmcm9tIHRoZSBBUEkuXHJcbiAqXHJcbiAqIEBwYXJhbSBsYW5ndWFnZUNvZGUgbGFuZ3VhZ2UgY29kZSBJU082MzktMSBpZiBub3Qgc3BlY2lmaWVkIERFRkFVTFRfTE9DQUxFIGlzIHVzZWRcclxuICogQHBhcmFtIHVwZGF0ZSBib29sZWFuIHRvIGZvcmNlIGFuIHVwZGF0ZSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgZ2l2ZW4gbG9jYWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFN0cmluZ3MobGFuZ3VhZ2VDb2RlPzogc3RyaW5nLCB1cGRhdGU/OiBib29sZWFuKSB7XHJcblx0aWYgKCFsYW5ndWFnZUNvZGUpIGxhbmd1YWdlQ29kZSA9IERFRkFVTFRfTE9DQUxFO1xyXG5cdGlmICghdXBkYXRlKSB1cGRhdGUgPSBmYWxzZTtcclxuXHRsYW5ndWFnZUNvZGUgPSBub3JtYWxpemVMYW5ndWFnZUNvZGUobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0cmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xyXG5cdFx0aWYgKHR5cGVvZiBsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSAhPT0gXCJ1bmRlZmluZWRcIikgcmVzb2x2ZSgpO1xyXG5cclxuXHRcdGlmICghbG9hZGluZ0xhbmdzLmluY2x1ZGVzKGxhbmd1YWdlQ29kZSkpIHtcclxuXHRcdFx0bG9hZGluZ0xhbmdzLnB1c2gobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLmdldChcImxhbmd1YWdlc1wiLCBhc3luYyBsbmdzID0+IHtcclxuXHRcdFx0XHRpZiAoIWxuZ3MubGFuZ3VhZ2VzKSB7XHJcblx0XHRcdFx0XHRsbmdzLmxhbmd1YWdlcyA9IHt9O1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0Y29uc3QgdXBkYXRlUHJvbWlzZXMgPSBbXTtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHQoXHJcblx0XHRcdFx0XHRcdHVwZGF0ZSAmJlxyXG5cdFx0XHRcdFx0XHR0eXBlb2YgbG5ncy5sYW5ndWFnZXNbREVGQVVMVF9MT0NBTEVdICE9PSBcInVuZGVmaW5lZFwiICYmXHJcblx0XHRcdFx0XHRcdERhdGUubm93KCkgLSBsbmdzLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0udXBkYXRlZEF0ID49IE1JTl9VUERBVEVfVElNRVxyXG5cdFx0XHRcdFx0KSB8fFxyXG5cdFx0XHRcdFx0KFxyXG5cdFx0XHRcdFx0XHRsYW5ndWFnZUNvZGUgIT09IERFRkFVTFRfTE9DQUxFICYmXHJcblx0XHRcdFx0XHRcdHR5cGVvZiBsbmdzLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0gPT09IFwidW5kZWZpbmVkXCJcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpIHtcclxuXHRcdFx0XHRcdHVwZGF0ZVByb21pc2VzLnB1c2godXBkYXRlU3RyaW5ncyhERUZBVUxUX0xPQ0FMRSkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0aWYgKFxyXG5cdFx0XHRcdFx0dHlwZW9mIGxuZ3MubGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0gPT09IFwidW5kZWZpbmVkXCIgfHxcclxuXHRcdFx0XHRcdChcclxuXHRcdFx0XHRcdFx0dXBkYXRlICYmXHJcblx0XHRcdFx0XHRcdC8vIGFscmVhZHkgY2hlY2tlZCBpZiBsbmdzLmxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdIGlzIHVuZGVmaW5lZFxyXG5cdFx0XHRcdFx0XHREYXRlLm5vdygpIC0gbG5ncy5sYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS51cGRhdGVkQXQgPj0gTUlOX1VQREFURV9USU1FXHJcblx0XHRcdFx0XHQpXHJcblxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0dXBkYXRlUHJvbWlzZXMucHVzaCh1cGRhdGVTdHJpbmdzKGxhbmd1YWdlQ29kZSkpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwodXBkYXRlUHJvbWlzZXMpO1xyXG5cclxuXHRcdFx0XHQvLyBtZXJnZSBhbGwgbGFuZ3VhZ2VzXHJcblx0XHRcdFx0bGFuZ3VhZ2VzID0geyAuLi5sYW5ndWFnZXMsIC4uLmxuZ3MubGFuZ3VhZ2VzIH07XHJcblxyXG5cdFx0XHRcdGxvYWRpbmdMYW5ncy5zcGxpY2UobG9hZGluZ0xhbmdzLmluZGV4T2YobGFuZ3VhZ2VDb2RlKSwgMSk7XHJcblx0XHRcdFx0cmVzb2x2ZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGxldCBsb2FkU3RhdHVzID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG5cdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdHR5cGVvZiBsYW5ndWFnZXMgIT09IFwidW5kZWZpbmVkXCIgJiZcclxuXHRcdFx0XHRcdHR5cGVvZiBsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXSAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHRcdCkge1xyXG5cdFx0XHRcdFx0Y2xlYXJJbnRlcnZhbChsb2FkU3RhdHVzKTtcclxuXHRcdFx0XHRcdHJlc29sdmUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sIDUpO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG59XHJcblxyXG4vKipcclxuICogR2V0IGFsbCB0aGUgdHJhbnNsYXRpb25zIGluIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgREVGQVVMVF9MT0NBTEVcclxuICpcclxuICogQHBhcmFtIGxhbmd1YWdlQ29kZSBsYW5ndWFnZSBjb2RlIElTTzYzOS0xIGlmIG5vdCBzcGVjaWZpZWQgREVGQVVMVF9MT0NBTEUgaXMgdXNlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZ3MobGFuZ3VhZ2VDb2RlPzogc3RyaW5nKSB7XHJcblx0aWYgKCFsYW5ndWFnZUNvZGUpIGxhbmd1YWdlQ29kZSA9IERFRkFVTFRfTE9DQUxFO1xyXG5cdGxhbmd1YWdlQ29kZSA9IG5vcm1hbGl6ZUxhbmd1YWdlQ29kZShsYW5ndWFnZUNvZGUpO1xyXG5cclxuXHRyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgcmVzb2x2ZSA9PiB7XHJcblx0XHRhd2FpdCBsb2FkU3RyaW5ncyhsYW5ndWFnZUNvZGUpO1xyXG5cclxuXHRcdGlmICh0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuXHRcdFx0aWYgKCFsYW5ndWFnZXNbREVGQVVMVF9MT0NBTEVdKSB7XHJcblx0XHRcdFx0cmVzb2x2ZSh7fSk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHJlc29sdmUoe1xyXG5cdFx0XHRcdFtERUZBVUxUX0xPQ0FMRV06IHtcclxuXHRcdFx0XHRcdC4uLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0uZXh0ZW5zaW9uLFxyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW0RFRkFVTFRfTE9DQUxFXS5wcmVzZW5jZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRyZXNvbHZlKHtcclxuXHRcdFx0XHRbbGFuZ3VhZ2VDb2RlXToge1xyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0uZXh0ZW5zaW9uLFxyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ucHJlc2VuY2VcclxuXHRcdFx0XHR9LFxyXG5cdFx0XHRcdFtERUZBVUxUX0xPQ0FMRV06IHtcclxuXHRcdFx0XHRcdC4uLmxhbmd1YWdlc1tERUZBVUxUX0xPQ0FMRV0uZXh0ZW5zaW9uLFxyXG5cdFx0XHRcdFx0Li4ubGFuZ3VhZ2VzW0RFRkFVTFRfTE9DQUxFXS5wcmVzZW5jZVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBHZXQgdHJhbnNsYXRpb24gb2YgYSBzcGVjaWZpYyBrZXlcclxuICpcclxuICogQHBhcmFtIHN0cmluZyBuYW1lIG9mIHRoZSBzdHJpbmcsIHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UgdXNlIFwibmFtZVwiIG9yIFwiaGVhZGVyLmxhbmd1YWdlXCJcclxuICogQHBhcmFtIGxhbmd1YWdlQ29kZSBsYW5ndWFnZSBjb2RlIElTTzYzOS0xIGlmIG5vdCBzcGVjaWZpZWQgREVGQVVMVF9MT0NBTEUgaXMgdXNlZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGdldFN0cmluZyhzdHJpbmc6IHN0cmluZywgbGFuZ3VhZ2VDb2RlPzogc3RyaW5nKSB7XHJcblx0aWYgKCFsYW5ndWFnZUNvZGUpIGxhbmd1YWdlQ29kZSA9IGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKTtcclxuXHRsYW5ndWFnZUNvZGUgPSBub3JtYWxpemVMYW5ndWFnZUNvZGUobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0cmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xyXG5cdFx0YXdhaXQgbG9hZFN0cmluZ3MobGFuZ3VhZ2VDb2RlKTtcclxuXHJcblx0XHRpZiAodHlwZW9mIGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcblx0XHRcdGlmIChcclxuXHRcdFx0XHRbXCJuYW1lXCIsIFwiaGVhZGVyLmxhbmd1YWdlXCJdLmluY2x1ZGVzKHN0cmluZykgJiZcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ubmFtZSAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS5uYW1lKTtcclxuXHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHRbXCJsb2FkaW5nXCIsIFwiaGVhZGVyLmxvYWRlci5waHJhc2VzXCJdLmluY2x1ZGVzKHN0cmluZykgJiZcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ubG9hZGluZyAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS5sb2FkaW5nKTtcclxuXHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0uZXh0ZW5zaW9uICE9PSBcInVuZGVmaW5lZFwiICYmXHJcblx0XHRcdFx0dHlwZW9mIGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdLmV4dGVuc2lvbltzdHJpbmddICE9PSBcInVuZGVmaW5lZFwiXHJcblx0XHRcdCkge1xyXG5cdFx0XHRcdHJldHVybiByZXNvbHZlKGxhbmd1YWdlc1tsYW5ndWFnZUNvZGVdLmV4dGVuc2lvbltzdHJpbmddKTtcclxuXHRcdFx0fSBlbHNlIGlmIChcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ucHJlc2VuY2UgIT09IFwidW5kZWZpbmVkXCIgJiZcclxuXHRcdFx0XHR0eXBlb2YgbGFuZ3VhZ2VzW2xhbmd1YWdlQ29kZV0ucHJlc2VuY2Vbc3RyaW5nXSAhPT0gXCJ1bmRlZmluZWRcIlxyXG5cdFx0XHQpIHtcclxuXHRcdFx0XHRyZXR1cm4gcmVzb2x2ZShsYW5ndWFnZXNbbGFuZ3VhZ2VDb2RlXS5wcmVzZW5jZVtzdHJpbmddKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHByZXZlbnQgaW5maW5pdGUgbG9vcHNcclxuXHRcdGlmIChsYW5ndWFnZUNvZGUgPT09IERFRkFVTFRfTE9DQUxFKSB7XHJcblx0XHRcdHJldHVybiByZXNvbHZlKHN0cmluZyk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlc29sdmUoYXdhaXQgZ2V0U3RyaW5nKHN0cmluZywgREVGQVVMVF9MT0NBTEUpKTtcclxuXHR9KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIE9idGFpbiBhbGwgbGFuZ3VhZ2VzIHRoYXQgYXJlIDEwMCUgdHJhbnNsYXRlZCBmb3IgYSBwcmVzZW5jZSBhbmQgdGhhdCBhbHNvIGhhdmUgdGhlIGdlbmVyYWwgZmlsZSAxMDAlIHRyYW5zbGF0ZWRcclxuICpcclxuICogQHBhcmFtIHByZXNlbmNlTmFtZSBuYW1lIG9mIHRoZSBwcmVzZW5jZSBhcyBzcGVjaWZpZWQgaW4gdGhlIFwic2VydmljZVwiIGtleSBvZiB0aGUgbWV0YWRhdGEuanNvbiBmaWxlXHJcbiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UHJlc2VuY2VMYW5ndWFnZXMocHJlc2VuY2VOYW1lOiBzdHJpbmcpIHtcclxuXHR0cnkge1xyXG5cdFx0Y29uc3QgbGFuZ3MgPSBhd2FpdCBncmFwaHFsUmVxdWVzdChgXHJcblx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRsYW5nRmlsZXMocHJlc2VuY2U6IFwiJHtwcmVzZW5jZU5hbWUudG9Mb3dlckNhc2UoKX1cIikge1xyXG5cdFx0XHRcdFx0bGFuZ1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRnZW5lcmFsTGFuZ0ZpbGVzOiBsYW5nRmlsZXMocHJlc2VuY2U6IFwiZ2VuZXJhbFwiKSB7XHJcblx0XHRcdFx0XHRsYW5nXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRgKTtcclxuXHJcblx0XHRjb25zdCBmaW5hbEFycmF5ID0gW107XHJcblx0XHRpZiAoXHJcblx0XHRcdGxhbmdzLmRhdGEubGFuZ0ZpbGVzLmxlbmd0aCA+IDAgJiZcclxuXHRcdFx0bGFuZ3MuZGF0YS5nZW5lcmFsTGFuZ0ZpbGVzLmxlbmd0aCA+IDBcclxuXHRcdCkge1xyXG5cdFx0XHRsYW5ncy5kYXRhLmdlbmVyYWxMYW5nRmlsZXMuZm9yRWFjaChsYW5nID0+IHtcclxuXHRcdFx0XHRjb25zdCBmb3VuZCA9IGxhbmdzLmRhdGEubGFuZ0ZpbGVzLmZpbmQocCA9PiBwLmxhbmcgPT09IGxhbmcubGFuZyk7XHJcblx0XHRcdFx0aWYgKGZvdW5kKSBmaW5hbEFycmF5LnB1c2gobGFuZy5sYW5nKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9IGVsc2UgaWYgKGxhbmdzLmRhdGEuZ2VuZXJhbExhbmdGaWxlcy5sZW5ndGggPiAwKSB7XHJcblx0XHRcdGxhbmdzLmRhdGEuZ2VuZXJhbExhbmdGaWxlcy5mb3JFYWNoKGxhbmcgPT4ge1xyXG5cdFx0XHRcdGZpbmFsQXJyYXkucHVzaChsYW5nLmxhbmcpO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdHJldHVybiBmaW5hbEFycmF5O1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdHJldHVybiBbXTtcclxuXHR9XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuXHRERUZBVUxUX0xPQ0FMRSxcclxuXHRnZXRTdHJpbmcsXHJcblx0Z2V0UHJlc2VuY2VMYW5ndWFnZXMgYXMgcHJlc2VuY2VMYW5ndWFnZXMsXHJcblx0dXBkYXRlU3RyaW5nc1xyXG59IGZyb20gXCIuL2xhbmdNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IGVycm9yLCBzdWNjZXNzIH0gZnJvbSBcIi4vZGVidWdcIjtcclxuaW1wb3J0IGdyYXBocWxSZXF1ZXN0LCB7IGdldFByZXNlbmNlTWV0YWRhdGEgfSBmcm9tIFwiLi9mdW5jdGlvbnMvZ3JhcGhxbFwiO1xyXG5cclxuaW1wb3J0IHsgZ2V0U3RvcmFnZSB9IGZyb20gXCIuL2Z1bmN0aW9ucy9hc3luY1N0b3JhZ2VcIjtcclxuaW1wb3J0IHsgbG9hZFN0cmluZ3MgfSBmcm9tIFwiLi9sYW5nTWFuYWdlclwiO1xyXG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tIFwidXVpZFwiO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBwbGF0Zm9ybVR5cGUge1xyXG5cdG9zOiBzdHJpbmc7XHJcblx0YXJjaDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJlc2VuY2VTY2llbmNlKCkge1xyXG5cdGxldCBpZGVudGlmaWVyID0gKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcImlkZW50aWZpZXJcIikpLmlkZW50aWZpZXIsXHJcblx0XHRwcmVzZW5jZXM6IHByZXNlbmNlU3RvcmFnZSA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpXHJcblx0XHRcdC5wcmVzZW5jZXM7XHJcblxyXG5cdGlmICghaWRlbnRpZmllcikge1xyXG5cdFx0aWRlbnRpZmllciA9IHV1aWR2NCgpO1xyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgaWRlbnRpZmllcjogaWRlbnRpZmllciB9KTtcclxuXHR9XHJcblxyXG5cdGNvbnN0IHBsYXRmb3JtOiBwbGF0Zm9ybVR5cGUgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+XHJcblx0XHRcdGNocm9tZS5ydW50aW1lLmdldFBsYXRmb3JtSW5mbyhpbmZvID0+XHJcblx0XHRcdFx0cmVzb2x2ZSh7IG9zOiBpbmZvLm9zLCBhcmNoOiBpbmZvLmFyY2ggfSlcclxuXHRcdFx0KVxyXG5cdFx0KSxcclxuXHRcdHByZXNlbmNlc0FycmF5ID0gcHJlc2VuY2VzLmZpbHRlcihwID0+ICFwLnRtcCkubWFwKHAgPT4gcC5tZXRhZGF0YS5zZXJ2aWNlKTtcclxuXHJcblx0Z3JhcGhxbFJlcXVlc3QoYFxyXG5cdG11dGF0aW9uIHtcclxuXHRcdGFkZFNjaWVuY2UoaWRlbnRpZmllcjogXCIke2lkZW50aWZpZXJ9XCIsIHByZXNlbmNlczogW1wiJHtwcmVzZW5jZXNBcnJheVxyXG5cdFx0LnRvU3RyaW5nKClcclxuXHRcdC5zcGxpdChcIixcIilcclxuXHRcdC5qb2luKGBcIiwgXCJgKX1cIl0sIG9zOiBcIiR7cGxhdGZvcm0ub3N9XCIsIGFyY2g6XCIke3BsYXRmb3JtLmFyY2h9XCIpIHtcclxuXHRcdFx0aWRlbnRpZmllclxyXG5cdFx0fVxyXG5cdH1cclxuXHRgKTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVByZXNlbmNlcygpIHtcclxuXHRsZXQgcHJlc2VuY2VWZXJzaW9uczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZzsgdXJsOiBzdHJpbmcgfT4sXHJcblx0XHRwcmVzZW5jZXM6IHByZXNlbmNlU3RvcmFnZSA9IChhd2FpdCBnZXRTdG9yYWdlKFwibG9jYWxcIiwgXCJwcmVzZW5jZXNcIikpXHJcblx0XHRcdC5wcmVzZW5jZXM7XHJcblxyXG5cdGlmICghcHJlc2VuY2VzIHx8IHByZXNlbmNlcy5sZW5ndGggPT09IDApIHJldHVybjtcclxuXHJcblx0Ly8qIENhdGNoIGZldGNoIGVycm9yXHJcblx0dHJ5IHtcclxuXHRcdGNvbnN0IGdyYXBocWxSZXN1bHQgPSAoXHJcblx0XHRcdGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0cXVlcnkge1xyXG4gIFx0XHRcdHByZXNlbmNlcyB7XHJcbiAgICBcdFx0XHR1cmxcclxuICAgIFx0XHRcdG1ldGFkYXRhIHtcclxuICAgICAgXHRcdFx0c2VydmljZVxyXG4gICAgICBcdFx0XHR2ZXJzaW9uXHJcbiAgICBcdFx0XHR9XHJcbiAgXHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHRgKVxyXG5cdFx0KS5kYXRhO1xyXG5cclxuXHRcdGNvbnN0IHJlc3VsdCA9IFtdO1xyXG5cclxuXHRcdGdyYXBocWxSZXN1bHQucHJlc2VuY2VzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcblx0XHRcdHJlc3VsdC5wdXNoKHtcclxuXHRcdFx0XHRuYW1lOiBlbGVtZW50Lm1ldGFkYXRhLnNlcnZpY2UsXHJcblx0XHRcdFx0dXJsOiBlbGVtZW50LnVybCxcclxuXHRcdFx0XHR2ZXJzaW9uOiBlbGVtZW50Lm1ldGFkYXRhLnZlcnNpb25cclxuXHRcdFx0fSk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRwcmVzZW5jZVZlcnNpb25zID0gcmVzdWx0O1xyXG5cdH0gY2F0Y2ggKGUpIHtcclxuXHRcdGVycm9yKFwicHJlc2VuY2VNYW5hZ2VyLnRzXCIsIGBFcnJvciB3aGlsZSB1cGRhdGluZyBwcmVzZW5jZXM6ICR7ZS5tZXNzYWdlfWApO1xyXG5cdFx0cmV0dXJuO1xyXG5cdH1cclxuXHJcblx0bGV0IGN1cnJQcmVzZW5jZVZlcnNpb25zID0gcHJlc2VuY2VzXHJcblx0XHRcdC5maWx0ZXIocCA9PiAhcC50bXApXHJcblx0XHRcdC5tYXAocCA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIHsgbmFtZTogcC5tZXRhZGF0YS5zZXJ2aWNlLCB2ZXJzaW9uOiBwLm1ldGFkYXRhLnZlcnNpb24gfTtcclxuXHRcdFx0fSksXHJcblx0XHRwcmVzZW5jZXNUb1VwZGF0ZSA9IGN1cnJQcmVzZW5jZVZlcnNpb25zLmZpbHRlcihwID0+XHJcblx0XHRcdHByZXNlbmNlVmVyc2lvbnMuZmluZChwMSA9PiBwMS5uYW1lID09IHAubmFtZSAmJiBwMS52ZXJzaW9uICE9PSBwLnZlcnNpb24pXHJcblx0XHQpO1xyXG5cclxuXHRQcm9taXNlLmFsbChcclxuXHRcdHByZXNlbmNlc1RvVXBkYXRlLm1hcChhc3luYyBwID0+IHtcclxuXHRcdFx0Y29uc3QgcHJlc2VuY2VJbmRleCA9IHByZXNlbmNlcy5maW5kSW5kZXgoXHJcblx0XHRcdFx0Ly9AdHMtaWdub3JlXHJcblx0XHRcdFx0cDEgPT4gcDEubWV0YWRhdGEuc2VydmljZSA9PT0gcC5uYW1lICYmICFwLnRtcFxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0Y29uc3QgZ3JhcGhxbFJlc3VsdCA9IChcclxuXHRcdFx0XHRhd2FpdCBncmFwaHFsUmVxdWVzdChgXHJcblx0XHRcdHF1ZXJ5IHtcclxuXHRcdFx0XHRwcmVzZW5jZXMoc2VydmljZTogXCIke3AubmFtZX1cIikge1xyXG5cdFx0XHRcdFx0cHJlc2VuY2VKc1xyXG5cdFx0XHRcdFx0aWZyYW1lSnNcclxuXHRcdFx0XHRcdG1ldGFkYXRhIHtcclxuXHRcdFx0XHRcdFx0YXV0aG9yIHtcclxuXHRcdFx0XHRcdFx0XHRuYW1lXHJcblx0XHRcdFx0XHRcdFx0aWRcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHRjb250cmlidXRvcnMge1xyXG5cdFx0XHRcdFx0XHRcdG5hbWVcclxuXHRcdFx0XHRcdFx0XHRpZFxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGFsdG5hbWVzXHJcblx0XHRcdFx0XHRcdHdhcm5pbmdcclxuXHRcdFx0XHRcdFx0cmVhZExvZ3NcclxuXHRcdFx0XHRcdFx0c2VydmljZVxyXG5cdFx0XHRcdFx0XHRkZXNjcmlwdGlvblxyXG5cdFx0XHRcdFx0XHR1cmxcclxuXHRcdFx0XHRcdFx0dmVyc2lvblxyXG5cdFx0XHRcdFx0XHRsb2dvXHJcblx0XHRcdFx0XHRcdHRodW1ibmFpbFxyXG5cdFx0XHRcdFx0XHRjb2xvclxyXG5cdFx0XHRcdFx0XHR0YWdzXHJcblx0XHRcdFx0XHRcdGNhdGVnb3J5XHJcblx0XHRcdFx0XHRcdGlmcmFtZVxyXG5cdFx0XHRcdFx0XHRyZWdFeHBcclxuXHRcdFx0XHRcdFx0aWZyYW1lUmVnRXhwXHJcblx0XHRcdFx0XHRcdGJ1dHRvblxyXG5cdFx0XHRcdFx0XHR3YXJuaW5nXHJcblx0XHRcdFx0XHRcdHNldHRpbmdzIHtcclxuXHRcdFx0XHRcdFx0XHRpZFxyXG5cdFx0XHRcdFx0XHRcdHRpdGxlXHJcblx0XHRcdFx0XHRcdFx0aWNvblxyXG5cdFx0XHRcdFx0XHRcdGlmIHtcclxuXHRcdFx0XHRcdFx0XHRcdHByb3ByZXR5TmFtZXNcclxuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm5Qcm9wcnRpZXNcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdFx0cGxhY2Vob2xkZXJcclxuXHRcdFx0XHRcdFx0XHR2YWx1ZVxyXG5cdFx0XHRcdFx0XHRcdHZhbHVlc1xyXG5cdFx0XHRcdFx0XHRcdG11bHRpTGFuZ3VhZ2VcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRgKVxyXG5cdFx0XHQpLmRhdGE7XHJcblxyXG5cdFx0XHRjb25zdCBtZXRhZGF0YSA9IGdyYXBocWxSZXN1bHQucHJlc2VuY2VzWzBdLm1ldGFkYXRhLFxyXG5cdFx0XHRcdGZpbGVzID0gW1xyXG5cdFx0XHRcdFx0Z3JhcGhxbFJlc3VsdC5wcmVzZW5jZXNbMF0ucHJlc2VuY2VKcyxcclxuXHRcdFx0XHRcdG1ldGFkYXRhLmlmcmFtZSA/IGdyYXBocWxSZXN1bHQucHJlc2VuY2VzWzBdLmlmcmFtZUpzIDogdW5kZWZpbmVkXHJcblx0XHRcdFx0XS5maWx0ZXIoZiA9PiBmKTtcclxuXHJcblx0XHRcdHByZXNlbmNlc1twcmVzZW5jZUluZGV4XS5tZXRhZGF0YSA9IG1ldGFkYXRhO1xyXG5cdFx0XHRwcmVzZW5jZXNbcHJlc2VuY2VJbmRleF0ucHJlc2VuY2UgPSBmaWxlc1swXTtcclxuXHRcdFx0Ly8gQHRzLWlnbm9yZVxyXG5cdFx0XHRpZiAoZmlsZXMubGVuZ3RoID09IDIpIHByZXNlbmNlc1twcmVzZW5jZUluZGV4XS5pZnJhbWUgPSBmaWxlc1sxXTtcclxuXHRcdH0pXHJcblx0KS50aGVuKCgpID0+IHtcclxuXHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7IHByZXNlbmNlczogWy4uLnByZXNlbmNlc10gfSwgKCkgPT4ge1xyXG5cdFx0XHRwcmVzZW5jZXNUb1VwZGF0ZS5tYXAocCA9PlxyXG5cdFx0XHRcdHN1Y2Nlc3MoXHJcblx0XHRcdFx0XHRcInByZXNlbmNlRGV2TWFuYWdlci50c1wiLFxyXG5cdFx0XHRcdFx0YFVwZGF0ZWQgJHtwLm5hbWV9IGZyb20gdiR7cC52ZXJzaW9ufSB0byB2JHtcclxuXHRcdFx0XHRcdFx0cHJlc2VuY2VWZXJzaW9ucy5maW5kKHAxID0+IHAxLm5hbWUgPT09IHAubmFtZSkudmVyc2lvblxyXG5cdFx0XHRcdFx0fWBcclxuXHRcdFx0XHQpXHJcblx0XHRcdCk7XHJcblx0XHR9KTtcclxuXHRcdGNvbnN0IHByZXNlbmNlTmFtZXNUb1VwZGF0ZSA9IHByZXNlbmNlc1RvVXBkYXRlLm1hcChwID0+IHAubmFtZSksXHJcblx0XHRcdHVwZGF0ZWRQcmVzZW5jZXMgPSBwcmVzZW5jZXMuZmlsdGVyKHAgPT4gcHJlc2VuY2VOYW1lc1RvVXBkYXRlLmluY2x1ZGVzKHAubWV0YWRhdGEuc2VydmljZSkpO1xyXG5cclxuXHRcdHVwZGF0ZWRQcmVzZW5jZXMuZm9yRWFjaChhc3luYyBwID0+IHtcclxuXHRcdFx0XHRhd2FpdCBpbml0UHJlc2VuY2VMYW5ndWFnZXMocCk7XHJcblxyXG5cdFx0XHRcdGNvbnN0IHNldHRpbmdOYW1lID0gYHBTZXR0aW5nc18ke3AubWV0YWRhdGEuc2VydmljZX1gLFxyXG5cdFx0XHRcdFx0c2V0dGluZ3MgPSAoYXdhaXQgZ2V0U3RvcmFnZShcImxvY2FsXCIsIHNldHRpbmdOYW1lKSlbc2V0dGluZ05hbWVdO1xyXG5cclxuXHRcdFx0XHRpZiAoc2V0dGluZ3MpIHtcclxuXHRcdFx0XHRcdGNvbnN0IGxhbmdTZXR0aW5ncyA9IHNldHRpbmdzLmZpbmQocyA9PiB0eXBlb2Ygcy5tdWx0aUxhbmd1YWdlICE9PSBcInVuZGVmaW5lZFwiKTtcclxuXHJcblx0XHRcdFx0XHRpZiAobGFuZ1NldHRpbmdzICYmIGxhbmdTZXR0aW5ncy52YWx1ZXMpIHtcclxuXHRcdFx0XHRcdFx0Y29uc3QgbGFuZ3MgPSBsYW5nU2V0dGluZ3MudmFsdWVzLm1hcCh2ID0+IHYudmFsdWUpO1xyXG5cclxuXHRcdFx0XHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXHJcblx0XHRcdFx0XHRcdFx0bGFuZ3MubWFwKGxhbmcgPT4gbG9hZFN0cmluZ3MobGFuZywgdHJ1ZSkpXHJcblx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fSk7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRQcmVzZW5jZShuYW1lOiBzdHJpbmcgfCBBcnJheTxzdHJpbmc+KSB7XHJcblx0bGV0IHByZXNlbmNlczogcHJlc2VuY2VTdG9yYWdlID0gKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcInByZXNlbmNlc1wiKSlcclxuXHRcdC5wcmVzZW5jZXM7XHJcblxyXG5cdGlmICghcHJlc2VuY2VzKSBwcmVzZW5jZXMgPSBbXTtcclxuXHQvLyogRmlsdGVyIG91dCB0bXAgcHJlc2VuY2VzXHJcblxyXG5cdGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0aWYgKHByZXNlbmNlcy5maWx0ZXIocCA9PiAhcC50bXApLmZpbmQocCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UgPT09IG5hbWUpKSB7XHJcblx0XHRcdGVycm9yKFwicHJlc2VuY2VNYW5hZ2VyXCIsIGBQcmVzZW5jZSAke25hbWV9IGFscmVhZHkgYWRkZWQuYCk7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHR9IGVsc2Uge1xyXG5cdFx0Y29uc3QgcmVzID0gbmFtZS5maWx0ZXIoXHJcblx0XHRcdHMgPT4gIXByZXNlbmNlcy5tYXAocCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UpLmluY2x1ZGVzKHMpXHJcblx0XHQpO1xyXG5cclxuXHRcdGlmIChyZXMubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdGVycm9yKFwicHJlc2VuY2VNYW5hZ2VyXCIsIFwiUHJlc2VuY2VzIGFscmVhZHkgYWRkZWQuXCIpO1xyXG5cdFx0XHRyZXR1cm47XHJcblx0XHR9IGVsc2UgbmFtZSA9IHJlcztcclxuXHR9XHJcblxyXG5cdGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikge1xyXG5cdFx0Z2V0UHJlc2VuY2VNZXRhZGF0YShuYW1lKVxyXG5cdFx0XHQudGhlbihhc3luYyAoeyBkYXRhIH0pID0+IHtcclxuXHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHR0eXBlb2YgZGF0YS5tZXRhZGF0YS5idXR0b24gIT09IFwidW5kZWZpbmVkXCIgJiZcclxuXHRcdFx0XHRcdCFkYXRhLm1ldGFkYXRhLmJ1dHRvblxyXG5cdFx0XHRcdClcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHRjb25zdCBwcmVzZW5jZUFuZElmcmFtZSA9IChcclxuXHRcdFx0XHRcdGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0XHRcdFx0cXVlcnkge1xyXG5cdFx0XHRcdFx0XHRcdHByZXNlbmNlcyhzZXJ2aWNlOiBcIiR7ZGF0YS5tZXRhZGF0YS5zZXJ2aWNlfVwiKSB7XHJcbiAgICBcdFx0XHRcdFx0cHJlc2VuY2VKc1xyXG4gICAgXHRcdFx0XHRcdGlmcmFtZUpzXHJcbiAgICBcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGApXHJcblx0XHRcdFx0KS5kYXRhLnByZXNlbmNlc1swXTtcclxuXHJcblx0XHRcdFx0Y29uc3QgcmVzOiBhbnkgPSB7XHJcblx0XHRcdFx0XHRtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcclxuXHRcdFx0XHRcdHByZXNlbmNlOiBwcmVzZW5jZUFuZElmcmFtZS5wcmVzZW5jZUpzLFxyXG5cdFx0XHRcdFx0ZW5hYmxlZDogdHJ1ZVxyXG5cdFx0XHRcdH07XHJcblxyXG5cdFx0XHRcdGlmICh0eXBlb2YgZGF0YS5tZXRhZGF0YS5pZnJhbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGF0YS5tZXRhZGF0YS5pZnJhbWUpXHJcblx0XHRcdFx0XHRyZXMuaWZyYW1lID0gcHJlc2VuY2VBbmRJZnJhbWUuaWZyYW1lSnM7XHJcblxyXG5cdFx0XHRcdHByZXNlbmNlcy5wdXNoKHJlcyk7XHJcblx0XHRcdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgcHJlc2VuY2VzOiBwcmVzZW5jZXMgfSk7XHJcblx0XHRcdFx0cHJlc2VuY2VzLm1hcChwID0+IHtcclxuXHRcdFx0XHRcdGlmIChwLm1ldGFkYXRhLnNldHRpbmdzKSB7XHJcblx0XHRcdFx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRcdFx0XHRcdFx0W2BwU2V0dGluZ3NfJHtwLm1ldGFkYXRhLnNlcnZpY2V9YF06IHAubWV0YWRhdGEuc2V0dGluZ3NcclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH0pXHJcblx0XHRcdC5jYXRjaCgoKSA9PiB7fSk7XHJcblx0fSBlbHNlIHtcclxuXHRcdGNvbnN0IHByZXNlbmNlc1RvQWRkOiBhbnkgPSAoXHJcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxyXG5cdFx0XHRcdChcclxuXHRcdFx0XHRcdGF3YWl0IFByb21pc2UuYWxsKFxyXG5cdFx0XHRcdFx0XHRuYW1lLm1hcChuYW1lID0+IHtcclxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZ2V0UHJlc2VuY2VNZXRhZGF0YShuYW1lKTtcclxuXHRcdFx0XHRcdFx0fSlcclxuXHRcdFx0XHRcdClcclxuXHRcdFx0XHQpLm1hcChhc3luYyAoeyBkYXRhIH0pID0+IHtcclxuXHRcdFx0XHRcdGlmIChcclxuXHRcdFx0XHRcdFx0dHlwZW9mIGRhdGEubWV0YWRhdGEuYnV0dG9uICE9PSBcInVuZGVmaW5lZFwiICYmXHJcblx0XHRcdFx0XHRcdCFkYXRhLm1ldGFkYXRhLmJ1dHRvblxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRyZXR1cm47XHJcblxyXG5cdFx0XHRcdFx0Y29uc3QgcHJlc2VuY2VBbmRJZnJhbWUgPSAoXHJcblx0XHRcdFx0XHRcdGF3YWl0IGdyYXBocWxSZXF1ZXN0KGBcclxuXHRcdFx0XHRcdFx0cXVlcnkge1xyXG5cdFx0XHRcdFx0XHRcdHByZXNlbmNlcyhzZXJ2aWNlOiBcIiR7ZGF0YS5tZXRhZGF0YS5zZXJ2aWNlfVwiKSB7XHJcbiAgICBcdFx0XHRcdFx0cHJlc2VuY2VKc1xyXG4gICAgXHRcdFx0XHRcdGlmcmFtZUpzXHJcbiAgICBcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdGApXHJcblx0XHRcdFx0XHQpLmRhdGEucHJlc2VuY2VzWzBdO1xyXG5cclxuXHRcdFx0XHRcdGNvbnN0IHJlczogYW55ID0ge1xyXG5cdFx0XHRcdFx0XHRtZXRhZGF0YTogZGF0YS5tZXRhZGF0YSxcclxuXHRcdFx0XHRcdFx0cHJlc2VuY2U6IHByZXNlbmNlQW5kSWZyYW1lLnByZXNlbmNlSnMsXHJcblx0XHRcdFx0XHRcdGVuYWJsZWQ6IHRydWVcclxuXHRcdFx0XHRcdH07XHJcblx0XHRcdFx0XHRpZiAoXHJcblx0XHRcdFx0XHRcdHR5cGVvZiBkYXRhLm1ldGFkYXRhLmlmcmFtZSAhPT0gXCJ1bmRlZmluZWRcIiAmJlxyXG5cdFx0XHRcdFx0XHRkYXRhLm1ldGFkYXRhLmlmcmFtZVxyXG5cdFx0XHRcdFx0KVxyXG5cdFx0XHRcdFx0XHRyZXMuaWZyYW1lID0gcHJlc2VuY2VBbmRJZnJhbWUuaWZyYW1lSnM7XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHJlcztcclxuXHRcdFx0XHR9KVxyXG5cdFx0XHQpXHJcblx0XHQpLmZpbHRlcihwID0+IHR5cGVvZiBwICE9PSBcInVuZGVmaW5lZFwiKTtcclxuXHJcblx0XHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoeyBwcmVzZW5jZXM6IHByZXNlbmNlcy5jb25jYXQocHJlc2VuY2VzVG9BZGQpIH0pO1xyXG5cdFx0cHJlc2VuY2VzLmNvbmNhdChwcmVzZW5jZXNUb0FkZCkubWFwKHAgPT4ge1xyXG5cdFx0XHRpZiAocC5tZXRhZGF0YS5zZXR0aW5ncykge1xyXG5cdFx0XHRcdGNocm9tZS5zdG9yYWdlLmxvY2FsLnNldCh7XHJcblx0XHRcdFx0XHRbYHBTZXR0aW5nc18ke3AubWV0YWRhdGEuc2VydmljZX1gXTogcC5tZXRhZGF0YS5zZXR0aW5nc1xyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHRcdC8vKiBOb3QgYXdhaXRpbmcgaXQsIGl0IGNvdWxkIHRha2UgYSBsb3Qgb2YgdGltZVxyXG5cdFx0XHRcdGluaXRQcmVzZW5jZUxhbmd1YWdlcyhwKTtcclxuXHRcdFx0fVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHR1cGRhdGVQcmVzZW5jZXMoKTtcclxuXHR1cGRhdGVTdHJpbmdzKGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKSk7XHJcbn1cclxuXHJcbi8vKiBPbmx5IGFkZCB0aGVzZSBpZiBpcyBub3QgYmFja2dyb3VuZCBwYWdlXHJcbmlmIChkb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZSAhPT0gXCIvX2dlbmVyYXRlZF9iYWNrZ3JvdW5kX3BhZ2UuaHRtbFwiKSB7XHJcblx0Ly8qIEFkZCBleHRlbnNpb25cclxuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiB7XHJcblx0XHRpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHBcIikpXHJcblx0XHRcdGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwXCIpLnNldEF0dHJpYnV0ZShcImV4dGVuc2lvbi1yZWFkeVwiLCBcInRydWVcIik7XHJcblx0fSk7XHJcblxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiUHJlTWlEX0FkZFByZXNlbmNlXCIsIGZ1bmN0aW9uKGRhdGE6IEN1c3RvbUV2ZW50KSB7XHJcblx0XHRhZGRQcmVzZW5jZShbZGF0YS5kZXRhaWxdKTtcclxuXHR9KTtcclxuXHJcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJQcmVNaURfUmVtb3ZlUHJlc2VuY2VcIiwgYXN5bmMgZnVuY3Rpb24oXHJcblx0XHRkYXRhOiBDdXN0b21FdmVudFxyXG5cdCkge1xyXG5cdFx0Y29uc3QgeyBwcmVzZW5jZXMgfSA9IGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcInByZXNlbmNlc1wiKTtcclxuXHJcblx0XHRjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoe1xyXG5cdFx0XHRwcmVzZW5jZXM6IChwcmVzZW5jZXMgYXMgcHJlc2VuY2VTdG9yYWdlKS5maWx0ZXIoXHJcblx0XHRcdFx0cCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UgIT09IGRhdGEuZGV0YWlsXHJcblx0XHRcdClcclxuXHRcdH0pO1xyXG5cdFx0dXBkYXRlUHJlc2VuY2VzKCk7XHJcblx0XHR1cGRhdGVTdHJpbmdzKGNocm9tZS5pMThuLmdldFVJTGFuZ3VhZ2UoKSk7XHJcblx0fSk7XHJcblxyXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiUHJlTWlEX0dldFByZXNlbmNlTGlzdFwiLCBzZW5kQmFja1ByZXNlbmNlcyk7XHJcblxyXG5cdC8vKiBPbiBwcmVzZW5jZSBjaGFuZ2UgdXBkYXRlXHJcblx0Y2hyb21lLnN0b3JhZ2Uub25DaGFuZ2VkLmFkZExpc3RlbmVyKGtleSA9PiB7XHJcblx0XHRpZiAoT2JqZWN0LmtleXMoa2V5KVswXSA9PT0gXCJwcmVzZW5jZXNcIikgc2VuZEJhY2tQcmVzZW5jZXMoKTtcclxuXHR9KTtcclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc2VuZEJhY2tQcmVzZW5jZXMoKSB7XHJcblx0Y29uc3QgcHJlc2VuY2VzID0gKGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBcInByZXNlbmNlc1wiKSlcclxuXHRcdC5wcmVzZW5jZXMgYXMgcHJlc2VuY2VTdG9yYWdlO1xyXG5cdGxldCBkYXRhID0ge1xyXG5cdFx0ZGV0YWlsOiBwcmVzZW5jZXMuZmlsdGVyKHAgPT4gIXAudG1wKS5tYXAocCA9PiBwLm1ldGFkYXRhLnNlcnZpY2UpXHJcblx0fTtcclxuXHJcblx0Ly8gQHRzLWlnbm9yZVxyXG5cdGlmICh0eXBlb2YgY2xvbmVJbnRvID09PSBcImZ1bmN0aW9uXCIpXHJcblx0XHQvLyBAdHMtaWdub3JlXHJcblx0XHRkYXRhID0gY2xvbmVJbnRvKGRhdGEsIGRvY3VtZW50LmRlZmF1bHRWaWV3KTtcclxuXHJcblx0Y29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoXCJQcmVNaURfR2V0V2ViaXN0ZUZhbGxiYWNrXCIsIGRhdGEpO1xyXG5cdHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRQcmVzZW5jZUxhbmd1YWdlcyhwKSB7XHJcblx0aWYgKHAubWV0YWRhdGEuc2V0dGluZ3MpIHtcclxuXHRcdGNvbnN0IGxuZ1NldHRpbmdJZHggPSBwLm1ldGFkYXRhLnNldHRpbmdzLmZpbmRJbmRleChcclxuXHRcdFx0cyA9PiB0eXBlb2Ygcy5tdWx0aUxhbmd1YWdlICE9PSBcInVuZGVmaW5lZFwiXHJcblx0XHQpO1xyXG5cclxuXHRcdGlmIChsbmdTZXR0aW5nSWR4ID49IDApIHtcclxuXHRcdFx0Y29uc3QgbG5nU2V0dGluZyA9IHAubWV0YWRhdGEuc2V0dGluZ3NbbG5nU2V0dGluZ0lkeF0sXHJcblx0XHRcdFx0bGFuZ3VhZ2VzID0gYXdhaXQgcHJlc2VuY2VNdWx0aUxhbmd1YWdlTGFuZ3VhZ2VzKFxyXG5cdFx0XHRcdFx0bG5nU2V0dGluZy5tdWx0aUxhbmd1YWdlLFxyXG5cdFx0XHRcdFx0cC5tZXRhZGF0YS5zZXJ2aWNlXHJcblx0XHRcdFx0KTtcclxuXHJcblx0XHRcdGlmIChPYmplY3Qua2V5cyhsYW5ndWFnZXMpLmxlbmd0aCA+IDEpIHtcclxuXHRcdFx0XHRhd2FpdCBzdG9yZURlZmF1bHRMYW5ndWFnZU9mUHJlc2VuY2UocCwgbGFuZ3VhZ2VzKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRwLm1ldGFkYXRhLnNldHRpbmdzLnNwbGljZShsbmdTZXR0aW5nSWR4LCAxKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gZ2V0UHJlc2VuY2VMYW5ndWFnZXMoc2VydmljZU5hbWUpIHtcclxuXHRjb25zdCB2YWx1ZXMgPSBbXSxcclxuXHRcdGxhbmd1YWdlcyA9IGF3YWl0IHByZXNlbmNlTGFuZ3VhZ2VzKHNlcnZpY2VOYW1lKTtcclxuXHJcblx0Zm9yIChjb25zdCBsYW5ndWFnZSBvZiBsYW5ndWFnZXMpIHtcclxuXHRcdHZhbHVlcy5wdXNoKHtcclxuXHRcdFx0bmFtZTogYXdhaXQgZ2V0U3RyaW5nKFwibmFtZVwiLCBsYW5ndWFnZSksXHJcblx0XHRcdHZhbHVlOiBsYW5ndWFnZVxyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdmFsdWVzO1xyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBwcmVzZW5jZU11bHRpTGFuZ3VhZ2VMYW5ndWFnZXMobXVsdGlMYW5ndWFnZSwgc2VydmljZSkge1xyXG5cdHN3aXRjaCAodHlwZW9mIG11bHRpTGFuZ3VhZ2UpIHtcclxuXHRcdGNhc2UgXCJib29sZWFuXCI6XHJcblx0XHRcdGlmIChtdWx0aUxhbmd1YWdlID09PSB0cnVlKSByZXR1cm4gYXdhaXQgZ2V0UHJlc2VuY2VMYW5ndWFnZXMoc2VydmljZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcInN0cmluZ1wiOlxyXG5cdFx0XHRyZXR1cm4gYXdhaXQgZ2V0UHJlc2VuY2VMYW5ndWFnZXMobXVsdGlMYW5ndWFnZSk7XHJcblx0XHRcdGJyZWFrO1xyXG5cdFx0Y2FzZSBcIm9iamVjdFwiOlxyXG5cdFx0XHRpZiAobXVsdGlMYW5ndWFnZSBpbnN0YW5jZW9mIEFycmF5KSB7XHJcblx0XHRcdFx0bGV0IGNvbW1vbkxuZ3MgPSBbXTtcclxuXHJcblx0XHRcdFx0Zm9yIChjb25zdCBwcmVmaXggb2YgbXVsdGlMYW5ndWFnZSkge1xyXG5cdFx0XHRcdFx0aWYgKHR5cGVvZiBwcmVmaXggPT09IFwic3RyaW5nXCIgJiYgcHJlZml4LnRyaW0oKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGxuZ3MgPSBhd2FpdCBnZXRQcmVzZW5jZUxhbmd1YWdlcyhwcmVmaXgpO1xyXG5cclxuXHRcdFx0XHRcdFx0Ly8gb25seSBsb2FkIGNvbW1vbiBsYW5ndWFnZXNcclxuXHRcdFx0XHRcdFx0aWYgKGNvbW1vbkxuZ3MubGVuZ3RoID09PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tbW9uTG5ncyA9IGxuZ3M7XHJcblx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0Y29tbW9uTG5ncyA9IGNvbW1vbkxuZ3MuZmlsdGVyKFxyXG5cdFx0XHRcdFx0XHRcdFx0Y2wgPT4gbG5ncy5maW5kSW5kZXgobCA9PiBsID09PSBjbCkgPj0gMFxyXG5cdFx0XHRcdFx0XHRcdCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdHJldHVybiBjb21tb25MbmdzO1xyXG5cdFx0XHR9XHJcblx0XHRcdGJyZWFrO1xyXG5cdH1cclxufVxyXG5cclxuYXN5bmMgZnVuY3Rpb24gc3RvcmVEZWZhdWx0TGFuZ3VhZ2VPZlByZXNlbmNlKHAsIGxhbmd1YWdlcykge1xyXG5cdGNvbnN0IGxuZ1NldHRpbmcgPSBwLm1ldGFkYXRhLnNldHRpbmdzLmZpbmQoXHJcblx0XHRzID0+IHR5cGVvZiBzLm11bHRpTGFuZ3VhZ2UgIT09IFwidW5kZWZpbmVkXCJcclxuXHQpO1xyXG5cclxuXHRsZXQgcHJlc2VuY2VTZXR0aW5ncyA9IChcclxuXHRcdGF3YWl0IGdldFN0b3JhZ2UoXCJsb2NhbFwiLCBgcFNldHRpbmdzXyR7cC5tZXRhZGF0YS5zZXJ2aWNlfWApXHJcblx0KVtgcFNldHRpbmdzXyR7cC5tZXRhZGF0YS5zZXJ2aWNlfWBdO1xyXG5cclxuXHRpZiAoIXByZXNlbmNlU2V0dGluZ3MgJiYgcC5tZXRhZGF0YS5zZXR0aW5ncykge1xyXG5cdFx0cHJlc2VuY2VTZXR0aW5ncyA9IHAubWV0YWRhdGEuc2V0dGluZ3M7XHJcblx0fVxyXG5cclxuXHRpZiAoXHJcblx0XHQhcHJlc2VuY2VTZXR0aW5ncy5maW5kKFxyXG5cdFx0XHRzID0+IHMuaWQgPT09IGxuZ1NldHRpbmcuaWQgJiYgcy52YWx1ZXMgJiYgcy52YWx1ZXMubGVuZ3RoID4gMFxyXG5cdFx0KVxyXG5cdCkge1xyXG5cdFx0Y29uc3QgdWlMYW5nID0gY2hyb21lLmkxOG4uZ2V0VUlMYW5ndWFnZSgpLFxyXG5cdFx0XHRwcmVmZXJyZWRWYWx1ZSA9IGxhbmd1YWdlcy5maW5kKGwgPT4gbC52YWx1ZSA9PT0gdWlMYW5nKTtcclxuXHJcblx0XHRsbmdTZXR0aW5nLnRpdGxlID0gYXdhaXQgZ2V0U3RyaW5nKFwiZ2VuZXJhbC5sYW5ndWFnZVwiLCB1aUxhbmcpO1xyXG5cdFx0bG5nU2V0dGluZy5pY29uID0gXCJmYXMgZmEtbGFuZ3VhZ2VcIjtcclxuXHRcdGxuZ1NldHRpbmcudmFsdWUgPSBwcmVmZXJyZWRWYWx1ZSA/IHByZWZlcnJlZFZhbHVlLnZhbHVlIDogREVGQVVMVF9MT0NBTEU7XHJcblx0XHRsbmdTZXR0aW5nLnZhbHVlcyA9IGxhbmd1YWdlcztcclxuXHJcblx0XHRjb25zdCBsbmdTZXR0aW5nSWR4ID0gcHJlc2VuY2VTZXR0aW5ncy5maW5kSW5kZXgoXHJcblx0XHRcdHMgPT4gcy5pZCA9PT0gbG5nU2V0dGluZy5pZFxyXG5cdFx0KTtcclxuXHRcdHByZXNlbmNlU2V0dGluZ3NbbG5nU2V0dGluZ0lkeF0gPSBsbmdTZXR0aW5nO1xyXG5cclxuXHRcdC8vKiBZb3UgbWF5IGJlIHdvbmRlcmluZywgd2h5IHRoZSBmdWNrIGRvIHlvdSBzdHJpbmdpZnkgYW5kIHBhcnNlIHRoaXM/IEd1ZXNzIHdoYXQgYmVjYXVzZSBGaXJlZm94IHN1Y2tzIGFuZCBicmVha3MgaXRzIHN0b3JhZ2VcclxuXHRcdC8vQHRzLWlnbm9yZVxyXG5cdFx0Y2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KFxyXG5cdFx0XHRKU09OLnBhcnNlKFxyXG5cdFx0XHRcdEpTT04uc3RyaW5naWZ5KHtcclxuXHRcdFx0XHRcdFtgcFNldHRpbmdzXyR7cC5tZXRhZGF0YS5zZXJ2aWNlfWBdOiBwcmVzZW5jZVNldHRpbmdzXHJcblx0XHRcdFx0fSlcclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcbn1cclxuIiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0aWYoX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSkge1xuXHRcdHJldHVybiBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gbW9kdWxlIGV4cG9ydHMgbXVzdCBiZSByZXR1cm5lZCBmcm9tIHJ1bnRpbWUgc28gZW50cnkgaW5saW5pbmcgaXMgZGlzYWJsZWRcbi8vIHJ1biBzdGFydHVwXG5yZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gKG1vZHVsZSkgPT4ge1xuXHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cblx0XHQoKSA9PiBtb2R1bGVbJ2RlZmF1bHQnXSA6XG5cdFx0KCkgPT4gbW9kdWxlO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBhbmQgbG9hZGluZyBjaHVua3Ncbi8vIHVuZGVmaW5lZCA9IGNodW5rIG5vdCBsb2FkZWQsIG51bGwgPSBjaHVuayBwcmVsb2FkZWQvcHJlZmV0Y2hlZFxuLy8gUHJvbWlzZSA9IGNodW5rIGxvYWRpbmcsIDAgPSBjaHVuayBsb2FkZWRcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdDQ2NDogMCxcblx0MjkzOiAwXG59O1xuXG52YXIgZGVmZXJyZWRNb2R1bGVzID0gW1xuXHRbOTcyOSw5OTldXG5dO1xuLy8gbm8gY2h1bmsgb24gZGVtYW5kIGxvYWRpbmdcblxuLy8gbm8gcHJlZmV0Y2hpbmdcblxuLy8gbm8gcHJlbG9hZGVkXG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3RcblxudmFyIGNoZWNrRGVmZXJyZWRNb2R1bGVzID0gKCkgPT4ge1xuXG59O1xuZnVuY3Rpb24gY2hlY2tEZWZlcnJlZE1vZHVsZXNJbXBsKCkge1xuXHR2YXIgcmVzdWx0O1xuXHRmb3IodmFyIGkgPSAwOyBpIDwgZGVmZXJyZWRNb2R1bGVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIGRlZmVycmVkTW9kdWxlID0gZGVmZXJyZWRNb2R1bGVzW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvcih2YXIgaiA9IDE7IGogPCBkZWZlcnJlZE1vZHVsZS5sZW5ndGg7IGorKykge1xuXHRcdFx0dmFyIGRlcElkID0gZGVmZXJyZWRNb2R1bGVbal07XG5cdFx0XHRpZihpbnN0YWxsZWRDaHVua3NbZGVwSWRdICE9PSAwKSBmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYoZnVsZmlsbGVkKSB7XG5cdFx0XHRkZWZlcnJlZE1vZHVsZXMuc3BsaWNlKGktLSwgMSk7XG5cdFx0XHRyZXN1bHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IGRlZmVycmVkTW9kdWxlWzBdKTtcblx0XHR9XG5cdH1cblx0aWYoZGVmZXJyZWRNb2R1bGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18ueCgpO1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblxuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuX193ZWJwYWNrX3JlcXVpcmVfXy54ID0gKCkgPT4ge1xuXHQvLyByZXNldCBzdGFydHVwIGZ1bmN0aW9uIHNvIGl0IGNhbiBiZSBjYWxsZWQgYWdhaW4gd2hlbiBtb3JlIHN0YXJ0dXAgY29kZSBpcyBhZGRlZFxuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnggPSAoKSA9PiB7XG5cblx0fVxuXHRjaHVua0xvYWRpbmdHbG9iYWwgPSBjaHVua0xvYWRpbmdHbG9iYWwuc2xpY2UoKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IGNodW5rTG9hZGluZ0dsb2JhbC5sZW5ndGg7IGkrKykgd2VicGFja0pzb25wQ2FsbGJhY2soY2h1bmtMb2FkaW5nR2xvYmFsW2ldKTtcblx0cmV0dXJuIChjaGVja0RlZmVycmVkTW9kdWxlcyA9IGNoZWNrRGVmZXJyZWRNb2R1bGVzSW1wbCkoKTtcbn07XG5cbi8vIGluc3RhbGwgYSBKU09OUCBjYWxsYmFjayBmb3IgY2h1bmsgbG9hZGluZ1xudmFyIHdlYnBhY2tKc29ucENhbGxiYWNrID0gKGRhdGEpID0+IHtcblx0dmFyIFtjaHVua0lkcywgbW9yZU1vZHVsZXMsIHJ1bnRpbWUsIGV4ZWN1dGVNb2R1bGVzXSA9IGRhdGE7XG5cdC8vIGFkZCBcIm1vcmVNb2R1bGVzXCIgdG8gdGhlIG1vZHVsZXMgb2JqZWN0LFxuXHQvLyB0aGVuIGZsYWcgYWxsIFwiY2h1bmtJZHNcIiBhcyBsb2FkZWQgYW5kIGZpcmUgY2FsbGJhY2tcblx0dmFyIG1vZHVsZUlkLCBjaHVua0lkLCBpID0gMCwgcmVzb2x2ZXMgPSBbXTtcblx0Zm9yKDtpIDwgY2h1bmtJZHMubGVuZ3RoOyBpKyspIHtcblx0XHRjaHVua0lkID0gY2h1bmtJZHNbaV07XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGluc3RhbGxlZENodW5rcywgY2h1bmtJZCkgJiYgaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0XHRyZXNvbHZlcy5wdXNoKGluc3RhbGxlZENodW5rc1tjaHVua0lkXVswXSk7XG5cdFx0fVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkXSA9IDA7XG5cdH1cblx0Zm9yKG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xuXHR3aGlsZShyZXNvbHZlcy5sZW5ndGgpIHtcblx0XHRyZXNvbHZlcy5zaGlmdCgpKCk7XG5cdH1cblxuXHQvLyBhZGQgZW50cnkgbW9kdWxlcyBmcm9tIGxvYWRlZCBjaHVuayB0byBkZWZlcnJlZCBsaXN0XG5cdGlmKGV4ZWN1dGVNb2R1bGVzKSBkZWZlcnJlZE1vZHVsZXMucHVzaC5hcHBseShkZWZlcnJlZE1vZHVsZXMsIGV4ZWN1dGVNb2R1bGVzKTtcblxuXHQvLyBydW4gZGVmZXJyZWQgbW9kdWxlcyB3aGVuIGFsbCBjaHVua3MgcmVhZHlcblx0cmV0dXJuIGNoZWNrRGVmZXJyZWRNb2R1bGVzKCk7XG59XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rcG1kXCJdID0gc2VsZltcIndlYnBhY2tDaHVua3BtZFwiXSB8fCBbXTtcbnZhciBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiA9IGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gd2VicGFja0pzb

Cannot reproduce.

  • Browser version: Edge Version 91.0.859.0 (Official build) canary (64-bit)
  • Extension Version: 2.2.3
  • Extensions: uBlock Origin, PreMiD, Bitwarden, Dark Reader, SponsorBlock

Also note that canary is not the latest stable build where most people will be on. As such development may break until the canary patch hits live, which may be months to years depending on the development cycle.

My Current version:

JustArion commented 3 years ago

msedge-Dawn-451-179-NU

JustArion commented 3 years ago

It's because of multiLang - not ublock 🤦 and still cannot reproduce your issue - ext ver 2.2.4 :P

msedge-Dawn-1346-619-NV 2.2.3 is latest on edge

additionally, multilang? what do you mean?

gkp1 commented 3 years ago

It's because of multiLang - not ublock 🤦 and still cannot reproduce your issue - ext ver 2.2.4 :P

I have no idea what you mean by multiLang

update: I mostly use ytmusic on my phone+headphone nowadays, so even though I created this issue, I don't know if the issue is still present.

Bas950 commented 3 years ago

@Arion-Kun @gkp1 please sign up for BETA here and see if the BETA version fixes the issue for you.

EncryptedDev commented 2 years ago

I believe this has been fixed now