@asgardeo/vue
Version:
Vue SDK for Asgardeo - Authentication and Identity Management
1,591 lines • 400 kB
JavaScript
import { reactive, ref, inject } from 'vue';
/******************************************************************************
Copyright (c) Microsoft Corporation.
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
***************************************************************************** */
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
function __awaiter(thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
}
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
var e = new Error(message);
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
};
function e(e,t,l,i){return new(l||(l=Promise))((function(n,o){function d(e){try{a(i.next(e));}catch(e){o(e);}}function c(e){try{a(i.throw(e));}catch(e){o(e);}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t);}))).then(d,c);}a((i=i.apply(e,[])).next());}))}function t(e,t,l,i){return new(l||(l=Promise))((function(n,o){function d(e){try{a(i.next(e));}catch(e){o(e);}}function c(e){try{a(i.throw(e));}catch(e){o(e);}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t);}))).then(d,c);}a((i=i.apply(e,[])).next());}))}var l;!function(e){e.formPost="form_post",e.query="query",e.direct="direct";}(l||(l={}));const i="{{token}}",n="{{username}}",o="{{scope}}",d="{{clientID}}",c="{{clientSecret}}";var a;!function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data";}(a||(a={}));const s="refresh_token_timer",Z="pkce_code_verifier",r="#",u=["RS256","RS512","RS384","PS256"],b="code",h="session_state",m="sign_out_url",I="sign_out_success",G="state",p="openid";var g;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit";}(g||(g={}));class X{constructor(e,t,l){this.message=l,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype);}}class y{constructor(){}static filterClaimsFromIDTokenPayload(e){const t=Object.assign({},e);null==t||delete t.iss,null==t||delete t.aud,null==t||delete t.exp,null==t||delete t.iat,null==t||delete t.acr,null==t||delete t.amr,null==t||delete t.azp,null==t||delete t.auth_time,null==t||delete t.nonce,null==t||delete t.c_hash,null==t||delete t.at_hash,null==t||delete t.nbf,null==t||delete t.isk,null==t||delete t.sid;const l={};return Object.entries(t).forEach((([e,t])=>{const i=e.split("_").map(((e,t)=>0===t?e:[e[0].toUpperCase(),...e.slice(1)].join(""))).join("");l[i]=t;})),l}static getTokenRequestHeaders(){return {Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}static generateStateParamForRequestCorrelation(e,t){const l=parseInt(e.split("#")[1]);return t?`${t}_request_${l}`:`request_${l}`}static extractPKCEKeyFromStateParam(e){return `pkce_code_verifier#${parseInt(e.split("request_")[1])}`}}y.getTenantDomainFromIdTokenPayload=(e,t="@")=>{const l=e.sub.split(t);return l.length>2?l[l.length-1]:""};class V{constructor(e,l){this._dataLayer=e,this._config=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=l;}resolveEndpoints(e){return t(this,void 0,void 0,(function*(){const t={},l=yield this._config();return l.endpoints&&Object.keys(l.endpoints).forEach((e=>{const i=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));t[i]=(null==l?void 0:l.endpoints)?l.endpoints[e]:"";})),Object.assign(Object.assign({},e),t)}))}resolveEndpointsExplicitly(){return t(this,void 0,void 0,(function*(){const e={},t=yield this._config();if(!t.endpoints||!["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"].every((e=>!!t.endpoints&&Object.keys(t.endpoints).some((t=>t.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`))===e)))))throw new X("JS-AUTH_HELPER-REE-NF01","Required endpoints missing","Some or all of the required endpoints are missing in the object passed to the `endpoints` attribute of the`AuthConfig` object.");return t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:"";})),Object.assign({},e)}))}resolveEndpointsByBaseURL(){return t(this,void 0,void 0,(function*(){const e={},t=yield this._config(),l=t.baseUrl;if(!l)throw new X("JS-AUTH_HELPER_REBO-NF01","Base URL not defined.","Base URL is not defined in AuthClient config.");t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:"";}));const i={authorization_endpoint:`${l}/oauth2/authorize`,end_session_endpoint:`${l}/oidc/logout`,issuer:`${l}/oauth2/token`,jwks_uri:`${l}/oauth2/jwks`,check_session_iframe:`${l}/oidc/checksession`,revocation_endpoint:`${l}/oauth2/revoke`,token_endpoint:`${l}/oauth2/token`,userinfo_endpoint:`${l}/oauth2/userinfo`};return Object.assign(Object.assign({},i),e)}))}validateIdToken(e){var l;return t(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();if(!t||0===t.trim().length)throw new X("JS_AUTH_HELPER-VIT-NF01","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty.");let n;try{n=yield fetch(t,{credentials:i.sendCookiesInRequests?g.Include:g.SameOrigin});}catch(t){throw new X("JS-AUTH_HELPER-VIT-NE02","Request to jwks endpoint failed.",null!=t?t:"The request sent to get the jwks from the server failed.")}if(200!==n.status||!n.ok)throw new X("JS-AUTH_HELPER-VIT-HE03",`Invalid response status received for jwks request (${n.statusText}).`,yield n.json());const o=(yield this._oidcProviderMetaData()).issuer,{keys:d}=yield n.json(),c=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],d);return this._cryptoHelper.isValidIdToken(e,c,(yield this._config()).clientID,null!=o?o:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance,null===(l=(yield this._config()).validateIDTokenIssuer)||void 0===l||l)}))}getAuthenticatedUserInfo(e){var t,l,i,n;const o=this._cryptoHelper.decodeIDToken(e),d=y.getTenantDomainFromIdTokenPayload(o),c=null!==(t=null==o?void 0:o.username)&&void 0!==t?t:"",a=null!==(l=o.given_name)&&void 0!==l?l:"",s=null!==(i=o.family_name)&&void 0!==i?i:"",Z=a&&s?`${a} ${s}`:a||s||"",r=null!==(n=o.preferred_username)&&void 0!==n?n:Z;return Object.assign({displayName:r,tenantDomain:d,username:c},y.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,l){var i;return t(this,void 0,void 0,(function*(){let t="openid";const n=yield this._config(),o=yield this._dataLayer.getSessionData(l);return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),t=n.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",t).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(i=n.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e);}))}handleTokenResponse(e,l){return t(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new X("JS-AUTH_HELPER-HTR-NE01",`Invalid response status received for token request (${e.statusText}).`,yield e.json());const i=yield e.json();if(i.created_at=(new Date).getTime(),(yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((()=>t(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,l);const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}))));{const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return yield this._dataLayer.setSessionData(i,l),Promise.resolve(e)}}))}generatePKCEKey(e){var l;return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getTemporaryData(e),i=[];Object.keys(t).forEach((e=>{e.startsWith("pkce_code_verifier")&&i.push(e);}));const n=i.sort().pop();return `pkce_code_verifier#${parseInt(null!==(l=null==n?void 0:n.split("#")[1])&&void 0!==l?l:"-1")+1}`}))}}class W{constructor(e){this._cryptoUtils=e;}getCodeVerifier(){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.generateRandomBytes(32))}getCodeChallenge(e){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.hashSha256(e))}getJWKForTheIdToken(e,t){const l=JSON.parse(this._cryptoUtils.base64URLDecode(e));for(const e of t)if(l.kid===e.kid)return e;throw new X("JS-CRYPTO_UTIL-GJFTIT-IV01","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+l.kid+", Expected values: "+t.map((e=>e.kid)).join(", "))}isValidIdToken(e,t,l,i,n,o,d){return this._cryptoUtils.verifyJwt(e,t,u,l,i,n,o,d).then((e=>e?Promise.resolve(true):Promise.reject(new X("JS-CRYPTO_HELPER-IVIT-IV01","Invalid ID token.","ID token validation returned false"))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new X("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class C{constructor(e,l){this._cryptoUtils=l,this._cryptoHelper=new W(l),this._authenticationHelper=new V(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}));}getAuthorizationURLParams(e,l){var i,n,o;return t(this,void 0,void 0,(function*(){const t=yield this._config(),d=new Map;d.set("response_type","code"),d.set("client_id",t.clientID),t.clientSecret&&t.clientSecret.trim().length>0&&d.set("client_secret",t.clientSecret);let c="openid";t.scope&&t.scope.length>0&&(t.scope.includes("openid")||t.scope.push("openid"),c=t.scope.join(" ")),d.set("scope",c),d.set("redirect_uri",t.signInRedirectURL),t.responseMode&&d.set("response_mode",t.responseMode);const a=yield this._authenticationHelper.generatePKCEKey(l);if(t.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),t=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(a,e,l),d.set("code_challenge_method","S256"),d.set("code_challenge",t);}t.prompt&&d.set("prompt",t.prompt);const s=e;if(s)for(const[e,t]of Object.entries(s))""!=e&&""!=t&&"state"!==e&&d.set(e,t.toString());return d.set("state",y.generateStateParamForRequestCorrelation(a,s?null===(o=s.state)||void 0===o?void 0:o.toString():"")),d}))}getAuthorizationURL(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint");if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GAU-NF01","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const i=new URL(t),n=yield this.getAuthorizationURLParams(e,l);for(const[e,t]of n.entries())i.searchParams.append(e,t);return i.toString()}))}requestAccessToken(e,l,i,n,o){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,d=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT1-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");l&&(yield this._dataLayer.setSessionDataParameter("session_state",l,n));const c=new URLSearchParams;c.set("client_id",d.clientID),d.clientSecret&&d.clientSecret.trim().length>0&&c.set("client_secret",d.clientSecret);const a=e;let s;c.set("code",a),c.set("grant_type","authorization_code"),c.set("redirect_uri",d.signInRedirectURL),(null==o?void 0:o.params)&&Object.entries(o.params).forEach((([e,t])=>{c.append(e,t);})),d.enablePKCE&&(c.set("code_verifier",`${yield this._dataLayer.getTemporaryDataParameter(y.extractPKCEKeyFromStateParam(i),n)}`),yield this._dataLayer.removeTemporaryDataParameter(y.extractPKCEKeyFromStateParam(i),n));try{s=yield fetch(t,{body:c,credentials:d.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"});}catch(t){throw new X("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=t?t:"The request to get the access token from the server failed.")}if(!s.ok)throw new X("JS-AUTH_CORE-RAT1-HE03",`Requesting access token failed with ${s.statusText}`,yield s.json());return yield this._authenticationHelper.handleTokenResponse(s,n)}))}refreshAccessToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config(),i=yield this._dataLayer.getSessionData(e);if(!i.refresh_token)throw new X("JS-AUTH_CORE-RAT2-NF01","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled.");if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT2-NF02","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty.");const n=[];let o;n.push(`client_id=${l.clientID}`),n.push(`refresh_token=${i.refresh_token}`),n.push("grant_type=refresh_token"),l.clientSecret&&l.clientSecret.trim().length>0&&n.push(`client_secret=${l.clientSecret}`);try{o=yield fetch(t,{body:n.join("&"),credentials:l.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"});}catch(t){throw new X("JS-AUTH_CORE-RAT2-NR03","Refresh access token request failed.",null!=t?t:"The request to refresh the access token failed.")}if(!o.ok)throw new X("JS-AUTH_CORE-RAT2-HE04",`Refreshing access token failed with ${o.statusText}`,yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,l=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT3-NF01","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty.");const i=[];let n;i.push(`client_id=${l.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData(e)).access_token}`),i.push("token_type_hint=access_token");try{n=yield fetch(t,{body:i.join("&"),credentials:l.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"});}catch(t){throw new X("JS-AUTH_CORE-RAT3-NE02","The request to revoke access token failed.",null!=t?t:"The request sent to revoke the access token failed.")}if(200!==n.status||!n.ok)throw new X("JS-AUTH_CORE-RAT3-HE03",`Invalid response status received for revoke access token request (${n.statusText}).`,yield n.json());return this._authenticationHelper.clearUserSessionData(e),Promise.resolve(n)}))}requestCustomGrant(e,l){return t(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let o;if(o=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!o||0===o.trim().length)throw new X("JS-AUTH_CORE-RCG-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");const d=yield Promise.all(Object.entries(e.data).map((([e,i])=>t(this,void 0,void 0,(function*(){const t=yield this._authenticationHelper.replaceCustomGrantTemplateTags(i,l);return `${e}=${t}`})))));let c=Object.assign({},y.getTokenRequestHeaders());e.attachToken&&(c=Object.assign(Object.assign({},c),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData(l)).access_token}`}));const a={body:d.join("&"),credentials:n.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(c),method:"POST"};let s;try{s=yield fetch(o,a);}catch(e){throw new X("JS-AUTH_CORE-RCG-NE02","The custom grant request failed.",null!=e?e:"The request sent to get the custom grant failed.")}if(200!==s.status||!s.ok)throw new X("JS-AUTH_CORE-RCG-HE03",`Invalid response status received for the custom grant request. (${s.statusText})`,yield s.json());return e.returnsSession?this._authenticationHelper.handleTokenResponse(s,l):Promise.resolve(yield s.json())}))}getBasicUserInfo(e){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(e),l=this._authenticationHelper.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(l).forEach((e=>{ void 0!==l[e]&&""!==l[e]&&null!==l[e]||delete l[e];})),i=Object.assign(Object.assign({},i),l),i}))}getDecodedIDToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getCryptoHelper(){return t(this,void 0,void 0,(function*(){return this._cryptoHelper}))}getIDToken(e){return t(this,void 0,void 0,(function*(){return (yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return t(this,void 0,void 0,(function*(){const t=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const l=t.wellKnownEndpoint;if(l){let e;try{if(e=yield fetch(l),200!==e.status||!e.ok)throw new Error}catch(t){throw new X("JS-AUTH_CORE-GOPMD-HE01","Invalid well-known response","The well known endpoint response has been failed with an error.")}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",true),Promise.resolve()}if(t.baseUrl){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL());}catch(t){throw new X("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=t?t:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",true),Promise.resolve()}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",true),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,l,i,n,o,d,c,a,s,Z;return t(this,void 0,void 0,(function*(){const t=yield this._oidcProviderMetaData();return {authorizationEndpoint:null!==(e=t.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(l=t.check_session_iframe)&&void 0!==l?l:"",endSessionEndpoint:null!==(i=t.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=t.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(o=t.issuer)&&void 0!==o?o:"",jwksUri:null!==(d=t.jwks_uri)&&void 0!==d?d:"",registrationEndpoint:null!==(c=t.registration_endpoint)&&void 0!==c?c:"",revocationEndpoint:null!==(a=t.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(s=t.token_endpoint)&&void 0!==s?s:"",userinfoEndpoint:null!==(Z=t.userinfo_endpoint)&&void 0!==Z?Z:""}}))}getSignOutURL(e){var l,i,n;return t(this,void 0,void 0,(function*(){const t=null===(l=yield this._oidcProviderMetaData())||void 0===l?void 0:l.end_session_endpoint,o=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF01","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const d=null!==(i=null==o?void 0:o.signOutRedirectURL)&&void 0!==i?i:null==o?void 0:o.signInRedirectURL;if(!d||0===d.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF03","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");const c=new URLSearchParams;if(c.set("post_logout_redirect_uri",d),o.sendIdTokenInLogoutRequest){const t=null===(n=yield this._dataLayer.getSessionData(e))||void 0===n?void 0:n.id_token;if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF02","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");c.set("id_token_hint",t);}else c.set("client_id",o.clientID);return c.set("state","sign_out_success"),`${t}?${c.toString()}`}))}clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._authenticationHelper.clearUserSessionData(e);}))}getAccessToken(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.access_token}))}getCreatedAt(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.created_at}))}getExpiresIn(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.expires_in}))}isAuthenticated(e){return t(this,void 0,void 0,(function*(){const t=Boolean(yield this.getAccessToken(e)),l=yield this.getCreatedAt(e),i=yield this.getExpiresIn(e);if(!i)return false;const n=1e3*parseInt(i),o=(new Date).getTime();return t&&l+n>o}))}getPKCECode(e,l){return t(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(y.extractPKCEKeyFromStateParam(e),l)}))}setPKCECode(e,l,i){return t(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(y.extractPKCEKeyFromStateParam(l),e,i)}))}updateConfig(e){return t(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),yield this.getOIDCProviderMetaData(true);}))}}const R="asgardeo-session-active";class S{constructor(e,t){this._id=e,this._store=t;}setDataInBulk(e,l){var i;return t(this,void 0,void 0,(function*(){const t=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=t&&JSON.parse(t),o=Object.assign(Object.assign({},n),l),d=JSON.stringify(o);yield this._store.setData(e,d);}))}setValue(e,l,i){var n;return t(this,void 0,void 0,(function*(){const t=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=t&&JSON.parse(t),d=Object.assign(Object.assign({},o),{[l]:i}),c=JSON.stringify(d);yield this._store.setData(e,c);}))}removeValue(e,l){var i;return t(this,void 0,void 0,(function*(){const t=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=t&&JSON.parse(t),o=Object.assign({},n);delete o[l];const d=JSON.stringify(o);yield this._store.setData(e,d);}))}_resolveKey(e,t){return t?`${e}-${this._id}-${t}`:`${e}-${this._id}`}isLocalStorageAvailable(){try{const e="__ASGARDEO_AUTH_CORE_LOCAL_STORAGE_TEST__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return false}}setConfigData(e){return t(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(a.ConfigData),e);}))}setOIDCProviderMetaData(e){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.OIDCProviderMetaData),e);}))}setTemporaryData(e,l){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.TemporaryData,l),e);}))}setSessionData(e,l){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.SessionData,l),e);}))}setCustomData(e,l,i){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e,i),l);}))}getConfigData(){var e;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(a.ConfigData)))&&void 0!==e?e:null)}))}getOIDCProviderMetaData(){var e;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(a.OIDCProviderMetaData)))&&void 0!==e?e:null)}))}getTemporaryData(e){var l;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(l=yield this._store.getData(this._resolveKey(a.TemporaryData,e)))&&void 0!==l?l:null)}))}getSessionData(e){var l;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(l=yield this._store.getData(this._resolveKey(a.SessionData,e)))&&void 0!==l?l:null)}))}getCustomData(e,l){var i;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e,l)))&&void 0!==i?i:null)}))}setSessionStatus(e){this.isLocalStorageAvailable()&&localStorage.setItem("asgardeo-session-active",e);}getSessionStatus(){var e;return this.isLocalStorageAvailable()&&null!==(e=localStorage.getItem("asgardeo-session-active"))&&void 0!==e?e:""}removeSessionStatus(){this.isLocalStorageAvailable()&&localStorage.removeItem("asgardeo-session-active");}removeConfigData(){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.ConfigData));}))}removeOIDCProviderMetaData(){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.OIDCProviderMetaData));}))}removeTemporaryData(e){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.TemporaryData,e));}))}removeSessionData(e){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.SessionData,e));}))}getConfigDataParameter(e){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.ConfigData));return t&&JSON.parse(t)[e]}))}getOIDCProviderMetaDataParameter(e){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.OIDCProviderMetaData));return t&&JSON.parse(t)[e]}))}getTemporaryDataParameter(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.TemporaryData,l));return t&&JSON.parse(t)[e]}))}getSessionDataParameter(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.SessionData,l));return t&&JSON.parse(t)[e]}))}setConfigDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.ConfigData),e,l);}))}setOIDCProviderMetaDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.OIDCProviderMetaData),e,l);}))}setTemporaryDataParameter(e,l,i){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.TemporaryData,i),e,l);}))}setSessionDataParameter(e,l,i){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.SessionData,i),e,l);}))}removeConfigDataParameter(e){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.ConfigData),e);}))}removeOIDCProviderMetaDataParameter(e){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.OIDCProviderMetaData),e);}))}removeTemporaryDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.TemporaryData,l),e);}))}removeSessionDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.SessionData,l),e);}))}}const Y={clockTolerance:300,enablePKCE:true,responseMode:l.query,scope:["openid"],sendCookiesInRequests:true,validateIDToken:true,validateIDTokenIssuer:true};class v{
/**
* This is the constructor method that returns an instance of the .
*
* @param store - The store object.
*
* @example
* ```
* const _store: Store = new DataStore();
* const auth = new AsgardeoAuthClient<CustomClientConfig>(_store);
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#constructor}
*
* @preserve
*/
constructor(){}
/**
*
* This method initializes the SDK with the config data.
*
* @param config - The config object to initialize with.
*
* @example
* const config = \{
* signInRedirectURL: "http://localhost:3000/sign-in",
* clientID: "client ID",
* baseUrl: "https://localhost:9443"
* \}
*
* await auth.initialize(config);
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#initialize}
*
* @preserve
*/initialize(e,l,i,n){var o,d,c;return t(this,void 0,void 0,(function*(){const t=e.clientID;v._instanceID?v._instanceID+=1:v._instanceID=0,n&&(v._instanceID=n),this._dataLayer=new S(t?`instance_${v._instanceID}-${t}`:`instance_${v._instanceID}`,l),this._authenticationCore=new C(this._dataLayer,i),v._authenticationCore=new C(this._dataLayer,i),yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},Y),e),{scope:[...null!==(o=Y.scope)&&void 0!==o?o:[],...null!==(c=null===(d=e.scope)||void 0===d?void 0:d.filter((e=>{var t;return !(null===(t=null==Y?void 0:Y.scope)||void 0===t?void 0:t.includes(e))})))&&void 0!==c?c:[]]}));}))}
/**
* This method returns the `DataLayer` object that allows you to access authentication data.
*
* @returns - The `DataLayer` object.
*
* @example
* ```
* const data = auth.getDataLayer();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getDataLayer}
*
* @preserve
*/getDataLayer(){return this._dataLayer}
/**
* This method returns the `instanceID` variable of the given instance.
*
* @returns - The `instanceID` number.
*
* @example
* ```
* const instanceId = auth.getInstanceID();
* ```
*
* @preserve
*/getInstanceID(){return v._instanceID}
/**
* This is an async method that returns a Promise that resolves with the authorization URL parameters.
*
* @param config - (Optional) A config object to force initialization and pass
* custom path parameters such as the `fidp` parameter.
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A promise that resolves with the authorization URL parameters.
*
* @example
* ```
* auth.getAuthorizationURLParams().then((params)=>{
* // console.log(params);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getAuthorizationURLParams}
*
* @preserve
*/getAuthorizationURLParams(e,l){return t(this,void 0,void 0,(function*(){const t=Object.assign({},e);return null==t||delete t.forceInit,(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.getAuthorizationURLParams(t,l):this._authenticationCore.getOIDCProviderMetaData(null==e?void 0:e.forceInit).then((()=>this._authenticationCore.getAuthorizationURLParams(t,l)))}))}
/**
* This is an async method that returns a Promise that resolves with the authorization URL.
*
* @param config - (Optional) A config object to force initialization and pass
* custom path parameters such as the fidp parameter.
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A promise that resolves with the authorization URL.
*
* @example
* ```
* auth.getAuthorizationURL().then((url)=>{
* // console.log(url);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getAuthorizationURL}
*
* @preserve
*/getAuthorizationURL(e,l){return t(this,void 0,void 0,(function*(){const t=Object.assign({},e);return null==t||delete t.forceInit,(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.getAuthorizationURL(t,l):this._authenticationCore.getOIDCProviderMetaData(null==e?void 0:e.forceInit).then((()=>this._authenticationCore.getAuthorizationURL(t,l)))}))}
/**
* This is an async method that sends a request to obtain the access token and returns a Promise
* that resolves with the token and other relevant data.
*
* @param authorizationCode - The authorization code.
* @param sessionState - The session state.
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with the token response.
*
* @example
* ```
* auth.requestAccessToken(authCode, sessionState).then((token)=>{
* // console.log(token);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#requestAccessToken}
*
*
* @preserve
*/requestAccessToken(e,l,i,n,o){return t(this,void 0,void 0,(function*(){return (yield this._dataLayer.getTemporaryDataParameter("op_config_initiated"))?this._authenticationCore.requestAccessToken(e,l,i,n,o):this._authenticationCore.getOIDCProviderMetaData(false).then((()=>this._authenticationCore.requestAccessToken(e,l,i,n,o)))}))}
/**
* This method returns the sign-out URL.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* **This doesn't clear the authentication data.**
*
* @returns - A Promise that resolves with the sign-out URL.
*
* @example
* ```
* const signOutUrl = await auth.getSignOutURL();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getSignOutURL}
*
* @preserve
*/getSignOutURL(e){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getSignOutURL(e)}))}
/**
* This method returns OIDC service endpoints that are fetched from the `.well-known` endpoint.
*
* @returns - A Promise that resolves with an object containing the OIDC service endpoints.
*
* @example
* ```
* const endpoints = await auth.getOIDCServiceEndpoints();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getOIDCServiceEndpoints}
*
* @preserve
*/getOIDCServiceEndpoints(){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getOIDCServiceEndpoints()}))}
/**
* This method decodes the payload of the ID token and returns it.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with the decoded ID token payload.
*
* @example
* ```
* const decodedIdToken = await auth.getDecodedIDToken();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getDecodedIDToken}
*
* @preserve
*/getDecodedIDToken(e){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getDecodedIDToken(e)}))}
/**
* This method returns the ID token.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with the ID token.
*
* @example
* ```
* const idToken = await auth.getIDToken();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getIDToken}
*
* @preserve
*/getIDToken(e){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getIDToken(e)}))}
/**
* This method returns the basic user information obtained from the ID token.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with an object containing the basic user information.
*
* @example
* ```
* const userInfo = await auth.getBasicUserInfo();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getBasicUserInfo}
*
* @preserve
*/getBasicUserInfo(e){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getBasicUserInfo(e)}))}
/**
* This method returns the crypto helper object.
*
* @returns - A Promise that resolves with a CryptoHelper object.
*
* @example
* ```
* const cryptoHelper = await auth.CryptoHelper();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getCryptoHelper}
*
* @preserve
*/getCryptoHelper(){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getCryptoHelper()}))}
/**
* This method revokes the access token.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* **This method also clears the authentication data.**
*
* @returns - A Promise that returns the response of the revoke-access-token request.
*
* @example
* ```
* auth.revokeAccessToken().then((response)=>{
* // console.log(response);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#revokeAccessToken}
*
* @preserve
*/revokeAccessToken(e){return this._authenticationCore.revokeAccessToken(e)}
/**
* This method refreshes the access token and returns a Promise that resolves with the new access
* token and other relevant data.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with the token response.
*
* @example
* ```
* auth.refreshAccessToken().then((response)=>{
* // console.log(response);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#refreshAccessToken}
*
* @preserve
*/refreshAccessToken(e){return this._authenticationCore.refreshAccessToken(e)}
/**
* This method returns the access token.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with the access token.
*
* @example
* ```
* const accessToken = await auth.getAccessToken();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getAccessToken}
*
* @preserve
*/getAccessToken(e){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getAccessToken(e)}))}
/**
* This method sends a custom-grant request and returns a Promise that resolves with the response
* depending on the config passed.
*
* @param config - A config object containing the custom grant configurations.
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with the response depending
* on your configurations.
*
* @example
* ```
* const config = {
* attachToken: false,
* data: {
* client_id: "{{clientID}}",
* grant_type: "account_switch",
* scope: "{{scope}}",
* token: "{{token}}",
* },
* id: "account-switch",
* returnResponse: true,
* returnsSession: true,
* signInRequired: true
* }
*
* auth.requestCustomGrant(config).then((response)=>{
* // console.log(response);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#requestCustomGrant}
*
* @preserve
*/requestCustomGrant(e,t){return this._authenticationCore.requestCustomGrant(e,t)}
/**
* This method returns if the user is authenticated or not.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @returns - A Promise that resolves with `true` if the user is authenticated, `false` otherwise.
*
* @example
* ```
* await auth.isAuthenticated();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#isAuthenticated}
*
* @preserve
*/isAuthenticated(e){return t(this,void 0,void 0,(function*(){return this._authenticationCore.isAuthenticated(e)}))}
/**
* This method returns the PKCE code generated during the generation of the authentication URL.
*
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
* @param state - The state parameter that was passed in the authentication URL.
*
* @returns - A Promise that resolves with the PKCE code.
*
* @example
* ```
* const pkce = await getPKCECode();
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getPKCECode}
*
* @preserve
*/getPKCECode(e,l){return t(this,void 0,void 0,(function*(){return this._authenticationCore.getPKCECode(e,l)}))}
/**
* This method sets the PKCE code to the data store.
*
* @param pkce - The PKCE code.
* @param state - The state parameter that was passed in the authentication URL.
* @param userID - (Optional) A unique ID of the user to be authenticated. This is useful in multi-user
* scenarios where each user should be uniquely identified.
*
* @example
* ```
* await auth.setPKCECode("pkce_code")
* ```
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#setPKCECode}
*
* @preserve
*/setPKCECode(e,l,i){return t(this,void 0,void 0,(function*(){yield this._authenticationCore.setPKCECode(e,l,i);}))}
/**
* This method returns if the sign-out is successful or not.
*
* @param signOutRedirectUrl - The URL to which the user has been redirected to after signing-out.
*
* **The server appends path parameters to the `signOutRedirectURL` and these path parameters
* are required for this method to function.**
*
* @returns - `true` if successful, `false` otherwise.
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#isSignOutSuccessful}
*
* @preserve
*/static isSignOutSuccessful(e){const t=new URL(e),l=t.searchParams.get("state"),i=Boolean(t.searchParams.get("error"));return !!l&&"sign_out_success"===l&&!i}
/**
* This method returns if the sign-out has failed or not.
*
* @param signOutRedirectUrl - The URL to which the user has been redirected to after signing-out.
*
* **The server appends path parameters to the `signOutRedirectURL` and these path parameters
* are required for this method to function.**
*
* @returns - `true` if successful, `false` otherwise.
*
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#didSignOutFail}
*
* @preserve
*/static didSignOutFail(e){const t=new URL(e),l=t.searchParams.get("state"),i=Boolean(t.searchParams.get("error"));return !!l&&"sign_out_success"===l&&i}
/**
* This method updates the configuration that was passed into the constructor when instantiating this class.
*
* @param config - A config object to update the SDK configurations with.
*
* @example
* ```
* const config = {
* signInRedirectURL: "http://localhost:3000/sign-in",
* clientID: "client ID",
* baseUrl: "https://localhost:9443"
* }
*
* await auth.updateConfig(config);
* ```
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#updateConfig}
*
* @preserve
*/updateConfig(e){return t(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e);}))}static clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._authenticationCore.clearUserSessionData(e);}))}}function K(e,t,l){var i=void 0===t?null:t,n=function(e,t){var l=atob(e);if(t){for(var i=new Uint8Array(l.length),n=0,o=l.length;n<o;++n)i[n]=l.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return l}(e,void 0!==l&&l),o=n.indexOf("\n",10)+1,d=n.substring(o)+(i?"//# sourceMappingURL="+i:""),c=new Blob([d],{type:"application/javascript"});return URL.createObjectURL(c)}var N,J,H,f,U=(N="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbixyKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKHIubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhyLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKHI9ci5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX1mdW5jdGlvbiB0KGUsdCxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciBuOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5IixlLmRpcmVjdD0iZGlyZWN0In0obnx8KG49e30pKTt2YXIgcjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KHJ8fChyPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il0scz0ic2lnbl9vdXRfdXJsIjt2YXIgYTshZnVuY3Rpb24oZSl7ZS5JbmNsdWRlPSJpbmNsdWRlIixlLlNhbWVPcmlnaW49InNhbWUtb3JpZ2luIixlLk9taXQ9Im9taXQifShhfHwoYT17fSkpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubWVzc2FnZT1uLHRoaXMubmFtZT10LHRoaXMuY29kZT1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO2NvbnN0IG49e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbZSx0XSk9Pntjb25zdCByPWUuc3BsaXQoIl8iKS5tYXAoKChlLHQpPT4wPT09dD9lOltlWzBdLnRvVXBwZXJDYXNlKCksLi4uZS5zbGljZSgxKV0uam9pbigiIikpKS5qb2luKCIiKTtuW3JdPXR9KSksbn1zdGF0aWMgZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpe3JldHVybntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifX1zdGF0aWMgZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGUsdCl7Y29uc3Qgbj1wYXJzZUludChlLnNwbGl0KCIjIilbMV0pO3JldHVybiB0P2Ake3R9X3JlcXVlc3RfJHtufWA6YHJlcXVlc3RfJHtufWB9c3RhdGljIGV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSl7cmV0dXJuYHBrY2VfY29kZV92ZXJpZmllciMke3BhcnNlSW50KGUuc3BsaXQoInJlcXVlc3RfIilbMV0pfWB9fXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkPShlLHQ9IkAiKT0+e2NvbnN0IG49ZS5zdWIuc3BsaXQodCk7cmV0dXJuIG4ubGVuZ3RoPjI/bltuLmxlbmd0aC0xXToiIn07Y2xhc3MgbHtjb25zdHJ1Y3RvcihlLG4pe3RoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpLHRoaXMuX2NyeXB0b0hlbHBlcj1ufXJlc29sdmVFbmRwb2ludHMoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LG49eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIG4uZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhuLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IHI9ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W3JdPShudWxsPT1uP3ZvaWQgMDpuLmVuZHBvaW50cyk/bi5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVFbmRwb2ludHNFeHBsaWNpdGx5KCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXt9LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXQuZW5kcG9pbnRzfHwhWyJhdXRob3JpemF0aW9uX2VuZHBvaW50IiwiZW5kX3Nlc3Npb25fZW5kcG9pbnQiLCJqd2tzX3VyaSIsImNoZWNrX3Nlc3Npb25faWZyYW1lIiwicmV2b2NhdGlvbl9lbmRwb2ludCIsInRva2VuX2VuZHBvaW50IiwiaXNzdWVyIiwidXNlcmluZm9fZW5kcG9pbnQiXS5ldmVyeSgoZT0+ISF0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLnNvbWUoKHQ9PnQucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk9PT1lKSkpKSl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItUkVFLU5GMDEiLCJSZXF1aXJlZCBlbmRwb2ludHMgbWlzc2luZyIsIlNvbWUgb3IgYWxsIG9mIHRoZSByZXF1aXJlZCBlbmRwb2ludHMgYXJlIG1pc3NpbmcgaW4gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGBlbmRwb2ludHNgIGF0dHJpYnV0ZSBvZiB0aGVgQXV0aENvbmZpZ2Agb2JqZWN0LiIpO3JldHVybiB0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKG49Pntjb25zdCByPW4ucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtyXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW25dOiIifSkpLE9iamVjdC5hc3NpZ24oe30sZSl9KSl9cmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLG49dC5iYXNlVXJsO2lmKCFuKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUl9SRUJPLU5GMDEiLCJCYXNlIFVSTCBub3QgZGVmaW5lZC4iLCJCYXNlIFVSTCBpcyBub3QgZGVmaW5lZCBpbiBBdXRoQ2xpZW50IGNvbmZpZy4iKTt0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKG49Pntjb25zdCByPW4ucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtyXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW25dOiIifSkpO2NvbnN0IHI9e2F1dGhvcml6YXRpb25fZW5kcG9pbnQ6YCR7bn0vb2F1dGgyL2F1dGhvcml6ZWAsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6YCR7bn0vb2lkYy9sb2dvdXRgLGlzc3VlcjpgJHtufS9vYXV0aDIvdG9rZW5gLGp3a3NfdXJpOmAke259L29hdXRoMi9qd2tzYCxjaGVja19zZXNzaW9uX2lmcmFtZTpgJHtufS9vaWRjL2NoZWNrc2Vzc2lvbmAscmV2b2NhdGlvbl9lbmRwb2ludDpgJHtufS9vYXV0aDIvcmV2b2tlYCx0b2tlbl9lbmRwb2ludDpgJHtufS9vYXV0aDIvdG9rZW5gLHVzZXJpbmZvX2VuZHBvaW50OmAke259L29hdXRoMi91c2VyaW5mb2B9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sciksZSl9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCkpLmp3a3NfdXJpLHI9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTX0FVVEhfSEVMUEVSLVZJVC1ORjAxIiwiSldLUyBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gSldLUyBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBKV0tTIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2xldCBpO3RyeXtpPXlpZWxkIGZldGNoKHQse2NyZWRlbnRpYWxzOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW59KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULU5FMDIiLCJSZXF1ZXN0IHRvIGp3a3MgZW5kcG9pbnQgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpfWlmKDIwMCE9PWkuc3RhdHVzfHwhaS5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgandrcyByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO2NvbnN0IG89KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLmlzc3Vlcix7a2V5czpzfT15aWVsZCBpLmpzb24oKSx1PXlpZWxkIHRoaXMuX2NyeXB0b0hlbHBlci5nZXRKV0tGb3JUaGVJZFRva2VuKGUuc3BsaXQoIi4iKVswXSxzKTtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmlzVmFsaWRJZFRva2VuKGUsdSwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsaWVudElELG51bGwhPW8/bzoiIix0aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKS5zdWIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSxudWxsPT09KG49KHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW5Jc3N1ZXIpfHx2b2lkIDA9PT1ufHxuKX0pKX1nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oZSl7dmFyIHQsbixyLGk7Y29uc3Qgbz10aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKSxzPXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkKG8pLGE9bnVsbCE9PSh0PW51bGw9PW8/dm9pZCAwOm8udXNlcm5hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsYz1udWxsIT09KG49by5naXZlbl9uYW1lKSYmdm9pZCAwIT09bj9uOiIiLGw9bnVsbCE9PShyPW8uZmFtaWx5X25hbWUpJiZ2b2lkIDAhPT1yP3I6IiIsZD1jJiZsP2Ake2N9ICR7bH1gOmN8fGx8fCIiLGg9bnVsbCE9PShpPW8ucHJlZmVycmVkX3VzZXJuYW1lKSYmdm9pZCAwIT09aT9pOmQ7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2Rpc3BsYXlOYW1lOmgsdGVuYW50RG9tYWluOnMsdXNlcm5hbWU6YX0sdS5maWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQobykpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHQ9Im9wZW5pZCI7Y29uc3QgaT15aWVsZCB0aGlzLl9jb25maWcoKSxvPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShuKTtyZXR1cm4gaS5zY29wZSYmaS5zY29wZS5sZW5ndGg+MCYmKGkuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHxpLnNjb3BlLnB1c2goIm9wZW5pZCIpLHQ9aS5zY29wZS5qb2luKCIgIikpLGUucmVwbGFjZSgie3t0b2tlbn19IixvLmFjY2Vzc190b2tlbikucmVwbGFjZSgie3t1c2VybmFtZX19Iix0aGlzLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhvLmlkX3Rva2VuKS51c2VybmFtZSkucmVwbGFjZSgie3tzY29wZX19Iix0KS5yZXBsYWNlKCJ7e2NsaWVudElEfX0iLGkuY2xpZW50SUQpLnJlcGxhY2UoInt7Y2xpZW50U2VjcmV0fX0iLG51bGwhPT0ocj1pLmNsaWVudFNlY3JldCkmJnZvaWQgMCE9PXI/cjoiIil9KSl9Y2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YShlKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlU2Vzc2lvbkRhdGEoZSl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoMjAwIT09ZS5zdGF0dXN8fCFlLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1IVFItTkUwMSIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0b2tlbiByZXF1ZXN0ICgke2Uuc3RhdHVzVGV4dH0pLmAseWllbGQgZS5qc29uKCkpO2NvbnN0IHI9eWllbGQgZS5qc29uKCk7aWYoci5jcmVhdGVkX2F0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLCh5aWVsZCB0aGlzLl9jb25maWcoKSkudmFsaWRhdGVJRFRva2VuKXJldHVybiB0aGlzLnZhbGlkYXRlSWRUb2tlbihyLmlkX3Rva2VuKS50aGVuKCgoKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShyLG4pO2NvbnN0IGU9e2FjY2Vzc1Rva2VuOnIuYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDpyLmNyZWF0ZWRfYXQsZXhwaXJlc0luOnIuZXhwaXJlc19pbixpZFRva2VuOnIuaWRfdG9rZW4scmVmcmVzaFRva2VuOnIucmVmcmVzaF90b2tlbixzY29wZTpyLnNjb3BlLHRva2VuVHlwZTpyLnRva2VuX3R5cGV9O3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9KSkpKTt7Y29uc3QgZT17YWNjZXNzVG9rZW46ci5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0OnIuY3JlYXRlZF9hdCxleHBpcmVzSW46ci5leHBpcmVzX2luLGlkVG9rZW46ci5pZF90b2tlbixyZWZyZXNoVG9rZW46ci5yZWZyZXNoX3Rva2VuLHNjb3BlOnIuc2NvcGUsdG9rZW5UeXBlOnIudG9rZW5fdHlwZX07cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShyLG4pLFByb21pc2UucmVzb2x2ZShlKX19KSl9Z2VuZXJhdGVQS0NFS2V5KGUpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YShlKSxyPVtdO09iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9PntlLnN0YXJ0c1dpdGgoInBrY2VfY29kZV92ZXJpZmllciIpJiZyLnB1c2goZSl9KSk7Y29uc3QgaT1yLnNvcnQoKS5wb3AoKTtyZXR1cm5gcGtjZV9jb2RlX3ZlcmlmaWVyIyR7cGFyc2VJbnQobnVsbCE9PShuPW51bGw9PWk/dm9pZCAwOmkuc3BsaXQoIiMiKVsxXSkmJnZvaWQgMCE9PW4/bjoiLTEiKSsxfWB9KSl9fWNsYXNzIGR7Y29uc3RydWN0b3IoZSl7dGhpcy5fY3J5cHRvVXRpbHM9ZX1nZXRDb2RlVmVyaWZpZXIoKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRW5jb2RlKHRoaXMuX2NyeXB0b1V0aWxzLmdlbmVyYXRlUmFuZG9tQnl0ZXMoMzIpKX1nZXRDb2RlQ2hhbGxlbmdlKGUpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuaGFzaFNoYTI1NihlKSl9Z2V0SldLRm9yVGhlSWRUb2tlbihlLHQpe2NvbnN0IG49SlNPTi5wYXJzZSh0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZSkpO2Zvcihjb25zdCBlIG9mIHQpaWYobi5raWQ9PT1lLmtpZClyZXR1cm4gZTt0aHJvdyBuZXcgYygiSlMtQ1JZUFRPX1VUSUwtR0pGVElULUlWMDEiLCJraWQgbm90IGZvdW5kLiIsIkZhaWxlZCB0byBmaW5kIHRoZSAna2lkJyBzcGVjaWZpZWQgaW4gdGhlIGlkX3Rva2VuLiAna2lkJyBmb3VuZCBpbiB0aGUgaGVhZGVyIDogIituLmtpZCsiLCBFeHBlY3RlZCB2YWx1ZXM6ICIrdC5tYXAoKGU9PmUua2lkKSkuam9pbigiLCAiKSl9aXNWYWxpZElkVG9rZW4oZSx0LG4scixpLHMsYSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLnZlcmlmeUp3dChlLHQsbyxuLHIsaSxzLGEpLnRoZW4oKGU9PmU/UHJvbWlzZS5yZXNvbHZlKCEwKTpQcm9taXNlLnJlamVjdChuZXcgYygiSlMtQ1JZUFRPX0hFTFBFUi1JVklULUlWMDEiLCJJbnZhbGlkIElEIHRva2VuLiIsIklEIHRva2VuIHZhbGlkYXRpb24gcmV0dXJuZWQgZmFsc2UiKSkpKX1kZWNvZGVJRFRva2VuKGUpe3RyeXtjb25zdCB0PXRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlLnNwbGl0KCIuIilbMV0pO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1DUllQVE9fVVRJTC1ESVQtSVYwMSIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLG4pe3RoaXMuX2NyeXB0b1V0aWxzPW4sdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBkKG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBsKGUsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7dmFyIHIsaSxvO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9jb25maWcoKSxzPW5ldyBNYXA7cy5zZXQoInJlc3BvbnNlX3R5cGUiLCJjb2RlIikscy5zZXQoImNsaWVudF9pZCIsdC5jbGllbnRJRCksdC5jbGllbnRTZWNyZXQmJnQuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmcy5zZXQoImNsaWVudF9zZWNyZXQiLHQuY2xpZW50U2VjcmV0KTtsZXQgYT0ib3BlbmlkIjt0LnNjb3BlJiZ0LnNjb3BlLmxlbmd0aD4wJiYodC5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHQuc2NvcGUucHVzaCgib3BlbmlkIiksYT10LnNjb3BlLmpvaW4oIiAiKSkscy5zZXQoInNjb3BlIixhKSxzLnNldCgicmVkaXJlY3RfdXJpIix0LnNpZ25JblJlZGlyZWN0VVJMKSx0LnJlc3BvbnNlTW9kZSYmcy5zZXQoInJlc3BvbnNlX21vZGUiLHQucmVzcG9uc2VNb2RlKTtjb25zdCBjPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleShuKTtpZih0LmVuYWJsZVBLQ0Upe2NvbnN0IGU9bnVsbD09PShyPXRoaXMuX2NyeXB0b0hlbHBlcil8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0Q29kZVZlcmlmaWVyKCksdD1udWxsPT09KGk9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09aT92b2lkIDA6aS5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGMsZSxuKSxzLnNldCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLHMuc2V0KCJjb2RlX2NoYWxsZW5nZSIsdCl9dC5wcm9tcHQmJnMuc2V0KCJwcm9tcHQiLHQucHJvbXB0KTtjb25zdCBsPWU7aWYobClmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKGwpKSIiIT1lJiYiIiE9dCYmInN0YXRlIiE9PWUmJnMuc2V0KGUsdC50b1N0cmluZygpKTtyZXR1cm4gcy5zZXQoInN0YXRlIix1LmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihjLGw/bnVsbD09PShvPWwuc3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnRvU3RyaW5nKCk6IiIpKSxzfSkpfWdldEF1dGhvcml6YXRpb25VUkwoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iik7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HQVUtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcj1uZXcgVVJMKHQpLGk9eWllbGQgdGhpcy5nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbik7Zm9yKGNvbnN0W2UsdF1vZiBpLmVudHJpZXMoKSlyLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0KTtyZXR1cm4gci50b1N0cmluZygpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQscz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtuJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixuLGkpKTtjb25zdCBsPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5zZXQoImNsaWVudF9pZCIscy5jbGllbnRJRCkscy5jbGllbnRTZWNyZXQmJnMuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmbC5zZXQoImNsaWVudF9zZWNyZXQiLHMuY2xpZW50U2VjcmV0KTtjb25zdCBkPWU7bGV0IGg7bC5zZXQoImNvZGUiLGQpLGwuc2V0KCJncmFudF90eXBlIiwiYXV0aG9yaXphdGlvbl9jb2RlIiksbC5zZXQoInJlZGlyZWN0X3VyaSIscy5zaWduSW5SZWRpcmVjdFVSTCksKG51bGw9PW8/dm9pZCAwOm8ucGFyYW1zKSYmT2JqZWN0LmVudHJpZXMoby5wYXJhbXMpLmZvckVhY2goKChbZSx0XSk9PntsLmFwcGVuZChlLHQpfSkpLHMuZW5hYmxlUEtDRSYmKGwuc2V0KCJjb2RlX3ZlcmlmaWVyIixgJHt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0ociksaSl9YCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHIpLGkpKTt0cnl7aD15aWVsZCBmZXRjaCh0LHtib2R5OmwsY3JlZGVudGlhbHM6cy5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQxLU5FMDIiLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQiLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgc2VydmVyIGZhaWxlZC4iKX1pZighaC5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtSEUwMyIsYFJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCB3aXRoICR7aC5zdGF0dXNUZXh0fWAseWllbGQgaC5qc29uKCkpO3JldHVybiB5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGgsaSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKSxyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKTtpZighci5yZWZyZXNoX3Rva2VuKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAxIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAyIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3QgaT1bXTtsZXQgbztpLnB1c2goYGNsaWVudF9pZD0ke24uY2xpZW50SUR9YCksaS5wdXNoKGByZWZyZXNoX3Rva2VuPSR7ci5yZWZyZXNoX3Rva2VufWApLGkucHVzaCgiZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuIiksbi5jbGllbnRTZWNyZXQmJm4uY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmaS5wdXNoKGBjbGllbnRfc2VjcmV0PSR7bi5jbGllbnRTZWNyZXR9YCk7dHJ5e289eWllbGQgZmV0Y2godCx7Ym9keTppLmpvaW4oIiYiKSxjcmVkZW50aWFsczpuLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTlIwMyIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpfWlmKCFvLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1IRTA0IixgUmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggJHtvLnN0YXR1c1RleHR9YCx5aWVsZCBvLmpzb24oKSk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UobyxlKX0pKX1yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnJldm9jYXRpb25fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkYwMSIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IHI9W107bGV0IGk7ci5wdXNoKGBjbGllbnRfaWQ9JHtuLmNsaWVudElEfWApLHIucHVzaChgdG9rZW49JHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5hY2Nlc3NfdG9rZW59YCksci5wdXNoKCJ0b2tlbl90eXBlX2hpbnQ9YWNjZXNzX3Rva2VuIik7dHJ5e2k9eWllbGQgZmV0Y2godCx7Ym9keTpyLmpvaW4oIiYiKSxjcmVkZW50aWFsczpuLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkUwMiIsIlRoZSByZXF1ZXN0IHRvIHJldm9rZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIGZhaWxlZC4iKX1pZigyMDAhPT1pLnN0YXR1c3x8IWkub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgcmV2b2tlIGFjY2VzcyB0b2tlbiByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUoaSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCksaT15aWVsZCB0aGlzLl9jb25maWcoKTtsZXQgbztpZihvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDpyLnRva2VuX2VuZHBvaW50LCFvfHwwPT09by50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5GMDEiLCJUb2tlbiBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcz15aWVsZCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoKFtlLHJdKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKHIsbik7cmV0dXJuYCR7ZX09JHt0fWB9KSkpKSk7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGw9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKG4pKS5hY2Nlc3NfdG9rZW59YH0pKTtjb25zdCBkPXtib2R5OnMuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhsKSxtZXRob2Q6IlBPU1QifTtsZXQgaDt0cnl7aD15aWVsZCBmZXRjaChvLGQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9ZT9lOiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKX1pZigyMDAhPT1oLnN0YXR1c3x8IWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQ0ctSEUwMyIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuICgke2guc3RhdHVzVGV4dH0pYCx5aWVsZCBoLmpzb24oKSk7cmV0dXJuIGUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLG4pOlByb21pc2UucmVzb2x2ZSh5aWVsZCBoLmpzb24oKSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLG49dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCByPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1uW2VdJiYiIiE9PW5bZV0mJm51bGwhPT1uW2VdfHxkZWxldGUgbltlXX0pKSxyPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSxuKSxyfSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgbj10LndlbGxLbm93bkVuZHBvaW50O2lmKG4pe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKG4pLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmwpe3RyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpKX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdPUE1ELUlWMDIiLCJSZXNvbHZpbmcgZW5kcG9pbnRzIGZhaWxlZC4iLG51bGwhPXQ/dDoiUmVzb2x2aW5nIGVuZHBvaW50cyBieSBiYXNlIHVybCBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7dmFyIGUsbixyLGksbyxzLGEsYyx1LGw7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDpudWxsIT09KGU9dC5hdXRob3JpemF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09ZT9lOiIiLGNoZWNrU2Vzc2lvbklmcmFtZTpudWxsIT09KG49dC5jaGVja19zZXNzaW9uX2lmcmFtZSkmJnZvaWQgMCE9PW4/bjoiIixlbmRTZXNzaW9uRW5kcG9pbnQ6bnVsbCE9PShyPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1yP3I6IiIsaW50cm9zcGVjdGlvbkVuZHBvaW50Om51bGwhPT0oaT10LmludHJvc3BlY3Rpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1pP2k6IiIsaXNzdWVyOm51bGwhPT0obz10Lmlzc3VlcikmJnZvaWQgMCE9PW8/bzoiIixqd2tzVXJpOm51bGwhPT0ocz10Lmp3a3NfdXJpKSYmdm9pZCAwIT09cz9zOiIiLHJlZ2lzdHJhdGlvbkVuZHBvaW50Om51bGwhPT0oYT10LnJlZ2lzdHJhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWE/YToiIixyZXZvY2F0aW9uRW5kcG9pbnQ6bnVsbCE9PShjPXQucmV2b2NhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix0b2tlbkVuZHBvaW50Om51bGwhPT0odT10LnRva2VuX2VuZHBvaW50KSYmdm9pZCAwIT09dT91OiIiLHVzZXJpbmZvRW5kcG9pbnQ6bnVsbCE9PShsPXQudXNlcmluZm9fZW5kcG9pbnQpJiZ2b2lkIDAhPT1sP2w6IiJ9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIG4scixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KG49eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBzPW51bGwhPT0ocj1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PXI/cjpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAzIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7Y29uc3QgYT1uZXcgVVJMU2VhcmNoUGFyYW1zO2lmKGEuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHMpLG8uc2VuZElkVG9rZW5JbkxvZ291dFJlcXVlc3Qpe2NvbnN0IHQ9bnVsbD09PShpPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuaWRfdG9rZW47aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7YS5zZXQoImlkX3Rva2VuX2hpbnQiLHQpfWVsc2UgYS5zZXQoImNsaWVudF9pZCIsby5jbGllbnRJRCk7cmV0dXJuIGEuc2V0KCJzdGF0ZSIsInNpZ25fb3V0X3N1Y2Nlc3MiKSxgJHt0fT8ke2EudG9TdHJpbmcoKX1gfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYWNjZXNzX3Rva2VufSkpfWdldENyZWF0ZWRBdChlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jcmVhdGVkX2F0fSkpfWdldEV4cGlyZXNJbihlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5leHBpcmVzX2lufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9Qm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKSxuPXlpZWxkIHRoaXMuZ2V0Q3JlYXRlZEF0KGUpLHI9eWllbGQgdGhpcy5nZXRFeHBpcmVzSW4oZSk7aWYoIXIpcmV0dXJuITE7Y29uc3QgaT0xZTMqcGFyc2VJbnQociksbz0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdCYmbitpPm99KSl9Z2V0UEtDRUNvZGUoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSksbil9KSl9c2V0UEtDRUNvZGUoZSxuLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlLHIpfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpLHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApfSkpfX1jbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxuKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSksbikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxuLHIpe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W25dOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bbl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD9gJHtlfS0ke3RoaXMuX2lkfS0ke3R9YDpgJHtlfS0ke3RoaXMuX2lkfWB9aXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKXt0cnl7Y29uc3QgZT0iX19BU0dBUkRFT19BVVRIX0NPUkVfTE9DQUxfU1RPUkFHRV9URVNUX18iO3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1zZXRDb25maWdEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXNldFRlbXBvcmFyeURhdGEoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxuKSxlKX0pKX1zZXRDdXN0b21EYXRhKGUsbixyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGUsciksbil9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PW4/bjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1uP246bnVsbCl9KSl9Z2V0Q3VzdG9tRGF0YShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShlLG4pKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1zZXRTZXNzaW9uU3RhdHVzKGUpe3RoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbG9jYWxTdG9yYWdlLnNldEl0ZW0oImFzZ2FyZGVvLXNlc3Npb24tYWN0aXZlIixlKX1nZXRTZXNzaW9uU3RhdHVzKCl7dmFyIGU7cmV0dXJuIHRoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbnVsbCE9PShlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpKSYmdm9pZCAwIT09ZT9lOiIifXJlbW92ZVNlc3Npb25TdGF0dXMoKXt0aGlzLmlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuU2Vzc2lvbkRhdGEsbikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUsbil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLG4pfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxpKSxlLG4pfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUsbixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLGkpLGUsbil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlRlbXBvcmFyeURhdGEsbiksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLG4pLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6bi5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITAsdmFsaWRhdGVJRFRva2VuSXNzdWVyOiEwfTtjbGFzcyBnewovKioKICAgICAgICAgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBfc3RvcmU6IFN0b3JlID0gbmV3IERhdGFTdG9yZSgpOwogICAgICAgICAqIGNvbnN0IGF1dGggPSBuZXcgQXNnYXJkZW9BdXRoQ2xpZW50PEN1c3RvbUNsaWVudENvbmZpZz4oX3N0b3JlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjY29uc3RydWN0b3J9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi8KY29uc3RydWN0b3IoKXt9Ci8qKgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIFNESyB3aXRoIHRoZSBjb25maWcgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IFx7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIFx9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaW5pdGlhbGl6ZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2luaXRpYWxpemUoZSxuLHIsaSl7dmFyIG8scyxhO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1lLmNsaWVudElEO2cuX2luc3RhbmNlSUQ/Zy5faW5zdGFuY2VJRCs9MTpnLl9pbnN0YW5jZUlEPTAsaSYmKGcuX2luc3RhbmNlSUQ9aSksdGhpcy5fZGF0YUxheWVyPW5ldyBmKHQ/YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH0tJHt0fWA6YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH1gLG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgaCh0aGlzLl9kYXRhTGF5ZXIsciksZy5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBoKHRoaXMuX2RhdGFMYXllcixyKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSxlKSx7c2NvcGU6Wy4uLm51bGwhPT0obz1wLnNjb3BlKSYmdm9pZCAwIT09bz9vOltdLC4uLm51bGwhPT0oYT1udWxsPT09KHM9ZS5zY29wZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuZmlsdGVyKChlPT57dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09cD92b2lkIDA6cC5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09YT9hOltdXX0pKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gVGhlIGBEYXRhTGF5ZXJgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgZGF0YSA9IGF1dGguZ2V0RGF0YUxheWVyKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERhdGFMYXllcn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGBpbnN0YW5jZUlEYCB2YXJpYWJsZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIFRoZSBgaW5zdGFuY2VJRGAgbnVtYmVyLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBpbnN0YW5jZUlkID0gYXV0aC5nZXRJbnN0YW5jZUlEKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRJbnN0YW5jZUlEKCl7cmV0dXJuIGcuX2luc3RhbmNlSUR9Ci8qKgogICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwgcGFyYW1ldGVycy4KICAgICAgICoKICAgICAgICogQHBhcmFtIGNvbmZpZyAtIChPcHRpb25hbCkgQSBjb25maWcgb2JqZWN0IHRvIGZvcmNlIGluaXRpYWxpemF0aW9uIGFuZCBwYXNzCiAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgYGZpZHBgIHBhcmFtZXRlci4KICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMIHBhcmFtZXRlcnMuCiAgICAgICAqCiAgICAgICAqIEBleGFtcGxlCiAgICAgICAqIGBgYAogICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXMoKS50aGVuKChwYXJhbXMpPT57CiAgICAgICAqICAvLyBjb25zb2xlLmxvZyhwYXJhbXMpOwogICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICogfSk7CiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEF1dGhvcml6YXRpb25VUkxQYXJhbXN9CiAgICAgICAqCiAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIG51bGw9PXR8fGRlbGV0ZSB0LmZvcmNlSW5pdCwoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXModCxuKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTFBhcmFtcyh0LG4pKSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgZmlkcCBwYXJhbWV0ZXIuCiAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QXV0aG9yaXphdGlvblVSTH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEF1dGhvcml6YXRpb25VUkwoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gbnVsbD09dHx8ZGVsZXRlIHQuZm9yY2VJbml0LCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0LG4pOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShudWxsPT1lP3ZvaWQgMDplLmZvcmNlSW5pdCkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQsbikpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCBzZW5kcyBhIHJlcXVlc3QgdG8gb2J0YWluIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlCiAgICAgICAgICogdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uQ29kZSAtIFRoZSBhdXRob3JpemF0aW9uIGNvZGUuCiAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0ZSAtIFRoZSBzZXNzaW9uIHN0YXRlLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiByZXNwb25zZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXF1ZXN0QWNjZXNzVG9rZW4oYXV0aENvZGUsIHNlc3Npb25TdGF0ZSkudGhlbigodG9rZW4pPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHRva2VuKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0QWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxuLHIsaSxvKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITEpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUsbixyLGksbykpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgZG9lc24ndCBjbGVhciB0aGUgYXV0aGVudGljYXRpb24gZGF0YS4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLmdldFNpZ25PdXRVUkwoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFNpZ25PdXRVUkwoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFNpZ25PdXRVUkwoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cyB0aGF0IGFyZSBmZXRjaGVkIGZyb20gdGhlIGAud2VsbC1rbm93bmAgZW5kcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE9JREMgc2VydmljZSBlbmRwb2ludHMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGF1dGguZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHN9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWNvZGVkIElEIHRva2VuIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBhdXRoLmdldElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0SURUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldElEVG9rZW4oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYmFzaWMgdXNlciBpbmZvcm1hdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgdXNlckluZm8gPSBhd2FpdCBhdXRoLmdldEJhc2ljVXNlckluZm8oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mb30KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEJhc2ljVXNlckluZm8oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEJhc2ljVXNlckluZm8oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNyeXB0byBoZWxwZXIgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgQ3J5cHRvSGVscGVyIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgY3J5cHRvSGVscGVyID0gYXdhaXQgYXV0aC5DcnlwdG9IZWxwZXIoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0Q3J5cHRvSGVscGVyfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldENyeXB0b0hlbHBlcigpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhpcyBtZXRob2QgYWxzbyBjbGVhcnMgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2Ugb2YgdGhlIHJldm9rZS1hY2Nlc3MtdG9rZW4gcmVxdWVzdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJldm9rZUFjY2Vzc1Rva2VuKGUpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgYWNjZXNzCiAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZWZyZXNoQWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZWZyZXNoQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZWZyZXNoQWNjZXNzVG9rZW4oZSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBY2Nlc3NUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBY2Nlc3NUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlnIHBhc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyB0aGUgY3VzdG9tIGdyYW50IGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICBhdHRhY2hUb2tlbjogZmFsc2UsCiAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgKiAgICAgICBncmFudF90eXBlOiAiYWNjb3VudF9zd2l0Y2giLAogICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICogICB9LAogICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgKiAgIHJldHVybnNTZXNzaW9uOiB0cnVlLAogICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEN1c3RvbUdyYW50fQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmVxdWVzdEN1c3RvbUdyYW50KGUsdCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXdhaXQgYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNBdXRoZW50aWNhdGVkfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovaXNBdXRoZW50aWNhdGVkKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5pc0F1dGhlbnRpY2F0ZWQoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFBLQ0UgY29kZSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBQS0NFIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHBrY2UgPSBhd2FpdCBnZXRQS0NFQ29kZSgpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRQS0NFQ29kZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFBLQ0VDb2RlKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFBLQ0VDb2RlKGUsbil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIFBLQ0UgY29kZSB0byB0aGUgZGF0YSBzdG9yZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhd2FpdCBhdXRoLnNldFBLQ0VDb2RlKCJwa2NlX2NvZGUiKQogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNzZXRQS0NFQ29kZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NldFBLQ0VDb2RlKGUsbixyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zZXRQS0NFQ29kZShlLG4scil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHNpZ24tb3V0IGlzIHN1Y2Nlc3NmdWwgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHNpZ25PdXRSZWRpcmVjdFVybCAtIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHVzZXIgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhZnRlciBzaWduaW5nLW91dC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAqICBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGZ1bmN0aW9uLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNTaWduT3V0U3VjY2Vzc2Z1bH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3N0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxyPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIW4mJiJzaWduX291dF9zdWNjZXNzIj09PW4mJiFyfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBoYXMgZmFpbGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzaWduT3V0UmVkaXJlY3RVcmwgLSBUaGUgVVJMIHRvIHdoaWNoIHRoZSB1c2VyIGhhcyBiZWVuIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgc2lnbmluZy1vdXQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoZSBzZXJ2ZXIgYXBwZW5kcyBwYXRoIHBhcmFtZXRlcnMgdG8gdGhlIGBzaWduT3V0UmVkaXJlY3RVUkxgIGFuZCB0aGVzZSBwYXRoIHBhcmFtZXRlcnMKICAgICAgICAgKiAgYXJlIHJlcXVpcmVkIGZvciB0aGlzIG1ldGhvZCB0byBmdW5jdGlvbi4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBgdHJ1ZWAgaWYgc3VjY2Vzc2Z1bCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc3RhdGljIGRpZFNpZ25PdXRGYWlsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxyPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIW4mJiJzaWduX291dF9zdWNjZXNzIj09PW4mJnJ9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGF3YWl0IGF1dGgudXBkYXRlQ29uZmlnKGNvbmZpZyk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWd9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi91cGRhdGVDb25maWcoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfSkpfXN0YXRpYyBjbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5jbGVhclVzZXJTZXNzaW9uRGF0YShlKX0pKX19Y29uc3Qgdj0iaW5pdCI7dmFyIHk7IWZ1bmN0aW9uKGUpe2UuU2lnbkluPSJzaWduLWluIixlLlNpZ25PdXQ9InNpZ24tb3V0IixlLkluaXRpYWxpemU9ImluaXRpYWxpemUiLGUuSHR0cFJlcXVlc3RTdGFydD0iaHR0cC1yZXF1ZXN0LXN0YXJ0IixlLkh0dHBSZXF1ZXN0RmluaXNoPSJodHRwLXJlcXVlc3QtZmluaXNoIixlLkh0dHBSZXF1ZXN0RXJyb3I9Imh0dHAtcmVxdWVzdC1lcnJvciIsZS5IdHRwUmVxdWVzdFN1Y2Nlc3M9Imh0dHAtcmVxdWVzdC1zdWNjZXNzIixlLlJldm9rZUFjY2Vzc1Rva2VuPSJyZXZva2UtYWNjZXNzLXRva2VuIixlLkN1c3RvbUdyYW50PSJjdXN0b20tZ3JhbnQiLGUuU2lnbk91dEZhaWxlZD0ic2lnbi1vdXQtZmFpbGVkIn0oeXx8KHk9e30pKTtjb25zdCBtPSJwcm9tcHROb25lUmVxdWVzdFNlbnQiLHc9ImVycm9yIixfPSJlcnJvcl9kZXNjcmlwdGlvbiIsUz0iY3VzdG9tX2dyYW50X2NvbmZpZyIsYj0iQWNjZXNzIHRva2VuIGlzIGludmFsaWQiO3ZhciBrOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oa3x8KGs9e30pKTtjbGFzcyBFe2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpe3JldHVybntibG9iOihudWxsPT1lP3ZvaWQgMDplLmRhdGEpaW5zdGFuY2VvZiBCbG9iP251bGw9PWU/dm9pZCAwOmUuZGF0YTpudWxsLGRhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiEwfX1zdGF0aWMgZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS50b0pTT04pJiZkZWxldGUgZS50b0pTT04se2Vycm9yOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMX19fWNsYXNzIFR7Y29uc3RydWN0b3IoKXt9c3RhdGljIHJlbW92ZUF1dGhvcml6YXRpb25Db2RlKCl7Y29uc3QgZT1sb2NhdGlvbi5ocmVmO2hpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLGUucmVwbGFjZSgvXD9jb2RlPS4qJC8sIiIpKX1zdGF0aWMgZ2V0UEtDRShlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZSkpJiZ2b2lkIDAhPT10P3Q6IiJ9c3RhdGljIHNldFBLQ0UoZSx0KXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGUsdCl9c3RhdGljIHNldFNpZ25PdXRVUkwoZSx0LG4pe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oYCR7c30taW5zdGFuY2VfJHtufS0ke3R9YCxlKX1zdGF0aWMgZ2V0U2lnbk91dFVSTChlLHQpe3ZhciBuO3JldHVybiBudWxsIT09KG49c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShgJHtzfS1pbnN0YW5jZV8ke3R9LSR7ZX1gKSkmJnZvaWQgMCE9PW4/bjoiIn1zdGF0aWMgcmVtb3ZlUEtDRShlKXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGUpfXN0YXRpYyBjYW5Db250aW51ZVNpZ25JbihlLHQpe3JldHVybiEoZSYmIVQuaGFzRXJyb3JJblVSTCgpJiYhVC5oYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoKSYmIXQpfXN0YXRpYyBpc0luaXRpYWxpemVkU2lsZW50U2lnbkluKCl7cmV0dXJuIFQuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpfXN0YXRpYyB3YXNTaWduSW5DYWxsZWQoKXtyZXR1cm4hKCFULmhhc0Vycm9ySW5VUkwoKSYmIVQuaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKCl8fHRoaXMuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpKX1zdGF0aWMgd2FzU2lsZW50U2lnbkluQ2FsbGVkKCl7Y29uc3QgZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJpbml0aWFsaXplZC1zaWxlbnQtc2lnbi1pbiIpLHQ9ZT9KU09OLnBhcnNlKGUpOm51bGw7cmV0dXJuIEJvb2xlYW4odCl9c3RhdGljIGlzU2lnbk91dFN1Y2Nlc3NmdWwoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKGcuaXNTaWduT3V0U3VjY2Vzc2Z1bCh3aW5kb3cubG9jYXRpb24uaHJlZikpe2NvbnN0IGU9d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUsZSkseWllbGQgZy5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLCEwfXJldHVybiExfSkpfXN0YXRpYyBkaWRTaWduT3V0RmFpbCgpe2lmKGcuZGlkU2lnbk91dEZhaWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtjb25zdCBlPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLHQ9ZS5zZWFyY2hQYXJhbXMuZ2V0KHcpLG49ZS5zZWFyY2hQYXJhbXMuZ2V0KF8pLHI9d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUscikse2Rlc2NyaXB0aW9uOm51bGwhPW4/bjoiIixlcnJvcjpudWxsIT10P3Q6IiJ9fXJldHVybiExfXN0YXRpYyBpc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCl7dmFyIGU7Y29uc3QgdD1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpO3JldHVybiBudWxsIT09KGU9bnVsbD09dD92b2lkIDA6dC5pbmNsdWRlcygic2lnbi1pbi1zaWxlbnRseSIpKSYmdm9pZCAwIT09ZSYmZX1zdGF0aWMgaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKGU9d2luZG93LmxvY2F0aW9uLnNlYXJjaCl7cmV0dXJuL1s/Jl1jb2RlPVteJl0rLy50ZXN0KGUpfXN0YXRpYyBoYXNFcnJvckluVVJMKGU9d2luZG93LmxvY2F0aW9uLmhyZWYpe2NvbnN0IHQ9bmV3IFVSTChlKTtyZXR1cm4hIXQuc2VhcmNoUGFyYW1zLmdldCh3KSYmInNpZ25fb3V0X3N1Y2Nlc3MiIT09dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpfXN0YXRpYyBjYW5TZW5kUHJvbXB0Tm9uZVJlcXVlc3QoKXtjb25zdCBlPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0obSk7cmV0dXJuIShlP0pTT04ucGFyc2UoZSk6bnVsbCl9c3RhdGljIHNldFByb21wdE5vbmVSZXF1ZXN0U2VudChlKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKG0sSlNPTi5zdHJpbmdpZnkoZSkpfXN0YXRpYyB3YWl0VGlsbFBhZ2VSZWRpcmVjdCh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9bnVsbCE9dD90OjNlMzt5aWVsZCBuZXcgUHJvbWlzZSgodD0+c2V0VGltZW91dCh0LDFlMyplKSkpfSkpfX1ULnVudGlsPShlLHQ9NTAwKT0+e2NvbnN0IG49cj0+ZSgpP3IoKTpzZXRUaW1lb3V0KCgoKT0+bihyKSksdCk7cmV0dXJuIG5ldyBQcm9taXNlKG4pfTtjbGFzcyBSe2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCksdGhpcy5fc3BhSGVscGVyPXQsdGhpcy5faW5zdGFuY2VJRD10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJbnN0YW5jZUlEKCksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9ZW5hYmxlSHR0cEhhbmRsZXIoZSl7KG51bGw9PWU/dm9pZCAwOmUuZW5hYmxlSGFuZGxlcikmJmUuZW5hYmxlSGFuZGxlcigpfWRpc2FibGVIdHRwSGFuZGxlcihlKXsobnVsbD09ZT92b2lkIDA6ZS5kaXNhYmxlSGFuZGxlcikmJmUuZGlzYWJsZUhhbmRsZXIoKX1pbml0aWFsaXplU2Vzc2lvbk1hbmdlcihlLHQsbixyLGkpe3ZhciBvLHMsYTtpLmluaXRpYWxpemUoZS5jbGllbnRJRCxudWxsIT09KG89dC5jaGVja1Nlc3Npb25JZnJhbWUpJiZ2b2lkIDAhPT1vP286IiIsbixudWxsIT09KHM9ZS5jaGVja1Nlc3Npb25JbnRlcnZhbCkmJnZvaWQgMCE9PXM/czozLG51bGwhPT0oYT1lLnNlc3Npb25SZWZyZXNoSW50ZXJ2YWwpJiZ2b2lkIDAhPT1hP2E6MzAwLGUuc2lnbkluUmVkaXJlY3RVUkwscil9cmVxdWVzdEN1c3RvbUdyYW50KHQsbil7dmFyIHIsaSxvO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHM9ITAsYT0hMTtpZihudWxsPT10P3ZvaWQgMDp0LnRva2VuRW5kcG9pbnQpe3M9ITE7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShpPW51bGw9PT0ocj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1pP2k6W10sdC5iYXNlVXJsXSlpZihlJiYobnVsbD09PShvPXQudG9rZW5FbmRwb2ludCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uc3RhcnRzV2l0aChlKSkpe2E9ITA7YnJlYWt9fXJldHVybiB0LnNob3VsZFJlcGxheUFmdGVyUmVmcmVzaCYmdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoUyxKU09OLnN0cmluZ2lmeSh0KSksc3x8YT90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0Q3VzdG9tR3JhbnQodCkudGhlbigocj0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBuJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih0KSx0LnJldHVybnNTZXNzaW9uPyh0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpOnJ9KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLU1BSU5fVEhSRUFEX0NMSUVOVC1SQ0ctSVYwMSIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIHRva2VuIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpfWdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihTKTtyZXR1cm4gZT9KU09OLnBhcnNlKGUpOm51bGx9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dHJ5e3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpO2NvbnN0IGU9eWllbGQgdGhpcy5nZXRDdXN0b21HcmFudENvbmZpZ0RhdGEoKTtyZXR1cm4gZSYmKHlpZWxkIHRoaXMucmVxdWVzdEN1c3RvbUdyYW50KGUsdCkpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX1jYXRjaChlKXtjb25zdCB0PXt0eXBlOiJyZWZyZXNoLWFjY2Vzcy10b2tlbi1lcnJvciJ9O3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCksUHJvbWlzZS5yZWplY3QoZSl9fSkpfXJldHJ5RmFpbGVkUmVxdWVzdHModCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXQuaHR0cENsaWVudCxuPXQucmVxdWVzdENvbmZpZyxyPXQuaXNIdHRwSGFuZGxlckVuYWJsZWQsaT10Lmh0dHBFcnJvckNhbGxiYWNrLG89dC5odHRwRmluaXNoQ2FsbGJhY2s7eWllbGQgVC51bnRpbCgoKCk9PiF0aGlzLl9pc1Rva2VuUmVmcmVzaGluZykpO3RyeXtjb25zdCB0PXlpZWxkIGUucmVxdWVzdChuKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfWNhdGNoKGUpe3JldHVybiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdChlKX19KSl9aHR0cFJlcXVlc3QodCxuLHIsaSxvLHMpe3ZhciBhLHU7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgbD0hMTtjb25zdCBkPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShhPXlpZWxkIG51bGw9PWQ/dm9pZCAwOmQucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09YT9hOltdLGQuYmFzZVVybF0paWYoZSYmKG51bGw9PT0odT1udWxsPT1uP3ZvaWQgMDpuLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChlKSkpe2w9ITA7YnJlYWt9cmV0dXJuIGw/dC5yZXF1ZXN0KG4pLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChhPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsdSxsO2lmKDQwMT09PShudWxsPT09KGU9bnVsbD09YT92b2lkIDA6YS5yZXNwb25zZSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc3RhdHVzKXx8IShudWxsPT1hP3ZvaWQgMDphLnJlc3BvbnNlKSl7aWYodGhpcy5faXNUb2tlblJlZnJlc2hpbmcpcmV0dXJuIHRoaXMucmV0cnlGYWlsZWRSZXF1ZXN0cyh7ZW5hYmxlUmV0cmlldmluZ1NpZ25PdXRVUkxGcm9tU2Vzc2lvbjpzLGh0dHBDbGllbnQ6dCxodHRwRXJyb3JDYWxsYmFjazppLGh0dHBGaW5pc2hDYWxsYmFjazpvLGlzSHR0cEhhbmRsZXJFbmFibGVkOnIscmVxdWVzdENvbmZpZzpufSk7bGV0IGU7dGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITA7dHJ5e2U9eWllbGQgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4ocyksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9Y2F0Y2goZSl7dGhyb3cgdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITEsciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NvZGU6Yn0pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUi1TRTAxIixudWxsIT09KHU9bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09dT91OiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PShsPW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PWw/bDoiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKGUpdHJ5e2NvbnN0IGU9eWllbGQgdC5yZXF1ZXN0KG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9Y2F0Y2goZSl7cmV0dXJuIHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KGUpfX1yZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShhKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QoYSl9KSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSLUlWMDIiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKX1odHRwUmVxdWVzdEFsbCh0LG4scixpLG8pe3ZhciBzLGEsdTtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBsPSEwO2NvbnN0IGQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgZSBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgbiBvZlsuLi5udWxsIT09KGE9bnVsbD09PShzPXlpZWxkIGQpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWE/YTpbXSxkLmJhc2VVcmxdKWlmKG4mJihudWxsPT09KHU9ZS51cmwpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnN0YXJ0c1dpdGgobikpKXt0PSEwO2JyZWFrfWlmKCF0KXtsPSExO2JyZWFrfX1jb25zdCBoPVtdO2lmKGwpcmV0dXJuIHQuZm9yRWFjaCgoZT0+e2gucHVzaChuLnJlcXVlc3QoZSkpfSkpLChudWxsPT1uP3ZvaWQgMDpuLmFsbCkmJm4uYWxsKGgpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIHMsYSx1O2lmKDQwMT09PShudWxsPT09KHM9bnVsbD09dD92b2lkIDA6dC5yZXNwb25zZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuc3RhdHVzKXx8IShudWxsPT10P3ZvaWQgMDp0LnJlc3BvbnNlKSl7bGV0IHM7dHJ5e3M9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7dGhyb3cgciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvZGU6Yn0pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUkEtU0UwMSIsbnVsbCE9PShhPW51bGw9PWU/dm9pZCAwOmUubmFtZSkmJnZvaWQgMCE9PWE/YToiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0odT1udWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UpJiZ2b2lkIDAhPT11P3U6IkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZm9sbG93aW5nIGEgNDAxIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4iKX1pZihzKXJldHVybiBuLmFsbCYmbi5hbGwoaCkudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKX1yZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKTt0aHJvdyBuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSQS1JVjAyIiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKX0pKX1yZXF1ZXN0QWNjZXNzVG9rZW4odCxuLHIsaSxvLHMpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgYT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2lmKGEuc3RvcmFnZT09PWsuQnJvd3Nlck1lbW9yeSYmYS5lbmFibGVQS0NFJiZuKXtjb25zdCBlPVQuZ2V0UEtDRSh1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0obikpO3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnNldFBLQ0VDb2RlKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlKX1lbHNlIGEuc3RvcmFnZT09PWsuV2ViV29ya2VyJiZpJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuc2V0UEtDRUNvZGUoaSxudWxsIT1vP286IiIpKTtyZXR1cm4gdD90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0QWNjZXNzVG9rZW4odCxudWxsIT1uP246IiIsbnVsbCE9bz9vOiIiLHZvaWQgMCxzKS50aGVuKCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLnN0b3JhZ2UhPT1rLldlYldvcmtlcj8oVC5zZXRTaWduT3V0VVJMKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldFNpZ25PdXRVUkwoKSxhLmNsaWVudElELHRoaXMuX2luc3RhbmNlSUQpLHRoaXMuX3NwYUhlbHBlciYmKHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSksciYmImZ1bmN0aW9uIj09dHlwZW9mIHImJmEuZW5hYmxlT0lEQ1Nlc3Npb25NYW5hZ2VtZW50JiZyKCkpOnRoaXMuX3NwYUhlbHBlciYmdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1SQVQxLU5GMDEiLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSl9dHJ5U2lnbkluU2lsZW50bHkodCxuLHIsaSxvKXt2YXIgcztyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKFQuaXNJbml0aWFsaXplZFNpbGVudFNpZ25JbigpKXJldHVybiB5aWVsZCByLnJlY2VpdmVQcm9tcHROb25lUmVzcG9uc2UoKSxQcm9taXNlLnJlc29sdmUoe2FsbG93ZWRTY29wZXM6IiIsZGlzcGxheU5hbWU6IiIsZW1haWw6IiIsc2Vzc2lvblN0YXRlOiIiLHN1YjoiIix0ZW5hbnREb21haW46IiIsdXNlcm5hbWU6IiJ9KTtjb25zdCBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJycElGcmFtZSIpLGM9bnVsbD09PShzPW51bGw9PWE/dm9pZCAwOmEuY29udGVudERvY3VtZW50KXx8dm9pZCAwPT09cz92b2lkIDA6cy5nZXRFbGVtZW50QnlJZCgicHJvbXB0Tm9uZUlGcmFtZSIpO3RyeXtjb25zdCBlPXlpZWxkIHQoaSk7Yy5zcmM9ZX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9cmV0dXJuIG5ldyBQcm9taXNlKCgodCxyKT0+e2NvbnN0IGk9c2V0VGltZW91dCgoKCk9Pnt0KCExKX0pLDFlNCkscz1hPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsYyx1LGw7Y29uc3QgZD1hLmRhdGE7ImNoZWNrX3Nlc3Npb25fc2lnbmVkX291dCI9PShudWxsPT1kP3ZvaWQgMDpkLnR5cGUpJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLGNsZWFyVGltZW91dChpKSx0KCExKSksImNoZWNrX3Nlc3Npb25fc2lnbmVkX2luIj09KG51bGw9PWQ/dm9pZCAwOmQudHlwZSkmJihudWxsPT09KGU9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jb2RlKSYmbihudWxsPT09KGM9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5jb2RlLG51bGw9PT0odT1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnNlc3Npb25TdGF0ZSxudWxsPT09KGw9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zdGF0ZSxvKS50aGVuKChlPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLHQoZSl9KSkuY2F0Y2goKGU9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscykscihlKX0pKS5maW5hbGx5KCgoKT0+e2NsZWFyVGltZW91dChpKX0pKX0pKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KSl9KSl9aGFuZGxlU2lnbkluKHQsbixyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtpZih5aWVsZCB0KCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7YWxsb3dlZFNjb3BlczoiIixkaXNwbGF5TmFtZToiIixlbWFpbDoiIixzZXNzaW9uU3RhdGU6IiIsc3ViOiIiLHRlbmFudERvbWFpbjoiIix1c2VybmFtZToiIn0pO2lmKGUuc3RvcmFnZSE9PWsuV2ViV29ya2VyJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCkpKXJldHVybiB0aGlzLl9zcGFIZWxwZXIuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksZS5lbmFibGVPSURDU2Vzc2lvbk1hbmFnZW1lbnQmJm4oKSxQcm9taXNlLnJlc29sdmUoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpKTtjb25zdCBpPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQodyksbz1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KF8pO2lmKGkpe2NvbnN0IGU9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7dGhyb3cgZS5zZWFyY2hQYXJhbXMuZGVsZXRlKHcpLGUuc2VhcmNoUGFyYW1zLmRlbGV0ZShfKSxoaXN0b3J5LnB1c2hTdGF0ZShudWxsLGRvY3VtZW50LnRpdGxlLGUudG9TdHJpbmcoKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1TSS1TRTAxIixpLG51bGwhPW8/bzoiIil9aWYoZS5zdG9yYWdlPT09ay5XZWJXb3JrZXImJnIpe2NvbnN0IGU9eWllbGQgcigpO2lmKGUpcmV0dXJuIGV9fSkpfWF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT1PYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sdCk7ZS5hdHRhY2hUb2tlbiYmKGUuc2hvdWxkQXR0YWNoSURQQWNjZXNzVG9rZW4/dC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt5aWVsZCB0aGlzLmdldElEUEFjY2Vzc1Rva2VuKCl9YH0pOnQuaGVhZGVycz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzKSx7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7eWllbGQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpfWB9KSl9KSl9Z2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX0pKX1nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCl9KSl9Z2V0RGVjb2RlZElEUElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREZWNvZGVkSURUb2tlbigpfSkpfWdldENyeXB0b0hlbHBlcigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldENyeXB0b0hlbHBlcigpfSkpfWdldElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJRFRva2VuKCl9KSl9Z2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfWdldEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QWNjZXNzVG9rZW4oKX0pKX1nZXRJRFBBY2Nlc3NUb2tlbigpe3ZhciB0O3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGw9PT0odD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuYWNjZXNzX3Rva2VufSkpfWdldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9aXNBdXRoZW50aWNhdGVkKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCl9KSl9fWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCl9cmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0KXt2YXIgbixyO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoIShudWxsIT09KHI9bnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnBlcmlvZGljVG9rZW5SZWZyZXNoKSYmdm9pZCAwIT09ciYmcikpcmV0dXJuO2NvbnN0IG89eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYoby5yZWZyZXNoX3Rva2VuKXtjb25zdCBuPXBhcnNlSW50KG8uZXhwaXJlc19pbikscj1zZXRUaW1lb3V0KCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9KSkpLDFlMyoobjw9MTA/bjpuLTEwKSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoaSxKU09OLnN0cmluZ2lmeShyKSl9fSkpfWdldFJlZnJlc2hUaW1lb3V0VGltZXIoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk/SlNPTi5wYXJzZSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk6LTF9KSl9Y2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYodClyZXR1cm4gdm9pZCBjbGVhclRpbWVvdXQodCk7Y29uc3QgZT15aWVsZCB0aGlzLmdldFJlZnJlc2hUaW1lb3V0VGltZXIoKTstMSE9PWUmJmNsZWFyVGltZW91dChlKX0pKX19dmFyIEM9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBEKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gUChlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4sci5nZXQ/cjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtuXX19KX0pKSx0fXZhciBJPXtleHBvcnRzOnt9fSxPPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxyPTA7cjxuLmxlbmd0aDtyKyspbltyXT1hcmd1bWVudHNbcl07cmV0dXJuIGUuYXBwbHkodCxuKX19LFU9TyxMPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gSChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBNKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIGooZSl7cmV0dXJuIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PUwuY2FsbChlKX1mdW5jdGlvbiBxKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfWZ1bmN0aW9uIE4oZSl7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1MLmNhbGwoZSkpcmV0dXJuITE7dmFyIHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09dHx8dD09PU9iamVjdC5wcm90b3R5cGV9ZnVuY3Rpb24geChlKXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09TC5jYWxsKGUpfWZ1bmN0aW9uIEsoZSx0KXtpZihudWxsIT1lKWlmKCJvYmplY3QiIT10eXBlb2YgZSYmKGU9W2VdKSxIKGUpKWZvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0LmNhbGwobnVsbCxlW25dLG4sZSk7ZWxzZSBmb3IodmFyIGkgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmdC5jYWxsKG51bGwsZVtpXSxpLGUpfXZhciBCPXtpc0FycmF5OkgsaXNBcnJheUJ1ZmZlcjpqLGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIU0oZSkmJm51bGwhPT1lLmNvbnN0cnVjdG9yJiYhTShlLmNvbnN0cnVjdG9yKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9LGlzRm9ybURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRm9ybURhdGFdIj09PUwuY2FsbChlKX0saXNBcnJheUJ1ZmZlclZpZXc6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyhlKTplJiZlLmJ1ZmZlciYmaihlLmJ1ZmZlcil9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSxpc09iamVjdDpxLGlzUGxhaW5PYmplY3Q6Tixpc1VuZGVmaW5lZDpNLGlzRGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1MLmNhbGwoZSl9LGlzRmlsZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBGaWxlXSI9PT1MLmNhbGwoZSl9LGlzQmxvYjpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBCbG9iXSI9PT1MLmNhbGwoZSl9LGlzRnVuY3Rpb246eCxpc1N0cmVhbTpmdW5jdGlvbihlKXtyZXR1cm4gcShlKSYmeChlLnBpcGUpfSxpc1VSTFNlYXJjaFBhcmFtczpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBVUkxTZWFyY2hQYXJhbXNdIj09PUwuY2FsbChlKX0saXNTdGFuZGFyZEJyb3dzZXJFbnY6ZnVuY3Rpb24oKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3J8fCJSZWFjdE5hdGl2ZSIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5hdGl2ZVNjcmlwdCIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5TIiE9PW5hdmlnYXRvci5wcm9kdWN0KSYmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KX0sZm9yRWFjaDpLLG1lcmdlOmZ1bmN0aW9uIGUoKXt2YXIgdD17fTtmdW5jdGlvbiBuKG4scil7Tih0W3JdKSYmTihuKT90W3JdPWUodFtyXSxuKTpOKG4pP3Rbcl09ZSh7fSxuKTpIKG4pP3Rbcl09bi5zbGljZSgpOnRbcl09bn1mb3IodmFyIHI9MCxpPWFyZ3VtZW50cy5sZW5ndGg7cjxpO3IrKylLKGFyZ3VtZW50c1tyXSxuKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSyh0LChmdW5jdGlvbih0LHIpe2Vbcl09biYmImZ1bmN0aW9uIj09dHlwZW9mIHQ/VSh0LG4pOnR9KSksZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxzdHJpcEJPTTpmdW5jdGlvbihlKXtyZXR1cm4gNjUyNzk9PT1lLmNoYXJDb2RlQXQoMCkmJihlPWUuc2xpY2UoMSkpLGV9fSxKPUI7ZnVuY3Rpb24gRihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgJD1mdW5jdGlvbihlLHQsbil7aWYoIXQpcmV0dXJuIGU7dmFyIHI7aWYobilyPW4odCk7ZWxzZSBpZihKLmlzVVJMU2VhcmNoUGFyYW1zKHQpKXI9dC50b1N0cmluZygpO2Vsc2V7dmFyIGk9W107Si5mb3JFYWNoKHQsKGZ1bmN0aW9uKGUsdCl7bnVsbCE9ZSYmKEouaXNBcnJheShlKT90Kz0iW10iOmU9W2VdLEouZm9yRWFjaChlLChmdW5jdGlvbihlKXtKLmlzRGF0ZShlKT9lPWUudG9JU09TdHJpbmcoKTpKLmlzT2JqZWN0KGUpJiYoZT1KU09OLnN0cmluZ2lmeShlKSksaS5wdXNoKEYodCkrIj0iK0YoZSkpfSkpKX0pKSxyPWkuam9pbigiJiIpfWlmKHIpe3ZhciBvPWUuaW5kZXhPZigiIyIpOy0xIT09byYmKGU9ZS5zbGljZSgwLG8pKSxlKz0oLTE9PT1lLmluZGV4T2YoIj8iKT8iPyI6IiYiKStyfXJldHVybiBlfSxXPUI7ZnVuY3Rpb24geigpe3RoaXMuaGFuZGxlcnM9W119ei5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOiEhbiYmbi5zeW5jaHJvbm91cyxydW5XaGVuOm4/bi5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSx6LnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sei5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtXLmZvckVhY2godGhpcy5oYW5kbGVycywoZnVuY3Rpb24odCl7bnVsbCE9PXQmJmUodCl9KSl9O3ZhciBZPXosVj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2Z1bmN0aW9uIEcoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBYKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgWj1HLFE9WDtmdW5jdGlvbiBlZShlKXtpZihaPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChaPT09R3x8IVopJiZzZXRUaW1lb3V0KXJldHVybiBaPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gWihlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gWi5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gWi5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBWLnNldFRpbWVvdXQmJihaPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBWLmNsZWFyVGltZW91dCYmKFE9Y2xlYXJUaW1lb3V0KTt2YXIgdGUsbmU9W10scmU9ITEsaWU9LTE7ZnVuY3Rpb24gb2UoKXtyZSYmdGUmJihyZT0hMSx0ZS5sZW5ndGg/bmU9dGUuY29uY2F0KG5lKTppZT0tMSxuZS5sZW5ndGgmJnNlKCkpfWZ1bmN0aW9uIHNlKCl7aWYoIXJlKXt2YXIgZT1lZShvZSk7cmU9ITA7Zm9yKHZhciB0PW5lLmxlbmd0aDt0Oyl7Zm9yKHRlPW5lLG5lPVtdOysraWU8dDspdGUmJnRlW2llXS5ydW4oKTtpZT0tMSx0PW5lLmxlbmd0aH10ZT1udWxsLHJlPSExLGZ1bmN0aW9uKGUpe2lmKFE9PT1jbGVhclRpbWVvdXQpcmV0dXJuIGNsZWFyVGltZW91dChlKTtpZigoUT09PVh8fCFRKSYmY2xlYXJUaW1lb3V0KXJldHVybiBRPWNsZWFyVGltZW91dCxjbGVhclRpbWVvdXQoZSk7dHJ5e1EoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBRLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gUS5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGFlKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9YWUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe3RoaXMuZnVuLmFwcGx5KG51bGwsdGhpcy5hcnJheSl9O2Z1bmN0aW9uIGNlKCl7fXZhciB1ZT1jZSxsZT1jZSxkZT1jZSxoZT1jZSxmZT1jZSxwZT1jZSxnZT1jZTt2YXIgdmU9Vi5wZXJmb3JtYW5jZXx8e30seWU9dmUubm93fHx2ZS5tb3pOb3d8fHZlLm1zTm93fHx2ZS5vTm93fHx2ZS53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBtZT1uZXcgRGF0ZTt2YXIgd2U9e25leHRUaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07bmUucHVzaChuZXcgYWUoZSx0KSksMSE9PW5lLmxlbmd0aHx8cmV8fGVlKHNlKX0sdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjp1ZSxhZGRMaXN0ZW5lcjpsZSxvbmNlOmRlLG9mZjpoZSxyZW1vdmVMaXN0ZW5lcjpmZSxyZW1vdmVBbGxMaXN0ZW5lcnM6cGUsZW1pdDpnZSxiaW5kaW5nOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9LjAwMSp5ZS5jYWxsKHZlKSxuPU1hdGguZmxvb3IodCkscj1NYXRoLmZsb29yKHQlMSoxZTkpO3JldHVybiBlJiYobi09ZVswXSwoci09ZVsxXSk8MCYmKG4tLSxyKz0xZTkpKSxbbixyXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1tZSkvMWUzfX0sX2U9d2UsU2U9QixiZT1mdW5jdGlvbihlLHQsbixyLGkpe3JldHVybiBlLmNvbmZpZz10LG4mJihlLmNvZGU9biksZS5yZXF1ZXN0PXIsZS5yZXNwb25zZT1pLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sa2U9e3NpbGVudEpTT05QYXJzaW5nOiEwLGZvcmNlZEpTT05QYXJzaW5nOiEwLGNsYXJpZnlUaW1lb3V0RXJyb3I6ITF9LEVlPWJlLFRlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89bmV3IEVycm9yKGUpO3JldHVybiBFZShvLHQsbixyLGkpfSxSZT1UZSxBZT1CLENlPUFlLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/e3dyaXRlOmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt2YXIgcz1bXTtzLnB1c2goZSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHQpKSxBZS5pc051bWJlcihuKSYmcy5wdXNoKCJleHBpcmVzPSIrbmV3IERhdGUobikudG9HTVRTdHJpbmcoKSksQWUuaXNTdHJpbmcocikmJnMucHVzaCgicGF0aD0iK3IpLEFlLmlzU3RyaW5nKGkpJiZzLnB1c2goImRvbWFpbj0iK2kpLCEwPT09byYmcy5wdXNoKCJzZWN1cmUiKSxkb2N1bWVudC5jb29raWU9cy5qb2luKCI7ICIpfSxyZWFkOmZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCIoXnw7XFxzKikoIitlKyIpPShbXjtdKikiKSk7cmV0dXJuIHQ/ZGVjb2RlVVJJQ29tcG9uZW50KHRbM10pOm51bGx9LHJlbW92ZTpmdW5jdGlvbihlKXt0aGlzLndyaXRlKGUsIiIsRGF0ZS5ub3coKS04NjRlNSl9fTp7d3JpdGU6ZnVuY3Rpb24oKXt9LHJlYWQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0scmVtb3ZlOmZ1bmN0aW9uKCl7fX0sRGU9ZnVuY3Rpb24oZSl7cmV0dXJuL14oW2Etel1bYS16XGQrXC0uXSo6KT9cL1wvL2kudGVzdChlKX0sUGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9lLnJlcGxhY2UoL1wvKyQvLCIiKSsiLyIrdC5yZXBsYWNlKC9eXC8rLywiIik6ZX0sSWU9QixPZT1bImFnZSIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LWxlbmd0aCIsImNvbnRlbnQtdHlwZSIsImV0YWciLCJleHBpcmVzIiwiZnJvbSIsImhvc3QiLCJpZi1tb2RpZmllZC1zaW5jZSIsImlmLXVubW9kaWZpZWQtc2luY2UiLCJsYXN0LW1vZGlmaWVkIiwibG9jYXRpb24iLCJtYXgtZm9yd2FyZHMiLCJwcm94eS1hdXRob3JpemF0aW9uIiwicmVmZXJlciIsInJldHJ5LWFmdGVyIiwidXNlci1hZ2VudCJdLFVlPUIsTGU9VWUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT9mdW5jdGlvbigpe3ZhciBlLHQ9Lyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtmdW5jdGlvbiByKGUpe3ZhciByPWU7cmV0dXJuIHQmJihuLnNldEF0dHJpYnV0ZSgiaHJlZiIscikscj1uLmhyZWYpLG4uc2V0QXR0cmlidXRlKCJocmVmIixyKSx7aHJlZjpuLmhyZWYscHJvdG9jb2w6bi5wcm90b2NvbD9uLnByb3RvY29sLnJlcGxhY2UoLzokLywiIik6IiIsaG9zdDpuLmhvc3Qsc2VhcmNoOm4uc2VhcmNoP24uc2VhcmNoLnJlcGxhY2UoL15cPy8sIiIpOiIiLGhhc2g6bi5oYXNoP24uaGFzaC5yZXBsYWNlKC9eIy8sIiIpOiIiLGhvc3RuYW1lOm4uaG9zdG5hbWUscG9ydDpuLnBvcnQscGF0aG5hbWU6Ii8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCk/bi5wYXRobmFtZToiLyIrbi5wYXRobmFtZX19cmV0dXJuIGU9cih3aW5kb3cubG9jYXRpb24uaHJlZiksZnVuY3Rpb24odCl7dmFyIG49VWUuaXNTdHJpbmcodCk/cih0KTp0O3JldHVybiBuLnByb3RvY29sPT09ZS5wcm90b2NvbCYmbi5ob3N0PT09ZS5ob3N0fX0oKTpmdW5jdGlvbigpe3JldHVybiEwfTtmdW5jdGlvbiBIZShlKXt0aGlzLm1lc3NhZ2U9ZX1IZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iQ2FuY2VsIisodGhpcy5tZXNzYWdlPyI6ICIrdGhpcy5tZXNzYWdlOiIiKX0sSGUucHJvdG90eXBlLl9fQ0FOQ0VMX189ITA7dmFyIE1lPUhlLGplPUIscWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4uY29uZmlnLnZhbGlkYXRlU3RhdHVzO24uc3RhdHVzJiZyJiYhcihuLnN0YXR1cyk/dChSZSgiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK24uc3RhdHVzLG4uY29uZmlnLG51bGwsbi5yZXF1ZXN0LG4pKTplKG4pfSxOZT1DZSx4ZT0kLEtlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiFEZSh0KT9QZShlLHQpOnR9LEJlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixpPXt9O3JldHVybiBlPyhJZS5mb3JFYWNoKGUuc3BsaXQoIlxuIiksKGZ1bmN0aW9uKGUpe2lmKHI9ZS5pbmRleE9mKCI6IiksdD1JZS50cmltKGUuc3Vic3RyKDAscikpLnRvTG93ZXJDYXNlKCksbj1JZS50cmltKGUuc3Vic3RyKHIrMSkpLHQpe2lmKGlbdF0mJk9lLmluZGV4T2YodCk+PTApcmV0dXJuO2lbdF09InNldC1jb29raWUiPT09dD8oaVt0XT9pW3RdOltdKS5jb25jYXQoW25dKTppW3RdP2lbdF0rIiwgIituOm59fSkpLGkpOml9LEplPUxlLEZlPVRlLCRlPWtlLFdlPU1lLHplPWZ1bmN0aW9uKGUpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXt2YXIgcixpPWUuZGF0YSxvPWUuaGVhZGVycyxzPWUucmVzcG9uc2VUeXBlO2Z1bmN0aW9uIGEoKXtlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnVuc3Vic2NyaWJlKHIpLGUuc2lnbmFsJiZlLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIscil9amUuaXNGb3JtRGF0YShpKSYmZGVsZXRlIG9bIkNvbnRlbnQtVHlwZSJdO3ZhciBjPW5ldyBYTUxIdHRwUmVxdWVzdDtpZihlLmF1dGgpe3ZhciB1PWUuYXV0aC51c2VybmFtZXx8IiIsbD1lLmF1dGgucGFzc3dvcmQ/dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUuYXV0aC5wYXNzd29yZCkpOiIiO28uQXV0aG9yaXphdGlvbj0iQmFzaWMgIitidG9hKHUrIjoiK2wpfXZhciBkPUtlKGUuYmFzZVVSTCxlLnVybCk7ZnVuY3Rpb24gaCgpe2lmKGMpe3ZhciByPSJnZXRBbGxSZXNwb25zZUhlYWRlcnMiaW4gYz9CZShjLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKTpudWxsLGk9e2RhdGE6cyYmInRleHQiIT09cyYmImpzb24iIT09cz9jLnJlc3BvbnNlOmMucmVzcG9uc2VUZXh0LHN0YXR1czpjLnN0YXR1cyxzdGF0dXNUZXh0OmMuc3RhdHVzVGV4dCxoZWFkZXJzOnIsY29uZmlnOmUscmVxdWVzdDpjfTtxZSgoZnVuY3Rpb24oZSl7dChlKSxhKCl9KSwoZnVuY3Rpb24oZSl7bihlKSxhKCl9KSxpKSxjPW51bGx9fWlmKGMub3BlbihlLm1ldGhvZC50b1VwcGVyQ2FzZSgpLHhlKGQsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKSwhMCksYy50aW1lb3V0PWUudGltZW91dCwib25sb2FkZW5kImluIGM/Yy5vbmxvYWRlbmQ9aDpjLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MmJjQ9PT1jLnJlYWR5U3RhdGUmJigwIT09Yy5zdGF0dXN8fGMucmVzcG9uc2VVUkwmJjA9PT1jLnJlc3BvbnNlVVJMLmluZGV4T2YoImZpbGU6IikpJiZzZXRUaW1lb3V0KGgpfSxjLm9uYWJvcnQ9ZnVuY3Rpb24oKXtjJiYobihGZSgiUmVxdWVzdCBhYm9ydGVkIixlLCJFQ09OTkFCT1JURUQiLGMpKSxjPW51bGwpfSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXtuKEZlKCJOZXR3b3JrIEVycm9yIixlLG51bGwsYykpLGM9bnVsbH0sYy5vbnRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgdD1lLnRpbWVvdXQ/InRpbWVvdXQgb2YgIitlLnRpbWVvdXQrIm1zIGV4Y2VlZGVkIjoidGltZW91dCBleGNlZWRlZCIscj1lLnRyYW5zaXRpb25hbHx8JGU7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYodD1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLG4oRmUodCxlLHIuY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsfSxqZS5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgZj0oZS53aXRoQ3JlZGVudGlhbHN8fEplKGQpKSYmZS54c3JmQ29va2llTmFtZT9OZS5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDtmJiYob1tlLnhzcmZIZWFkZXJOYW1lXT1mKX0ic2V0UmVxdWVzdEhlYWRlciJpbiBjJiZqZS5mb3JFYWNoKG8sKGZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09aSYmImNvbnRlbnQtdHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/ZGVsZXRlIG9bdF06Yy5zZXRSZXF1ZXN0SGVhZGVyKHQsZSl9KSksamUuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwoYy53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscykscyYmImpzb24iIT09cyYmKGMucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3MmJmMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzJiZjLnVwbG9hZCYmYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKHI9ZnVuY3Rpb24oZSl7YyYmKG4oIWV8fGUmJmUudHlwZT9uZXcgV2UoImNhbmNlbGVkIik6ZSksYy5hYm9ydCgpLGM9bnVsbCl9LGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKHIpLGUuc2lnbmFsJiYoZS5zaWduYWwuYWJvcnRlZD9yKCk6ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHIpKSksaXx8KGk9bnVsbCksYy5zZW5kKGkpfSkpfSxZZT1CLFZlPWZ1bmN0aW9uKGUsdCl7U2UuZm9yRWFjaChlLChmdW5jdGlvbihuLHIpe3IhPT10JiZyLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPW4sZGVsZXRlIGVbcl0pfSkpfSxHZT1iZSxYZT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIFplKGUsdCl7IVllLmlzVW5kZWZpbmVkKGUpJiZZZS5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgUWUsZXQ9e3RyYW5zaXRpb25hbDprZSxhZGFwdGVyOigoInVuZGVmaW5lZCIhPXR5cGVvZiBYTUxIdHRwUmVxdWVzdHx8dm9pZCAwIT09X2UmJiJbb2JqZWN0IHByb2Nlc3NdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChfZSkpJiYoUWU9emUpLFFlKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe3JldHVybiBWZSh0LCJBY2NlcHQiKSxWZSh0LCJDb250ZW50LVR5cGUiKSxZZS5pc0Zvcm1EYXRhKGUpfHxZZS5pc0FycmF5QnVmZmVyKGUpfHxZZS5pc0J1ZmZlcihlKXx8WWUuaXNTdHJlYW0oZSl8fFllLmlzRmlsZShlKXx8WWUuaXNCbG9iKGUpP2U6WWUuaXNBcnJheUJ1ZmZlclZpZXcoZSk/ZS5idWZmZXI6WWUuaXNVUkxTZWFyY2hQYXJhbXMoZSk/KFplKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpKTpZZS5pc09iamVjdChlKXx8dCYmImFwcGxpY2F0aW9uL2pzb24iPT09dFsiQ29udGVudC1UeXBlIl0/KFplKHQsImFwcGxpY2F0aW9uL2pzb24iKSxmdW5jdGlvbihlLHQsbil7aWYoWWUuaXNTdHJpbmcoZSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShlKSxZZS50cmltKGUpfWNhdGNoKGUpe2lmKCJTeW50YXhFcnJvciIhPT1lLm5hbWUpdGhyb3cgZX1yZXR1cm4obnx8SlNPTi5zdHJpbmdpZnkpKGUpfShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8ZXQudHJhbnNpdGlvbmFsLG49dCYmdC5zaWxlbnRKU09OUGFyc2luZyxyPXQmJnQuZm9yY2VkSlNPTlBhcnNpbmcsaT0hbiYmImpzb24iPT09dGhpcy5yZXNwb25zZVR5cGU7aWYoaXx8ciYmWWUuaXNTdHJpbmcoZSkmJmUubGVuZ3RoKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChlKXtpZihpKXtpZigiU3ludGF4RXJyb3IiPT09ZS5uYW1lKXRocm93IEdlKGUsdGhpcywiRV9KU09OX1BBUlNFIik7dGhyb3cgZX19cmV0dXJuIGV9XSx0aW1lb3V0OjAseHNyZkNvb2tpZU5hbWU6IlhTUkYtVE9LRU4iLHhzcmZIZWFkZXJOYW1lOiJYLVhTUkYtVE9LRU4iLG1heENvbnRlbnRMZW5ndGg6LTEsbWF4Qm9keUxlbmd0aDotMSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fX07WWUuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7ZXQuaGVhZGVyc1tlXT17fX0pKSxZZS5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe2V0LmhlYWRlcnNbZV09WWUubWVyZ2UoWGUpfSkpO3ZhciB0dD1ldCxudD1CLHJ0PXR0LGl0PWZ1bmN0aW9uKGUpe3JldHVybiEoIWV8fCFlLl9fQ0FOQ0VMX18pfSxvdD1CLHN0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzfHxydDtyZXR1cm4gbnQuZm9yRWFjaChuLChmdW5jdGlvbihuKXtlPW4uY2FsbChyLGUsdCl9KSksZX0sYXQ9aXQsY3Q9dHQsdXQ9TWU7ZnVuY3Rpb24gbHQoZSl7aWYoZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksZS5zaWduYWwmJmUuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IHV0KCJjYW5jZWxlZCIpfXZhciBkdD1CLGh0PWZ1bmN0aW9uKGUsdCl7dD10fHx7fTt2YXIgbj17fTtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGR0LmlzUGxhaW5PYmplY3QoZSkmJmR0LmlzUGxhaW5PYmplY3QodCk/ZHQubWVyZ2UoZSx0KTpkdC5pc1BsYWluT2JqZWN0KHQpP2R0Lm1lcmdlKHt9LHQpOmR0LmlzQXJyYXkodCk/dC5zbGljZSgpOnR9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZHQuaXNVbmRlZmluZWQodFtuXSk/ZHQuaXNVbmRlZmluZWQoZVtuXSk/dm9pZCAwOnIodm9pZCAwLGVbbl0pOnIoZVtuXSx0W25dKX1mdW5jdGlvbiBvKGUpe2lmKCFkdC5pc1VuZGVmaW5lZCh0W2VdKSlyZXR1cm4gcih2b2lkIDAsdFtlXSl9ZnVuY3Rpb24gcyhuKXtyZXR1cm4gZHQuaXNVbmRlZmluZWQodFtuXSk/ZHQuaXNVbmRlZmluZWQoZVtuXSk/dm9pZCAwOnIodm9pZCAwLGVbbl0pOnIodm9pZCAwLHRbbl0pfWZ1bmN0aW9uIGEobil7cmV0dXJuIG4gaW4gdD9yKGVbbl0sdFtuXSk6biBpbiBlP3Iodm9pZCAwLGVbbl0pOnZvaWQgMH12YXIgYz17dXJsOm8sbWV0aG9kOm8sZGF0YTpvLGJhc2VVUkw6cyx0cmFuc2Zvcm1SZXF1ZXN0OnMsdHJhbnNmb3JtUmVzcG9uc2U6cyxwYXJhbXNTZXJpYWxpemVyOnMsdGltZW91dDpzLHRpbWVvdXRNZXNzYWdlOnMsd2l0aENyZWRlbnRpYWxzOnMsYWRhcHRlcjpzLHJlc3BvbnNlVHlwZTpzLHhzcmZDb29raWVOYW1lOnMseHNyZkhlYWRlck5hbWU6cyxvblVwbG9hZFByb2dyZXNzOnMsb25Eb3dubG9hZFByb2dyZXNzOnMsZGVjb21wcmVzczpzLG1heENvbnRlbnRMZW5ndGg6cyxtYXhCb2R5TGVuZ3RoOnMsdHJhbnNwb3J0OnMsaHR0cEFnZW50OnMsaHR0cHNBZ2VudDpzLGNhbmNlbFRva2VuOnMsc29ja2V0UGF0aDpzLHJlc3BvbnNlRW5jb2Rpbmc6cyx2YWxpZGF0ZVN0YXR1czphfTtyZXR1cm4gZHQuZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLChmdW5jdGlvbihlKXt2YXIgdD1jW2VdfHxpLHI9dChlKTtkdC5pc1VuZGVmaW5lZChyKSYmdCE9PWF8fChuW2VdPXIpfSkpLG59LGZ0PSIwLjI2LjEiLHB0PWZ0LGd0PXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtndFtlXT1mdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PT1lfHwiYSIrKHQ8MT8ibiAiOiIgIikrZX19KSk7dmFyIHZ0PXt9O2d0LnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3JldHVybiJbQXhpb3MgdiIrcHQrIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitlKyInIit0KyhuPyIuICIrbjoiIil9cmV0dXJuIGZ1bmN0aW9uKG4saSxvKXtpZighMT09PWUpdGhyb3cgbmV3IEVycm9yKHIoaSwiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSkpO3JldHVybiB0JiYhdnRbaV0mJih2dFtpXT0hMCxjb25zb2xlLndhcm4ocihpLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLCFlfHxlKG4saSxvKX19O3ZhciB5dD17YXNzZXJ0T3B0aW9uczpmdW5jdGlvbihlLHQsbil7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QiKTtmb3IodmFyIHI9T2JqZWN0LmtleXMoZSksaT1yLmxlbmd0aDtpLS0gPjA7KXt2YXIgbz1yW2ldLHM9dFtvXTtpZihzKXt2YXIgYT1lW29dLGM9dm9pZCAwPT09YXx8cyhhLG8sZSk7aWYoITAhPT1jKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbiAiK28rIiBtdXN0IGJlICIrYyl9ZWxzZSBpZighMCE9PW4pdGhyb3cgRXJyb3IoIlVua25vd24gb3B0aW9uICIrbyl9fSx2YWxpZGF0b3JzOmd0fSxtdD1CLHd0PSQsX3Q9WSxTdD1mdW5jdGlvbihlKXtyZXR1cm4gbHQoZSksZS5oZWFkZXJzPWUuaGVhZGVyc3x8e30sZS5kYXRhPXN0LmNhbGwoZSxlLmRhdGEsZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVxdWVzdCksZS5oZWFkZXJzPW90Lm1lcmdlKGUuaGVhZGVycy5jb21tb258fHt9LGUuaGVhZGVyc1tlLm1ldGhvZF18fHt9LGUuaGVhZGVycyksb3QuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJwb3N0IiwicHV0IiwicGF0Y2giLCJjb21tb24iXSwoZnVuY3Rpb24odCl7ZGVsZXRlIGUuaGVhZGVyc1t0XX0pKSwoZS5hZGFwdGVyfHxjdC5hZGFwdGVyKShlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gbHQoZSksdC5kYXRhPXN0LmNhbGwoZSx0LmRhdGEsdC5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpLHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIGF0KHQpfHwobHQoZSksdCYmdC5yZXNwb25zZSYmKHQucmVzcG9uc2UuZGF0YT1zdC5jYWxsKGUsdC5yZXNwb25zZS5kYXRhLHQucmVzcG9uc2UuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSkpLFByb21pc2UucmVqZWN0KHQpfSkpfSxidD1odCxrdD15dCxFdD1rdC52YWxpZGF0b3JzO2Z1bmN0aW9uIFR0KGUpe3RoaXMuZGVmYXVsdHM9ZSx0aGlzLmludGVyY2VwdG9ycz17cmVxdWVzdDpuZXcgX3QscmVzcG9uc2U6bmV3IF90fX1UdC5wcm90b3R5cGUucmVxdWVzdD1mdW5jdGlvbihlLHQpeyJzdHJpbmciPT10eXBlb2YgZT8odD10fHx7fSkudXJsPWU6dD1lfHx7fSwodD1idCh0aGlzLmRlZmF1bHRzLHQpKS5tZXRob2Q/dC5tZXRob2Q9dC5tZXRob2QudG9Mb3dlckNhc2UoKTp0aGlzLmRlZmF1bHRzLm1ldGhvZD90Lm1ldGhvZD10aGlzLmRlZmF1bHRzLm1ldGhvZC50b0xvd2VyQ2FzZSgpOnQubWV0aG9kPSJnZXQiO3ZhciBuPXQudHJhbnNpdGlvbmFsO3ZvaWQgMCE9PW4mJmt0LmFzc2VydE9wdGlvbnMobix7c2lsZW50SlNPTlBhcnNpbmc6RXQudHJhbnNpdGlvbmFsKEV0LmJvb2xlYW4pLGZvcmNlZEpTT05QYXJzaW5nOkV0LnRyYW5zaXRpb25hbChFdC5ib29sZWFuKSxjbGFyaWZ5VGltZW91dEVycm9yOkV0LnRyYW5zaXRpb25hbChFdC5ib29sZWFuKX0sITEpO3ZhciByPVtdLGk9ITA7dGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKChmdW5jdGlvbihlKXsiZnVuY3Rpb24iPT10eXBlb2YgZS5ydW5XaGVuJiYhMT09PWUucnVuV2hlbih0KXx8KGk9aSYmZS5zeW5jaHJvbm91cyxyLnVuc2hpZnQoZS5mdWxmaWxsZWQsZS5yZWplY3RlZCkpfSkpO3ZhciBvLHM9W107aWYodGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7cy5wdXNoKGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpfSkpLCFpKXt2YXIgYT1bU3Qsdm9pZCAwXTtmb3IoQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkoYSxyKSxhPWEuY29uY2F0KHMpLG89UHJvbWlzZS5yZXNvbHZlKHQpO2EubGVuZ3RoOylvPW8udGhlbihhLnNoaWZ0KCksYS5zaGlmdCgpKTtyZXR1cm4gb31mb3IodmFyIGM9dDtyLmxlbmd0aDspe3ZhciB1PXIuc2hpZnQoKSxsPXIuc2hpZnQoKTt0cnl7Yz11KGMpfWNhdGNoKGUpe2woZSk7YnJlYWt9fXRyeXtvPVN0KGMpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX1mb3IoO3MubGVuZ3RoOylvPW8udGhlbihzLnNoaWZ0KCkscy5zaGlmdCgpKTtyZXR1cm4gb30sVHQucHJvdG90eXBlLmdldFVyaT1mdW5jdGlvbihlKXtyZXR1cm4gZT1idCh0aGlzLmRlZmF1bHRzLGUpLHd0KGUudXJsLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplcikucmVwbGFjZSgvXlw/LywiIil9LG10LmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwib3B0aW9ucyJdLChmdW5jdGlvbihlKXtUdC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGJ0KG58fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOihufHx7fSkuZGF0YX0pKX19KSksbXQuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXtUdC5wcm90b3R5cGVbZV09ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLnJlcXVlc3QoYnQocnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6bn0pKX19KSk7dmFyIFJ0PVR0LEF0PU1lO2Z1bmN0aW9uIEN0KGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoImV4ZWN1dG9yIG11c3QgYmUgYSBmdW5jdGlvbi4iKTt2YXIgdDt0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Q9ZX0pKTt2YXIgbj10aGlzO3RoaXMucHJvbWlzZS50aGVuKChmdW5jdGlvbihlKXtpZihuLl9saXN0ZW5lcnMpe3ZhciB0LHI9bi5fbGlzdGVuZXJzLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kyspbi5fbGlzdGVuZXJzW3RdKGUpO24uX2xpc3RlbmVycz1udWxsfX0pKSx0aGlzLnByb21pc2UudGhlbj1mdW5jdGlvbihlKXt2YXIgdCxyPW5ldyBQcm9taXNlKChmdW5jdGlvbihlKXtuLnN1YnNjcmliZShlKSx0PWV9KSkudGhlbihlKTtyZXR1cm4gci5jYW5jZWw9ZnVuY3Rpb24oKXtuLnVuc3Vic2NyaWJlKHQpfSxyfSxlKChmdW5jdGlvbihlKXtuLnJlYXNvbnx8KG4ucmVhc29uPW5ldyBBdChlKSx0KG4ucmVhc29uKSl9KSl9Q3QucHJvdG90eXBlLnRocm93SWZSZXF1ZXN0ZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLnJlYXNvbil0aHJvdyB0aGlzLnJlYXNvbn0sQ3QucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlKXt0aGlzLnJlYXNvbj9lKHRoaXMucmVhc29uKTp0aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzLnB1c2goZSk6dGhpcy5fbGlzdGVuZXJzPVtlXX0sQ3QucHJvdG90eXBlLnVuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe2lmKHRoaXMuX2xpc3RlbmVycyl7dmFyIHQ9dGhpcy5fbGlzdGVuZXJzLmluZGV4T2YoZSk7LTEhPT10JiZ0aGlzLl9saXN0ZW5lcnMuc3BsaWNlKHQsMSl9fSxDdC5zb3VyY2U9ZnVuY3Rpb24oKXt2YXIgZSx0PW5ldyBDdCgoZnVuY3Rpb24odCl7ZT10fSkpO3JldHVybnt0b2tlbjp0LGNhbmNlbDplfX07dmFyIER0PUN0LFB0PUIsSXQ9QixPdD1PLFV0PVJ0LEx0PWh0O3ZhciBIdD1mdW5jdGlvbiBlKHQpe3ZhciBuPW5ldyBVdCh0KSxyPU90KFV0LnByb3RvdHlwZS5yZXF1ZXN0LG4pO3JldHVybiBJdC5leHRlbmQocixVdC5wcm90b3R5cGUsbiksSXQuZXh0ZW5kKHIsbiksci5jcmVhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGUoTHQodCxuKSl9LHJ9KHR0KTtIdC5BeGlvcz1VdCxIdC5DYW5jZWw9TWUsSHQuQ2FuY2VsVG9rZW49RHQsSHQuaXNDYW5jZWw9aXQsSHQuVkVSU0lPTj1mdCxIdC5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxIdC5zcHJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KG51bGwsdCl9fSxIdC5pc0F4aW9zRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIFB0LmlzT2JqZWN0KGUpJiYhMD09PWUuaXNBeGlvc0Vycm9yfSxJLmV4cG9ydHM9SHQsSS5leHBvcnRzLmRlZmF1bHQ9SHQ7dmFyIE10LGp0PUkuZXhwb3J0cztsZXQgcXQ9TXQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmF0dGFjaFRva2VuPSgpPT5Qcm9taXNlLnJlc29sdmUoKSx0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPSgpPT5udWxsLHRoaXMuaW5pdD10aGlzLmluaXQuYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjay5iaW5kKHRoaXMpfXN0YXRpYyBnZXRJbnN0YW5jZSgpe3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9anQuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcgTXQpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbGllbnRJbnN0YW5jZS5yZXF1ZXN0SGFuZGxlcih0KX0pKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChlPT50aGlzLmNsaWVudEluc3RhbmNlLnN1Y2Nlc3NIYW5kbGVyKGUpKSwoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIoZSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuYWxsPWp0LmFsbCx0aGlzLmF4aW9zSW5zdGFuY2Uuc3ByZWFkPWp0LnNwcmVhZCx0aGlzLmF4aW9zSW5zdGFuY2UuaW5pdD10aGlzLmNsaWVudEluc3RhbmNlLmluaXQsdGhpcy5heGlvc0luc3RhbmNlLmVuYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5lbmFibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0PXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSx0aGlzLmF4aW9zSW5zdGFuY2V9cmVxdWVzdEhhbmRsZXIodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLmF0dGFjaFRva2VuKHQpLG51bGw9PXQ/dm9pZCAwOnQuc2hvdWxkRW5jb2RlVG9Gb3JtRGF0YSl7Y29uc3QgZT1udWxsPT10P3ZvaWQgMDp0LmRhdGEsbj1uZXcgRm9ybURhdGE7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e24uYXBwZW5kKHQsZVt0XSl9KSksdC5kYXRhPW59cmV0dXJuIHQuc3RhcnRUaW1lSW5Ncz0obmV3IERhdGUpLmdldFRpbWUoKSxNdC5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayh0KSx0fSkpfWVycm9ySGFuZGxlcihlKXt0aHJvdyBNdC5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJnRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1zdWNjZXNzSGFuZGxlcihlKXtyZXR1cm4gTXQuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9aW5pdCh0PSEwLG4pe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7TXQuaXNIYW5kbGVyRW5hYmxlZD10LHRoaXMuYXR0YWNoVG9rZW49bn0pKX1lbmFibGVIYW5kbGVyKCl7TXQuaXNIYW5kbGVyRW5hYmxlZD0hMH1kaXNhYmxlSGFuZGxlcigpe010LmlzSGFuZGxlckVuYWJsZWQ9ITF9ZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dChlPU10LkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQpe010LmlzSGFuZGxlckVuYWJsZWQ9ITEsc2V0VGltZW91dCgoKCk9PntNdC5pc0hhbmRsZXJFbmFibGVkPSEwfSksZSl9c2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9ZX19O3F0LkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLHF0PU10PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1yP3I9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LG4pOnI7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LG4scik7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkoaT1lW2FdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQsbixzKTppKHQsbikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHMpLHN9KFtlPT57fV0scXQpO2NsYXNzIE50e2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1uZXcgTWFwfXNldERhdGEodCxuKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuc2V0KHQsbil9KSl9Z2V0RGF0YSh0KXt2YXIgbixyO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGwhPT0ocj1udWxsPT09KG49dGhpcy5fZGF0YSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0KHQpKSYmdm9pZCAwIT09cj9yOiJ7fSJ9KSl9cmVtb3ZlRGF0YSh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuZGVsZXRlKHQpfSkpfX12YXIgeHQ9W10sS3Q9W10sQnQ9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksSnQ9ITE7ZnVuY3Rpb24gRnQoKXtKdD0hMDtmb3IodmFyIGU9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHQ9MCxuPWUubGVuZ3RoO3Q8bjsrK3QpeHRbdF09ZVt0XSxLdFtlLmNoYXJDb2RlQXQodCldPXQ7S3RbIi0iLmNoYXJDb2RlQXQoMCldPTYyLEt0WyJfIi5jaGFyQ29kZUF0KDApXT02M31mdW5jdGlvbiAkdChlLHQsbil7Zm9yKHZhciByLGksbz1bXSxzPXQ7czxuO3MrPTMpcj0oZVtzXTw8MTYpKyhlW3MrMV08PDgpK2VbcysyXSxvLnB1c2goeHRbKGk9cik+PjE4JjYzXSt4dFtpPj4xMiY2M10reHRbaT4+NiY2M10reHRbNjMmaV0pO3JldHVybiBvLmpvaW4oIiIpfWZ1bmN0aW9uIFd0KGUpe3ZhciB0O0p0fHxGdCgpO2Zvcih2YXIgbj1lLmxlbmd0aCxyPW4lMyxpPSIiLG89W10scz0xNjM4MyxhPTAsYz1uLXI7YTxjO2ErPXMpby5wdXNoKCR0KGUsYSxhK3M+Yz9jOmErcykpO3JldHVybiAxPT09cj8odD1lW24tMV0saSs9eHRbdD4+Ml0saSs9eHRbdDw8NCY2M10saSs9Ij09Iik6Mj09PXImJih0PShlW24tMl08PDgpK2Vbbi0xXSxpKz14dFt0Pj4xMF0saSs9eHRbdD4+NCY2M10saSs9eHRbdDw8MiY2M10saSs9Ij0iKSxvLnB1c2goaSksby5qb2luKCIiKX1mdW5jdGlvbiB6dChlLHQsbixyLGkpe3ZhciBvLHMsYT04Kmktci0xLGM9KDE8PGEpLTEsdT1jPj4xLGw9LTcsZD1uP2ktMTowLGg9bj8tMToxLGY9ZVt0K2RdO2ZvcihkKz1oLG89ZiYoMTw8LWwpLTEsZj4+PS1sLGwrPWE7bD4wO289MjU2Km8rZVt0K2RdLGQrPWgsbC09OCk7Zm9yKHM9byYoMTw8LWwpLTEsbz4+PS1sLGwrPXI7bD4wO3M9MjU2KnMrZVt0K2RdLGQrPWgsbC09OCk7aWYoMD09PW8pbz0xLXU7ZWxzZXtpZihvPT09YylyZXR1cm4gcz9OYU46MS8wKihmPy0xOjEpO3MrPU1hdGgucG93KDIsciksby09dX1yZXR1cm4oZj8tMToxKSpzKk1hdGgucG93KDIsby1yKX1mdW5jdGlvbiBZdChlLHQsbixyLGksbyl7dmFyIHMsYSxjLHU9OCpvLWktMSxsPSgxPDx1KS0xLGQ9bD4+MSxoPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZj1yPzA6by0xLHA9cj8xOi0xLGc9dDwwfHwwPT09dCYmMS90PDA/MTowO2Zvcih0PU1hdGguYWJzKHQpLGlzTmFOKHQpfHx0PT09MS8wPyhhPWlzTmFOKHQpPzE6MCxzPWwpOihzPU1hdGguZmxvb3IoTWF0aC5sb2codCkvTWF0aC5MTjIpLHQqKGM9TWF0aC5wb3coMiwtcykpPDEmJihzLS0sYyo9MiksKHQrPXMrZD49MT9oL2M6aCpNYXRoLnBvdygyLDEtZCkpKmM+PTImJihzKyssYy89MikscytkPj1sPyhhPTAscz1sKTpzK2Q+PTE/KGE9KHQqYy0xKSpNYXRoLnBvdygyLGkpLHMrPWQpOihhPXQqTWF0aC5wb3coMixkLTEpKk1hdGgucG93KDIsaSkscz0wKSk7aT49ODtlW24rZl09MjU1JmEsZis9cCxhLz0yNTYsaS09OCk7Zm9yKHM9czw8aXxhLHUrPWk7dT4wO2VbbitmXT0yNTUmcyxmKz1wLHMvPTI1Nix1LT04KTtlW24rZi1wXXw9MTI4Kmd9dmFyIFZ0PXt9LnRvU3RyaW5nLEd0PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PVZ0LmNhbGwoZSl9O2VuLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwPT09Vi5UWVBFRF9BUlJBWV9TVVBQT1JUfHxWLlRZUEVEX0FSUkFZX1NVUFBPUlQ7dmFyIFh0PVp0KCk7ZnVuY3Rpb24gWnQoKXtyZXR1cm4gZW4uVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gUXQoZSx0KXtpZihadCgpPHQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9bmV3IFVpbnQ4QXJyYXkodCkpLl9fcHJvdG9fXz1lbi5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgZW4odCkpLGUubGVuZ3RoPXQpLGV9ZnVuY3Rpb24gZW4oZSx0LG4pe2lmKCEoZW4uVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGVuKSlyZXR1cm4gbmV3IGVuKGUsdCxuKTtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIHJuKHRoaXMsZSl9cmV0dXJuIHRuKHRoaXMsZSx0LG4pfWZ1bmN0aW9uIHRuKGUsdCxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKGUsdCxuLHIpe2lmKHQuYnl0ZUxlbmd0aCxuPDB8fHQuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYodC5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7dD12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCxuKTpuZXcgVWludDhBcnJheSh0LG4scik7ZW4uVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189ZW4ucHJvdG90eXBlOmU9b24oZSx0KTtyZXR1cm4gZX0oZSx0LG4scik6InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighZW4uaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGNuKHQsbiksaT0oZT1RdChlLHIpKS53cml0ZSh0LG4pO2khPT1yJiYoZT1lLnNsaWNlKDAsaSkpO3JldHVybiBlfShlLHQsbik6ZnVuY3Rpb24oZSx0KXtpZihhbih0KSl7dmFyIG49MHxzbih0Lmxlbmd0aCk7cmV0dXJuIDA9PT0oZT1RdChlLG4pKS5sZW5ndGh8fHQuY29weShlLDAsMCxuKSxlfWlmKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwocj10Lmxlbmd0aCkhPXI/UXQoZSwwKTpvbihlLHQpO2lmKCJCdWZmZXIiPT09dC50eXBlJiZHdCh0LmRhdGEpKXJldHVybiBvbihlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIG5uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gcm4oZSx0KXtpZihubih0KSxlPVF0KGUsdDwwPzA6MHxzbih0KSksIWVuLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gb24oZSx0KXt2YXIgbj10Lmxlbmd0aDwwPzA6MHxzbih0Lmxlbmd0aCk7ZT1RdChlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gc24oZSl7aWYoZT49WnQoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrWnQoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gYW4oZSl7cmV0dXJuIShudWxsPT1lfHwhZS5faXNCdWZmZXIpfWZ1bmN0aW9uIGNuKGUsdCl7aWYoYW4oZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEhuKGUpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gTW4oZSkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gSG4oZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gdW4oZSx0LG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT10fHx0PDApJiYodD0wKSx0PnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PSh0Pj4+PTApKXJldHVybiIiO2ZvcihlfHwoZT0idXRmOCIpOzspc3dpdGNoKGUpe2Nhc2UiaGV4IjpyZXR1cm4gRW4odGhpcyx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIF9uKHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gYm4odGhpcyx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGtuKHRoaXMsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIHduKHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFRuKHRoaXMsdCxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtlPShlKyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGxuKGUsdCxuKXt2YXIgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9ZnVuY3Rpb24gZG4oZSx0LG4scixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1pPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFpKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWVuLmZyb20odCxyKSksYW4odCkpcmV0dXJuIDA9PT10Lmxlbmd0aD8tMTpobihlLHQsbixyLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGUsdCxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGUsdCxuKTpobihlLFt0XSxuLHIsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gaG4oZSx0LG4scixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBsPS0xO2ZvcihvPW47bzxhO28rKylpZih1KGUsbyk9PT11KHQsLTE9PT1sPzA6by1sKSl7aWYoLTE9PT1sJiYobD1vKSxvLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoby09by1sKSxsPS0xfWVsc2UgZm9yKG4rYz5hJiYobj1hLWMpLG89bjtvPj0wO28tLSl7Zm9yKHZhciBkPSEwLGg9MDtoPGM7aCsrKWlmKHUoZSxvK2gpIT09dSh0LGgpKXtkPSExO2JyZWFrfWlmKGQpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gZm4oZSx0LG4scil7bj1OdW1iZXIobil8fDA7dmFyIGk9ZS5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+aSYmKHI9aSk6cj1pO3ZhciBvPXQubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPm8vMiYmKHI9by8yKTtmb3IodmFyIHM9MDtzPHI7KytzKXt2YXIgYT1wYXJzZUludCh0LnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO2VbbitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIHBuKGUsdCxuLHIpe3JldHVybiBqbihIbih0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiBnbihlLHQsbixyKXtyZXR1cm4gam4oZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiB2bihlLHQsbixyKXtyZXR1cm4gZ24oZSx0LG4scil9ZnVuY3Rpb24geW4oZSx0LG4scil7cmV0dXJuIGpuKE1uKHQpLGUsbixyKX1mdW5jdGlvbiBtbihlLHQsbixyKXtyZXR1cm4gam4oZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixpLG89W10scz0wO3M8ZS5sZW5ndGgmJiEoKHQtPTIpPDApOysrcylyPShuPWUuY2hhckNvZGVBdChzKSk+PjgsaT1uJTI1NixvLnB1c2goaSksby5wdXNoKHIpO3JldHVybiBvfSh0LGUubGVuZ3RoLW4pLGUsbixyKX1mdW5jdGlvbiB3bihlLHQsbil7cmV0dXJuIDA9PT10JiZuPT09ZS5sZW5ndGg/V3QoZSk6V3QoZS5zbGljZSh0LG4pKX1mdW5jdGlvbiBfbihlLHQsbil7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIHI9W10saT10O2k8bjspe3ZhciBvLHMsYSxjLHU9ZVtpXSxsPW51bGwsZD11PjIzOT80OnU+MjIzPzM6dT4xOTE/MjoxO2lmKGkrZDw9bilzd2l0Y2goZCl7Y2FzZSAxOnU8MTI4JiYobD11KTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPWVbaSsxXSkpJiYoYz0oMzEmdSk8PDZ8NjMmbyk+MTI3JiYobD1jKTticmVhaztjYXNlIDM6bz1lW2krMV0scz1lW2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJihjPSgxNSZ1KTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJihjPDU1Mjk2fHxjPjU3MzQzKSYmKGw9Yyk7YnJlYWs7Y2FzZSA0Om89ZVtpKzFdLHM9ZVtpKzJdLGE9ZVtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJihjPSgxNSZ1KTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJmM8MTExNDExMiYmKGw9Yyl9bnVsbD09PWw/KGw9NjU1MzMsZD0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLGkrPWR9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ8PVNuKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgbj0iIixyPTA7Zm9yKDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz1TbikpO3JldHVybiBufShyKX1lbi5wb29sU2l6ZT04MTkyLGVuLl9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz1lbi5wcm90b3R5cGUsZX0sZW4uZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRuKG51bGwsZSx0LG4pfSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUJiYoZW4ucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxlbi5fX3Byb3RvX189VWludDhBcnJheSksZW4uYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbm4odCksdDw9MD9RdChlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP1F0KGUsdCkuZmlsbChuLHIpOlF0KGUsdCkuZmlsbChuKTpRdChlLHQpfShudWxsLGUsdCxuKX0sZW4uYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHJuKG51bGwsZSl9LGVuLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gcm4obnVsbCxlKX0sZW4uaXNCdWZmZXI9cW4sZW4uY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFhbihlKXx8IWFuKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxpPTAsbz1NYXRoLm1pbihuLHIpO2k8bzsrK2kpaWYoZVtpXSE9PXRbaV0pe249ZVtpXSxyPXRbaV07YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxlbi5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxlbi5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighR3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gZW4uYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09dClmb3IodD0wLG49MDtuPGUubGVuZ3RoOysrbil0Kz1lW25dLmxlbmd0aDt2YXIgcj1lbi5hbGxvY1Vuc2FmZSh0KSxpPTA7Zm9yKG49MDtuPGUubGVuZ3RoOysrbil7dmFyIG89ZVtuXTtpZighYW4obykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShyLGkpLGkrPW8ubGVuZ3RofXJldHVybiByfSxlbi5ieXRlTGVuZ3RoPWNuLGVuLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsZW4ucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9Milsbih0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30sZW4ucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NClsbih0aGlzLHQsdCszKSxsbih0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxlbi5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KWxuKHRoaXMsdCx0KzcpLGxuKHRoaXMsdCsxLHQrNiksbG4odGhpcyx0KzIsdCs1KSxsbih0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxlbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9fbih0aGlzLDAsZSk6dW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlbi5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFhbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09ZW4uY29tcGFyZSh0aGlzLGUpfSxlbi5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxlbi5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixyLGkpe2lmKCFhbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09biYmKG49ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1yJiYocj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxuPmUubGVuZ3RofHxyPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI+PWkmJnQ+PW4pcmV0dXJuIDA7aWYocj49aSlyZXR1cm4tMTtpZih0Pj1uKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0ocj4+Pj0wKSxzPShuPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSxjPXRoaXMuc2xpY2UocixpKSx1PWUuc2xpY2UodCxuKSxsPTA7bDxhOysrbClpZihjW2xdIT09dVtsXSl7bz1jW2xdLHM9dVtsXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGVuLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxlbi5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGRuKHRoaXMsZSx0LG4sITApfSxlbi5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkbih0aGlzLGUsdCxuLCExKX0sZW4ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHZvaWQgMD09PXQpcj0idXRmOCIsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1uJiYic3RyaW5nIj09dHlwZW9mIHQpcj10LG49dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKG4pPyhufD0wLHZvaWQgMD09PXImJihyPSJ1dGY4IikpOihyPW4sbj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PW58fG4+aSkmJihuPWkpLGUubGVuZ3RoPjAmJihuPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7cnx8KHI9InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gocil7Y2FzZSJoZXgiOnJldHVybiBmbih0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBwbih0aGlzLGUsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gZ24odGhpcyxlLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gdm4odGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiB5bih0aGlzLGUsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIG1uKHRoaXMsZSx0LG4pO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpO3I9KCIiK3IpLnRvTG93ZXJDYXNlKCksbz0hMH19LGVuLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBTbj00MDk2O2Z1bmN0aW9uIGJuKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgaT10O2k8bjsrK2kpcis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIHJ9ZnVuY3Rpb24ga24oZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBpPXQ7aTxuOysraSlyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiByfWZ1bmN0aW9uIEVuKGUsdCxuKXt2YXIgcj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIGk9IiIsbz10O288bjsrK28paSs9TG4oZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVG4oZSx0LG4pe2Zvcih2YXIgcj1lLnNsaWNlKHQsbiksaT0iIixvPTA7bzxyLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUocltvXSsyNTYqcltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBSbihlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gQW4oZSx0LG4scixpLG8pe2lmKCFhbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gQ24oZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtpPG87KytpKWVbbitpXT0odCYyNTU8PDgqKHI/aToxLWkpKT4+PjgqKHI/aToxLWkpfWZ1bmN0aW9uIERuKGUsdCxuLHIpe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtbiw0KTtpPG87KytpKWVbbitpXT10Pj4+OCoocj9pOjMtaSkmMjU1fWZ1bmN0aW9uIFBuKGUsdCxuLHIsaSxvKXtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSW4oZSx0LG4scixpKXtyZXR1cm4gaXx8UG4oZSwwLG4sNCksWXQoZSx0LG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gT24oZSx0LG4scixpKXtyZXR1cm4gaXx8UG4oZSwwLG4sOCksWXQoZSx0LG4sciw1Miw4KSxuKzh9ZW4ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQpKG49dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189ZW4ucHJvdG90eXBlO2Vsc2V7dmFyIGk9dC1lO249bmV3IGVuKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKW5bb109dGhpc1tvK2VdfXJldHVybiBufSxlbi5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KXIrPXRoaXNbZStvXSppO3JldHVybiByfSxlbi5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOylyKz10aGlzW2UrLS10XSppO3JldHVybiByfSxlbi5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sZW4ucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxlbi5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LGVuLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxlbi5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0sZW4ucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KXIrPXRoaXNbZStvXSppO3JldHVybiByPj0oaSo9MTI4KSYmKHItPU1hdGgucG93KDIsOCp0KSkscn0sZW4ucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFJuKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsaT0xLG89dGhpc1tlKy0tcl07cj4wJiYoaSo9MjU2KTspbys9dGhpc1tlKy0tcl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqdCkpLG99LGVuLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW2VdPy0xKigyNTUtdGhpc1tlXSsxKTp0aGlzW2VdfSxlbi5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxSbihlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxlbi5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXt0fHxSbihlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxlbi5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LGVuLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sZW4ucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsNCx0aGlzLmxlbmd0aCksenQodGhpcyxlLCEwLDIzLDQpfSxlbi5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw0LHRoaXMubGVuZ3RoKSx6dCh0aGlzLGUsITEsMjMsNCl9LGVuLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw4LHRoaXMubGVuZ3RoKSx6dCh0aGlzLGUsITAsNTIsOCl9LGVuLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw4LHRoaXMubGVuZ3RoKSx6dCh0aGlzLGUsITEsNTIsOCl9LGVuLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXsoZT0rZSx0fD0wLG58PTAscil8fEFuKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPG4mJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtufSxlbi5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7KGU9K2UsdHw9MCxufD0wLHIpfHxBbih0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBpPW4tMSxvPTE7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxlbi5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCwxLDI1NSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0sZW4ucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsMiw2NTUzNSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6Q24odGhpcyxlLHQsITApLHQrMn0sZW4ucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsMiw2NTUzNSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6Q24odGhpcyxlLHQsITEpLHQrMn0sZW4ucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6RG4odGhpcyxlLHQsITApLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6RG4odGhpcyxlLHQsITEpLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgaT1NYXRoLnBvdygyLDgqbi0xKTtBbih0aGlzLGUsdCxuLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxuJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvLTFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sZW4ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgaT1NYXRoLnBvdygyLDgqbi0xKTtBbih0aGlzLGUsdCxuLGktMSwtaSl9dmFyIG89bi0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28rMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtufSxlbi5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDEsMTI3LC0xMjgpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGVuLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpDbih0aGlzLGUsdCwhMCksdCsyfSxlbi5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6Q24odGhpcyxlLHQsITEpLHQrMn0sZW4ucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCk6RG4odGhpcyxlLHQsITApLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6RG4odGhpcyxlLHQsITEpLHQrNH0sZW4ucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEluKHRoaXMsZSx0LCEwLG4pfSxlbi5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gSW4odGhpcyxlLHQsITEsbil9LGVuLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gT24odGhpcyxlLHQsITAsbil9LGVuLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gT24odGhpcyxlLHQsITEsbil9LGVuLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxyLW4mJihyPWUubGVuZ3RoLXQrbik7dmFyIGksbz1yLW47aWYodGhpcz09PWUmJm48dCYmdDxyKWZvcihpPW8tMTtpPj0wOy0taSllW2krdF09dGhpc1tpK25dO2Vsc2UgaWYobzwxZTN8fCFlbi5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSllW2krdF09dGhpc1tpK25dO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KG4sbitvKSx0KTtyZXR1cm4gb30sZW4ucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIGk9ZS5jaGFyQ29kZUF0KDApO2k8MjU2JiYoZT1pKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWVuLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PXQpcmV0dXJuIHRoaXM7dmFyIG87aWYodD4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKG89dDtvPG47KytvKXRoaXNbb109ZTtlbHNle3ZhciBzPWFuKGUpP2U6SG4obmV3IGVuKGUscikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288bi10Oysrbyl0aGlzW28rdF09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgVW49L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gTG4oZSl7cmV0dXJuIGU8MTY/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEhuKGUsdCl7dmFyIG47dD10fHwxLzA7Zm9yKHZhciByPWUubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPHI7KytzKXtpZigobj1lLmNoYXJDb2RlQXQocykpPjU1Mjk1JiZuPDU3MzQ0KXtpZighaSl7aWYobj41NjMxOSl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PXIpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPW47Y29udGludWV9aWYobjw1NjMyMCl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9bjtjb250aW51ZX1uPTY1NTM2KyhpLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIGkmJih0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsbjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO28ucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7by5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO28ucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7by5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBNbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxzO0p0fHxGdCgpO3ZhciBhPWUubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09ZVthLTJdPzI6Ij0iPT09ZVthLTFdPzE6MCxzPW5ldyBCdCgzKmEvNC1vKSxyPW8+MD9hLTQ6YTt2YXIgYz0wO2Zvcih0PTAsbj0wO3Q8cjt0Kz00LG4rPTMpaT1LdFtlLmNoYXJDb2RlQXQodCldPDwxOHxLdFtlLmNoYXJDb2RlQXQodCsxKV08PDEyfEt0W2UuY2hhckNvZGVBdCh0KzIpXTw8NnxLdFtlLmNoYXJDb2RlQXQodCszKV0sc1tjKytdPWk+PjE2JjI1NSxzW2MrK109aT4+OCYyNTUsc1tjKytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1LdFtlLmNoYXJDb2RlQXQodCldPDwyfEt0W2UuY2hhckNvZGVBdCh0KzEpXT4+NCxzW2MrK109MjU1JmkpOjE9PT1vJiYoaT1LdFtlLmNoYXJDb2RlQXQodCldPDwxMHxLdFtlLmNoYXJDb2RlQXQodCsxKV08PDR8S3RbZS5jaGFyQ29kZUF0KHQrMildPj4yLHNbYysrXT1pPj44JjI1NSxzW2MrK109MjU1JmkpLHN9KGZ1bmN0aW9uKGUpe2lmKChlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KGUpLnJlcGxhY2UoVW4sIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIGpuKGUsdCxuLHIpe2Zvcih2YXIgaT0wO2k8ciYmIShpK24+PXQubGVuZ3RofHxpPj1lLmxlbmd0aCk7KytpKXRbaStuXT1lW2ldO3JldHVybiBpfWZ1bmN0aW9uIHFuKGUpe3JldHVybiBudWxsIT1lJiYoISFlLl9pc0J1ZmZlcnx8Tm4oZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmTm4oZS5zbGljZSgwLDApKX0oZSkpfWZ1bmN0aW9uIE5uKGUpe3JldHVybiEhZS5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9dmFyIHhuPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJ1ZmZlcjplbixJTlNQRUNUX01BWF9CWVRFUzo1MCxTbG93QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxlbi5hbGxvYygrZSl9LGlzQnVmZmVyOnFuLGtNYXhMZW5ndGg6WHR9KSxLbj17ZXhwb3J0czp7fX0sQm49e30sSm49e307T2JqZWN0LmRlZmluZVByb3BlcnR5KEpuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxKbi5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoLG49dCU0O2lmKCFuKXJldHVybiBlO3ZhciByPXQsaT00LW4sbz10K2kscz1lbi5hbGxvYyhvKTtmb3Iocy53cml0ZShlKTtpLS07KXMud3JpdGUoIj0iLHIrKyk7cmV0dXJuIHMudG9TdHJpbmcoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KEJuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRm49Sm47ZnVuY3Rpb24gJG4oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxlbi5pc0J1ZmZlcihlKT96bihlLnRvU3RyaW5nKCJiYXNlNjQiKSk6em4oZW4uZnJvbShlLHQpLnRvU3RyaW5nKCJiYXNlNjQiKSl9ZnVuY3Rpb24gV24oZSl7cmV0dXJuIGU9ZS50b1N0cmluZygpLEZuLmRlZmF1bHQoZSkucmVwbGFjZSgvXC0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpfWZ1bmN0aW9uIHpuKGUpe3JldHVybiBlLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKX12YXIgWW4sVm49JG47Vm4uZW5jb2RlPSRuLFZuLmRlY29kZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLGVuLmZyb20oV24oZSksImJhc2U2NCIpLnRvU3RyaW5nKHQpfSxWbi50b0Jhc2U2ND1XbixWbi5mcm9tQmFzZTY0PXpuLFZuLnRvQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiBlbi5mcm9tKFduKGUpLCJiYXNlNjQiKX0sQm4uZGVmYXVsdD1WbiwoWW49S24pLmV4cG9ydHM9Qm4uZGVmYXVsdCxZbi5leHBvcnRzLmRlZmF1bHQ9WW4uZXhwb3J0czt2YXIgR249S24uZXhwb3J0cyxYbj17ZXhwb3J0czp7fX07IWZ1bmN0aW9uKGUpeyFmdW5jdGlvbih0LG4pe3ZhciByPXt9OyFmdW5jdGlvbihlKXtlLl9fZXNNb2R1bGU9ITAsZS5kaWdlc3RMZW5ndGg9MzIsZS5ibG9ja1NpemU9NjQ7dmFyIHQ9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKTtmdW5jdGlvbiBuKGUsbixyLGksbyl7Zm9yKHZhciBzLGEsYyx1LGwsZCxoLGYscCxnLHYseSxtO28+PTY0Oyl7Zm9yKHM9blswXSxhPW5bMV0sYz1uWzJdLHU9blszXSxsPW5bNF0sZD1uWzVdLGg9bls2XSxmPW5bN10sZz0wO2c8MTY7ZysrKXY9aSs0KmcsZVtnXT0oMjU1JnJbdl0pPDwyNHwoMjU1JnJbdisxXSk8PDE2fCgyNTUmclt2KzJdKTw8OHwyNTUmclt2KzNdO2ZvcihnPTE2O2c8NjQ7ZysrKXk9KChwPWVbZy0yXSk+Pj4xN3xwPDwxNSleKHA+Pj4xOXxwPDwxMylecD4+PjEwLG09KChwPWVbZy0xNV0pPj4+N3xwPDwyNSleKHA+Pj4xOHxwPDwxNClecD4+PjMsZVtnXT0oeStlW2ctN118MCkrKG0rZVtnLTE2XXwwKTtmb3IoZz0wO2c8NjQ7ZysrKXk9KCgobD4+PjZ8bDw8MjYpXihsPj4+MTF8bDw8MjEpXihsPj4+MjV8bDw8NykpKyhsJmRefmwmaCl8MCkrKGYrKHRbZ10rZVtnXXwwKXwwKXwwLG09KChzPj4+MnxzPDwzMCleKHM+Pj4xM3xzPDwxOSleKHM+Pj4yMnxzPDwxMCkpKyhzJmFecyZjXmEmYyl8MCxmPWgsaD1kLGQ9bCxsPXUreXwwLHU9YyxjPWEsYT1zLHM9eSttfDA7blswXSs9cyxuWzFdKz1hLG5bMl0rPWMsblszXSs9dSxuWzRdKz1sLG5bNV0rPWQsbls2XSs9aCxuWzddKz1mLGkrPTY0LG8tPTY0fXJldHVybiBpfXZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuZGlnZXN0TGVuZ3RoPWUuZGlnZXN0TGVuZ3RoLHRoaXMuYmxvY2tTaXplPWUuYmxvY2tTaXplLHRoaXMuc3RhdGU9bmV3IEludDMyQXJyYXkoOCksdGhpcy50ZW1wPW5ldyBJbnQzMkFycmF5KDY0KSx0aGlzLmJ1ZmZlcj1uZXcgVWludDhBcnJheSgxMjgpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5yZXNldCgpfXJldHVybiB0LnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXRlWzBdPTE3NzkwMzM3MDMsdGhpcy5zdGF0ZVsxXT0zMTQ0MTM0Mjc3LHRoaXMuc3RhdGVbMl09MTAxMzkwNDI0Mix0aGlzLnN0YXRlWzNdPTI3NzM0ODA3NjIsdGhpcy5zdGF0ZVs0XT0xMzU5ODkzMTE5LHRoaXMuc3RhdGVbNV09MjYwMDgyMjkyNCx0aGlzLnN0YXRlWzZdPTUyODczNDYzNSx0aGlzLnN0YXRlWzddPTE1NDE0NTkyMjUsdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzfSx0LnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5idWZmZXIubGVuZ3RoO2UrKyl0aGlzLmJ1ZmZlcltlXT0wO2ZvcihlPTA7ZTx0aGlzLnRlbXAubGVuZ3RoO2UrKyl0aGlzLnRlbXBbZV09MDt0aGlzLnJlc2V0KCl9LHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PWUubGVuZ3RoKSx0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiU0hBMjU2OiBjYW4ndCB1cGRhdGUgYmVjYXVzZSBoYXNoIHdhcyBmaW5pc2hlZC4iKTt2YXIgcj0wO2lmKHRoaXMuYnl0ZXNIYXNoZWQrPXQsdGhpcy5idWZmZXJMZW5ndGg+MCl7Zm9yKDt0aGlzLmJ1ZmZlckxlbmd0aDw2NCYmdD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW3IrK10sdC0tOzY0PT09dGhpcy5idWZmZXJMZW5ndGgmJihuKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAsNjQpLHRoaXMuYnVmZmVyTGVuZ3RoPTApfWZvcih0Pj02NCYmKHI9bih0aGlzLnRlbXAsdGhpcy5zdGF0ZSxlLHIsdCksdCU9NjQpO3Q+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtyKytdLHQtLTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLmJ5dGVzSGFzaGVkLHI9dGhpcy5idWZmZXJMZW5ndGgsaT10LzUzNjg3MDkxMnwwLG89dDw8MyxzPXQlNjQ8NTY/NjQ6MTI4O3RoaXMuYnVmZmVyW3JdPTEyODtmb3IodmFyIGE9cisxO2E8cy04O2ErKyl0aGlzLmJ1ZmZlclthXT0wO3RoaXMuYnVmZmVyW3MtOF09aT4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTddPWk+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy02XT1pPj4+OCYyNTUsdGhpcy5idWZmZXJbcy01XT1pPj4+MCYyNTUsdGhpcy5idWZmZXJbcy00XT1vPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtM109bz4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTJdPW8+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTFdPW8+Pj4wJjI1NSxuKHRoaXMudGVtcCx0aGlzLnN0YXRlLHRoaXMuYnVmZmVyLDAscyksdGhpcy5maW5pc2hlZD0hMH1mb3IoYT0wO2E8ODthKyspZVs0KmErMF09dGhpcy5zdGF0ZVthXT4+PjI0JjI1NSxlWzQqYSsxXT10aGlzLnN0YXRlW2FdPj4+MTYmMjU1LGVbNCphKzJdPXRoaXMuc3RhdGVbYV0+Pj44JjI1NSxlWzQqYSszXT10aGlzLnN0YXRlW2FdPj4+MCYyNTU7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sdC5wcm90b3R5cGUuX3NhdmVTdGF0ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PHRoaXMuc3RhdGUubGVuZ3RoO3QrKyllW3RdPXRoaXMuc3RhdGVbdF19LHQucHJvdG90eXBlLl9yZXN0b3JlU3RhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHRoaXMuc3RhdGUubGVuZ3RoO24rKyl0aGlzLnN0YXRlW25dPWVbbl07dGhpcy5ieXRlc0hhc2hlZD10LHRoaXMuZmluaXNoZWQ9ITEsdGhpcy5idWZmZXJMZW5ndGg9MH0sdH0oKTtlLkhhc2g9cjt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5pbm5lcj1uZXcgcix0aGlzLm91dGVyPW5ldyByLHRoaXMuYmxvY2tTaXplPXRoaXMuaW5uZXIuYmxvY2tTaXplLHRoaXMuZGlnZXN0TGVuZ3RoPXRoaXMuaW5uZXIuZGlnZXN0TGVuZ3RoO3ZhciB0PW5ldyBVaW50OEFycmF5KHRoaXMuYmxvY2tTaXplKTtpZihlLmxlbmd0aD50aGlzLmJsb2NrU2l6ZSkobmV3IHIpLnVwZGF0ZShlKS5maW5pc2godCkuY2xlYW4oKTtlbHNlIGZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZVtuXTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRbbl1ePTU0O3RoaXMuaW5uZXIudXBkYXRlKHQpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXV49MTA2O3RoaXMub3V0ZXIudXBkYXRlKHQpLHRoaXMuaXN0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLm9zdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5pbm5lci5fc2F2ZVN0YXRlKHRoaXMuaXN0YXRlKSx0aGlzLm91dGVyLl9zYXZlU3RhdGUodGhpcy5vc3RhdGUpO2ZvcihuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT0wfXJldHVybiBlLnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVyLl9yZXN0b3JlU3RhdGUodGhpcy5pc3RhdGUsdGhpcy5pbm5lci5ibG9ja1NpemUpLHRoaXMub3V0ZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLm9zdGF0ZSx0aGlzLm91dGVyLmJsb2NrU2l6ZSksdGhpc30sZS5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuaXN0YXRlLmxlbmd0aDtlKyspdGhpcy5vc3RhdGVbZV09dGhpcy5pc3RhdGVbZV09MDt0aGlzLmlubmVyLmNsZWFuKCksdGhpcy5vdXRlci5jbGVhbigpfSxlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaW5uZXIudXBkYXRlKGUpLHRoaXN9LGUucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vdXRlci5maW5pc2hlZD90aGlzLm91dGVyLmZpbmlzaChlKToodGhpcy5pbm5lci5maW5pc2goZSksdGhpcy5vdXRlci51cGRhdGUoZSx0aGlzLmRpZ2VzdExlbmd0aCkuZmluaXNoKGUpKSx0aGlzfSxlLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LGV9KCk7ZnVuY3Rpb24gbyhlKXt2YXIgdD0obmV3IHIpLnVwZGF0ZShlKSxuPXQuZGlnZXN0KCk7cmV0dXJuIHQuY2xlYW4oKSxufWZ1bmN0aW9uIHMoZSx0KXt2YXIgbj1uZXcgaShlKS51cGRhdGUodCkscj1uLmRpZ2VzdCgpO3JldHVybiBuLmNsZWFuKCkscn1mdW5jdGlvbiBhKGUsdCxuLHIpe3ZhciBpPXJbMF07aWYoMD09PWkpdGhyb3cgbmV3IEVycm9yKCJoa2RmOiBjYW5ub3QgZXhwYW5kIG1vcmUiKTt0LnJlc2V0KCksaT4xJiZ0LnVwZGF0ZShlKSxuJiZ0LnVwZGF0ZShuKSx0LnVwZGF0ZShyKSx0LmZpbmlzaChlKSxyWzBdKyt9ZS5ITUFDPWksZS5oYXNoPW8sZS5kZWZhdWx0PW8sZS5obWFjPXM7dmFyIGM9bmV3IFVpbnQ4QXJyYXkoZS5kaWdlc3RMZW5ndGgpO2Z1bmN0aW9uIHUoZSx0LG4scil7dm9pZCAwPT09dCYmKHQ9Yyksdm9pZCAwPT09ciYmKHI9MzIpO2Zvcih2YXIgbz1uZXcgVWludDhBcnJheShbMV0pLHU9cyh0LGUpLGw9bmV3IGkodSksZD1uZXcgVWludDhBcnJheShsLmRpZ2VzdExlbmd0aCksaD1kLmxlbmd0aCxmPW5ldyBVaW50OEFycmF5KHIpLHA9MDtwPHI7cCsrKWg9PT1kLmxlbmd0aCYmKGEoZCxsLG4sbyksaD0wKSxmW3BdPWRbaCsrXTtyZXR1cm4gbC5jbGVhbigpLGQuZmlsbCgwKSxvLmZpbGwoMCksZn1mdW5jdGlvbiBsKGUsdCxuLHIpe2Zvcih2YXIgbz1uZXcgaShlKSxzPW8uZGlnZXN0TGVuZ3RoLGE9bmV3IFVpbnQ4QXJyYXkoNCksYz1uZXcgVWludDhBcnJheShzKSx1PW5ldyBVaW50OEFycmF5KHMpLGw9bmV3IFVpbnQ4QXJyYXkociksZD0wO2QqczxyO2QrKyl7dmFyIGg9ZCsxO2FbMF09aD4+PjI0JjI1NSxhWzFdPWg+Pj4xNiYyNTUsYVsyXT1oPj4+OCYyNTUsYVszXT1oPj4+MCYyNTUsby5yZXNldCgpLG8udXBkYXRlKHQpLG8udXBkYXRlKGEpLG8uZmluaXNoKHUpO2Zvcih2YXIgZj0wO2Y8cztmKyspY1tmXT11W2ZdO2ZvcihmPTI7Zjw9bjtmKyspe28ucmVzZXQoKSxvLnVwZGF0ZSh1KS5maW5pc2godSk7Zm9yKHZhciBwPTA7cDxzO3ArKyljW3BdXj11W3BdfWZvcihmPTA7ZjxzJiZkKnMrZjxyO2YrKylsW2QqcytmXT1jW2ZdfWZvcihkPTA7ZDxzO2QrKyljW2RdPXVbZF09MDtmb3IoZD0wO2Q8NDtkKyspYVtkXT0wO3JldHVybiBvLmNsZWFuKCksbH1lLmhrZGY9dSxlLnBia2RmMj1sfShyKTt2YXIgaT1yLmRlZmF1bHQ7Zm9yKHZhciBvIGluIHIpaVtvXT1yW29dO2UuZXhwb3J0cz1pfSgpfShYbik7dmFyIFpuPUQoWG4uZXhwb3J0cyksUW49Y3J5cHRvO2NvbnN0IGVyPWU9PmUgaW5zdGFuY2VvZiBDcnlwdG9LZXksdHI9bmV3IFRleHRFbmNvZGVyLG5yPW5ldyBUZXh0RGVjb2Rlcjtjb25zdCBycj1lPT57bGV0IHQ9ZTt0IGluc3RhbmNlb2YgVWludDhBcnJheSYmKHQ9bnIuZGVjb2RlKHQpKSx0PXQucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIikucmVwbGFjZSgvXHMvZywiIik7dHJ5e3JldHVybihlPT57Y29uc3QgdD1hdG9iKGUpLG49bmV3IFVpbnQ4QXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKW5bZV09dC5jaGFyQ29kZUF0KGUpO3JldHVybiBufSkodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGlucHV0IHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLiIpfX07Y2xhc3MgaXIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlKXt2YXIgdDtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0dFTkVSSUMiLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsbnVsbD09PSh0PUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKXx8dm9pZCAwPT09dHx8dC5jYWxsKEVycm9yLHRoaXMsdGhpcy5jb25zdHJ1Y3Rvcil9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0dFTkVSSUMifX1jbGFzcyBvciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKGUsdD0idW5zcGVjaWZpZWQiLG49InVuc3BlY2lmaWVkIil7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIix0aGlzLmNsYWltPXQsdGhpcy5yZWFzb249bn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCJ9fWNsYXNzIHNyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoZSx0PSJ1bnNwZWNpZmllZCIsbj0idW5zcGVjaWZpZWQiKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KV1RfRVhQSVJFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPW59c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfRVhQSVJFRCJ9fWNsYXNzIGFyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfQUxHX05PVF9BTExPV0VEIn19Y2xhc3MgY3IgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9fWNsYXNzIHVyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19JTlZBTElEIn19Y2xhc3MgbHIgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldUX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0lOVkFMSUQifX1jbGFzcyBkciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19JTlZBTElEIn19Y2xhc3MgaHIgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19OT19NQVRDSElOR19LRVkiLHRoaXMubWVzc2FnZT0ibm8gYXBwbGljYWJsZSBrZXkgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19OT19NQVRDSElOR19LRVkifX1jbGFzcyBmciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMiLHRoaXMubWVzc2FnZT0ibXVsdGlwbGUgbWF0Y2hpbmcga2V5cyBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMifX1jbGFzcyBwciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQiLHRoaXMubWVzc2FnZT0ic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsZWQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIn19ZnVuY3Rpb24gZ3IoKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgV2ViU29ja2V0UGFpcn1mdW5jdGlvbiB2cihlLHQ9ImFsZ29yaXRobS5uYW1lIil7cmV0dXJuIG5ldyBUeXBlRXJyb3IoYENyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgJHt0fSBtdXN0IGJlICR7ZX1gKX1mdW5jdGlvbiB5cihlLHQpe3JldHVybiBlLm5hbWU9PT10fWZ1bmN0aW9uIG1yKGUpe3JldHVybiBwYXJzZUludChlLm5hbWUuc2xpY2UoNCksMTApfWZ1bmN0aW9uIHdyKGUsdCwuLi5uKXtzd2l0Y2godCl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6e2lmKCF5cihlLmFsZ29yaXRobSwiSE1BQyIpKXRocm93IHZyKCJITUFDIik7Y29uc3Qgbj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihtcihlLmFsZ29yaXRobS5oYXNoKSE9PW4pdGhyb3cgdnIoYFNIQS0ke259YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjp7aWYoIXlyKGUuYWxnb3JpdGhtLCJSU0FTU0EtUEtDUzEtdjFfNSIpKXRocm93IHZyKCJSU0FTU0EtUEtDUzEtdjFfNSIpO2NvbnN0IG49cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYobXIoZS5hbGdvcml0aG0uaGFzaCkhPT1uKXRocm93IHZyKGBTSEEtJHtufWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6e2lmKCF5cihlLmFsZ29yaXRobSwiUlNBLVBTUyIpKXRocm93IHZyKCJSU0EtUFNTIik7Y29uc3Qgbj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihtcihlLmFsZ29yaXRobS5oYXNoKSE9PW4pdGhyb3cgdnIoYFNIQS0ke259YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIGdyKCkmJiJFZERTQSI6aWYoIXlyKGUuYWxnb3JpdGhtLCJOT0RFLUVEMjU1MTkiKSl0aHJvdyB2cigiTk9ERS1FRDI1NTE5Iik7YnJlYWs7Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6e2lmKCF5cihlLmFsZ29yaXRobSwiRUNEU0EiKSl0aHJvdyB2cigiRUNEU0EiKTtjb25zdCBuPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIkVTMjU2IjpyZXR1cm4iUC0yNTYiO2Nhc2UiRVMzODQiOnJldHVybiJQLTM4NCI7Y2FzZSJFUzUxMiI6cmV0dXJuIlAtNTIxIjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigidW5yZWFjaGFibGUiKX19KHQpO2lmKGUuYWxnb3JpdGhtLm5hbWVkQ3VydmUhPT1uKXRocm93IHZyKG4sImFsZ29yaXRobS5uYW1lZEN1cnZlIik7YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiIpfSFmdW5jdGlvbihlLHQpe2lmKHQubGVuZ3RoJiYhdC5zb21lKCh0PT5lLnVzYWdlcy5pbmNsdWRlcyh0KSkpKXtsZXQgZT0iQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyB1c2FnZXMgbXVzdCBpbmNsdWRlICI7aWYodC5sZW5ndGg+Mil7Y29uc3Qgbj10LnBvcCgpO2UrPWBvbmUgb2YgJHt0LmpvaW4oIiwgIil9LCBvciAke259LmB9ZWxzZSAyPT09dC5sZW5ndGg/ZSs9YG9uZSBvZiAke3RbMF19IG9yICR7dFsxXX0uYDplKz1gJHt0WzBdfS5gO3Rocm93IG5ldyBUeXBlRXJyb3IoZSl9fShlLG4pfXZhciBfcj0oZSwuLi50KT0+e2xldCBuPSJLZXkgbXVzdCBiZSAiO2lmKHQubGVuZ3RoPjIpe2NvbnN0IGU9dC5wb3AoKTtuKz1gb25lIG9mIHR5cGUgJHt0LmpvaW4oIiwgIil9LCBvciAke2V9LmB9ZWxzZSAyPT09dC5sZW5ndGg/bis9YG9uZSBvZiB0eXBlICR7dFswXX0gb3IgJHt0WzFdfS5gOm4rPWBvZiB0eXBlICR7dFswXX0uYDtyZXR1cm4gbnVsbD09ZT9uKz1gIFJlY2VpdmVkICR7ZX1gOiJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLm5hbWU/bis9YCBSZWNlaXZlZCBmdW5jdGlvbiAke2UubmFtZX1gOiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9ZSYmZS5jb25zdHJ1Y3RvciYmZS5jb25zdHJ1Y3Rvci5uYW1lJiYobis9YCBSZWNlaXZlZCBhbiBpbnN0YW5jZSBvZiAke2UuY29uc3RydWN0b3IubmFtZX1gKSxufSxTcj1lPT5lcihlKTtjb25zdCBicj1bIkNyeXB0b0tleSJdO2Z1bmN0aW9uIGtyKGUpe2lmKCJvYmplY3QiIT10eXBlb2YodD1lKXx8bnVsbD09PXR8fCJbb2JqZWN0IE9iamVjdF0iIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKXJldHVybiExO3ZhciB0O2lmKG51bGw9PT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSkpcmV0dXJuITA7bGV0IG49ZTtmb3IoO251bGwhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2Yobik7KW49T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pO3JldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk9PT1ufWNvbnN0IEVyPWFzeW5jIGU9Pnt2YXIgdCxuO2NvbnN0e2FsZ29yaXRobTpyLGtleVVzYWdlczppfT1mdW5jdGlvbihlKXtsZXQgdCxuO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOnN3aXRjaChlLmFsZyl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6dD17bmFtZToiSE1BQyIsaGFzaDpgU0hBLSR7ZS5hbGcuc2xpY2UoLTMpfWB9LG49WyJzaWduIiwidmVyaWZ5Il07YnJlYWs7Y2FzZSJBMTI4Q0JDLUhTMjU2IjpjYXNlIkExOTJDQkMtSFMzODQiOmNhc2UiQTI1NkNCQy1IUzUxMiI6dGhyb3cgbmV3IGNyKGAke2UuYWxnfSBrZXlzIGNhbm5vdCBiZSBpbXBvcnRlZCBhcyBDcnlwdG9LZXkgaW5zdGFuY2VzYCk7Y2FzZSJBMTI4R0NNIjpjYXNlIkExOTJHQ00iOmNhc2UiQTI1NkdDTSI6Y2FzZSJBMTI4R0NNS1ciOmNhc2UiQTE5MkdDTUtXIjpjYXNlIkEyNTZHQ01LVyI6dD17bmFtZToiQUVTLUdDTSJ9LG49WyJlbmNyeXB0IiwiZGVjcnlwdCJdO2JyZWFrO2Nhc2UiQTEyOEtXIjpjYXNlIkExOTJLVyI6Y2FzZSJBMjU2S1ciOnQ9e25hbWU6IkFFUy1LVyJ9LG49WyJ3cmFwS2V5IiwidW53cmFwS2V5Il07YnJlYWs7Y2FzZSJQQkVTMi1IUzI1NitBMTI4S1ciOmNhc2UiUEJFUzItSFMzODQrQTE5MktXIjpjYXNlIlBCRVMyLUhTNTEyK0EyNTZLVyI6dD17bmFtZToiUEJLREYyIn0sbj1bImRlcml2ZUJpdHMiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJSU0EiOnN3aXRjaChlLmFsZyl7Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6dD17bmFtZToiUlNBLVBTUyIsaGFzaDpgU0hBLSR7ZS5hbGcuc2xpY2UoLTMpfWB9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6dD17bmFtZToiUlNBU1NBLVBLQ1MxLXYxXzUiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlNBLU9BRVAiOmNhc2UiUlNBLU9BRVAtMjU2IjpjYXNlIlJTQS1PQUVQLTM4NCI6Y2FzZSJSU0EtT0FFUC01MTIiOnQ9e25hbWU6IlJTQS1PQUVQIixoYXNoOmBTSEEtJHtwYXJzZUludChlLmFsZy5zbGljZSgtMyksMTApfHwxfWB9LG49ZS5kP1siZGVjcnlwdCIsInVud3JhcEtleSJdOlsiZW5jcnlwdCIsIndyYXBLZXkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSJFQyI6c3dpdGNoKGUuYWxnKXtjYXNlIkVTMjU2Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0yNTYifSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVMzODQiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTM4NCJ9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFUzUxMiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtNTIxIn0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVDREgtRVMiOmNhc2UiRUNESC1FUytBMTI4S1ciOmNhc2UiRUNESC1FUytBMTkyS1ciOmNhc2UiRUNESC1FUytBMjU2S1ciOnQ9e25hbWU6IkVDREgiLG5hbWVkQ3VydmU6ZS5jcnZ9LG49ZS5kP1siZGVyaXZlQml0cyJdOltdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IGNyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIGdyKCkmJiJPS1AiOmlmKCJFZERTQSIhPT1lLmFsZyl0aHJvdyBuZXcgY3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpO2lmKCJFZDI1NTE5IiE9PWUuY3J2KXRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImNydiIgKFN1YnR5cGUgb2YgS2V5IFBhaXIpIFBhcmFtZXRlciB2YWx1ZScpO3Q9e25hbWU6Ik5PREUtRUQyNTUxOSIsbmFtZWRDdXJ2ZToiTk9ERS1FRDI1NTE5In0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOm59fShlKSxvPVtyLG51bGwhPT0odD1lLmV4dCkmJnZvaWQgMCE9PXQmJnQsbnVsbCE9PShuPWUua2V5X29wcykmJnZvaWQgMCE9PW4/bjppXTtpZigiUEJLREYyIj09PXIubmFtZSlyZXR1cm4gUW4uc3VidGxlLmltcG9ydEtleSgicmF3IixycihlLmspLC4uLm8pO2NvbnN0IHM9ey4uLmV9O3JldHVybiBkZWxldGUgcy5hbGcsUW4uc3VidGxlLmltcG9ydEtleSgiandrIixzLC4uLm8pfTtjb25zdCBUcj0oZSx0LG4pPT57ZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8L15BXGR7M30oPzpHQ00pP0tXJC8udGVzdChlKT8oZT0+e2lmKCEoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXtpZighU3IoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihfcihlLC4uLmJyLCJVaW50OEFycmF5IikpO2lmKCJzZWNyZXQiIT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7YnIuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIHN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3QgYmUgb2YgdHlwZSAic2VjcmV0ImApfX0pKHQpOigoZSx0KT0+e2lmKCFTcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKF9yKGUsLi4uYnIpKTtpZigic2VjcmV0Ij09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBub3QgYmUgb2YgdHlwZSAic2VjcmV0ImApO2lmKCJzaWduIj09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7YnIuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIHNpZ25pbmcgbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKCJkZWNyeXB0Ij09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7YnIuam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIGRlY3J5cHRpb24gbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKGUuYWxnb3JpdGhtJiYidmVyaWZ5Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSB2ZXJpZnlpbmcgbXVzdCBiZSBvZiB0eXBlICJwdWJsaWMiYCk7aWYoZS5hbGdvcml0aG0mJiJlbmNyeXB0Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBlbmNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHVibGljImApfSkodCxuKX07Y29uc3QgUnI9YXN5bmMoZSx0LG4scik9Pntjb25zdCBpPWF3YWl0IGZ1bmN0aW9uKGUsdCxuKXtpZihlcih0KSlyZXR1cm4gd3IodCxlLG4pLHQ7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKCFlLnN0YXJ0c1dpdGgoIkhTIikpdGhyb3cgbmV3IFR5cGVFcnJvcihfcih0LC4uLmJyKSk7cmV0dXJuIFFuLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCx7aGFzaDpgU0hBLSR7ZS5zbGljZSgtMyl9YCxuYW1lOiJITUFDIn0sITEsW25dKX10aHJvdyBuZXcgVHlwZUVycm9yKF9yKHQsLi4uYnIsIlVpbnQ4QXJyYXkiKSl9KGUsdCwidmVyaWZ5Iik7KChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJSUyIpfHxlLnN0YXJ0c1dpdGgoIlBTIikpe2NvbnN0e21vZHVsdXNMZW5ndGg6bn09dC5hbGdvcml0aG07aWYoIm51bWJlciIhPXR5cGVvZiBufHxuPDIwNDgpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlfSByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyYCl9fSkoZSxpKTtjb25zdCBvPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1gU0hBLSR7ZS5zbGljZSgtMyl9YDtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOmUuc2xpY2UoLTMpPj4zfTtjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDpuLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTp0Lm5hbWVkQ3VydmV9O2Nhc2UgZ3IoKSYmIkVkRFNBIjpjb25zdHtuYW1lZEN1cnZlOnJ9PXQ7cmV0dXJue25hbWU6cixuYW1lZEN1cnZlOnJ9O2RlZmF1bHQ6dGhyb3cgbmV3IGNyKGBhbGcgJHtlfSBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlciBieSBKT1NFIG9yIHlvdXIgamF2YXNjcmlwdCBydW50aW1lYCl9fShlLGkuYWxnb3JpdGhtKTt0cnl7cmV0dXJuIGF3YWl0IFFuLnN1YnRsZS52ZXJpZnkobyxpLG4scil9Y2F0Y2goZSl7cmV0dXJuITF9fTthc3luYyBmdW5jdGlvbiBBcihlLHQsbil7dmFyIHI7aWYoIWtyKGUpKXRocm93IG5ldyB1cigiRmxhdHRlbmVkIEpXUyBtdXN0IGJlIGFuIG9iamVjdCIpO2lmKHZvaWQgMD09PWUucHJvdGVjdGVkJiZ2b2lkIDA9PT1lLmhlYWRlcil0aHJvdyBuZXcgdXIoJ0ZsYXR0ZW5lZCBKV1MgbXVzdCBoYXZlIGVpdGhlciBvZiB0aGUgInByb3RlY3RlZCIgb3IgImhlYWRlciIgbWVtYmVycycpO2lmKHZvaWQgMCE9PWUucHJvdGVjdGVkJiYic3RyaW5nIiE9dHlwZW9mIGUucHJvdGVjdGVkKXRocm93IG5ldyB1cigiSldTIFByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDA9PT1lLnBheWxvYWQpdGhyb3cgbmV3IHVyKCJKV1MgUGF5bG9hZCBtaXNzaW5nIik7aWYoInN0cmluZyIhPXR5cGVvZiBlLnNpZ25hdHVyZSl0aHJvdyBuZXcgdXIoIkpXUyBTaWduYXR1cmUgbWlzc2luZyBvciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMCE9PWUuaGVhZGVyJiYha3IoZS5oZWFkZXIpKXRocm93IG5ldyB1cigiSldTIFVucHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2xldCBpPXt9O2lmKGUucHJvdGVjdGVkKXtjb25zdCB0PXJyKGUucHJvdGVjdGVkKTt0cnl7aT1KU09OLnBhcnNlKG5yLmRlY29kZSh0KSl9Y2F0Y2goZSl7dGhyb3cgbmV3IHVyKCJKV1MgUHJvdGVjdGVkIEhlYWRlciBpcyBpbnZhbGlkIil9fWlmKCEoKC4uLmUpPT57Y29uc3QgdD1lLmZpbHRlcihCb29sZWFuKTtpZigwPT09dC5sZW5ndGh8fDE9PT10Lmxlbmd0aClyZXR1cm4hMDtsZXQgbjtmb3IoY29uc3QgZSBvZiB0KXtjb25zdCB0PU9iamVjdC5rZXlzKGUpO2lmKG4mJjAhPT1uLnNpemUpZm9yKGNvbnN0IGUgb2YgdCl7aWYobi5oYXMoZSkpcmV0dXJuITE7bi5hZGQoZSl9ZWxzZSBuPW5ldyBTZXQodCl9cmV0dXJuITB9KShpLGUuaGVhZGVyKSl0aHJvdyBuZXcgdXIoIkpXUyBQcm90ZWN0ZWQgYW5kIEpXUyBVbnByb3RlY3RlZCBIZWFkZXIgUGFyYW1ldGVyIG5hbWVzIG11c3QgYmUgZGlzam9pbnQiKTtjb25zdCBvPXsuLi5pLC4uLmUuaGVhZGVyfSxzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYodm9pZCAwIT09aS5jcml0JiZ2b2lkIDA9PT1yLmNyaXQpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkJyk7aWYoIXJ8fHZvaWQgMD09PXIuY3JpdClyZXR1cm4gbmV3IFNldDtpZighQXJyYXkuaXNBcnJheShyLmNyaXQpfHwwPT09ci5jcml0Lmxlbmd0aHx8ci5jcml0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKSkpdGhyb3cgbmV3IGUoJyJjcml0IiAoQ3JpdGljYWwpIEhlYWRlciBQYXJhbWV0ZXIgTVVTVCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgc3RyaW5ncyB3aGVuIHByZXNlbnQnKTtsZXQgbztvPXZvaWQgMCE9PW4/bmV3IE1hcChbLi4uT2JqZWN0LmVudHJpZXMobiksLi4udC5lbnRyaWVzKCldKTp0O2Zvcihjb25zdCB0IG9mIHIuY3JpdCl7aWYoIW8uaGFzKHQpKXRocm93IG5ldyBjcihgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIGlzIG5vdCByZWNvZ25pemVkYCk7aWYodm9pZCAwPT09aVt0XSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIGlzIG1pc3NpbmdgKTtpZihvLmdldCh0KSYmdm9pZCAwPT09clt0XSl0aHJvdyBuZXcgZShgRXh0ZW5zaW9uIEhlYWRlciBQYXJhbWV0ZXIgIiR7dH0iIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZGApfXJldHVybiBuZXcgU2V0KHIuY3JpdCl9KHVyLG5ldyBNYXAoW1siYjY0IiwhMF1dKSxudWxsPT1uP3ZvaWQgMDpuLmNyaXQsaSxvKTtsZXQgYT0hMDtpZihzLmhhcygiYjY0IikmJihhPWkuYjY0LCJib29sZWFuIiE9dHlwZW9mIGEpKXRocm93IG5ldyB1cignVGhlICJiNjQiIChiYXNlNjR1cmwtZW5jb2RlIHBheWxvYWQpIEhlYWRlciBQYXJhbWV0ZXIgbXVzdCBiZSBhIGJvb2xlYW4nKTtjb25zdHthbGc6Y309bztpZigic3RyaW5nIiE9dHlwZW9mIGN8fCFjKXRocm93IG5ldyB1cignSldTICJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbWlzc2luZyBvciBpbnZhbGlkJyk7Y29uc3QgdT1uJiYoKGUsdCk9PntpZih2b2lkIDAhPT10JiYoIUFycmF5LmlzQXJyYXkodCl8fHQuc29tZSgoZT0+InN0cmluZyIhPXR5cGVvZiBlKSkpKXRocm93IG5ldyBUeXBlRXJyb3IoYCIke2V9IiBvcHRpb24gbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzYCk7aWYodClyZXR1cm4gbmV3IFNldCh0KX0pKCJhbGdvcml0aG1zIixuLmFsZ29yaXRobXMpO2lmKHUmJiF1LmhhcyhjKSl0aHJvdyBuZXcgYXIoJyJhbGciIChBbGdvcml0aG0pIEhlYWRlciBQYXJhbWV0ZXIgbm90IGFsbG93ZWQnKTtpZihhKXtpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCl0aHJvdyBuZXcgdXIoIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmciKX1lbHNlIGlmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkJiYhKGUucGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXRocm93IG5ldyB1cigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyBvciBhbiBVaW50OEFycmF5IGluc3RhbmNlIik7bGV0IGw9ITE7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PWF3YWl0IHQoaSxlKSxsPSEwKSxUcihjLHQsInZlcmlmeSIpO2NvbnN0IGQ9ZnVuY3Rpb24oLi4uZSl7Y29uc3QgdD1lLnJlZHVjZSgoKGUse2xlbmd0aDp0fSk9PmUrdCksMCksbj1uZXcgVWludDhBcnJheSh0KTtsZXQgcj0wO3JldHVybiBlLmZvckVhY2goKGU9PntuLnNldChlLHIpLHIrPWUubGVuZ3RofSkpLG59KHRyLmVuY29kZShudWxsIT09KHI9ZS5wcm90ZWN0ZWQpJiZ2b2lkIDAhPT1yP3I6IiIpLHRyLmVuY29kZSgiLiIpLCJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP3RyLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZCksaD1ycihlLnNpZ25hdHVyZSk7aWYoIWF3YWl0IFJyKGMsdCxoLGQpKXRocm93IG5ldyBwcjtsZXQgZjtmPWE/cnIoZS5wYXlsb2FkKToic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD90ci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQ7Y29uc3QgcD17cGF5bG9hZDpmfTtyZXR1cm4gdm9pZCAwIT09ZS5wcm90ZWN0ZWQmJihwLnByb3RlY3RlZEhlYWRlcj1pKSx2b2lkIDAhPT1lLmhlYWRlciYmKHAudW5wcm90ZWN0ZWRIZWFkZXI9ZS5oZWFkZXIpLGw/ey4uLnAsa2V5OnR9OnB9Y29uc3QgQ3I9ODY0MDAsRHI9L14oXGQrfFxkK1wuXGQrKSA/KHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSkkL2k7dmFyIFByPWU9Pntjb25zdCB0PURyLmV4ZWMoZSk7aWYoIXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCB0aW1lIHBlcmlvZCBmb3JtYXQiKTtjb25zdCBuPXBhcnNlRmxvYXQodFsxXSk7c3dpdGNoKHRbMl0udG9Mb3dlckNhc2UoKSl7Y2FzZSJzZWMiOmNhc2Uic2VjcyI6Y2FzZSJzZWNvbmQiOmNhc2Uic2Vjb25kcyI6Y2FzZSJzIjpyZXR1cm4gTWF0aC5yb3VuZChuKTtjYXNlIm1pbnV0ZSI6Y2FzZSJtaW51dGVzIjpjYXNlIm1pbiI6Y2FzZSJtaW5zIjpjYXNlIm0iOnJldHVybiBNYXRoLnJvdW5kKDYwKm4pO2Nhc2UiaG91ciI6Y2FzZSJob3VycyI6Y2FzZSJociI6Y2FzZSJocnMiOmNhc2UiaCI6cmV0dXJuIE1hdGgucm91bmQoMzYwMCpuKTtjYXNlImRheSI6Y2FzZSJkYXlzIjpjYXNlImQiOnJldHVybiBNYXRoLnJvdW5kKG4qQ3IpO2Nhc2Uid2VlayI6Y2FzZSJ3ZWVrcyI6Y2FzZSJ3IjpyZXR1cm4gTWF0aC5yb3VuZCg2MDQ4MDAqbik7ZGVmYXVsdDpyZXR1cm4gTWF0aC5yb3VuZCgzMTU1NzYwMCpuKX19O2NvbnN0IElyPWU9PmUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9eYXBwbGljYXRpb25cLy8sIiIpO3ZhciBPcj0oZSx0LG49e30pPT57Y29uc3R7dHlwOnJ9PW47aWYociYmKCJzdHJpbmciIT10eXBlb2YgZS50eXB8fElyKGUudHlwKSE9PUlyKHIpKSl0aHJvdyBuZXcgb3IoJ3VuZXhwZWN0ZWQgInR5cCIgSldUIGhlYWRlciB2YWx1ZScsInR5cCIsImNoZWNrX2ZhaWxlZCIpO2xldCBpO3RyeXtpPUpTT04ucGFyc2UobnIuZGVjb2RlKHQpKX1jYXRjaChlKXt9aWYoIWtyKGkpKXRocm93IG5ldyBscigiSldUIENsYWltcyBTZXQgbXVzdCBiZSBhIHRvcC1sZXZlbCBKU09OIG9iamVjdCIpO2NvbnN0e2lzc3VlcjpvfT1uO2lmKG8mJiEoQXJyYXkuaXNBcnJheShvKT9vOltvXSkuaW5jbHVkZXMoaS5pc3MpKXRocm93IG5ldyBvcigndW5leHBlY3RlZCAiaXNzIiBjbGFpbSB2YWx1ZScsImlzcyIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e3N1YmplY3Q6c309bjtpZihzJiZpLnN1YiE9PXMpdGhyb3cgbmV3IG9yKCd1bmV4cGVjdGVkICJzdWIiIGNsYWltIHZhbHVlJywic3ViIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7YXVkaWVuY2U6YX09bjtpZihhJiYoYz1pLmF1ZCx1PSJzdHJpbmciPT10eXBlb2YgYT9bYV06YSwhKCJzdHJpbmciPT10eXBlb2YgYz91LmluY2x1ZGVzKGMpOkFycmF5LmlzQXJyYXkoYykmJnUuc29tZShTZXQucHJvdG90eXBlLmhhcy5iaW5kKG5ldyBTZXQoYykpKSkpKXRocm93IG5ldyBvcigndW5leHBlY3RlZCAiYXVkIiBjbGFpbSB2YWx1ZScsImF1ZCIsImNoZWNrX2ZhaWxlZCIpO3ZhciBjLHU7bGV0IGw7c3dpdGNoKHR5cGVvZiBuLmNsb2NrVG9sZXJhbmNlKXtjYXNlInN0cmluZyI6bD1QcihuLmNsb2NrVG9sZXJhbmNlKTticmVhaztjYXNlIm51bWJlciI6bD1uLmNsb2NrVG9sZXJhbmNlO2JyZWFrO2Nhc2UidW5kZWZpbmVkIjpsPTA7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGNsb2NrVG9sZXJhbmNlIG9wdGlvbiB0eXBlIil9Y29uc3R7Y3VycmVudERhdGU6ZH09bixoPShmPWR8fG5ldyBEYXRlLE1hdGguZmxvb3IoZi5nZXRUaW1lKCkvMWUzKSk7dmFyIGY7aWYoKHZvaWQgMCE9PWkuaWF0fHxuLm1heFRva2VuQWdlKSYmIm51bWJlciIhPXR5cGVvZiBpLmlhdCl0aHJvdyBuZXcgb3IoJyJpYXQiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJpYXQiLCJpbnZhbGlkIik7aWYodm9pZCAwIT09aS5uYmYpe2lmKCJudW1iZXIiIT10eXBlb2YgaS5uYmYpdGhyb3cgbmV3IG9yKCcibmJmIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywibmJmIiwiaW52YWxpZCIpO2lmKGkubmJmPmgrbCl0aHJvdyBuZXcgb3IoJyJuYmYiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJuYmYiLCJjaGVja19mYWlsZWQiKX1pZih2b2lkIDAhPT1pLmV4cCl7aWYoIm51bWJlciIhPXR5cGVvZiBpLmV4cCl0aHJvdyBuZXcgb3IoJyJleHAiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJleHAiLCJpbnZhbGlkIik7aWYoaS5leHA8PWgtbCl0aHJvdyBuZXcgc3IoJyJleHAiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQnLCJleHAiLCJjaGVja19mYWlsZWQiKX1pZihuLm1heFRva2VuQWdlKXtjb25zdCBlPWgtaS5pYXQ7aWYoZS1sPigibnVtYmVyIj09dHlwZW9mIG4ubWF4VG9rZW5BZ2U/bi5tYXhUb2tlbkFnZTpQcihuLm1heFRva2VuQWdlKSkpdGhyb3cgbmV3IHNyKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkICh0b28gZmFyIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpO2lmKGU8MC1sKXRocm93IG5ldyBvcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAoaXQgc2hvdWxkIGJlIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpfXJldHVybiBpfTthc3luYyBmdW5jdGlvbiBVcihlLHQsbil7dmFyIHI7Y29uc3QgaT1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQsbil7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJihlPW5yLmRlY29kZShlKSksInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyB1cigiQ29tcGFjdCBKV1MgbXVzdCBiZSBhIHN0cmluZyBvciBVaW50OEFycmF5Iik7Y29uc3R7MDpyLDE6aSwyOm8sbGVuZ3RoOnN9PWUuc3BsaXQoIi4iKTtpZigzIT09cyl0aHJvdyBuZXcgdXIoIkludmFsaWQgQ29tcGFjdCBKV1MiKTtjb25zdCBhPWF3YWl0IEFyKHtwYXlsb2FkOmkscHJvdGVjdGVkOnIsc2lnbmF0dXJlOm99LHQsbiksYz17cGF5bG9hZDphLnBheWxvYWQscHJvdGVjdGVkSGVhZGVyOmEucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4uYyxrZXk6YS5rZXl9OmN9KGUsdCxuKTtpZigobnVsbD09PShyPWkucHJvdGVjdGVkSGVhZGVyLmNyaXQpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmluY2x1ZGVzKCJiNjQiKSkmJiExPT09aS5wcm90ZWN0ZWRIZWFkZXIuYjY0KXRocm93IG5ldyBscigiSldUcyBNVVNUIE5PVCB1c2UgdW5lbmNvZGVkIHBheWxvYWQiKTtjb25zdCBvPXtwYXlsb2FkOk9yKGkucHJvdGVjdGVkSGVhZGVyLGkucGF5bG9hZCxuKSxwcm90ZWN0ZWRIZWFkZXI6aS5wcm90ZWN0ZWRIZWFkZXJ9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3suLi5vLGtleTppLmtleX06b31mdW5jdGlvbiBMcihlKXtyZXR1cm4ga3IoZSl9Y2xhc3MgSHJ7Y29uc3RydWN0b3IoZSl7aWYodGhpcy5fY2FjaGVkPW5ldyBXZWFrTWFwLCFmdW5jdGlvbihlKXtyZXR1cm4gZSYmIm9iamVjdCI9PXR5cGVvZiBlJiZBcnJheS5pc0FycmF5KGUua2V5cykmJmUua2V5cy5ldmVyeShMcil9KGUpKXRocm93IG5ldyBkcigiSlNPTiBXZWIgS2V5IFNldCBtYWxmb3JtZWQiKTt2YXIgdDt0aGlzLl9qd2tzPSh0PWUsImZ1bmN0aW9uIj09dHlwZW9mIHN0cnVjdHVyZWRDbG9uZT9zdHJ1Y3R1cmVkQ2xvbmUodCk6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0KSkpfWFzeW5jIGdldEtleShlLHQpe2NvbnN0e2FsZzpuLGtpZDpyfT17Li4uZSwuLi50LmhlYWRlcn0saT1mdW5jdGlvbihlKXtzd2l0Y2goInN0cmluZyI9PXR5cGVvZiBlJiZlLnNsaWNlKDAsMikpe2Nhc2UiUlMiOmNhc2UiUFMiOnJldHVybiJSU0EiO2Nhc2UiRVMiOnJldHVybiJFQyI7Y2FzZSJFZCI6cmV0dXJuIk9LUCI7ZGVmYXVsdDp0aHJvdyBuZXcgY3IoJ1Vuc3VwcG9ydGVkICJhbGciIHZhbHVlIGZvciBhIEpTT04gV2ViIEtleSBTZXQnKX19KG4pLG89dGhpcy5fandrcy5rZXlzLmZpbHRlcigoZT0+e2xldCB0PWk9PT1lLmt0eTtpZih0JiYic3RyaW5nIj09dHlwZW9mIHImJih0PXI9PT1lLmtpZCksdCYmInN0cmluZyI9PXR5cGVvZiBlLmFsZyYmKHQ9bj09PWUuYWxnKSx0JiYic3RyaW5nIj09dHlwZW9mIGUudXNlJiYodD0ic2lnIj09PWUudXNlKSx0JiZBcnJheS5pc0FycmF5KGUua2V5X29wcykmJih0PWUua2V5X29wcy5pbmNsdWRlcygidmVyaWZ5IikpLHQmJiJFZERTQSI9PT1uJiYodD0iRWQyNTUxOSI9PT1lLmNydnx8IkVkNDQ4Ij09PWUuY3J2KSx0KXN3aXRjaChuKXtjYXNlIkVTMjU2Ijp0PSJQLTI1NiI9PT1lLmNydjticmVhaztjYXNlIkVTMjU2SyI6dD0ic2VjcDI1NmsxIj09PWUuY3J2O2JyZWFrO2Nhc2UiRVMzODQiOnQ9IlAtMzg0Ij09PWUuY3J2O2JyZWFrO2Nhc2UiRVM1MTIiOnQ9IlAtNTIxIj09PWUuY3J2fXJldHVybiB0fSkpLHswOnMsbGVuZ3RoOmF9PW87aWYoMD09PWEpdGhyb3cgbmV3IGhyO2lmKDEhPT1hKXRocm93IG5ldyBmcjtjb25zdCBjPXRoaXMuX2NhY2hlZC5nZXQocyl8fHRoaXMuX2NhY2hlZC5zZXQocyx7fSkuZ2V0KHMpO2lmKHZvaWQgMD09PWNbbl0pe2NvbnN0IGU9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LG4pe2lmKCFrcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJKV0sgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih0fHwodD1lLmFsZyksInN0cmluZyIhPXR5cGVvZiB0fHwhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciYWxnIiBhcmd1bWVudCBpcyByZXF1aXJlZCB3aGVuICJqd2suYWxnIiBpcyBub3QgcHJlc2VudCcpO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOmlmKCJzdHJpbmciIT10eXBlb2YgZS5rfHwhZS5rKXRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgImsiIChLZXkgVmFsdWUpIFBhcmFtZXRlciB2YWx1ZScpO3JldHVybiBudWxsIT1ufHwobj0hMCE9PWUuZXh0KSxuP0VyKHsuLi5lLGFsZzp0LGV4dDohMX0pOnJyKGUuayk7Y2FzZSJSU0EiOmlmKHZvaWQgMCE9PWUub3RoKXRocm93IG5ldyBjcignUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkJyk7Y2FzZSJFQyI6Y2FzZSJPS1AiOnJldHVybiBFcih7Li4uZSxhbGc6dH0pO2RlZmF1bHQ6dGhyb3cgbmV3IGNyKCdVbnN1cHBvcnRlZCAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfX0oey4uLnMsZXh0OiEwfSxuKTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheXx8InB1YmxpYyIhPT1lLnR5cGUpdGhyb3cgbmV3IGRyKCJKU09OIFdlYiBLZXkgU2V0IG1lbWJlcnMgbXVzdCBiZSBwdWJsaWMga2V5cyIpO2Nbbl09ZX1yZXR1cm4gY1tuXX19dmFyIE1yPXtleHBvcnRzOnt9fSxqcj17ZXhwb3J0czp7fX0scXI9UCh4bik7Ci8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqLwohZnVuY3Rpb24oZSx0KXt2YXIgbj1xcixyPW4uQnVmZmVyO2Z1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl19ZnVuY3Rpb24gbyhlLHQsbil7cmV0dXJuIHIoZSx0LG4pfXIuZnJvbSYmci5hbGxvYyYmci5hbGxvY1Vuc2FmZSYmci5hbGxvY1Vuc2FmZVNsb3c/ZS5leHBvcnRzPW46KGkobix0KSx0LkJ1ZmZlcj1vKSxvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSxpKHIsbyksby5mcm9tPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gcihlLHQsbil9LG8uYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGk9cihlKTtyZXR1cm4gdm9pZCAwIT09dD8ic3RyaW5nIj09dHlwZW9mIG4/aS5maWxsKHQsbik6aS5maWxsKHQpOmkuZmlsbCgwKSxpfSxvLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIoZSl9LG8uYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIG4uU2xvd0J1ZmZlcihlKX19KGpyLGpyLmV4cG9ydHMpO3ZhciBOcj02NTUzNix4cj00Mjk0OTY3Mjk1O3ZhciBLcj1qci5leHBvcnRzLkJ1ZmZlcixCcj1DLmNyeXB0b3x8Qy5tc0NyeXB0bztCciYmQnIuZ2V0UmFuZG9tVmFsdWVzP01yLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihlPnhyKXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIG49S3IuYWxsb2NVbnNhZmUoZSk7aWYoZT4wKWlmKGU+TnIpZm9yKHZhciByPTA7cjxlO3IrPU5yKUJyLmdldFJhbmRvbVZhbHVlcyhuLnNsaWNlKHIscitOcikpO2Vsc2UgQnIuZ2V0UmFuZG9tVmFsdWVzKG4pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiBfZS5uZXh0VGljaygoZnVuY3Rpb24oKXt0KG51bGwsbil9KSk7cmV0dXJuIG59Ok1yLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9O3ZhciBKcj1Nci5leHBvcnRzO2NsYXNzIEZye2Jhc2U2NFVSTEVuY29kZShlKXtyZXR1cm4gR24uZW5jb2RlKGUpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPS9nLCIiKX1iYXNlNjRVUkxEZWNvZGUoZSl7cmV0dXJuIEduLmRlY29kZShlKS50b1N0cmluZygpfWhhc2hTaGEyNTYoZSl7cmV0dXJuIGVuLmZyb20oWm4oKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpKSl9Z2VuZXJhdGVSYW5kb21CeXRlcyhlKXtyZXR1cm4gSnIoZSl9dmVyaWZ5Snd0KGUsdCxuLHIsaSxvLHMsYSl7Y29uc3QgdT17YWxnb3JpdGhtczpuLGF1ZGllbmNlOnIsY2xvY2tUb2xlcmFuY2U6cyxzdWJqZWN0Om99O3JldHVybihudWxsPT1hfHxhKSYmKHUuaXNzdWVyPWkpLFVyKGUsKGw9e2tleXM6W3RdfSxIci5wcm90b3R5cGUuZ2V0S2V5LmJpbmQobmV3IEhyKGwpKSksdSkudGhlbigoKCk9PlByb21pc2UucmVzb2x2ZSghMCkpKS5jYXRjaCgoZT0+e3ZhciB0O3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUNSWVBUTy1VVElMUy1WSi1JVjAxIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5yZWFzb24pJiZ2b2lkIDAhPT10P3Q6SlNPTi5zdHJpbmdpZnkoZSksYCR7bnVsbD09ZT92b2lkIDA6ZS5jb2RlfSAke251bGw9PWU/dm9pZCAwOmUuY2xhaW19YCkpfSkpO3ZhciBsfX0odD0+e2NvbnN0IG49c2VsZjtsZXQgcjtuLm9ubWVzc2FnZT0oe2RhdGE6bixwb3J0czphfSk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciB1LGwsZCxoLGYscDtjb25zdCB5PWFbMF07aWYobi50eXBlPT09dnx8cilzd2l0Y2gobi50eXBlKXtjYXNlIHY6dHJ5e2NvbnN0IGE9T2JqZWN0LmFzc2lnbih7fSxuLmRhdGEpO3I9eWllbGQoKHQsbik9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHI9bmV3IE50LGk9bmV3IEZyLG89bmV3IGc7eWllbGQgby5pbml0aWFsaXplKHQscixpKTtjb25zdCBzPW5ldyBBKG8pLGE9bihvLHMpLGM9by5nZXREYXRhTGF5ZXIoKSx1PXF0LmdldEluc3RhbmNlKCk7cmV0dXJuKG51bGw9PXU/dm9pZCAwOnUuaW5pdCkmJih5aWVsZCB1LmluaXQoITAsKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIGEuYXR0YWNoVG9rZW5Ub1JlcXVlc3RDb25maWcodCl9KSkpKSkse2Rpc2FibGVIdHRwSGFuZGxlcjooKT0+e2EuZGlzYWJsZUh0dHBIYW5kbGVyKHUpfSxlbmFibGVIdHRwSGFuZGxlcjooKT0+e2EuZW5hYmxlSHR0cEhhbmRsZXIodSl9LGdldEFjY2Vzc1Rva2VuOigpPT5hLmdldEFjY2Vzc1Rva2VuKCksZ2V0QXV0aG9yaXphdGlvblVSTDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gby5nZXRBdXRob3JpemF0aW9uVVJMKHQpLnRoZW4oKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlO2NvbnN0IG49bnVsbCE9PShlPW5ldyBVUkwodCkuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSkmJnZvaWQgMCE9PWU/ZToiIixyPXlpZWxkIG8uZ2V0UEtDRUNvZGUobik7cmV0dXJue2F1dGhvcml6YXRpb25VUkw6dCxwa2NlOnJ9fSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksZ2V0QmFzaWNVc2VySW5mbzooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0QmFzaWNVc2VySW5mbygpfSkpLGdldENvbmZpZ0RhdGE6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBjLmdldENvbmZpZ0RhdGEoKX0pKSxnZXRDcnlwdG9IZWxwZXI6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldENyeXB0b0hlbHBlcigpfSkpLGdldERlY29kZWRJRFBJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXREZWNvZGVkSURQSURUb2tlbigpfSkpLGdldERlY29kZWRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXREZWNvZGVkSURUb2tlbigpfSkpLGdldElEVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldElEVG9rZW4oKX0pKSxnZXRPSURDU2VydmljZUVuZHBvaW50czooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKSxnZXRTaWduT3V0VVJMOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgby5nZXRTaWduT3V0VVJMKCl9KSksaHR0cFJlcXVlc3Q6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGEuaHR0cFJlcXVlc3QodSx0KX0pKSxodHRwUmVxdWVzdEFsbDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5odHRwUmVxdWVzdEFsbCh0LHUpfSkpLGlzQXV0aGVudGljYXRlZDooKT0+YS5pc0F1dGhlbnRpY2F0ZWQoKSxyZWZyZXNoQWNjZXNzVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RyeXtyZXR1cm4geWllbGQgYS5yZWZyZXNoQWNjZXNzVG9rZW4oKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fSkpLHJlcXVlc3RBY2Nlc3NUb2tlbjoodCxuLHIsaSk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLnJlcXVlc3RBY2Nlc3NUb2tlbih0LG4sdm9pZCAwLHIsaSl9KSkscmVxdWVzdEN1c3RvbUdyYW50OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLnJlcXVlc3RDdXN0b21HcmFudCh0KX0pKSxyZXZva2VBY2Nlc3NUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCBzLmdldFJlZnJlc2hUaW1lb3V0VGltZXIoKTtyZXR1cm4gby5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKCgpPT4ocy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoZSksUHJvbWlzZS5yZXNvbHZlKCEwKSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKX0pKSxzZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrOmU9PnsobnVsbD09dT92b2lkIDA6dS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSYmdS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s6ZT0+eyhudWxsPT11P3ZvaWQgMDp1LnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaykmJnUuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpfSxzZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjazplPT57KG51bGw9PXU/dm9pZCAwOnUuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2spJiZ1LnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpfSxzZXRTZXNzaW9uU3RhdGU6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgYy5zZXRTZXNzaW9uRGF0YVBhcmFtZXRlcigic2Vzc2lvbl9zdGF0ZSIsdCl9KSksc2lnbk91dDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCkseWllbGQgby5nZXRTaWduT3V0VVJMKCl9KSksc3RhcnRBdXRvUmVmcmVzaFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHMucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseShhKX0pKSx1cGRhdGVDb25maWc6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgby51cGRhdGVDb25maWcodCl9KSl9fSkpKShhLHQpLHIuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhzKSxyLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhpKSxyLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKG8pLHkucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9hdXRoX3VybCI6ci5nZXRBdXRob3JpemF0aW9uVVJMKG51bGw9PW4/dm9pZCAwOm4uZGF0YSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJlcXVlc3RfZ2V0X3Rva2VuIjpyLnJlcXVlc3RBY2Nlc3NUb2tlbihudWxsPT09KHU9bnVsbD09bj92b2lkIDA6bi5kYXRhKXx8dm9pZCAwPT09dT92b2lkIDA6dS5jb2RlLG51bGw9PT0obD1udWxsPT1uP3ZvaWQgMDpuLmRhdGEpfHx2b2lkIDA9PT1sP3ZvaWQgMDpsLnNlc3Npb25TdGF0ZSxudWxsPT09KGQ9bnVsbD09bj92b2lkIDA6bi5kYXRhKXx8dm9pZCAwPT09ZD92b2lkIDA6ZC5wa2NlLG51bGw9PT0oaD1udWxsPT1uP3ZvaWQgMDpuLmRhdGEpfHx2b2lkIDA9PT1oP3ZvaWQgMDpoLnN0YXRlKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiaHR0cC1yZXF1ZXN0Ijp7Y29uc3QgZT1uLmRhdGEsdD1udWxsPT1lP3ZvaWQgMDplLmRhdGE7aWYoITA9PT0obnVsbD09PShwPW51bGw9PT0oZj1uLmRhdGEpfHx2b2lkIDA9PT1mP3ZvaWQgMDpmLmRhdGEpfHx2b2lkIDA9PT1wP3ZvaWQgMDpwLmZvcm1EYXRhKSl7Y29uc3Qgbj1uZXcgRm9ybURhdGE7Zm9yKGNvbnN0IGUgaW4gdCkiZm9ybURhdGEiIT09ZSYmbi5hcHBlbmQoZSx0W2VdKTtlLmRhdGE9bn1yLmh0dHBSZXF1ZXN0KGUpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWt9Y2FzZSJodHRwLXJlcXVlc3QtYWxsIjpyLmh0dHBSZXF1ZXN0QWxsKG4uZGF0YSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInNpZ24tb3V0Ijp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5zaWduT3V0KCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJyZXF1ZXN0LWN1c3RvbS1ncmFudCI6ci5yZXF1ZXN0Q3VzdG9tR3JhbnQobi5kYXRhKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmV2b2tlLWFjY2Vzcy10b2tlbiI6ci5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJnZXQtb2lkYy1zZXJ2aWNlLWVuZHBvaW50cyI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1iYXNpYy11c2VyLWluZm8iOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldEJhc2ljVXNlckluZm8oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1kZWNvZGVkLWlkLXRva2VuIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXREZWNvZGVkSURUb2tlbigpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0LWNyeXB0by1oZWxwZXIiOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldENyeXB0b0hlbHBlcigpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0X2lkX3Rva2VuIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRJRFRva2VuKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJlbmFibGVfaHR0cF9oYW5kbGVyIjpyLmVuYWJsZUh0dHBIYW5kbGVyKCkseS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJkaXNhYmxlX2h0dHBfaGFuZGxlciI6ci5kaXNhYmxlSHR0cEhhbmRsZXIoKSx5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKTticmVhaztjYXNlImlzX2F1dGhlbnRpY2F0ZWQiOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmlzQXV0aGVudGljYXRlZCgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0X3NpZ25fb3V0X3VybCI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0U2lnbk91dFVSTCgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVmcmVzaF9hY2Nlc3MtdG9rZW4iOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLnJlZnJlc2hBY2Nlc3NUb2tlbigpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2Uic3RhcnRfYXV0b19yZWZyZXNoX3Rva2VuIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2Uoci5zdGFydEF1dG9SZWZyZXNoVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInNldF9zZXNzaW9uX3N0YXRlIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5zZXRTZXNzaW9uU3RhdGUobnVsbD09bj92b2lkIDA6bi5kYXRhKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInVwZGF0ZV9jb25maWciOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLnVwZGF0ZUNvbmZpZyhudWxsPT1uP3ZvaWQgMDpuLmRhdGEpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0X2NvbmZpZ19kYXRhIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRDb25maWdEYXRhKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7ZGVmYXVsdDpudWxsPT15fHx5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgYygiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctSVYwMiIsIlRoZSBtZXNzYWdlIHR5cGUgaXMgaW52YWxpZC4iLGBUaGUgbWVzc2FnZSB0eXBlIHByb3ZpZGVkLCAke24udHlwZX0sIGlzIGludmFsaWQuYCkpKX1lbHNlIHkucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKG5ldyBjKCJTUEEtQ0xJRU5UX1dPUktFUi1PTk1TRy1ORjAxIiwiVGhlIHdlYiB3b3JrZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC4iLCJUaGUgaW5pdGlhbGl6ZSBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBjYW4gYmUgY2FycmllZCBvdXQuIikpKX0pKTtjb25zdCBpPSgpPT57bi5wb3N0TWVzc2FnZSh7dHlwZToicmVxdWVzdC1zdGFydCJ9KX0sbz1lPT57bi5wb3N0TWVzc2FnZSh7ZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHR5cGU6InJlcXVlc3Qtc3VjY2VzcyJ9KX0scz0oKT0+e24ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3QtZmluaXNoIn0pfX0pKCgoZSx0KT0+bmV3IFIoZSx0KSkpO3JldHVybnt9fSgpOwoK",J=null,H=false,function(e){return f=f||K(N,J,H),new Worker(f,e)});const L="token_request_config";var k;!function(e){e.SignIn="sign-in",e.SignOut="sign-out",e.Initialize="initialize",e.HttpRequestStart="http-request-start",e.HttpRequestFinish="http-request-finish",e.HttpRequestError="http-request-error",e.HttpRequestSuccess="http-request-success",e.RevokeAccessToken="revoke-access-token",e.CustomGrant="custom-grant",e.SignOutFailed="sign-out-failed";}(k||(k={}));const B="Y2hlY2tTZXNzaW9u";var T;!function(e){e.LocalStorage="localStorage",e.SessionStorage="sessionStorage",e.WebWorker="webWorker",e.BrowserMemory="browserMemory";}(T||(T={}));class F{constructor(){}static generateSuccessMessage(e){return {blob:(null==e?void 0:e.data)instanceof Blob?null==e?void 0:e.data:null,data:JSON.stringify(null!=e?e:""),success:true}}static generateFailureMessage(e){return (null==e?void 0:e.toJSON)&&delete e.toJSON,{error:JSON.stringify(null!=e?e:""),success:false}}}class A{constructor(){}static removeAuthorizationCode(){const e=location.href;history.pushState({},document.title,e.replace(/\?code=.*$/,""));}static getPKCE(e){var t;return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:""}static setPKCE(e,t){sessionStorage.setItem(e,t);}static setSignOutURL(e,t,l){sessionStorage.setItem(`${m}-instance_${l}-${t}`,e);}static getSignOutURL(e,t){var l;return null!==(l=sessionStorage.getItem(`${m}-instance_${t}-${e}`))&&void 0!==l?l:""}static removePKCE(e){sessionStorage.removeItem(e);}static canContinueSignIn(e,t){return !(e&&!A.hasErrorInURL()&&!A.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return A.isSilentStatePresentInURL()}static wasSignInCalled(){return !(!A.hasErrorInURL()&&!A.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem("initialized-silent-sign-in"),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){return e(this,void 0,void 0,(function*(){if(v.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),yield v.clearUserSessionData(),true}return false}))}static didSignOutFail(){if(v.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get("error"),l=e.searchParams.get("error_description"),i=window.location.href.split("?")[0];return history.pushState({},document.title,i),{description:null!=l?l:"",error:null!=t?t:""}}return false}static isSilentStatePresentInURL(){var e;const t=new URL(window.location.href).searchParams.get("state");return null!==(e=null==t?void 0:t.includes("sign-in-silently"))&&void 0!==e&&e}static hasAuthSearchParamsInURL(e=window.location.search){return /[?&]code=[^&]+/.test(e)}static hasErrorInURL(e=window.location.href){const t=new URL(e);return !!t.searchParams.get("error")&&t.searchParams.get("state")!==I}static canSendPromptNoneRequest(){const e=sessionStorage.getItem("promptNoneRequestSent");return !(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem("promptNoneRequestSent",JSON.stringify(e));}static waitTillPageRedirect(t){return e(this,void 0,void 0,(function*(){const e=null!=t?t:3e3;yield new Promise((t=>setTimeout(t,1e3*e)));}))}}A.until=(e,t=500)=>{const l=i=>e()?i():setTimeout((()=>l(i)),t);return new Promise(l)};class z{constructor(e,t){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=t,this._instanceID=this._authenticationClient.getInstanceID(),this._isTokenRefreshing=false;}enableHttpHandler(e){(null==e?void 0:e.enableHandler)&&e.enableHandler();}disableHttpHandler(e){(null==e?void 0:e.disableHandler)&&e.disableHandler();}initializeSessionManger(e,t,l,i,n){var o,d,c;n.initialize(e.clientID,null!==(o=t.checkSessionIframe)&&void 0!==o?o:"",l,null!==(d=e.checkSessionInterval)&&void 0!==d?d:3,null!==(c=e.sessionRefreshInterval)&&void 0!==c?c:300,e.signInRedirectURL,i);}requestCustomGrant(t,l){var i,n,o;return e(this,void 0,void 0,(function*(){let d=true,c=false;if(null==t?void 0:t.tokenEndpoint){d=false;for(const e of [...null!==(n=null===(i=yield this._dataLayer.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==n?n:[],t.baseUrl])if(e&&(null===(o=t.tokenEndpoint)||void 0===o?void 0:o.startsWith(e))){c=true;break}}return t.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter("custom_grant_config",JSON.stringify(t)),d||c?this._authenticationClient.requestCustomGrant(t).then((i=>e(this,void 0,void 0,(function*(){return l&&"function"==typeof l&&l(t),t.returnsSession?(this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()):i})))).catch((e=>Promise.reject(e))):Promise.reject(new X("SPA-MAIN_THREAD_CLIENT-RCG-IV01","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`"))}))}getCustomGrantConfigData(){return e(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getTemporaryDataParameter("custom_grant_config");return e?JSON.parse(e):null}))}refreshAccessToken(t){return e(this,void 0,void 0,(function*(){try{yield this._authenticationClient.refreshAccessToken();const e=yield this.getCustomGrantConfigData();return e&&(yield this.requestCustomGrant(e,t)),this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()}catch(e){const t={type:"refresh-access-token-error"};return window.postMessage(t),Promise.reject(e)}}))}retryFailedRequests(t){return e(this,void 0,void 0,(function*(){const e=t.httpClient,l=t.requestConfig,i=t.isHttpHandlerEnabled,n=t.httpErrorCallback,o=t.httpFinishCallback;yield A.until((()=>!this._isTokenRefreshing));try{const t=yield e.request(l);return Promise.resolve(t)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}))}httpRequest(t,l,i,n,o,d){var c,a;return e(this,void 0,void 0,(function*(){let s=false;const Z=yield this._dataLayer.getConfigData();for(const e of [...null!==(c=yield null==Z?void 0:Z.resourceServerURLs)&&void 0!==c?c:[],Z.baseUrl])if(e&&(null===(a=null==l?void 0:l.url)||void 0===a?void 0:a.startsWith(e))){s=true;break}return s?t.request(l).then((e=>Promise.resolve(e))).catch((c=>e(this,void 0,void 0,(function*(){var e,a,s;if(401===(null===(e=null==c?void 0:c.response)||void 0===e?void 0:e.status)||!(null==c?void 0:c.response)){if(this._isTokenRefreshing)return this.retryFailedRequests({enableRetrievingSignOutURLFromSession:d,httpClient:t,httpErrorCallback:n,httpFinishCallback:o,isHttpHandlerEnabled:i,requestConfig:l});let e;this._isTokenRefreshing=true;try{e=yield this.refreshAccessToken(d),this._isTokenRefreshing=!1;}catch(e){throw this._isTokenRefreshing=false,i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},c),{code:"Access token is invalid"}))),"function"==typeof o&&o()),new X("SPA-AUTH_HELPER-HR-SE01",null!==(a=null==e?void 0:e.name)&&void 0!==a?a:"Refresh token request failed.",null!==(s=null==e?void 0:e.message)&&void 0!==s?s:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(e)try{const e=yield t.request(l);return Promise.resolve(e)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}return i&&("function"==typeof n&&(yield n(c)),"function"==typeof o&&o()),Promise.reject(c)})))):Promise.reject(new X("SPA-AUTH_HELPER-HR-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))}))}httpRequestAll(t,l,i,n,o){var d,c,a;return e(this,void 0,void 0,(function*(){let s=true;const Z=yield this._dataLayer.getConfigData();for(const e of t){let t=false;for(const l of [...null!==(c=null===(d=yield Z)||void 0===d?void 0:d.resourceServerURLs)&&void 0!==c?c:[],Z.baseUrl])if(l&&(null===(a=e.url)||void 0===a?void 0:a.startsWith(l))){t=true;break}if(!t){s=false;break}}const r=[];if(s)return t.forEach((e=>{r.push(l.request(e));})),(null==l?void 0:l.all)&&l.all(r).then((e=>Promise.resolve(e))).catch((t=>e(this,void 0,void 0,(function*(){var d,c,a;if(401===(null===(d=null==t?void 0:t.response)||void 0===d?void 0:d.status)||!(null==t?void 0:t.response)){let d;try{d=yield this._authenticationClient.refreshAccessToken();}catch(e){throw i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},t),{code:"Access token is invalid"}))),"function"==typeof o&&o()),new X("SPA-AUTH_HELPER-HRA-SE01",null!==(c=null==e?void 0:e.name)&&void 0!==c?c:"Refresh token request failed.",null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(d)return l.all&&l.all(r).then((e=>Promise.resolve(e))).catch((t=>e(this,void 0,void 0,(function*(){return i&&("function"==typeof n&&(yield n(t)),"function"==typeof o&&o()),Promise.reject(t)}))))}return i&&("function"==typeof n&&(yield n(t)),"function"==typeof o&&o()),Promise.reject(t)}))));throw new X("SPA-AUTH_HELPER-HRA-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`")}))}requestAccessToken(t,l,i,n,o,d){return e(this,void 0,void 0,(function*(){const c=yield this._dataLayer.getConfigData();if(c.storage===T.BrowserMemory&&c.enablePKCE&&l){const e=A.getPKCE(y.extractPKCEKeyFromStateParam(l));yield this._authenticationClient.setPKCECode(y.extractPKCEKeyFromStateParam(l),e);}else c.storage===T.WebWorker&&n&&(yield this._authenticationClient.setPKCECode(n,null!=o?o:""));return t?this._authenticationClient.requestAccessToken(t,null!=l?l:"",null!=o?o:"",void 0,d).then((()=>e(this,void 0,void 0,(function*(){return c.storage!==T.WebWorker?(A.setSignOutURL(yield this._authenticationClient.getSignOutURL(),c.clientID,this._instanceID),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this)),i&&"function"==typeof i&&c.enableOIDCSessionManagement&&i()):this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()})))).catch((e=>Promise.reject(e))):Promise.reject(new X("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found."))}))}trySignInSilently(t,l,i,n,o){var d;return e(this,void 0,void 0,(function*(){if(A.isInitializedSilentSignIn())return yield i.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const c=document.getElementById("rpIFrame"),a=null===(d=null==c?void 0:c.contentDocument)||void 0===d?void 0:d.getElementById("promptNoneIFrame");try{const e=yield t(n);a.src=e;}catch(e){return Promise.reject(e)}return new Promise(((t,i)=>{const n=setTimeout((()=>{t(false);}),1e4),d=c=>e(this,void 0,void 0,(function*(){var e,a,s,Z;const r=c.data;"check_session_signed_out"==(null==r?void 0:r.type)&&(window.removeEventListener("message",d),clearTimeout(n),t(false)),"check_session_signed_in"==(null==r?void 0:r.type)&&(null===(e=null==r?void 0:r.data)||void 0===e?void 0:e.code)&&l(null===(a=null==r?void 0:r.data)||void 0===a?void 0:a.code,null===(s=null==r?void 0:r.data)||void 0===s?void 0:s.sessionState,null===(Z=null==r?void 0:r.data)||void 0===Z?void 0:Z.state,o).then((e=>{window.removeEventListener("message",d),t(e);})).catch((e=>{window.removeEventListener("message",d),i(e);})).finally((()=>{clearTimeout(n);}));}));window.addEventListener("message",d);}))}))}handleSignIn(t,l,i){return e(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getConfigData();if(yield t())return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(e.storage!==T.WebWorker&&(yield this._authenticationClient.isAuthenticated()))return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this),e.enableOIDCSessionManagement&&l(),Promise.resolve(yield this._authenticationClient.getBasicUserInfo());const n=new URL(window.location.href).searchParams.get("error"),o=new URL(window.location.href).searchParams.get("error_description");if(n){const e=new URL(window.location.href);throw e.searchParams.delete("error"),e.searchParams.delete("error_description"),history.pushState(null,document.title,e.toString()),new X("SPA-AUTH_HELPER-SI-SE01",n,null!=o?o:"")}if(e.storage===T.WebWorker&&i){const e=yield i();if(e)return e}}))}attachTokenToRequestConfig(t){return e(this,void 0,void 0,(function*(){const e=Object.assign({attachToken:true},t);e.attachToken&&(e.shouldAttachIDPAccessToken?t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield this.getIDPAccessToken()}`}):t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield this.getAccessToken()}`}));}))}getBasicUserInfo(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getBasicUserInfo()}))}getDecodedIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getDecodedIDPIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getCryptoHelper(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getCryptoHelper()}))}getIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getIDToken()}))}getOIDCServiceEndpoints(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getOIDCServiceEndpoints()}))}getAccessToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getAccessToken()}))}getIDPAccessToken(){var t;return e(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData())||void 0===t?void 0:t.access_token}))}getDataLayer(){return this._dataLayer}isAuthenticated(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.isAuthenticated()}))}}class w{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer();}refreshAccessTokenAutomatically(t){var l,i;return e(this,void 0,void 0,(function*(){if(!(null!==(i=null===(l=yield this._dataLayer.getConfigData())||void 0===l?void 0:l.periodicTokenRefresh)&&void 0!==i&&i))return;const n=yield this._dataLayer.getSessionData();if(n.refresh_token){const l=parseInt(n.expires_in),i=setTimeout((()=>e(this,void 0,void 0,(function*(){yield t.refreshAccessToken();}))),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(s,JSON.stringify(i));}}))}getRefreshTimeoutTimer(){return e(this,void 0,void 0,(function*(){return (yield this._dataLayer.getTemporaryDataParameter(s))?JSON.parse(yield this._dataLayer.getTemporaryDataParameter(s)):-1}))}clearRefreshTokenTimeout(t){return e(this,void 0,void 0,(function*(){if(t)return void clearTimeout(t);const e=yield this.getRefreshTimeoutTimer();-1!==e&&clearTimeout(e);}))}}const x=(()=>{let t,l,i,n,o,d,c,a,s,Z,r;const u=(e,c,a,s,Z,u,h)=>{t=e,l=c,i=a,n=s,o=u,d=Z,r=h,n>-1&&b(),d>-1&&(Z=setInterval((()=>{G();}),1e3*d));},b=()=>e(void 0,void 0,void 0,(function*(){var d;if(!l||!t||!o)return;const c="opIFrame";const s=document.getElementById("rpIFrame");(null===(d=null==s?void 0:s.contentDocument)||void 0===d?void 0:d.getElementById(c)).src=l+"?client_id="+t+"&redirect_uri="+o,a=setInterval((function(){var n;return e(this,void 0,void 0,(function*(){const e=yield i();if(Boolean(t)&&Boolean(e)){const i=`${t} ${e}`,o=document.getElementById("rpIFrame"),d=(null===(n=null==o?void 0:o.contentDocument)||void 0===n?void 0:n.getElementById(c)).contentWindow;null==d||d.postMessage(i,l);}}))}),1e3*n),I();})),m=()=>{clearInterval(a),clearInterval(undefined);},I=()=>{null===window||void 0===window||window.addEventListener("message",(function(t){var i;return e(this,void 0,void 0,(function*(){const e=l;!e||(null==e?void 0:e.indexOf(t.origin))<0||"set_session_state_from_iframe"===(null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.type)||"unchanged"===t.data||("error"===t.data?window.location.href=yield c():"changed"===t.data&&G());}))}),false);},G=()=>e(void 0,void 0,void 0,(function*(){var e;const t=document.getElementById("rpIFrame"),l=null===(e=null==t?void 0:t.contentDocument)||void 0===e?void 0:e.getElementById("promptNoneIFrame");if(A.canSendPromptNoneRequest()){A.setPromptNoneRequestSent(true);const e=t=>{var l,i,n;"set_session_state_from_iframe"===(null===(l=null==t?void 0:t.data)||void 0===l?void 0:l.type)&&(Z(null!==(n=null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",e));};s!==T.BrowserMemory&&s!==T.WebWorker||null===window||void 0===window||window.addEventListener("message",e);const t=yield r({prompt:"none",response_mode:"query",state:B});l.src=t;}})),p=t=>e(void 0,void 0,void 0,(function*(){var e,l;const i=new URL(window.location.href).searchParams.get("state"),n=new URL(window.location.href).searchParams.get(h),o=window.parent.parent;if(null!==i&&(i.includes(B)||i.includes("sign-in-silently"))){const d=new URL(window.location.href).searchParams.get("code");if(null!==d&&0!==d.length){if(i.includes("sign-in-silently")){const e={data:{code:d,sessionState:null!=n?n:"",state:i},type:"check_session_signed_in"};return sessionStorage.setItem("initialized-silent-sign-in","false"),o.postMessage(e,o.origin),A.setPromptNoneRequestSent(false),window.location.href="about:blank",yield A.waitTillPageRedirect(),true}const c=new URL(window.location.href).searchParams.get("session_state");if(s===T.LocalStorage||s===T.SessionStorage)t&&(yield t(c));else {const t={data:null!=c?c:"",type:"set_session_state_from_iframe"};null===(l=null===(e=null===window||void 0===window?void 0:window.parent)||void 0===e?void 0:e.parent)||void 0===l||l.postMessage(t);}return A.setPromptNoneRequestSent(false),window.location.href="about:blank",yield A.waitTillPageRedirect(),true}{if(i.includes("sign-in-silently")){const e={type:"check_session_signed_out"};return window.parent.parent.postMessage(e,o.origin),A.setPromptNoneRequestSent(false),window.location.href="about:blank",yield A.waitTillPageRedirect(),true}A.setPromptNoneRequestSent(false);const e=yield c();return yield v.clearUserSessionData(),o.location.href=e,window.location.href="about:blank",yield A.waitTillPageRedirect(),true}}return false}));return (t,l,i)=>e(void 0,void 0,void 0,(function*(){var e;let n=document.createElement("iframe");n.setAttribute("id","rpIFrame"),n.style.display="none";let o=false;n.onload=()=>{var e,t,l,i;n=document.getElementById("rpIFrame");const d=null==n?void 0:n.contentDocument,c=null==d?void 0:d.createElement("iframe");c&&(c.setAttribute("id","opIFrame"),c.style.display="none");const a=null==d?void 0:d.createElement("iframe");a&&(a.setAttribute("id","promptNoneIFrame"),a.style.display="none"),c&&(null===(t=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.body)||void 0===t||t.appendChild(c)),a&&(null===(i=null===(l=null==n?void 0:n.contentDocument)||void 0===l?void 0:l.body)||void 0===i||i.appendChild(a)),o=true;},null===(e=null===document||void 0===document?void 0:document.body)||void 0===e||e.appendChild(n),c=t,s=l,Z=i;for(;false===o;)yield new Promise((e=>setTimeout(e,1)));return {initialize:u,receivePromptNoneResponse:p,reset:m}}))})();var P="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Q(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function M(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:true});return Object.keys(e).forEach((function(l){var i=Object.getOwnPropertyDescriptor(e,l);Object.defineProperty(t,l,i.get?i:{enumerable:true,get:function(){return e[l]}});})),t}var j={exports:{}},E=function(e,t){return function(){for(var l=new Array(arguments.length),i=0;i<l.length;i++)l[i]=arguments[i];return e.apply(t,l)}},D=E,O=Object.prototype.toString;function _(e){return Array.isArray(e)}function q(e){return void 0===e}function $(e){return "[object ArrayBuffer]"===O.call(e)}function ee(e){return null!==e&&"object"==typeof e}function te(e){if("[object Object]"!==O.call(e))return false;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function le(e){return "[object Function]"===O.call(e)}function ie(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),_(e))for(var l=0,i=e.length;l<i;l++)t.call(null,e[l],l,e);else for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.call(null,e[n],n,e);}var ne={isArray:_,isArrayBuffer:$,isBuffer:function(e){return null!==e&&!q(e)&&null!==e.constructor&&!q(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return "[object FormData]"===O.call(e)},isArrayBufferView:function(e){return "undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&$(e.buffer)},isString:function(e){return "string"==typeof e},isNumber:function(e){return "number"==typeof e},isObject:ee,isPlainObject:te,isUndefined:q,isDate:function(e){return "[object Date]"===O.call(e)},isFile:function(e){return "[object File]"===O.call(e)},isBlob:function(e){return "[object Blob]"===O.call(e)},isFunction:le,isStream:function(e){return ee(e)&&le(e.pipe)},isURLSearchParams:function(e){return "[object URLSearchParams]"===O.call(e)},isStandardBrowserEnv:function(){return ("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:ie,merge:function e(){var t={};function l(l,i){te(t[i])&&te(l)?t[i]=e(t[i],l):te(l)?t[i]=e({},l):_(l)?t[i]=l.slice():t[i]=l;}for(var i=0,n=arguments.length;i<n;i++)ie(arguments[i],l);return t},extend:function(e,t,l){return ie(t,(function(t,i){e[i]=l&&"function"==typeof t?D(t,l):t;})),e},trim:function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}},oe=ne;function de(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ce=function(e,t,l){if(!t)return e;var i;if(l)i=l(t);else if(oe.isURLSearchParams(t))i=t.toString();else {var n=[];oe.forEach(t,(function(e,t){null!=e&&(oe.isArray(e)?t+="[]":e=[e],oe.forEach(e,(function(e){oe.isDate(e)?e=e.toISOString():oe.isObject(e)&&(e=JSON.stringify(e)),n.push(de(t)+"="+de(e));})));})),i=n.join("&");}if(i){var o=e.indexOf("#");-1!==o&&(e=e.slice(0,o)),e+=(-1===e.indexOf("?")?"?":"&")+i;}return e},ae=ne;function se(){this.handlers=[];}se.prototype.use=function(e,t,l){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!l&&l.synchronous,runWhen:l?l.runWhen:null}),this.handlers.length-1},se.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null);},se.prototype.forEach=function(e){ae.forEach(this.handlers,(function(t){null!==t&&e(t);}));};var Ze=se,re="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function ue(){throw new Error("setTimeout has not been defined")}function be(){throw new Error("clearTimeout has not been defined")}var he=ue,me=be;function Ie(e){if(he===setTimeout)return setTimeout(e,0);if((he===ue||!he)&&setTimeout)return he=setTimeout,setTimeout(e,0);try{return he(e,0)}catch(t){try{return he.call(null,e,0)}catch(t){return he.call(this,e,0)}}}"function"==typeof re.setTimeout&&(he=setTimeout),"function"==typeof re.clearTimeout&&(me=clearTimeout);var Ge,pe=[],ge=false,Xe=-1;function ye(){ge&&Ge&&(ge=false,Ge.length?pe=Ge.concat(pe):Xe=-1,pe.length&&Ve());}function Ve(){if(!ge){var e=Ie(ye);ge=true;for(var t=pe.length;t;){for(Ge=pe,pe=[];++Xe<t;)Ge&&Ge[Xe].run();Xe=-1,t=pe.length;}Ge=null,ge=false,function(e){if(me===clearTimeout)return clearTimeout(e);if((me===be||!me)&&clearTimeout)return me=clearTimeout,clearTimeout(e);try{me(e);}catch(t){try{return me.call(null,e)}catch(t){return me.call(this,e)}}}(e);}}function We(e,t){this.fun=e,this.array=t;}We.prototype.run=function(){this.fun.apply(null,this.array);};function Ce(){}var Re=Ce,Se=Ce,Ye=Ce,ve=Ce,Ke=Ce,Ne=Ce,Je=Ce;var He=re.performance||{},fe=He.now||He.mozNow||He.msNow||He.oNow||He.webkitNow||function(){return (new Date).getTime()};var Ue=new Date;var Le={nextTick:function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var l=1;l<arguments.length;l++)t[l-1]=arguments[l];pe.push(new We(e,t)),1!==pe.length||ge||Ie(Ve);},title:"browser",browser:true,env:{},argv:[],version:"",versions:{},on:Re,addListener:Se,once:Ye,off:ve,removeListener:Ke,removeAllListeners:Ne,emit:Je,binding:function(e){throw new Error("process.binding is not supported")},cwd:function(){return "/"},chdir:function(e){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(e){var t=.001*fe.call(He),l=Math.floor(t),i=Math.floor(t%1*1e9);return e&&(l-=e[0],(i-=e[1])<0&&(l--,i+=1e9)),[l,i]},platform:"browser",release:{},config:{},uptime:function(){return (new Date-Ue)/1e3}},ke=Le,Be=ne,Te=function(e,t,l,i,n){return e.config=t,l&&(e.code=l),e.request=i,e.response=n,e.isAxiosError=true,e.toJSON=function(){return {message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},e},Fe={silentJSONParsing:true,forcedJSONParsing:true,clarifyTimeoutError:false},Ae=Te,ze=function(e,t,l,i,n){var o=new Error(e);return Ae(o,t,l,i,n)},we=ze,xe=ne,Pe=xe.isStandardBrowserEnv()?{write:function(e,t,l,i,n,o){var d=[];d.push(e+"="+encodeURIComponent(t)),xe.isNumber(l)&&d.push("expires="+new Date(l).toGMTString()),xe.isString(i)&&d.push("path="+i),xe.isString(n)&&d.push("domain="+n),true===o&&d.push("secure"),document.cookie=d.join("; ");},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5);}}:{write:function(){},read:function(){return null},remove:function(){}},Qe=function(e){return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},Me=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e},je=ne,Ee=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],De=ne,Oe=De.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a");function i(e){var i=e;return t&&(l.setAttribute("href",i),i=l.href),l.setAttribute("href",i),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:"/"===l.pathname.charAt(0)?l.pathname:"/"+l.pathname}}return e=i(window.location.href),function(t){var l=De.isString(t)?i(t):t;return l.protocol===e.protocol&&l.host===e.host}}():function(){return true};function _e(e){this.message=e;}_e.prototype.toString=function(){return "Cancel"+(this.message?": "+this.message:"")},_e.prototype.__CANCEL__=true;var qe=_e,$e=ne,et=function(e,t,l){var i=l.config.validateStatus;l.status&&i&&!i(l.status)?t(we("Request failed with status code "+l.status,l.config,null,l.request,l)):e(l);},tt=Pe,lt=ce,it=function(e,t){return e&&!Qe(t)?Me(e,t):t},nt=function(e){var t,l,i,n={};return e?(je.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=je.trim(e.substr(0,i)).toLowerCase(),l=je.trim(e.substr(i+1)),t){if(n[t]&&Ee.indexOf(t)>=0)return;n[t]="set-cookie"===t?(n[t]?n[t]:[]).concat([l]):n[t]?n[t]+", "+l:l;}})),n):n},ot=Oe,dt=ze,ct=Fe,at=qe,st=function(e){return new Promise((function(t,l){var i,n=e.data,o=e.headers,d=e.responseType;function c(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i);}$e.isFormData(n)&&delete o["Content-Type"];var a=new XMLHttpRequest;if(e.auth){var s=e.auth.username||"",Z=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.Authorization="Basic "+btoa(s+":"+Z);}var r=it(e.baseURL,e.url);function u(){if(a){var i="getAllResponseHeaders"in a?nt(a.getAllResponseHeaders()):null,n={data:d&&"text"!==d&&"json"!==d?a.response:a.responseText,status:a.status,statusText:a.statusText,headers:i,config:e,request:a};et((function(e){t(e),c();}),(function(e){l(e),c();}),n),a=null;}}if(a.open(e.method.toUpperCase(),lt(r,e.params,e.paramsSerializer),true),a.timeout=e.timeout,"onloadend"in a?a.onloadend=u:a.onreadystatechange=function(){a&&4===a.readyState&&(0!==a.status||a.responseURL&&0===a.responseURL.indexOf("file:"))&&setTimeout(u);},a.onabort=function(){a&&(l(dt("Request aborted",e,"ECONNABORTED",a)),a=null);},a.onerror=function(){l(dt("Network Error",e,null,a)),a=null;},a.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",i=e.transitional||ct;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),l(dt(t,e,i.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null;},$e.isStandardBrowserEnv()){var b=(e.withCredentials||ot(r))&&e.xsrfCookieName?tt.read(e.xsrfCookieName):void 0;b&&(o[e.xsrfHeaderName]=b);}"setRequestHeader"in a&&$e.forEach(o,(function(e,t){ void 0===n&&"content-type"===t.toLowerCase()?delete o[t]:a.setRequestHeader(t,e);})),$e.isUndefined(e.withCredentials)||(a.withCredentials=!!e.withCredentials),d&&"json"!==d&&(a.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&a.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&a.upload&&a.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(i=function(e){a&&(l(!e||e&&e.type?new at("canceled"):e),a.abort(),a=null);},e.cancelToken&&e.cancelToken.subscribe(i),e.signal&&(e.signal.aborted?i():e.signal.addEventListener("abort",i))),n||(n=null),a.send(n);}))},Zt=ne,rt=function(e,t){Be.forEach(e,(function(l,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=l,delete e[i]);}));},ut=Te,bt={"Content-Type":"application/x-www-form-urlencoded"};function ht(e,t){!Zt.isUndefined(e)&&Zt.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t);}var mt,It={transitional:Fe,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==ke&&"[object process]"===Object.prototype.toString.call(ke))&&(mt=st),mt),transformRequest:[function(e,t){return rt(t,"Accept"),rt(t,"Content-Type"),Zt.isFormData(e)||Zt.isArrayBuffer(e)||Zt.isBuffer(e)||Zt.isStream(e)||Zt.isFile(e)||Zt.isBlob(e)?e:Zt.isArrayBufferView(e)?e.buffer:Zt.isURLSearchParams(e)?(ht(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):Zt.isObject(e)||t&&"application/json"===t["Content-Type"]?(ht(t,"application/json"),function(e,t,l){if(Zt.isString(e))try{return (t||JSON.parse)(e),Zt.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return (l||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||It.transitional,l=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,n=!l&&"json"===this.responseType;if(n||i&&Zt.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw ut(e,this,"E_JSON_PARSE");throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};Zt.forEach(["delete","get","head"],(function(e){It.headers[e]={};})),Zt.forEach(["post","put","patch"],(function(e){It.headers[e]=Zt.merge(bt);}));var Gt=It,pt=ne,gt=Gt,Xt=function(e){return !(!e||!e.__CANCEL__)},yt=ne,Vt=function(e,t,l){var i=this||gt;return pt.forEach(l,(function(l){e=l.call(i,e,t);})),e},Wt=Xt,Ct=Gt,Rt=qe;function St(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Rt("canceled")}var Yt=ne,vt=function(e,t){t=t||{};var l={};function i(e,t){return Yt.isPlainObject(e)&&Yt.isPlainObject(t)?Yt.merge(e,t):Yt.isPlainObject(t)?Yt.merge({},t):Yt.isArray(t)?t.slice():t}function n(l){return Yt.isUndefined(t[l])?Yt.isUndefined(e[l])?void 0:i(void 0,e[l]):i(e[l],t[l])}function o(e){if(!Yt.isUndefined(t[e]))return i(void 0,t[e])}function d(l){return Yt.isUndefined(t[l])?Yt.isUndefined(e[l])?void 0:i(void 0,e[l]):i(void 0,t[l])}function c(l){return l in t?i(e[l],t[l]):l in e?i(void 0,e[l]):void 0}var a={url:o,method:o,data:o,baseURL:d,transformRequest:d,transformResponse:d,paramsSerializer:d,timeout:d,timeoutMessage:d,withCredentials:d,adapter:d,responseType:d,xsrfCookieName:d,xsrfHeaderName:d,onUploadProgress:d,onDownloadProgress:d,decompress:d,maxContentLength:d,maxBodyLength:d,transport:d,httpAgent:d,httpsAgent:d,cancelToken:d,socketPath:d,responseEncoding:d,validateStatus:c};return Yt.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=a[e]||n,i=t(e);Yt.isUndefined(i)&&t!==c||(l[e]=i);})),l},Kt="0.26.1",Nt=Kt,Jt={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Jt[e]=function(l){return typeof l===e||"a"+(t<1?"n ":" ")+e};}));var Ht={};Jt.transitional=function(e,t,l){function i(e,t){return "[Axios v"+Nt+"] Transitional option '"+e+"'"+t+(l?". "+l:"")}return function(l,n,o){if(false===e)throw new Error(i(n," has been removed"+(t?" in "+t:"")));return t&&!Ht[n]&&(Ht[n]=true,console.warn(i(n," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(l,n,o)}};var ft={assertOptions:function(e,t,l){if("object"!=typeof e)throw new TypeError("options must be an object");for(var i=Object.keys(e),n=i.length;n-- >0;){var o=i[n],d=t[o];if(d){var c=e[o],a=void 0===c||d(c,o,e);if(true!==a)throw new TypeError("option "+o+" must be "+a)}else if(true!==l)throw Error("Unknown option "+o)}},validators:Jt},Ut=ne,Lt=ce,kt=Ze,Bt=function(e){return St(e),e.headers=e.headers||{},e.data=Vt.call(e,e.data,e.headers,e.transformRequest),e.headers=yt.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),yt.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t];})),(e.adapter||Ct.adapter)(e).then((function(t){return St(e),t.data=Vt.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return Wt(t)||(St(e),t&&t.response&&(t.response.data=Vt.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))},Tt=vt,Ft=ft,At=Ft.validators;function zt(e){this.defaults=e,this.interceptors={request:new kt,response:new kt};}zt.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=Tt(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var l=t.transitional;void 0!==l&&Ft.assertOptions(l,{silentJSONParsing:At.transitional(At.boolean),forcedJSONParsing:At.transitional(At.boolean),clarifyTimeoutError:At.transitional(At.boolean)},false);var i=[],n=true;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&false===e.runWhen(t)||(n=n&&e.synchronous,i.unshift(e.fulfilled,e.rejected));}));var o,d=[];if(this.interceptors.response.forEach((function(e){d.push(e.fulfilled,e.rejected);})),!n){var c=[Bt,void 0];for(Array.prototype.unshift.apply(c,i),c=c.concat(d),o=Promise.resolve(t);c.length;)o=o.then(c.shift(),c.shift());return o}for(var a=t;i.length;){var s=i.shift(),Z=i.shift();try{a=s(a);}catch(e){Z(e);break}}try{o=Bt(a);}catch(e){return Promise.reject(e)}for(;d.length;)o=o.then(d.shift(),d.shift());return o},zt.prototype.getUri=function(e){return e=Tt(this.defaults,e),Lt(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},Ut.forEach(["delete","get","head","options"],(function(e){zt.prototype[e]=function(t,l){return this.request(Tt(l||{},{method:e,url:t,data:(l||{}).data}))};})),Ut.forEach(["post","put","patch"],(function(e){zt.prototype[e]=function(t,l,i){return this.request(Tt(i||{},{method:e,url:t,data:l}))};}));var wt=zt,xt=qe;function Pt(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e;}));var l=this;this.promise.then((function(e){if(l._listeners){var t,i=l._listeners.length;for(t=0;t<i;t++)l._listeners[t](e);l._listeners=null;}})),this.promise.then=function(e){var t,i=new Promise((function(e){l.subscribe(e),t=e;})).then(e);return i.cancel=function(){l.unsubscribe(t);},i},e((function(e){l.reason||(l.reason=new xt(e),t(l.reason));}));}Pt.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},Pt.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e];},Pt.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1);}},Pt.source=function(){var e,t=new Pt((function(t){e=t;}));return {token:t,cancel:e}};var Qt=Pt,Mt=ne,jt=ne,Et=E,Dt=wt,Ot=vt;var _t=function e(t){var l=new Dt(t),i=Et(Dt.prototype.request,l);return jt.extend(i,Dt.prototype,l),jt.extend(i,l),i.create=function(l){return e(Ot(t,l))},i}(Gt);_t.Axios=Dt,_t.Cancel=qe,_t.CancelToken=Qt,_t.isCancel=Xt,_t.VERSION=Kt,_t.all=function(e){return Promise.all(e)},_t.spread=function(e){return function(t){return e.apply(null,t)}},_t.isAxiosError=function(e){return Mt.isObject(e)&&true===e.isAxiosError},j.exports=_t,j.exports.default=_t;var qt,$t=j.exports;let el=qt=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>null,this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this);}static getInstance(){return this.axiosInstance||(this.axiosInstance=$t.create({withCredentials:true}),this.clientInstance||(this.clientInstance=new qt),this.axiosInstance.interceptors.request.use((t=>e(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(t)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=$t.all,this.axiosInstance.spread=$t.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}requestHandler(t){return e(this,void 0,void 0,(function*(){if(yield this.attachToken(t),null==t?void 0:t.shouldEncodeToFormData){const e=null==t?void 0:t.data,l=new FormData;Object.keys(e).forEach((t=>{l.append(t,e[t]);})),t.data=l;}return t.startTimeInMs=(new Date).getTime(),qt.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),t}))}errorHandler(e){throw qt.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){return qt.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(t=true,l){return e(this,void 0,void 0,(function*(){qt.isHandlerEnabled=t,this.attachToken=l;}))}enableHandler(){qt.isHandlerEnabled=true;}disableHandler(){qt.isHandlerEnabled=false;}disableHandlerWithTimeout(e=qt.DEFAULT_HANDLER_DISABLE_TIMEOUT){qt.isHandlerEnabled=false,setTimeout((()=>{qt.isHandlerEnabled=true;}),e);}setHttpRequestStartCallback(e){this.requestStartCallback=e;}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e;}setHttpRequestErrorCallback(e){this.requestErrorCallback=e;}setHttpRequestFinishCallback(e){this.requestFinishCallback=e;}};el.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,el=qt=function(e,t,l,i){var n,o=arguments.length,d=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,l):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(e,t,l,i);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(d=(o<3?n(d):o>3?n(t,l,d):n(t,l))||d);return o>3&&d&&Object.defineProperty(t,l,d),d}([e=>{}],el);class tl{setData(t,l){return e(this,void 0,void 0,(function*(){localStorage.setItem(t,l);}))}getData(t){var l;return e(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){localStorage.removeItem(t);}))}}class ll{constructor(){this._data=new Map;}setData(t,l){return e(this,void 0,void 0,(function*(){this._data.set(t,l);}))}getData(t){var l,i;return e(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(t))&&void 0!==i?i:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){this._data.delete(t);}))}}class il{setData(t,l){return e(this,void 0,void 0,(function*(){sessionStorage.setItem(t,l);}))}getData(t){var l;return e(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){sessionStorage.removeItem(t);}))}}var nl=[],ol=[],dl="undefined"!=typeof Uint8Array?Uint8Array:Array,cl=false;function al(){cl=true;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,l=e.length;t<l;++t)nl[t]=e[t],ol[e.charCodeAt(t)]=t;ol["-".charCodeAt(0)]=62,ol["_".charCodeAt(0)]=63;}function sl(e,t,l){for(var i,n,o=[],d=t;d<l;d+=3)i=(e[d]<<16)+(e[d+1]<<8)+e[d+2],o.push(nl[(n=i)>>18&63]+nl[n>>12&63]+nl[n>>6&63]+nl[63&n]);return o.join("")}function Zl(e){var t;cl||al();for(var l=e.length,i=l%3,n="",o=[],d=16383,c=0,a=l-i;c<a;c+=d)o.push(sl(e,c,c+d>a?a:c+d));return 1===i?(t=e[l-1],n+=nl[t>>2],n+=nl[t<<4&63],n+="=="):2===i&&(t=(e[l-2]<<8)+e[l-1],n+=nl[t>>10],n+=nl[t>>4&63],n+=nl[t<<2&63],n+="="),o.push(n),o.join("")}function rl(e,t,l,i,n){var o,d,c=8*n-i-1,a=(1<<c)-1,s=a>>1,Z=-7,r=l?n-1:0,u=l?-1:1,b=e[t+r];for(r+=u,o=b&(1<<-Z)-1,b>>=-Z,Z+=c;Z>0;o=256*o+e[t+r],r+=u,Z-=8);for(d=o&(1<<-Z)-1,o>>=-Z,Z+=i;Z>0;d=256*d+e[t+r],r+=u,Z-=8);if(0===o)o=1-s;else {if(o===a)return d?NaN:1/0*(b?-1:1);d+=Math.pow(2,i),o-=s;}return (b?-1:1)*d*Math.pow(2,o-i)}function ul(e,t,l,i,n,o){var d,c,a,s=8*o-n-1,Z=(1<<s)-1,r=Z>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,b=i?0:o-1,h=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(c=isNaN(t)?1:0,d=Z):(d=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-d))<1&&(d--,a*=2),(t+=d+r>=1?u/a:u*Math.pow(2,1-r))*a>=2&&(d++,a/=2),d+r>=Z?(c=0,d=Z):d+r>=1?(c=(t*a-1)*Math.pow(2,n),d+=r):(c=t*Math.pow(2,r-1)*Math.pow(2,n),d=0));n>=8;e[l+b]=255&c,b+=h,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;e[l+b]=255&d,b+=h,d/=256,s-=8);e[l+b-h]|=128*m;}var bl={}.toString,hl=Array.isArray||function(e){return "[object Array]"==bl.call(e)};pl.TYPED_ARRAY_SUPPORT=void 0===re.TYPED_ARRAY_SUPPORT||re.TYPED_ARRAY_SUPPORT;var ml=Il();function Il(){return pl.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Gl(e,t){if(Il()<t)throw new RangeError("Invalid typed array length");return pl.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=pl.prototype:(null===e&&(e=new pl(t)),e.length=t),e}function pl(e,t,l){if(!(pl.TYPED_ARRAY_SUPPORT||this instanceof pl))return new pl(e,t,l);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return yl(this,e)}return gl(this,e,t,l)}function gl(e,t,l,i){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return "undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,l,i){if(t.byteLength,l<0||t.byteLength<l)throw new RangeError("'offset' is out of bounds");if(t.byteLength<l+(i||0))throw new RangeError("'length' is out of bounds");t=void 0===l&&void 0===i?new Uint8Array(t):void 0===i?new Uint8Array(t,l):new Uint8Array(t,l,i);pl.TYPED_ARRAY_SUPPORT?(e=t).__proto__=pl.prototype:e=Vl(e,t);return e}(e,t,l,i):"string"==typeof t?function(e,t,l){"string"==typeof l&&""!==l||(l="utf8");if(!pl.isEncoding(l))throw new TypeError('"encoding" must be a valid string encoding');var i=0|Rl(t,l),n=(e=Gl(e,i)).write(t,l);n!==i&&(e=e.slice(0,n));return e}(e,t,l):function(e,t){if(Cl(t)){var l=0|Wl(t.length);return 0===(e=Gl(e,l)).length||t.copy(e,0,0,l),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return "number"!=typeof t.length||(i=t.length)!=i?Gl(e,0):Vl(e,t);if("Buffer"===t.type&&hl(t.data))return Vl(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function Xl(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function yl(e,t){if(Xl(t),e=Gl(e,t<0?0:0|Wl(t)),!pl.TYPED_ARRAY_SUPPORT)for(var l=0;l<t;++l)e[l]=0;return e}function Vl(e,t){var l=t.length<0?0:0|Wl(t.length);e=Gl(e,l);for(var i=0;i<l;i+=1)e[i]=255&t[i];return e}function Wl(e){if(e>=Il())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Il().toString(16)+" bytes");return 0|e}function Cl(e){return !(null==e||!e._isBuffer)}function Rl(e,t){if(Cl(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var l=e.length;if(0===l)return 0;for(var i=false;;)switch(t){case "ascii":case "latin1":case "binary":return l;case "utf8":case "utf-8":case void 0:return _l(e).length;case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return 2*l;case "hex":return l>>>1;case "base64":return ql(e).length;default:if(i)return _l(e).length;t=(""+t).toLowerCase(),i=true;}}function Sl(e,t,l){var i=false;if((void 0===t||t<0)&&(t=0),t>this.length)return "";if((void 0===l||l>this.length)&&(l=this.length),l<=0)return "";if((l>>>=0)<=(t>>>=0))return "";for(e||(e="utf8");;)switch(e){case "hex":return Al(this,t,l);case "utf8":case "utf-8":return Bl(this,t,l);case "ascii":return Tl(this,t,l);case "latin1":case "binary":return Fl(this,t,l);case "base64":return kl(this,t,l);case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return zl(this,t,l);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=true;}}function Yl(e,t,l){var i=e[t];e[t]=e[l],e[l]=i;}function vl(e,t,l,i,n){if(0===e.length)return -1;if("string"==typeof l?(i=l,l=0):l>2147483647?l=2147483647:l<-2147483648&&(l=-2147483648),l=+l,isNaN(l)&&(l=n?0:e.length-1),l<0&&(l=e.length+l),l>=e.length){if(n)return -1;l=e.length-1;}else if(l<0){if(!n)return -1;l=0;}if("string"==typeof t&&(t=pl.from(t,i)),Cl(t))return 0===t.length?-1:Kl(e,t,l,i,n);if("number"==typeof t)return t&=255,pl.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,l):Uint8Array.prototype.lastIndexOf.call(e,t,l):Kl(e,[t],l,i,n);throw new TypeError("val must be string, number or Buffer")}function Kl(e,t,l,i,n){var o,d=1,c=e.length,a=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return -1;d=2,c/=2,a/=2,l/=2;}function s(e,t){return 1===d?e[t]:e.readUInt16BE(t*d)}if(n){var Z=-1;for(o=l;o<c;o++)if(s(e,o)===s(t,-1===Z?0:o-Z)){if(-1===Z&&(Z=o),o-Z+1===a)return Z*d}else -1!==Z&&(o-=o-Z),Z=-1;}else for(l+a>c&&(l=c-a),o=l;o>=0;o--){for(var r=true,u=0;u<a;u++)if(s(e,o+u)!==s(t,u)){r=false;break}if(r)return o}return -1}function Nl(e,t,l,i){l=Number(l)||0;var n=e.length-l;i?(i=Number(i))>n&&(i=n):i=n;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");i>o/2&&(i=o/2);for(var d=0;d<i;++d){var c=parseInt(t.substr(2*d,2),16);if(isNaN(c))return d;e[l+d]=c;}return d}function Jl(e,t,l,i){return $l(_l(t,e.length-l),e,l,i)}function Hl(e,t,l,i){return $l(function(e){for(var t=[],l=0;l<e.length;++l)t.push(255&e.charCodeAt(l));return t}(t),e,l,i)}function fl(e,t,l,i){return Hl(e,t,l,i)}function Ul(e,t,l,i){return $l(ql(t),e,l,i)}function Ll(e,t,l,i){return $l(function(e,t){for(var l,i,n,o=[],d=0;d<e.length&&!((t-=2)<0);++d)i=(l=e.charCodeAt(d))>>8,n=l%256,o.push(n),o.push(i);return o}(t,e.length-l),e,l,i)}function kl(e,t,l){return 0===t&&l===e.length?Zl(e):Zl(e.slice(t,l))}function Bl(e,t,l){l=Math.min(e.length,l);for(var i=[],n=t;n<l;){var o,d,c,a,s=e[n],Z=null,r=s>239?4:s>223?3:s>191?2:1;if(n+r<=l)switch(r){case 1:s<128&&(Z=s);break;case 2:128==(192&(o=e[n+1]))&&(a=(31&s)<<6|63&o)>127&&(Z=a);break;case 3:o=e[n+1],d=e[n+2],128==(192&o)&&128==(192&d)&&(a=(15&s)<<12|(63&o)<<6|63&d)>2047&&(a<55296||a>57343)&&(Z=a);break;case 4:o=e[n+1],d=e[n+2],c=e[n+3],128==(192&o)&&128==(192&d)&&128==(192&c)&&(a=(15&s)<<18|(63&o)<<12|(63&d)<<6|63&c)>65535&&a<1114112&&(Z=a);}null===Z?(Z=65533,r=1):Z>65535&&(Z-=65536,i.push(Z>>>10&1023|55296),Z=56320|1023&Z),i.push(Z),n+=r;}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var l="",i=0;for(;i<t;)l+=String.fromCharCode.apply(String,e.slice(i,i+=4096));return l}(i)}pl.poolSize=8192,pl._augment=function(e){return e.__proto__=pl.prototype,e},pl.from=function(e,t,l){return gl(null,e,t,l)},pl.TYPED_ARRAY_SUPPORT&&(pl.prototype.__proto__=Uint8Array.prototype,pl.__proto__=Uint8Array),pl.alloc=function(e,t,l){return function(e,t,l,i){return Xl(t),t<=0?Gl(e,t):void 0!==l?"string"==typeof i?Gl(e,t).fill(l,i):Gl(e,t).fill(l):Gl(e,t)}(null,e,t,l)},pl.allocUnsafe=function(e){return yl(null,e)},pl.allocUnsafeSlow=function(e){return yl(null,e)},pl.isBuffer=ei,pl.compare=function(e,t){if(!Cl(e)||!Cl(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var l=e.length,i=t.length,n=0,o=Math.min(l,i);n<o;++n)if(e[n]!==t[n]){l=e[n],i=t[n];break}return l<i?-1:i<l?1:0},pl.isEncoding=function(e){switch(String(e).toLowerCase()){case "hex":case "utf8":case "utf-8":case "ascii":case "latin1":case "binary":case "base64":case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return true;default:return false}},pl.concat=function(e,t){if(!hl(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return pl.alloc(0);var l;if(void 0===t)for(t=0,l=0;l<e.length;++l)t+=e[l].length;var i=pl.allocUnsafe(t),n=0;for(l=0;l<e.length;++l){var o=e[l];if(!Cl(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length;}return i},pl.byteLength=Rl,pl.prototype._isBuffer=true,pl.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)Yl(this,t,t+1);return this},pl.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)Yl(this,t,t+3),Yl(this,t+1,t+2);return this},pl.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)Yl(this,t,t+7),Yl(this,t+1,t+6),Yl(this,t+2,t+5),Yl(this,t+3,t+4);return this},pl.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?Bl(this,0,e):Sl.apply(this,arguments)},pl.prototype.equals=function(e){if(!Cl(e))throw new TypeError("Argument must be a Buffer");return this===e||0===pl.compare(this,e)},pl.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},pl.prototype.compare=function(e,t,l,i,n){if(!Cl(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===l&&(l=e?e.length:0),void 0===i&&(i=0),void 0===n&&(n=this.length),t<0||l>e.length||i<0||n>this.length)throw new RangeError("out of range index");if(i>=n&&t>=l)return 0;if(i>=n)return -1;if(t>=l)return 1;if(this===e)return 0;for(var o=(n>>>=0)-(i>>>=0),d=(l>>>=0)-(t>>>=0),c=Math.min(o,d),a=this.slice(i,n),s=e.slice(t,l),Z=0;Z<c;++Z)if(a[Z]!==s[Z]){o=a[Z],d=s[Z];break}return o<d?-1:d<o?1:0},pl.prototype.includes=function(e,t,l){return -1!==this.indexOf(e,t,l)},pl.prototype.indexOf=function(e,t,l){return vl(this,e,t,l,true)},pl.prototype.lastIndexOf=function(e,t,l){return vl(this,e,t,l,false)},pl.prototype.write=function(e,t,l,i){if(void 0===t)i="utf8",l=this.length,t=0;else if(void 0===l&&"string"==typeof t)i=t,l=this.length,t=0;else {if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(l)?(l|=0,void 0===i&&(i="utf8")):(i=l,l=void 0);}var n=this.length-t;if((void 0===l||l>n)&&(l=n),e.length>0&&(l<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=false;;)switch(i){case "hex":return Nl(this,e,t,l);case "utf8":case "utf-8":return Jl(this,e,t,l);case "ascii":return Hl(this,e,t,l);case "latin1":case "binary":return fl(this,e,t,l);case "base64":return Ul(this,e,t,l);case "ucs2":case "ucs-2":case "utf16le":case "utf-16le":return Ll(this,e,t,l);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=true;}},pl.prototype.toJSON=function(){return {type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function Tl(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(127&e[n]);return i}function Fl(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(e[n]);return i}function Al(e,t,l){var i=e.length;(!t||t<0)&&(t=0),(!l||l<0||l>i)&&(l=i);for(var n="",o=t;o<l;++o)n+=Ol(e[o]);return n}function zl(e,t,l){for(var i=e.slice(t,l),n="",o=0;o<i.length;o+=2)n+=String.fromCharCode(i[o]+256*i[o+1]);return n}function wl(e,t,l){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>l)throw new RangeError("Trying to access beyond buffer length")}function xl(e,t,l,i,n,o){if(!Cl(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||t<o)throw new RangeError('"value" argument is out of bounds');if(l+i>e.length)throw new RangeError("Index out of range")}function Pl(e,t,l,i){t<0&&(t=65535+t+1);for(var n=0,o=Math.min(e.length-l,2);n<o;++n)e[l+n]=(t&255<<8*(i?n:1-n))>>>8*(i?n:1-n);}function Ql(e,t,l,i){t<0&&(t=4294967295+t+1);for(var n=0,o=Math.min(e.length-l,4);n<o;++n)e[l+n]=t>>>8*(i?n:3-n)&255;}function Ml(e,t,l,i,n,o){if(l+i>e.length)throw new RangeError("Index out of range");if(l<0)throw new RangeError("Index out of range")}function jl(e,t,l,i,n){return n||Ml(e,0,l,4),ul(e,t,l,i,23,4),l+4}function El(e,t,l,i,n){return n||Ml(e,0,l,8),ul(e,t,l,i,52,8),l+8}pl.prototype.slice=function(e,t){var l,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t<e&&(t=e),pl.TYPED_ARRAY_SUPPORT)(l=this.subarray(e,t)).__proto__=pl.prototype;else {var n=t-e;l=new pl(n,void 0);for(var o=0;o<n;++o)l[o]=this[o+e];}return l},pl.prototype.readUIntLE=function(e,t,l){e|=0,t|=0,l||wl(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i},pl.prototype.readUIntBE=function(e,t,l){e|=0,t|=0,l||wl(e,t,this.length);for(var i=this[e+--t],n=1;t>0&&(n*=256);)i+=this[e+--t]*n;return i},pl.prototype.readUInt8=function(e,t){return t||wl(e,1,this.length),this[e]},pl.prototype.readUInt16LE=function(e,t){return t||wl(e,2,this.length),this[e]|this[e+1]<<8},pl.prototype.readUInt16BE=function(e,t){return t||wl(e,2,this.length),this[e]<<8|this[e+1]},pl.prototype.readUInt32LE=function(e,t){return t||wl(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},pl.prototype.readUInt32BE=function(e,t){return t||wl(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},pl.prototype.readIntLE=function(e,t,l){e|=0,t|=0,l||wl(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*t)),i},pl.prototype.readIntBE=function(e,t,l){e|=0,t|=0,l||wl(e,t,this.length);for(var i=t,n=1,o=this[e+--i];i>0&&(n*=256);)o+=this[e+--i]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*t)),o},pl.prototype.readInt8=function(e,t){return t||wl(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},pl.prototype.readInt16LE=function(e,t){t||wl(e,2,this.length);var l=this[e]|this[e+1]<<8;return 32768&l?4294901760|l:l},pl.prototype.readInt16BE=function(e,t){t||wl(e,2,this.length);var l=this[e+1]|this[e]<<8;return 32768&l?4294901760|l:l},pl.prototype.readInt32LE=function(e,t){return t||wl(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},pl.prototype.readInt32BE=function(e,t){return t||wl(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},pl.prototype.readFloatLE=function(e,t){return t||wl(e,4,this.length),rl(this,e,true,23,4)},pl.prototype.readFloatBE=function(e,t){return t||wl(e,4,this.length),rl(this,e,false,23,4)},pl.prototype.readDoubleLE=function(e,t){return t||wl(e,8,this.length),rl(this,e,true,52,8)},pl.prototype.readDoubleBE=function(e,t){return t||wl(e,8,this.length),rl(this,e,false,52,8)},pl.prototype.writeUIntLE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||xl(this,e,t,l,Math.pow(2,8*l)-1,0);var n=1,o=0;for(this[t]=255&e;++o<l&&(n*=256);)this[t+o]=e/n&255;return t+l},pl.prototype.writeUIntBE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||xl(this,e,t,l,Math.pow(2,8*l)-1,0);var n=l-1,o=1;for(this[t+n]=255&e;--n>=0&&(o*=256);)this[t+n]=e/o&255;return t+l},pl.prototype.writeUInt8=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,1,255,0),pl.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},pl.prototype.writeUInt16LE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,2,65535,0),pl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Pl(this,e,t,true),t+2},pl.prototype.writeUInt16BE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,2,65535,0),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Pl(this,e,t,false),t+2},pl.prototype.writeUInt32LE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,4,4294967295,0),pl.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):Ql(this,e,t,true),t+4},pl.prototype.writeUInt32BE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,4,4294967295,0),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Ql(this,e,t,false),t+4},pl.prototype.writeIntLE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);xl(this,e,t,l,n-1,-n);}var o=0,d=1,c=0;for(this[t]=255&e;++o<l&&(d*=256);)e<0&&0===c&&0!==this[t+o-1]&&(c=1),this[t+o]=(e/d>>0)-c&255;return t+l},pl.prototype.writeIntBE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);xl(this,e,t,l,n-1,-n);}var o=l-1,d=1,c=0;for(this[t+o]=255&e;--o>=0&&(d*=256);)e<0&&0===c&&0!==this[t+o+1]&&(c=1),this[t+o]=(e/d>>0)-c&255;return t+l},pl.prototype.writeInt8=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,1,127,-128),pl.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},pl.prototype.writeInt16LE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,2,32767,-32768),pl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Pl(this,e,t,true),t+2},pl.prototype.writeInt16BE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,2,32767,-32768),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Pl(this,e,t,false),t+2},pl.prototype.writeInt32LE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,4,2147483647,-2147483648),pl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):Ql(this,e,t,true),t+4},pl.prototype.writeInt32BE=function(e,t,l){return e=+e,t|=0,l||xl(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Ql(this,e,t,false),t+4},pl.prototype.writeFloatLE=function(e,t,l){return jl(this,e,t,true,l)},pl.prototype.writeFloatBE=function(e,t,l){return jl(this,e,t,false,l)},pl.prototype.writeDoubleLE=function(e,t,l){return El(this,e,t,true,l)},pl.prototype.writeDoubleBE=function(e,t,l){return El(this,e,t,false,l)},pl.prototype.copy=function(e,t,l,i){if(l||(l=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<l&&(i=l),i===l)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(l<0||l>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-l&&(i=e.length-t+l);var n,o=i-l;if(this===e&&l<t&&t<i)for(n=o-1;n>=0;--n)e[n+t]=this[n+l];else if(o<1e3||!pl.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)e[n+t]=this[n+l];else Uint8Array.prototype.set.call(e,this.subarray(l,l+o),t);return o},pl.prototype.fill=function(e,t,l,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,l=this.length):"string"==typeof l&&(i=l,l=this.length),1===e.length){var n=e.charCodeAt(0);n<256&&(e=n);}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!pl.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else "number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<l)throw new RangeError("Out of range index");if(l<=t)return this;var o;if(t>>>=0,l=void 0===l?this.length:l>>>0,e||(e=0),"number"==typeof e)for(o=t;o<l;++o)this[o]=e;else {var d=Cl(e)?e:_l(new pl(e,i).toString()),c=d.length;for(o=0;o<l-t;++o)this[o+t]=d[o%c];}return this};var Dl=/[^+\/0-9A-Za-z-_]/g;function Ol(e){return e<16?"0"+e.toString(16):e.toString(16)}function _l(e,t){var l;t=t||1/0;for(var i=e.length,n=null,o=[],d=0;d<i;++d){if((l=e.charCodeAt(d))>55295&&l<57344){if(!n){if(l>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(d+1===i){(t-=3)>-1&&o.push(239,191,189);continue}n=l;continue}if(l<56320){(t-=3)>-1&&o.push(239,191,189),n=l;continue}l=65536+(n-55296<<10|l-56320);}else n&&(t-=3)>-1&&o.push(239,191,189);if(n=null,l<128){if((t-=1)<0)break;o.push(l);}else if(l<2048){if((t-=2)<0)break;o.push(l>>6|192,63&l|128);}else if(l<65536){if((t-=3)<0)break;o.push(l>>12|224,l>>6&63|128,63&l|128);}else {if(!(l<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(l>>18|240,l>>12&63|128,l>>6&63|128,63&l|128);}}return o}function ql(e){return function(e){var t,l,i,n,o,d;cl||al();var c=e.length;if(c%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[c-2]?2:"="===e[c-1]?1:0,d=new dl(3*c/4-o),i=o>0?c-4:c;var a=0;for(t=0,l=0;t<i;t+=4,l+=3)n=ol[e.charCodeAt(t)]<<18|ol[e.charCodeAt(t+1)]<<12|ol[e.charCodeAt(t+2)]<<6|ol[e.charCodeAt(t+3)],d[a++]=n>>16&255,d[a++]=n>>8&255,d[a++]=255&n;return 2===o?(n=ol[e.charCodeAt(t)]<<2|ol[e.charCodeAt(t+1)]>>4,d[a++]=255&n):1===o&&(n=ol[e.charCodeAt(t)]<<10|ol[e.charCodeAt(t+1)]<<4|ol[e.charCodeAt(t+2)]>>2,d[a++]=n>>8&255,d[a++]=255&n),d}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(Dl,"")).length<2)return "";for(;e.length%4!=0;)e+="=";return e}(e))}function $l(e,t,l,i){for(var n=0;n<i&&!(n+l>=t.length||n>=e.length);++n)t[n+l]=e[n];return n}function ei(e){return null!=e&&(!!e._isBuffer||ti(e)||function(e){return "function"==typeof e.readFloatLE&&"function"==typeof e.slice&&ti(e.slice(0,0))}(e))}function ti(e){return !!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var li=Object.freeze({__proto__:null,Buffer:pl,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return +e!=e&&(e=0),pl.alloc(+e)},isBuffer:ei,kMaxLength:ml}),ii={exports:{}},ni={},oi={};Object.defineProperty(oi,"__esModule",{value:true}),oi.default=function(e){var t=e.length,l=t%4;if(!l)return e;var i=t,n=4-l,o=t+n,d=pl.alloc(o);for(d.write(e);n--;)d.write("=",i++);return d.toString()},Object.defineProperty(ni,"__esModule",{value:true});var di=oi;function ci(e,t){return void 0===t&&(t="utf8"),pl.isBuffer(e)?si(e.toString("base64")):si(pl.from(e,t).toString("base64"))}function ai(e){return e=e.toString(),di.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function si(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var Zi,ri=ci;ri.encode=ci,ri.decode=function(e,t){return void 0===t&&(t="utf8"),pl.from(ai(e),"base64").toString(t)},ri.toBase64=ai,ri.fromBase64=si,ri.toBuffer=function(e){return pl.from(ai(e),"base64")},ni.default=ri,(Zi=ii).exports=ni.default,Zi.exports.default=Zi.exports;var ui=ii.exports,bi={exports:{}};!function(e){!function(t,l){var i={};!function(e){e.__esModule=true,e.digestLength=32,e.blockSize=64;var t=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function l(e,l,i,n,o){for(var d,c,a,s,Z,r,u,b,h,m,I,G,p;o>=64;){for(d=l[0],c=l[1],a=l[2],s=l[3],Z=l[4],r=l[5],u=l[6],b=l[7],m=0;m<16;m++)I=n+4*m,e[m]=(255&i[I])<<24|(255&i[I+1])<<16|(255&i[I+2])<<8|255&i[I+3];for(m=16;m<64;m++)G=((h=e[m-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,p=((h=e[m-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,e[m]=(G+e[m-7]|0)+(p+e[m-16]|0);for(m=0;m<64;m++)G=(((Z>>>6|Z<<26)^(Z>>>11|Z<<21)^(Z>>>25|Z<<7))+(Z&r^~Z&u)|0)+(b+(t[m]+e[m]|0)|0)|0,p=((d>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10))+(d&c^d&a^c&a)|0,b=u,u=r,r=Z,Z=s+G|0,s=a,a=c,c=d,d=G+p|0;l[0]+=d,l[1]+=c,l[2]+=a,l[3]+=s,l[4]+=Z,l[5]+=r,l[6]+=u,l[7]+=b,n+=64,o-=64;}return n}var i=function(){function t(){this.digestLength=e.digestLength,this.blockSize=e.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=false,this.reset();}return t.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=false,this},t.prototype.clean=function(){for(var e=0;e<this.buffer.length;e++)this.buffer[e]=0;for(e=0;e<this.temp.length;e++)this.temp[e]=0;this.reset();},t.prototype.update=function(e,t){if(void 0===t&&(t=e.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var i=0;if(this.bytesHashed+=t,this.bufferLength>0){for(;this.bufferLength<64&&t>0;)this.buffer[this.bufferLength++]=e[i++],t--;64===this.bufferLength&&(l(this.temp,this.state,this.buffer,0,64),this.bufferLength=0);}for(t>=64&&(i=l(this.temp,this.state,e,i,t),t%=64);t>0;)this.buffer[this.bufferLength++]=e[i++],t--;return this},t.prototype.finish=function(e){if(!this.finished){var t=this.bytesHashed,i=this.bufferLength,n=t/536870912|0,o=t<<3,d=t%64<56?64:128;this.buffer[i]=128;for(var c=i+1;c<d-8;c++)this.buffer[c]=0;this.buffer[d-8]=n>>>24&255,this.buffer[d-7]=n>>>16&255,this.buffer[d-6]=n>>>8&255,this.buffer[d-5]=n>>>0&255,this.buffer[d-4]=o>>>24&255,this.buffer[d-3]=o>>>16&255,this.buffer[d-2]=o>>>8&255,this.buffer[d-1]=o>>>0&255,l(this.temp,this.state,this.buffer,0,d),this.finished=true;}for(c=0;c<8;c++)e[4*c+0]=this.state[c]>>>24&255,e[4*c+1]=this.state[c]>>>16&255,e[4*c+2]=this.state[c]>>>8&255,e[4*c+3]=this.state[c]>>>0&255;return this},t.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},t.prototype._saveState=function(e){for(var t=0;t<this.state.length;t++)e[t]=this.state[t];},t.prototype._restoreState=function(e,t){for(var l=0;l<this.state.length;l++)this.state[l]=e[l];this.bytesHashed=t,this.finished=false,this.bufferLength=0;},t}();e.Hash=i;var n=function(){function e(e){this.inner=new i,this.outer=new i,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var t=new Uint8Array(this.blockSize);if(e.length>this.blockSize)(new i).update(e).finish(t).clean();else for(var l=0;l<e.length;l++)t[l]=e[l];for(l=0;l<t.length;l++)t[l]^=54;this.inner.update(t);for(l=0;l<t.length;l++)t[l]^=106;this.outer.update(t),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(l=0;l<t.length;l++)t[l]=0;}return e.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},e.prototype.clean=function(){for(var e=0;e<this.istate.length;e++)this.ostate[e]=this.istate[e]=0;this.inner.clean(),this.outer.clean();},e.prototype.update=function(e){return this.inner.update(e),this},e.prototype.finish=function(e){return this.outer.finished?this.outer.finish(e):(this.inner.finish(e),this.outer.update(e,this.digestLength).finish(e)),this},e.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},e}();function o(e){var t=(new i).update(e),l=t.digest();return t.clean(),l}function d(e,t){var l=new n(e).update(t),i=l.digest();return l.clean(),i}function c(e,t,l,i){var n=i[0];if(0===n)throw new Error("hkdf: cannot expand more");t.reset(),n>1&&t.update(e),l&&t.update(l),t.update(i),t.finish(e),i[0]++;}e.HMAC=n,e.hash=o,e.default=o,e.hmac=d;var a=new Uint8Array(e.digestLength);function s(e,t,l,i){ void 0===t&&(t=a),void 0===i&&(i=32);for(var o=new Uint8Array([1]),s=d(t,e),Z=new n(s),r=new Uint8Array(Z.digestLength),u=r.length,b=new Uint8Array(i),h=0;h<i;h++)u===r.length&&(c(r,Z,l,o),u=0),b[h]=r[u++];return Z.clean(),r.fill(0),o.fill(0),b}function Z(e,t,l,i){for(var o=new n(e),d=o.digestLength,c=new Uint8Array(4),a=new Uint8Array(d),s=new Uint8Array(d),Z=new Uint8Array(i),r=0;r*d<i;r++){var u=r+1;c[0]=u>>>24&255,c[1]=u>>>16&255,c[2]=u>>>8&255,c[3]=u>>>0&255,o.reset(),o.update(t),o.update(c),o.finish(s);for(var b=0;b<d;b++)a[b]=s[b];for(b=2;b<=l;b++){o.reset(),o.update(s).finish(s);for(var h=0;h<d;h++)a[h]^=s[h];}for(b=0;b<d&&r*d+b<i;b++)Z[r*d+b]=a[b];}for(r=0;r<d;r++)a[r]=s[r]=0;for(r=0;r<4;r++)c[r]=0;return o.clean(),Z}e.hkdf=s,e.pbkdf2=Z;}(i);var n=i.default;for(var o in i)n[o]=i[o];e.exports=n;}();}(bi);var hi=Q(bi.exports),mi=crypto;const Ii=e=>e instanceof CryptoKey,Gi=new TextEncoder,pi=new TextDecoder;const gi=e=>{let t=e;t instanceof Uint8Array&&(t=pi.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return (e=>{const t=atob(e),l=new Uint8Array(t.length);for(let e=0;e<t.length;e++)l[e]=t.charCodeAt(e);return l})(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class Xi extends Error{constructor(e){var t;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,null===(t=Error.captureStackTrace)||void 0===t||t.call(Error,this,this.constructor);}static get code(){return "ERR_JOSE_GENERIC"}}class yi extends Xi{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=t,this.reason=l;}static get code(){return "ERR_JWT_CLAIM_VALIDATION_FAILED"}}class Vi extends Xi{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_EXPIRED",this.claim=t,this.reason=l;}static get code(){return "ERR_JWT_EXPIRED"}}class Wi extends Xi{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED";}static get code(){return "ERR_JOSE_ALG_NOT_ALLOWED"}}class Ci extends Xi{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED";}static get code(){return "ERR_JOSE_NOT_SUPPORTED"}}class Ri extends Xi{constructor(){super(...arguments),this.code="ERR_JWS_INVALID";}static get code(){return "ERR_JWS_INVALID"}}class Si extends Xi{constructor(){super(...arguments),this.code="ERR_JWT_INVALID";}static get code(){return "ERR_JWT_INVALID"}}class Yi extends Xi{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID";}static get code(){return "ERR_JWKS_INVALID"}}class vi extends Xi{constructor(){super(...arguments),this.code="ERR_JWKS_NO_MATCHING_KEY",this.message="no applicable key found in the JSON Web Key Set";}static get code(){return "ERR_JWKS_NO_MATCHING_KEY"}}class Ki extends Xi{constructor(){super(...arguments),this.code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",this.message="multiple matching keys found in the JSON Web Key Set";}static get code(){return "ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}class Ni extends Xi{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed";}static get code(){return "ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}function Ji(){return "function"==typeof WebSocketPair}function Hi(e,t="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`)}function fi(e,t){return e.name===t}function Ui(e){return parseInt(e.name.slice(4),10)}function Li(e,t,...l){switch(t){case "HS256":case "HS384":case "HS512":{if(!fi(e.algorithm,"HMAC"))throw Hi("HMAC");const l=parseInt(t.slice(2),10);if(Ui(e.algorithm.hash)!==l)throw Hi(`SHA-${l}`,"algorithm.hash");break}case "RS256":case "RS384":case "RS512":{if(!fi(e.algorithm,"RSASSA-PKCS1-v1_5"))throw Hi("RSASSA-PKCS1-v1_5");const l=parseInt(t.slice(2),10);if(Ui(e.algorithm.hash)!==l)throw Hi(`SHA-${l}`,"algorithm.hash");break}case "PS256":case "PS384":case "PS512":{if(!fi(e.algorithm,"RSA-PSS"))throw Hi("RSA-PSS");const l=parseInt(t.slice(2),10);if(Ui(e.algorithm.hash)!==l)throw Hi(`SHA-${l}`,"algorithm.hash");break}case Ji()&&"EdDSA":if(!fi(e.algorithm,"NODE-ED25519"))throw Hi("NODE-ED25519");break;case "ES256":case "ES384":case "ES512":{if(!fi(e.algorithm,"ECDSA"))throw Hi("ECDSA");const l=function(e){switch(e){case "ES256":return "P-256";case "ES384":return "P-384";case "ES512":return "P-521";default:throw new Error("unreachable")}}(t);if(e.algorithm.namedCurve!==l)throw Hi(l,"algorithm.namedCurve");break}default:throw new TypeError("CryptoKey does not support this operation")}!function(e,t){if(t.length&&!t.some((t=>e.usages.includes(t)))){let e="CryptoKey does not support this operation, its usages must include ";if(t.length>2){const l=t.pop();e+=`one of ${t.join(", ")}, or ${l}.`;}else 2===t.length?e+=`one of ${t[0]} or ${t[1]}.`:e+=`${t[0]}.`;throw new TypeError(e)}}(e,l);}var ki=(e,...t)=>{let l="Key must be ";if(t.length>2){const e=t.pop();l+=`one of type ${t.join(", ")}, or ${e}.`;}else 2===t.length?l+=`one of type ${t[0]} or ${t[1]}.`:l+=`of type ${t[0]}.`;return null==e?l+=` Received ${e}`:"function"==typeof e&&e.name?l+=` Received function ${e.name}`:"object"==typeof e&&null!=e&&e.constructor&&e.constructor.name&&(l+=` Received an instance of ${e.constructor.name}`),l},Bi=e=>Ii(e);const Ti=["CryptoKey"];function Fi(e){if("object"!=typeof(t=e)||null===t||"[object Object]"!==Object.prototype.toString.call(e))return false;var t;if(null===Object.getPrototypeOf(e))return true;let l=e;for(;null!==Object.getPrototypeOf(l);)l=Object.getPrototypeOf(l);return Object.getPrototypeOf(e)===l}const Ai=async e=>{var t,l;const{algorithm:i,keyUsages:n}=function(e){let t,l;switch(e.kty){case "oct":switch(e.alg){case "HS256":case "HS384":case "HS512":t={name:"HMAC",hash:`SHA-${e.alg.slice(-3)}`},l=["sign","verify"];break;case "A128CBC-HS256":case "A192CBC-HS384":case "A256CBC-HS512":throw new Ci(`${e.alg} keys cannot be imported as CryptoKey instances`);case "A128GCM":case "A192GCM":case "A256GCM":case "A128GCMKW":case "A192GCMKW":case "A256GCMKW":t={name:"AES-GCM"},l=["encrypt","decrypt"];break;case "A128KW":case "A192KW":case "A256KW":t={name:"AES-KW"},l=["wrapKey","unwrapKey"];break;case "PBES2-HS256+A128KW":case "PBES2-HS384+A192KW":case "PBES2-HS512+A256KW":t={name:"PBKDF2"},l=["deriveBits"];break;default:throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case "RSA":switch(e.alg){case "PS256":case "PS384":case "PS512":t={name:"RSA-PSS",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case "RS256":case "RS384":case "RS512":t={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case "RSA-OAEP":case "RSA-OAEP-256":case "RSA-OAEP-384":case "RSA-OAEP-512":t={name:"RSA-OAEP",hash:`SHA-${parseInt(e.alg.slice(-3),10)||1}`},l=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case "EC":switch(e.alg){case "ES256":t={name:"ECDSA",namedCurve:"P-256"},l=e.d?["sign"]:["verify"];break;case "ES384":t={name:"ECDSA",namedCurve:"P-384"},l=e.d?["sign"]:["verify"];break;case "ES512":t={name:"ECDSA",namedCurve:"P-521"},l=e.d?["sign"]:["verify"];break;case "ECDH-ES":case "ECDH-ES+A128KW":case "ECDH-ES+A192KW":case "ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},l=e.d?["deriveBits"]:[];break;default:throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case Ji()&&"OKP":if("EdDSA"!==e.alg)throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');if("Ed25519"!==e.crv)throw new Ci('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value');t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},l=e.d?["sign"]:["verify"];break;default:throw new Ci('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return {algorithm:t,keyUsages:l}}(e),o=[i,null!==(t=e.ext)&&void 0!==t&&t,null!==(l=e.key_ops)&&void 0!==l?l:n];if("PBKDF2"===i.name)return mi.subtle.importKey("raw",gi(e.k),...o);const d={...e};return delete d.alg,mi.subtle.importKey("jwk",d,...o)};const zi=(e,t,l)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!Bi(e))throw new TypeError(ki(e,...Ti,"Uint8Array"));if("secret"!==e.type)throw new TypeError(`${Ti.join(" or ")} instances for symmetric algorithms must be of type "secret"`)}})(t):((e,t)=>{if(!Bi(e))throw new TypeError(ki(e,...Ti));if("secret"===e.type)throw new TypeError(`${Ti.join(" or ")} instances for asymmetric algorithms must not be of type "secret"`);if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError(`${Ti.join(" or ")} instances for asymmetric algorithm verifying must be of type "public"`);if(e.algorithm&&"encrypt"===t);})(t,l);};const wi=async(e,t,l,i)=>{const n=await function(e,t,l){if(Ii(t))return Li(t,e,l),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(ki(t,...Ti));return mi.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},false,[l])}throw new TypeError(ki(t,...Ti,"Uint8Array"))}(e,t,"verify");((e,t)=>{if(e.startsWith("RS")||e.startsWith("PS")){const{modulusLength:l}=t.algorithm;if("number"!=typeof l||l<2048)throw new TypeError(`${e} requires key modulusLength to be 2048 bits or larger`)}})(e,n);const o=function(e,t){const l=`SHA-${e.slice(-3)}`;switch(e){case "HS256":case "HS384":case "HS512":return {hash:l,name:"HMAC"};case "PS256":case "PS384":case "PS512":return {hash:l,name:"RSA-PSS",saltLength:e.slice(-3)>>3};case "RS256":case "RS384":case "RS512":return {hash:l,name:"RSASSA-PKCS1-v1_5"};case "ES256":case "ES384":case "ES512":return {hash:l,name:"ECDSA",namedCurve:t.namedCurve};case Ji()&&"EdDSA":const{namedCurve:i}=t;return {name:i,namedCurve:i};default:throw new Ci(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,n.algorithm);try{return await mi.subtle.verify(o,n,l,i)}catch(e){return false}};async function xi(e,t,l){var i;if(!Fi(e))throw new Ri("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new Ri('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new Ri("JWS Protected Header incorrect type");if(void 0===e.payload)throw new Ri("JWS Payload missing");if("string"!=typeof e.signature)throw new Ri("JWS Signature missing or incorrect type");if(void 0!==e.header&&!Fi(e.header))throw new Ri("JWS Unprotected Header incorrect type");let n={};if(e.protected){const t=gi(e.protected);try{n=JSON.parse(pi.decode(t));}catch(e){throw new Ri("JWS Protected Header is invalid")}}if(!((...e)=>{const t=e.filter(Boolean);if(0===t.length||1===t.length)return true;let l;for(const e of t){const t=Object.keys(e);if(l&&0!==l.size)for(const e of t){if(l.has(e))return false;l.add(e);}else l=new Set(t);}return true})(n,e.header))throw new Ri("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const o={...n,...e.header},d=function(e,t,l,i,n){if(void 0!==n.crit&&void 0===i.crit)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some((e=>"string"!=typeof e||0===e.length)))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let o;o=void 0!==l?new Map([...Object.entries(l),...t.entries()]):t;for(const t of i.crit){if(!o.has(t))throw new Ci(`Extension Header Parameter "${t}" is not recognized`);if(void 0===n[t])throw new e(`Extension Header Parameter "${t}" is missing`);if(o.get(t)&&void 0===i[t])throw new e(`Extension Header Parameter "${t}" MUST be integrity protected`)}return new Set(i.crit)}(Ri,new Map([["b64",true]]),null==l?void 0:l.crit,n,o);let c=true;if(d.has("b64")&&(c=n.b64,"boolean"!=typeof c))throw new Ri('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:a}=o;if("string"!=typeof a||!a)throw new Ri('JWS "alg" (Algorithm) Header Parameter missing or invalid');const s=l&&((e,t)=>{if(void 0!==t&&(!Array.isArray(t)||t.some((e=>"string"!=typeof e))))throw new TypeError(`"${e}" option must be an array of strings`);if(t)return new Set(t)})("algorithms",l.algorithms);if(s&&!s.has(a))throw new Wi('"alg" (Algorithm) Header Parameter not allowed');if(c){if("string"!=typeof e.payload)throw new Ri("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new Ri("JWS Payload must be a string or an Uint8Array instance");let Z=false;"function"==typeof t&&(t=await t(n,e),Z=true),zi(a,t,"verify");const r=function(...e){const t=e.reduce(((e,{length:t})=>e+t),0),l=new Uint8Array(t);let i=0;return e.forEach((e=>{l.set(e,i),i+=e.length;})),l}(Gi.encode(null!==(i=e.protected)&&void 0!==i?i:""),Gi.encode("."),"string"==typeof e.payload?Gi.encode(e.payload):e.payload),u=gi(e.signature);if(!await wi(a,t,u,r))throw new Ni;let b;b=c?gi(e.payload):"string"==typeof e.payload?Gi.encode(e.payload):e.payload;const h={payload:b};return void 0!==e.protected&&(h.protectedHeader=n),void 0!==e.header&&(h.unprotectedHeader=e.header),Z?{...h,key:t}:h}const Pi=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var Qi=e=>{const t=Pi.exec(e);if(!t)throw new TypeError("Invalid time period format");const l=parseFloat(t[1]);switch(t[2].toLowerCase()){case "sec":case "secs":case "second":case "seconds":case "s":return Math.round(l);case "minute":case "minutes":case "min":case "mins":case "m":return Math.round(60*l);case "hour":case "hours":case "hr":case "hrs":case "h":return Math.round(3600*l);case "day":case "days":case "d":return Math.round(86400*l);case "week":case "weeks":case "w":return Math.round(604800*l);default:return Math.round(31557600*l)}};const Mi=e=>e.toLowerCase().replace(/^application\//,"");var ji=(e,t,l={})=>{const{typ:i}=l;if(i&&("string"!=typeof e.typ||Mi(e.typ)!==Mi(i)))throw new yi('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(pi.decode(t));}catch(e){}if(!Fi(n))throw new Si("JWT Claims Set must be a top-level JSON object");const{issuer:o}=l;if(o&&!(Array.isArray(o)?o:[o]).includes(n.iss))throw new yi('unexpected "iss" claim value',"iss","check_failed");const{subject:d}=l;if(d&&n.sub!==d)throw new yi('unexpected "sub" claim value',"sub","check_failed");const{audience:c}=l;if(c&&(a=n.aud,s="string"==typeof c?[c]:c,!("string"==typeof a?s.includes(a):Array.isArray(a)&&s.some(Set.prototype.has.bind(new Set(a))))))throw new yi('unexpected "aud" claim value',"aud","check_failed");var a,s;let Z;switch(typeof l.clockTolerance){case "string":Z=Qi(l.clockTolerance);break;case "number":Z=l.clockTolerance;break;case "undefined":Z=0;break;default:throw new TypeError("Invalid clockTolerance option type")}const{currentDate:r}=l,u=(b=r||new Date,Math.floor(b.getTime()/1e3));var b;if((void 0!==n.iat||l.maxTokenAge)&&"number"!=typeof n.iat)throw new yi('"iat" claim must be a number',"iat","invalid");if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new yi('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>u+Z)throw new yi('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new yi('"exp" claim must be a number',"exp","invalid");if(n.exp<=u-Z)throw new Vi('"exp" claim timestamp check failed',"exp","check_failed")}if(l.maxTokenAge){const e=u-n.iat;if(e-Z>("number"==typeof l.maxTokenAge?l.maxTokenAge:Qi(l.maxTokenAge)))throw new Vi('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-Z)throw new yi('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};async function Ei(e,t,l){var i;const n=await async function(e,t,l){if(e instanceof Uint8Array&&(e=pi.decode(e)),"string"!=typeof e)throw new Ri("Compact JWS must be a string or Uint8Array");const{0:i,1:n,2:o,length:d}=e.split(".");if(3!==d)throw new Ri("Invalid Compact JWS");const c=await xi({payload:n,protected:i,signature:o},t,l),a={payload:c.payload,protectedHeader:c.protectedHeader};return "function"==typeof t?{...a,key:c.key}:a}(e,t,l);if((null===(i=n.protectedHeader.crit)||void 0===i?void 0:i.includes("b64"))&&false===n.protectedHeader.b64)throw new Si("JWTs MUST NOT use unencoded payload");const o={payload:ji(n.protectedHeader,n.payload,l),protectedHeader:n.protectedHeader};return "function"==typeof t?{...o,key:n.key}:o}function Di(e){return Fi(e)}class Oi{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(Di)}(e))throw new Yi("JSON Web Key Set malformed");var t;this._jwks=(t=e,"function"==typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t)));}async getKey(e,t){const{alg:l,kid:i}={...e,...t.header},n=function(e){switch("string"==typeof e&&e.slice(0,2)){case "RS":case "PS":return "RSA";case "ES":return "EC";case "Ed":return "OKP";default:throw new Ci('Unsupported "alg" value for a JSON Web Key Set')}}(l),o=this._jwks.keys.filter((e=>{let t=n===e.kty;if(t&&"string"==typeof i&&(t=i===e.kid),t&&"string"==typeof e.alg&&(t=l===e.alg),t&&"string"==typeof e.use&&(t="sig"===e.use),t&&Array.isArray(e.key_ops)&&(t=e.key_ops.includes("verify")),t&&"EdDSA"===l&&(t="Ed25519"===e.crv||"Ed448"===e.crv),t)switch(l){case "ES256":t="P-256"===e.crv;break;case "ES256K":t="secp256k1"===e.crv;break;case "ES384":t="P-384"===e.crv;break;case "ES512":t="P-521"===e.crv;}return t})),{0:d,length:c}=o;if(0===c)throw new vi;if(1!==c)throw new Ki;const a=this._cached.get(d)||this._cached.set(d,{}).get(d);if(void 0===a[l]){const e=await async function(e,t,l){if(!Fi(e))throw new TypeError("JWK must be an object");if(t||(t=e.alg),"string"!=typeof t||!t)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(e.kty){case "oct":if("string"!=typeof e.k||!e.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=l||(l=true!==e.ext),l?Ai({...e,alg:t,ext:false}):gi(e.k);case "RSA":if(void 0!==e.oth)throw new Ci('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case "EC":case "OKP":return Ai({...e,alg:t});default:throw new Ci('Unsupported "kty" (Key Type) Parameter value')}}({...d,ext:true},l);if(e instanceof Uint8Array||"public"!==e.type)throw new Yi("JSON Web Key Set members must be public keys");a[l]=e;}return a[l]}}var _i={exports:{}},qi={exports:{}},$i=M(li);
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
!function(e,t){var l=$i,i=l.Buffer;function n(e,t){for(var l in e)t[l]=e[l];}function o(e,t,l){return i(e,t,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=l:(n(l,t),t.Buffer=o),o.prototype=Object.create(i.prototype),n(i,o),o.from=function(e,t,l){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,l)},o.alloc=function(e,t,l){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof l?n.fill(t,l):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return l.SlowBuffer(e)};}(qi,qi.exports);var en=qi.exports.Buffer,tn=P.crypto||P.msCrypto;tn&&tn.getRandomValues?_i.exports=function(e,t){if(e>4294967295)throw new RangeError("requested too many random bytes");var l=en.allocUnsafe(e);if(e>0)if(e>65536)for(var i=0;i<e;i+=65536)tn.getRandomValues(l.slice(i,i+65536));else tn.getRandomValues(l);if("function"==typeof t)return ke.nextTick((function(){t(null,l);}));return l}:_i.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var ln=_i.exports;class nn{base64URLEncode(e){return ui.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return ui.decode(e).toString()}hashSha256(e){return pl.from(hi((new TextEncoder).encode(e)))}generateRandomBytes(e){return ln(e)}verifyJwt(e,t,l,i,n,o,d,c){const a={algorithms:l,audience:i,clockTolerance:d,subject:o};return (null==c||c)&&(a.issuer=n),Ei(e,(s={keys:[t]},Oi.prototype.getKey.bind(new Oi(s))),a).then((()=>Promise.resolve(true))).catch((e=>{var t;return Promise.reject(new X("SPA-CRYPTO-UTILS-VJ-IV01",null!==(t=null==e?void 0:e.reason)&&void 0!==t?t:JSON.stringify(e),`${null==e?void 0:e.code} ${null==e?void 0:e.claim}`))}));var s;}}const on=(t,i,n)=>e(void 0,void 0,void 0,(function*(){var o;const d=(e=>{switch(e){case T.LocalStorage:return new tl;case T.SessionStorage:return new il;case T.BrowserMemory:return new ll;default:return new il}})(i.storage),c=new nn,a=new v;yield a.initialize(i,d,c,t);const s=new w(a),Z=a.getDataLayer(),r=yield x((()=>e(void 0,void 0,void 0,(function*(){return a.getSignOutURL()}))),null!==(o=i.storage)&&void 0!==o?o:T.SessionStorage,(e=>Z.setSessionDataParameter(h,null!=e?e:""))),u=n(a,s);let m=false;const I=el.getInstance();let p,g,X=true;(null==I?void 0:I.init)&&(yield I.init(true,(t=>e(void 0,void 0,void 0,(function*(){yield u.attachTokenToRequestConfig(t);})))));const V=()=>e(void 0,void 0,void 0,(function*(){const t=yield a.getOIDCServiceEndpoints(),l=yield Z.getConfigData();u.initializeSessionManger(l,t,(()=>e(void 0,void 0,void 0,(function*(){return (yield a.getBasicUserInfo()).sessionState}))),(t=>e(void 0,void 0,void 0,(function*(){return a.getAuthorizationURL(t)}))),r);})),W=()=>e(void 0,void 0,void 0,(function*(){return yield r.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){yield Z.setSessionDataParameter(h,null!=t?t:"");}))))})),C=e=>{e.preventSignOutURLUpdate&&(m=true);},R=(t,l,i,n)=>e(void 0,void 0,void 0,(function*(){return yield u.requestAccessToken(t,l,V,void 0,i,n)})),S=(t={})=>e(void 0,void 0,void 0,(function*(){const e=yield Z.getConfigData(),l=yield a.getAuthorizationURL(Object.assign({prompt:"none",state:"sign-in-silently"},t)),i=new URL(l);i.searchParams.set("response_mode","query");const n=i.toString();if(e.storage===T.BrowserMemory&&e.enablePKCE){const e=i.searchParams.get(G);A.setPKCE(y.extractPKCEKeyFromStateParam(null!=e?e:""),yield a.getPKCECode(null!=e?e:""));}return n}));return {disableHttpHandler:()=>(u.disableHttpHandler(I),X=false,true),enableHttpHandler:()=>(u.enableHttpHandler(I),X=true,true),getAccessToken:()=>e(void 0,void 0,void 0,(function*(){return u.getAccessToken()})),getBasicUserInfo:()=>e(void 0,void 0,void 0,(function*(){return u.getBasicUserInfo()})),getConfigData:()=>e(void 0,void 0,void 0,(function*(){return yield Z.getConfigData()})),getCryptoHelper:()=>e(void 0,void 0,void 0,(function*(){return u.getCryptoHelper()})),getDataLayer:()=>e(void 0,void 0,void 0,(function*(){return u.getDataLayer()})),getDecodedIDToken:()=>e(void 0,void 0,void 0,(function*(){return u.getDecodedIDToken()})),getHttpClient:()=>I,getIDToken:()=>e(void 0,void 0,void 0,(function*(){return u.getIDToken()})),getOIDCServiceEndpoints:()=>e(void 0,void 0,void 0,(function*(){return u.getOIDCServiceEndpoints()})),httpRequest:t=>e(void 0,void 0,void 0,(function*(){return yield u.httpRequest(I,t,X,p,g)})),httpRequestAll:t=>e(void 0,void 0,void 0,(function*(){return yield u.httpRequestAll(t,I,X,p,g)})),isAuthenticated:()=>e(void 0,void 0,void 0,(function*(){return u.isAuthenticated()})),isSessionActive:()=>e(void 0,void 0,void 0,(function*(){return "true"===(yield Z.getSessionStatus())})),refreshAccessToken:()=>e(void 0,void 0,void 0,(function*(){try{return yield u.refreshAccessToken(C)}catch(e){return Promise.reject(e)}})),requestCustomGrant:t=>e(void 0,void 0,void 0,(function*(){return yield u.requestCustomGrant(t,C)})),revokeAccessToken:()=>e(void 0,void 0,void 0,(function*(){const e=yield s.getRefreshTimeoutTimer();return a.revokeAccessToken().then((()=>(r.reset(),s.clearRefreshTokenTimeout(e),Promise.resolve(true)))).catch((e=>Promise.reject(e)))})),setHttpRequestErrorCallback:e=>{p=e;},setHttpRequestFinishCallback:e=>{(null==I?void 0:I.setHttpRequestFinishCallback)&&I.setHttpRequestFinishCallback(e);},setHttpRequestStartCallback:e=>{(null==I?void 0:I.setHttpRequestStartCallback)&&I.setHttpRequestStartCallback(e);},setHttpRequestSuccessCallback:e=>{(null==I?void 0:I.setHttpRequestSuccessCallback)&&I.setHttpRequestSuccessCallback(e);},signIn:(t,n,o,d,c)=>e(void 0,void 0,void 0,(function*(){var s,r,m;const I=yield u.handleSignIn(W,V,void 0);if(I)return I;{let u,I,g,X={params:{}};if((null==i?void 0:i.responseMode)===l.formPost&&n?(u=n,I=null!=o?o:"",g=null!=d?d:""):(u=null!==(s=new URL(window.location.href).searchParams.get(b))&&void 0!==s?s:"",I=null!==(r=new URL(window.location.href).searchParams.get(h))&&void 0!==r?r:"",g=null!==(m=new URL(window.location.href).searchParams.get(G))&&void 0!==m?m:"",A.removeAuthorizationCode()),u&&g){p="true",e(void 0,void 0,void 0,(function*(){yield Z.setSessionStatus(p);}));const t=yield Z.getTemporaryDataParameter("token_request_config");return t&&"string"==typeof t&&(X=JSON.parse(t)),R(u,I,g,X)}return a.getAuthorizationURL(t).then((t=>e(void 0,void 0,void 0,(function*(){if(i.storage===T.BrowserMemory&&i.enablePKCE){const e=y.extractPKCEKeyFromStateParam(g);A.setPKCE(e,yield a.getPKCECode(g));}return c&&Z.setTemporaryDataParameter("token_request_config",JSON.stringify(c)),location.href=t,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))}var p;})),signOut:()=>e(void 0,void 0,void 0,(function*(){return (yield a.isAuthenticated())&&!m?location.href=yield a.getSignOutURL():location.href=A.getSignOutURL(i.clientID,t),s.clearRefreshTokenTimeout(),yield Z.removeOIDCProviderMetaData(),yield Z.removeTemporaryData(),yield Z.removeSessionData(),yield Z.removeSessionStatus(),yield A.waitTillPageRedirect(),true})),trySignInSilently:(t,l)=>e(void 0,void 0,void 0,(function*(){return yield u.trySignInSilently(S,R,r,t,l)})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield Z.getConfigData(),l=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},e),t);yield a.updateConfig(i),i.enableOIDCSessionManagement&&l&&(r.reset(),V());}))}})),dn=(t,i,n,o)=>e(void 0,void 0,void 0,(function*(){var d;let c;const a=null!==(d=null==i?void 0:i.requestTimeout)&&void 0!==d?d:6e4;let s=true,Z=false;const r=(e=>{switch(e){case T.LocalStorage:return new tl;case T.SessionStorage:return new il;case T.BrowserMemory:return new ll;default:return new il}})(i.storage),u=new nn,m=new v;yield m.initialize(i,r,u,t);const I=new w(m),p=yield x((()=>e(void 0,void 0,void 0,(function*(){const e={type:"sign-out"};try{return yield W(e)}catch(e){return A.getSignOutURL(i.clientID,t)}}))),i.storage,(e=>C(e))),g=o(m,I),V=new n,W=e=>{const t=new MessageChannel;return V.postMessage(e,[t.port2]),new Promise(((e,l)=>{const i=setTimeout((()=>{l(new X("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+a/1e3+" since dispatching the request"));}),a);return t.port1.onmessage=({data:n})=>{if(clearTimeout(i),t.port1.close(),t.port2.close(),null==n?void 0:n.success){const t=(null==n?void 0:n.data)?JSON.parse(null==n?void 0:n.data):null;(null==n?void 0:n.blob)&&(t.data=null==n?void 0:n.blob),e(t);}else l(n.error?JSON.parse(n.error):null);}}))},C=e=>W({data:e,type:"set_session_state"}),R=()=>W({type:"start_auto_refresh_token"}),S=()=>e(void 0,void 0,void 0,(function*(){const t=yield f(),l=yield U();g.initializeSessionManger(l,t,(()=>e(void 0,void 0,void 0,(function*(){return (yield L()).sessionState}))),(t=>e(void 0,void 0,void 0,(function*(){return (yield K(t)).authorizationURL}))),p);})),Y=(t={})=>e(void 0,void 0,void 0,(function*(){var e;const l=yield U(),i={data:Object.assign({prompt:"none",state:"sign-in-silently"},t),type:"get_auth_url"},n=yield W(i),o=y.extractPKCEKeyFromStateParam(null!==(e=new URL(n.authorizationURL).searchParams.get(G))&&void 0!==e?e:"");n.pkce&&l.enablePKCE&&A.setPKCE(o,n.pkce);const d=n.authorizationURL,c=new URL(d);c.searchParams.set("response_mode","query");return c.toString()})),K=t=>e(void 0,void 0,void 0,(function*(){const l=yield U();return W({data:t,type:"get_auth_url"}).then((t=>e(void 0,void 0,void 0,(function*(){var e;if(t.pkce&&l.enablePKCE){const l=y.extractPKCEKeyFromStateParam(null!==(e=new URL(t.authorizationURL).searchParams.get(G))&&void 0!==e?e:"");A.setPKCE(l,t.pkce);}return Promise.resolve(t)}))))})),N=(l,i,n,o)=>e(void 0,void 0,void 0,(function*(){const e=yield U(),d=y.extractPKCEKeyFromStateParam(n),c={data:{code:l,pkce:e.enablePKCE?A.getPKCE(d):void 0,sessionState:i,state:n,tokenRequestConfig:o},type:"request_get_token"};return e.enablePKCE&&A.removePKCE(d),W(c).then((l=>W({type:"get_sign_out_url"}).then((i=>(A.setSignOutURL(i,e.clientID,t),e.enableOIDCSessionManagement&&S(),R(),Promise.resolve(l)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),J=()=>e(void 0,void 0,void 0,(function*(){return yield p.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){return C(t)}))))})),H=()=>e(void 0,void 0,void 0,(function*(){if(yield k())return yield R(),i.enableOIDCSessionManagement&&S(),L()})),f=()=>W({type:"get-oidc-service-endpoints"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),U=()=>W({type:"get_config_data"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),L=()=>W({type:"get-basic-user-info"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),k=()=>W({type:"is_authenticated"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return {disableHttpHandler:()=>W({type:"disable_http_handler"}).then((()=>(s=false,Promise.resolve(true)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>W({type:"enable_http_handler"}).then((()=>(s=true,Promise.resolve(true)))).catch((e=>Promise.reject(e))),getBasicUserInfo:L,getConfigData:U,getCryptoHelper:()=>W({type:"get-crypto-helper"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDPIDToken:()=>W({type:"get-decoded-idp-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDToken:()=>W({type:"get-decoded-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>W({type:"get_id_token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:f,httpRequest:t=>{(null==t?void 0:t.data)&&(null==t?void 0:t.data)instanceof FormData&&(t.data=Object.assign(Object.assign({},Object.fromEntries(null==t?void 0:t.data.entries())),{formData:true}));return W({data:t,type:"http-request"}).then((e=>Promise.resolve(e))).catch((t=>e(void 0,void 0,void 0,(function*(){return s&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(t)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(t)}))))},httpRequestAll:t=>W({data:t,type:"http-request-all"}).then((e=>Promise.resolve(e))).catch((t=>e(void 0,void 0,void 0,(function*(){return s&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(t)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(t)})))),initialize:()=>{c||(c={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),V.onmessage=({data:e})=>{switch(e.type){case "request-finish":(null==c?void 0:c.requestFinishCallback)&&(null==c||c.requestFinishCallback());break;case "request-start":(null==c?void 0:c.requestStartCallback)&&(null==c||c.requestStartCallback());break;case "request-success":(null==c?void 0:c.requestSuccessCallback)&&(null==c||c.requestSuccessCallback(e.data?JSON.parse(e.data):null));}};return W({data:i,type:"init"}).then((()=>Promise.resolve(true))).catch((e=>Promise.reject(e)))},isAuthenticated:k,refreshAccessToken:()=>W({type:"refresh_access-token"}),requestCustomGrant:e=>W({data:e,type:"request-custom-grant"}).then((t=>(e.preventSignOutURLUpdate&&(Z=true),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>W({type:"revoke-access-token"}).then((e=>(p.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(c.requestErrorCallback=e);},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(c.requestFinishCallback=e);},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(c.requestStartCallback=e);},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(c.requestSuccessCallback=e);},signIn:(t,n,o,d,c)=>e(void 0,void 0,void 0,(function*(){var a,s,Z;const r=yield g.handleSignIn(J,S,H);if(r)return r;{let r,u,m;return (null==i?void 0:i.responseMode)===l.formPost&&n?(r=n,u=null!=o?o:"",m=null!=d?d:""):(r=null!==(a=new URL(window.location.href).searchParams.get(b))&&void 0!==a?a:"",u=null!==(s=new URL(window.location.href).searchParams.get(h))&&void 0!==s?s:"",m=null!==(Z=new URL(window.location.href).searchParams.get(G))&&void 0!==Z?Z:"",A.removeAuthorizationCode()),r&&m?N(r,u,m,c):K(t).then((t=>e(void 0,void 0,void 0,(function*(){return location.href=t.authorizationURL,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))}})),signOut:()=>new Promise(((l,n)=>{if(!Z){return W({type:"sign-out"}).then((t=>e(void 0,void 0,void 0,(function*(){return window.location.href=t,yield A.waitTillPageRedirect(),l(true)})))).catch((e=>n(e)))}window.location.href=A.getSignOutURL(i.clientID,t),A.waitTillPageRedirect().then((()=>Promise.resolve(true)));})),trySignInSilently:(t,l)=>e(void 0,void 0,void 0,(function*(){return yield g.trySignInSilently(Y,N,p,t,l)})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield U(),l=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},e),t),n={data:i,type:"update_config"};yield W(n),i.enableOIDCSessionManagement&&l&&(p.reset(),S());}))}})),cn={autoLogoutOnTokenRefreshError:true,checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:false,periodicTokenRefresh:false,sessionRefreshInterval:300,storage:T.SessionStorage};class an{constructor(e){this._authHelper=z,this._worker=U,this._initialized=false,this._startedInitialize=false,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onSignOutFailedCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=e;}instantiateAuthHelper(e){this._authHelper=e||z;}instantiateWorker(e){this._worker=e||U;}_isInitialized(){return e(this,void 0,void 0,(function*(){if(!this._startedInitialize)return false;let e=0;for(;!this._initialized;)1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((e=>setTimeout(e,1))),e++;return true}))}_validateMethod(t=true){return e(this,void 0,void 0,(function*(){return (yield this._isInitialized())?!(t&&!(yield this.isAuthenticated()))||Promise.reject(new X("SPA-AUTH_CLIENT-VM-IV02","The user is not authenticated.","The user must be authenticated first.")):Promise.reject(new X("SPA-AUTH_CLIENT-VM-NF01","The SDK is not initialized.","The SDK must be initialized first."))}))}
/**
* This method returns the instance of the singleton class.
* If an ID is provided, it will return the instance with the given ID.
* If no ID is provided, it will return the default instance value 0.
*
* @return {AsgardeoSPAClient} - Returns the instance of the singleton class.
*
* @example
* ```
* const auth = AsgardeoSPAClient.getInstance();
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getinstance
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/static getInstance(e){var t,l;return e&&(null===(t=this._instances)||void 0===t?void 0:t.get(e))?this._instances.get(e):!e&&(null===(l=this._instances)||void 0===l?void 0:l.get(0))?this._instances.get(0):e?(this._instances.set(e,new an(e)),this._instances.get(e)):(this._instances.set(0,new an(0)),this._instances.get(0))}
/**
* This method initializes the `AsgardeoSPAClient` instance.
*
* @param {ConfigInterface} config The config object to initialize with.
*
* @return {Promise<boolean>} - Resolves to `true` if initialization is successful.
*
* @example
* ```
* auth.initialize({
* signInRedirectURL: "http://localhost:3000/sign-in",
* clientID: "client ID",
* baseUrl: "https://api.asgardeo.io"
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#initialize
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/initialize(t,l,i){var n,o,d,c;return e(this,void 0,void 0,(function*(){this._storage=null!==(n=t.storage)&&void 0!==n?n:T.SessionStorage,this._initialized=false,this._startedInitialize=true,l&&this.instantiateAuthHelper(l),i&&this.instantiateWorker(i);const e=yield null===(o=this._client)||void 0===o?void 0:o.getConfigData();if(this._storage!==T.WebWorker){const l=t,i=Object.assign({},cn),n=Object.assign(Object.assign({},i),l);return this._client&&(!this._client||e&&0!==(null===(d=Object.keys(e))||void 0===d?void 0:d.length))||(this._client=yield on(this._instanceID,n,((e,t)=>new this._authHelper(e,t)))),this._initialized=true,this._onInitialize&&this._onInitialize(true),n.autoLogoutOnTokenRefreshError?(window.addEventListener("message",(e=>{var t;"refresh-access-token-error"===(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.type)&&this.signOut();})),Promise.resolve(true)):Promise.resolve(true)}if(!this._client||this._client&&(!e||0===(null===(c=Object.keys(e))||void 0===c?void 0:c.length))){const e=t;return this._client=yield dn(this._instanceID,Object.assign(Object.assign({},cn),e),this._worker,((e,t)=>new this._authHelper(e,t))),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(true),this._initialized=true,Promise.resolve(true)))).catch((e=>Promise.reject(e)))}return Promise.resolve(true)}))}
/**
* This method returns a Promise that resolves with the basic user information obtained from the ID token.
*
* @return {Promise<BasicUserInfo>} - A promise that resolves with the user information.
*
* @example
* ```
* auth.getBasicUserInfo().then((response) => {
* // console.log(response);
* }).catch((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getuserinfo
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getBasicUserInfo(){var t;return e(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.getBasicUserInfo()}))}
/**
* This method initiates the authentication flow. This should be called twice.
* 1. To initiate the authentication flow.
* 2. To obtain the access token after getting the authorization code.
*
* To satisfy the second condition, one of the two strategies mentioned below can be used:
* 1. Redirect the user back to the same login page that initiated the authentication flow.
* 2. Call the `signIn()` method in the page the user is redirected to after authentication.
*
* **To fire a callback function after signing in, use the `on()` method.**
* **To learn more about the `on()` method:**
* @see {@link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#on}
*
* @param {SignInConfig} config - The sign-in config.
* The `SignInConfig` object has these two attributes in addition to any custom key-value pairs.
* 1. fidp - Specifies the FIDP parameter that is used to take the user directly to an IdP login page.
* 2. forceInit: Specifies if the OIDC Provider Meta Data should be loaded again from the `well-known`
* endpoint.
* 3. Any other parameters that should be appended to the authorization request.
* @param {string} authorizationCode - The authorization code. (Optional)
* @param {string} sessionState - The session state. (Optional)
* @param {string} state - The state. (Optional)
*
* @return {Promise<BasicUserInfo>} - A promise that resolves with the user information.
*
* @example
* ```
* auth.signIn();
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#signin
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/signIn(t,l,i,n,o){var d;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),A.canContinueSignIn(Boolean(null==t?void 0:t.callOnlyOnRedirect),l))return null==t||delete t.callOnlyOnRedirect,null===(d=this._client)||void 0===d?void 0:d.signIn(t,l,i,n,o).then((e=>(this._onSignInCallback&&(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e),e)))}))}trySignInSilently(t,l){var i;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!A.wasSignInCalled())return null===(i=this._client)||void 0===i?void 0:i.trySignInSilently(t,l).then((e=>{if(this._onSignInCallback&&e){const t=e;(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t);}return e}))}))}
/**
* This method initiates the sign-out flow.
*
* **To fire a callback function after signing out, use the `on()` method.**
* **To learn more about the `on()` method:**
* @see {@link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#on}
*
* @return {Promise<boolean>} - Returns a promise that resolves with `true` if sign out is successful.
*
* @example
* ```
* auth.signOut();
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#signout
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/signOut(){var t,l;return e(this,void 0,void 0,(function*(){yield this._validateMethod(false);return null!==(l=yield null===(t=this._client)||void 0===t?void 0:t.signOut())&&void 0!==l&&l}))}
/**
* This method sends an API request to a protected endpoint.
* The access token is automatically attached to the header of the request.
* This is the only way by which protected endpoints can be accessed
* when the web worker is used to store session information.
*
* @param {HttpRequestConfig} config - The config object containing attributes necessary to send a request.
*
* @return {Promise<HttpResponse>} - Returns a Promise that resolves with the response to the request.
*
* @example
* ```
* const requestConfig = {
* headers: {
* "Accept": "application/json",
* "Access-Control-Allow-Origin": "https://api.asgardeo.io/myaccount",
* "Content-Type": "application/scim+json"
* },
* method: "GET",
* url: "https://api.asgardeo.io/scim2/me"
* };
*
* return auth.httpRequest(requestConfig)
* .then((response) => {
* // console.log(response);
* })
* .catch((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#httprequest
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/httpRequest(t){var l;return e(this,void 0,void 0,(function*(){return yield this._validateMethod(false),null===(l=this._client)||void 0===l?void 0:l.httpRequest(t)}))}
/**
* This method sends multiple API requests to a protected endpoint.
* The access token is automatically attached to the header of the request.
* This is the only way by which multiple requests can be sent to protected endpoints
* when the web worker is used to store session information.
*
* @param {HttpRequestConfig[]} config - The config object containing attributes necessary to send a request.
*
* @return {Promise<HttpResponse[]>} - Returns a Promise that resolves with the responses to the requests.
*
* @example
* ```
* const requestConfig = {
* headers: {
* "Accept": "application/json",
* "Content-Type": "application/scim+json"
* },
* method: "GET",
* url: "https://api.asgardeo.io/scim2/me"
* };
*
* const requestConfig2 = {
* headers: {
* "Accept": "application/json",
* "Content-Type": "application/scim+json"
* },
* method: "GET",
* url: "https://api.asgardeo.io/scim2/me"
* };
*
* return auth.httpRequest([requestConfig, requestConfig2])
* .then((responses) => {
* response.forEach((response)=>{
* // console.log(response);
* });
* })
* .catch((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#httprequestall
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/httpRequestAll(t){var l;return e(this,void 0,void 0,(function*(){return yield this._validateMethod(false),null===(l=this._client)||void 0===l?void 0:l.httpRequestAll(t)}))}
/**
* This method allows you to send a request with a custom grant.
*
* @param {CustomGrantRequestParams} config - The request parameters.
*
* @return {Promise<HttpResponse<any> | SignInResponse>} - A Promise that resolves with
* the value returned by the custom grant request.
*
* @example
* ```
* auth.customGrant({
* attachToken: false,
* data: {
* client_id: "{{clientId}}",
* grant_type: "account_switch",
* scope: "{{scope}}",
* token: "{{token}}",
* },
* id: "account-switch",
* returnResponse: true,
* returnsSession: true,
* signInRequired: true
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#customgrant
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/requestCustomGrant(t){var l,i;return e(this,void 0,void 0,(function*(){if(t.signInRequired,yield this._validateMethod(),!t.id)return Promise.reject(new X("SPA-AUTH_CLIENT-RCG-NF01","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const e=yield null===(l=this._client)||void 0===l?void 0:l.requestCustomGrant(t),n=this._onCustomGrant.get(t.id);return n&&n(null===(i=this._onCustomGrant)||void 0===i?void 0:i.get(t.id)),e}))}
/**
* This method ends a user session. The access token is revoked and the session information is destroyed.
*
* **To fire a callback function after ending user session, use the `on()` method.**
* **To learn more about the `on()` method:**
* @see {@link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#on}
*
* @return {Promise<boolean>} - A promise that resolves with `true` if the process is successful.
*
* @example
* ```
* auth.endUserSession();
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#endusersession
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/revokeAccessToken(){var t;return e(this,void 0,void 0,(function*(){yield this._validateMethod();const e=yield null===(t=this._client)||void 0===t?void 0:t.revokeAccessToken();return this._onEndUserSession&&(yield this._onEndUserSession(e)),e}))}
/**
* This method returns a Promise that resolves with an object containing the service endpoints.
*
* @return {Promise<ServiceResourcesType} - A Promise that resolves with an object containing the service endpoints.
*
* @example
* ```
* auth.getServiceEndpoints().then((endpoints) => {
* // console.log(endpoints);
* }).error((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getserviceendpoints
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getOIDCServiceEndpoints(){var t;return e(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.getOIDCServiceEndpoints()}))}
/**
* This methods returns the Axios http client.
*
* @return {HttpClientInstance} - The Axios HTTP client.
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getHttpClient(){if(this._client){if(this._storage!==T.WebWorker){return this._client.getHttpClient()}throw new X("SPA-AUTH_CLIENT-GHC-IV01","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new X("SPA-AUTH_CLIENT-GHC-NF02","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK using the initialize method before calling this method.")}
/**
* This method decodes the payload of the id token and returns it.
*
* @return {Promise<DecodedIdTokenPayloadInterface>} - A Promise that resolves with
* the decoded payload of the id token.
*
* @example
* ```
* auth.getDecodedIDToken().then((response)=>{
* // console.log(response);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getdecodedidtoken
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getDecodedIDToken(){var t;return e(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.getDecodedIDToken()}))}
/**
* This method returns the CryptoHelper instance.
*
* @return {Promise<DecodedIdTokenPayloadInterface>} - A Promise that resolves with
* the CryptoHelper instance.
*
* @example
* ```
* auth.getCryptoHelper().then((response)=>{
* // console.log(response);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getCryptoHelper
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getCryptoHelper(){var t;return e(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.getCryptoHelper()}))}
/**
* This method return the ID token.
*
* @return {Promise<string>} - A Promise that resolves with the ID token.
*
* @example
* ```
* const idToken = await auth.getIDToken();
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#getIDToken
*
* @memberof AsgardeoAuthClient
*
* @preserve
*/getIDToken(){var t;return e(this,void 0,void 0,(function*(){return yield this._validateMethod(),null===(t=this._client)||void 0===t?void 0:t.getIDToken()}))}
/**
* This method return a Promise that resolves with the access token.
*
* **This method will not return the access token if the storage type is set to `webWorker`.**
*
* @return {Promise<string>} - A Promise that resolves with the access token.
*
* @example
* ```
* auth.getAccessToken().then((token) => {
* // console.log(token);
* }).catch((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getaccesstoken
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(T.WebWorker,T.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-GAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
/**
* This method return a Promise that resolves with the idp access token.
*
* **This method will not return the access token if the storage type is set to `webWorker`.**
*
* @return {Promise<string>} - A Promise that resolves with the idp access token.
*
* @example
* ```
* auth.getIDPAccessToken().then((token) => {
* // console.log(token);
* }).catch((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getaccesstoken
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getIDPAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(T.WebWorker,T.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-GIAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
/**
* This method return a Promise that resolves with the data layer object.
*
* **This method will not return the data layer object, if the storage type is set to `webWorker`.**
*
* @return {Promise<string>} - A Promise that resolves with the data layer object.
*
* @example
* ```
* auth.getDataLayer().then((dataLayer) => {
* // console.log(dataLayer);
* }).catch((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#getdatalayer
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getDataLayer(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(T.WebWorker,T.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-GDL-IV01","The data layer cannot be returned.","The data layer cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getDataLayer()}))}
/**
* This method return a Promise that resolves with the config data stored in the storage.
*
* @return - A Promise that resolves with the config data.
*
* @example
* ```
* auth.getConfigData().then((configData) => {
* // console.log(configData);
* }).catch((error) => {
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/main#getConfigData
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/getConfigData(){var t;return e(this,void 0,void 0,(function*(){return null===(t=this._client)||void 0===t?void 0:t.getConfigData()}))}
/**
* This method refreshes the access token.
*
* @return {TokenResponseInterface} - A Promise that resolves with an object containing
* information about the refreshed access token.
*
* @example
* ```
* auth.refreshToken().then((response)=>{
* // console.log(response);
* }).catch((error)=>{
* // console.error(error);
* });
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#refreshtoken
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/refreshAccessToken(){var t;return e(this,void 0,void 0,(function*(){return yield this._validateMethod(false),null===(t=this._client)||void 0===t?void 0:t.refreshAccessToken()}))}
/**
* This method specifies if the user is authenticated or not.
*
* @return {Promise<boolean>} - A Promise that resolves with `true` if the user is authenticated.
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/isAuthenticated(){var t;return e(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.isAuthenticated()}))}
/**
* This method specifies if there is an active session in the browser or not.
*
* @return {Promise<boolean>} - A Promise that resolves with `true` if there is a session.
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/isSessionActive(){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage&&[(T.WebWorker,T.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-ISA-IV01","The active session cannot be returned.","The active session cannot be returned when the storage type is set to webWorker or browserMemory."));const e=this._client;return null==e?void 0:e.isSessionActive()}))}on(t,l,i){var n,o,d,c;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!l||"function"!=typeof l)throw new X("SPA-AUTH_CLIENT-ON-IV02","Invalid callback function.","The provided callback function is invalid.");switch(t){case k.SignIn:this._onSignInCallback=l;break;case k.SignOut:this._onSignOutCallback=l,(yield A.isSignOutSuccessful())&&this._onSignOutCallback();break;case k.RevokeAccessToken:this._onEndUserSession=l;break;case k.Initialize:this._onInitialize=l;break;case k.HttpRequestError:null===(n=this._client)||void 0===n||n.setHttpRequestErrorCallback(l);break;case k.HttpRequestFinish:null===(o=this._client)||void 0===o||o.setHttpRequestFinishCallback(l);break;case k.HttpRequestStart:null===(d=this._client)||void 0===d||d.setHttpRequestStartCallback(l);break;case k.HttpRequestSuccess:null===(c=this._client)||void 0===c||c.setHttpRequestSuccessCallback(l);break;case k.CustomGrant:i&&this._onCustomGrant.set(i,l);break;case k.SignOutFailed:{this._onSignOutFailedCallback=l;const e=A.didSignOutFail();e&&this._onSignOutFailedCallback(e);break}default:throw new X("SPA-AUTH_CLIENT-ON-IV01","Invalid hook.","The provided hook is invalid.")}}))}
/**
* This method enables callback functions attached to the http client.
*
* @return {Promise<boolean>} - A promise that resolves with True.
*
* @example
* ```
* auth.enableHttpHandler();
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#enableHttpHandler
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/enableHttpHandler(){var t;return e(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.enableHttpHandler()}))}
/**
* This method disables callback functions attached to the http client.
*
* @return {Promise<boolean>} - A promise that resolves with True.
*
* @example
* ```
* auth.disableHttpHandler();
* ```
*
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master#disableHttpHandler
*
* @memberof AsgardeoSPAClient
*
* @preserve
*/disableHttpHandler(){var t;return e(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(t=this._client)||void 0===t?void 0:t.disableHttpHandler()}))}
/**
* This method updates the configuration that was passed into the constructor when instantiating this class.
*
* @param {Partial<AuthClientConfig<T>>} config - A config object to update the SDK configurations with.
*
* @example
* ```
* const config = {
* signInRedirectURL: "http://localhost:3000/sign-in",
* clientID: "client ID",
* baseUrl: "https://api.asgardeo.io"
* }
* const auth.updateConfig(config);
* ```
* @link https://github.com/asgardeo/asgardeo-auth-spa-sdk/tree/master/lib#updateConfig
*
* @memberof AsgardeoAuthClient
*
* @preserve
*/updateConfig(t){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===T.WebWorker){const e=this._client;yield e.updateConfig(t);}else {const e=this._client;yield e.updateConfig(t);}}))}}an._instances=new Map;class sn extends Worker{constructor(){super(...arguments),this.onmessage=()=>null;}}const Zn=t=>{const l=self;let i;l.onmessage=({data:l,ports:c})=>e(void 0,void 0,void 0,(function*(){var a,s,Z,r,u,b;const m=c[0];if("init"===l.type||i)switch(l.type){case "init":try{const c=Object.assign({},l.data);i=yield ((t,l)=>e(void 0,void 0,void 0,(function*(){const i=new ll,n=new nn,o=new v;yield o.initialize(t,i,n);const d=new w(o),c=l(o,d),a=o.getDataLayer(),s=el.getInstance();return (null==s?void 0:s.init)&&(yield s.init(!0,(t=>e(void 0,void 0,void 0,(function*(){yield c.attachTokenToRequestConfig(t);}))))),{disableHttpHandler:()=>{c.disableHttpHandler(s);},enableHttpHandler:()=>{c.enableHttpHandler(s);},getAccessToken:()=>c.getAccessToken(),getAuthorizationURL:t=>e(void 0,void 0,void 0,(function*(){return o.getAuthorizationURL(t).then((t=>e(void 0,void 0,void 0,(function*(){var e;const l=null!==(e=new URL(t).searchParams.get(G))&&void 0!==e?e:"",i=yield o.getPKCECode(l);return {authorizationURL:t,pkce:i}})))).catch((e=>Promise.reject(e)))})),getBasicUserInfo:()=>e(void 0,void 0,void 0,(function*(){return c.getBasicUserInfo()})),getConfigData:()=>e(void 0,void 0,void 0,(function*(){return a.getConfigData()})),getCryptoHelper:()=>e(void 0,void 0,void 0,(function*(){return c.getCryptoHelper()})),getDecodedIDPIDToken:()=>e(void 0,void 0,void 0,(function*(){return c.getDecodedIDPIDToken()})),getDecodedIDToken:()=>e(void 0,void 0,void 0,(function*(){return c.getDecodedIDToken()})),getIDToken:()=>e(void 0,void 0,void 0,(function*(){return c.getIDToken()})),getOIDCServiceEndpoints:()=>e(void 0,void 0,void 0,(function*(){return c.getOIDCServiceEndpoints()})),getSignOutURL:()=>e(void 0,void 0,void 0,(function*(){return yield o.getSignOutURL()})),httpRequest:t=>e(void 0,void 0,void 0,(function*(){return yield c.httpRequest(s,t)})),httpRequestAll:t=>e(void 0,void 0,void 0,(function*(){return yield c.httpRequestAll(t,s)})),isAuthenticated:()=>c.isAuthenticated(),refreshAccessToken:()=>e(void 0,void 0,void 0,(function*(){try{return yield c.refreshAccessToken()}catch(e){return Promise.reject(e)}})),requestAccessToken:(t,l,i,n)=>e(void 0,void 0,void 0,(function*(){return yield c.requestAccessToken(t,l,void 0,i,n)})),requestCustomGrant:t=>e(void 0,void 0,void 0,(function*(){return yield c.requestCustomGrant(t)})),revokeAccessToken:()=>e(void 0,void 0,void 0,(function*(){const e=yield d.getRefreshTimeoutTimer();return o.revokeAccessToken().then((()=>(d.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestFinishCallback:e=>{(null==s?void 0:s.setHttpRequestFinishCallback)&&s.setHttpRequestFinishCallback(e);},setHttpRequestStartCallback:e=>{(null==s?void 0:s.setHttpRequestStartCallback)&&s.setHttpRequestStartCallback(e);},setHttpRequestSuccessCallback:e=>{(null==s?void 0:s.setHttpRequestSuccessCallback)&&s.setHttpRequestSuccessCallback(e);},setSessionState:t=>e(void 0,void 0,void 0,(function*(){yield a.setSessionDataParameter(h,t);})),signOut:()=>e(void 0,void 0,void 0,(function*(){return d.clearRefreshTokenTimeout(),yield o.getSignOutURL()})),startAutoRefreshToken:()=>e(void 0,void 0,void 0,(function*(){d.clearRefreshTokenTimeout(),d.refreshAccessTokenAutomatically(c);})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){yield o.updateConfig(t);}))}})))(c,t),i.setHttpRequestFinishCallback(d),i.setHttpRequestStartCallback(n),i.setHttpRequestSuccessCallback(o),m.postMessage(F.generateSuccessMessage());}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "get_auth_url":i.getAuthorizationURL(null==l?void 0:l.data).then((e=>{m.postMessage(F.generateSuccessMessage(e));})).catch((e=>{m.postMessage(F.generateFailureMessage(e));}));break;case "request_get_token":i.requestAccessToken(null===(a=null==l?void 0:l.data)||void 0===a?void 0:a.code,null===(s=null==l?void 0:l.data)||void 0===s?void 0:s.sessionState,null===(Z=null==l?void 0:l.data)||void 0===Z?void 0:Z.pkce,null===(r=null==l?void 0:l.data)||void 0===r?void 0:r.state).then((e=>{m.postMessage(F.generateSuccessMessage(e));})).catch((e=>{m.postMessage(F.generateFailureMessage(e));}));break;case "http-request":{const e=l.data,t=null==e?void 0:e.data;if(true===(null===(b=null===(u=l.data)||void 0===u?void 0:u.data)||void 0===b?void 0:b.formData)){const l=new FormData;for(const e in t)"formData"!==e&&l.append(e,t[e]);e.data=l;}i.httpRequest(e).then((e=>{m.postMessage(F.generateSuccessMessage(e));})).catch((e=>{m.postMessage(F.generateFailureMessage(e));}));break}case "http-request-all":i.httpRequestAll(l.data).then((e=>{m.postMessage(F.generateSuccessMessage(e));})).catch((e=>{m.postMessage(F.generateFailureMessage(e));}));break;case "sign-out":try{m.postMessage(F.generateSuccessMessage(yield i.signOut()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "request-custom-grant":i.requestCustomGrant(l.data).then((e=>{m.postMessage(F.generateSuccessMessage(e));})).catch((e=>{m.postMessage(F.generateFailureMessage(e));}));break;case "revoke-access-token":i.revokeAccessToken().then((e=>{m.postMessage(F.generateSuccessMessage(e));})).catch((e=>{m.postMessage(F.generateFailureMessage(e));}));break;case "get-oidc-service-endpoints":try{m.postMessage(F.generateSuccessMessage(yield i.getOIDCServiceEndpoints()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "get-basic-user-info":try{m.postMessage(F.generateSuccessMessage(yield i.getBasicUserInfo()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "get-decoded-id-token":try{m.postMessage(F.generateSuccessMessage(yield i.getDecodedIDToken()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "get-crypto-helper":try{m.postMessage(F.generateSuccessMessage(yield i.getCryptoHelper()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "get_id_token":try{m.postMessage(F.generateSuccessMessage(yield i.getIDToken()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "enable_http_handler":i.enableHttpHandler(),m.postMessage(F.generateSuccessMessage());break;case "disable_http_handler":i.disableHttpHandler(),m.postMessage(F.generateSuccessMessage());break;case "is_authenticated":try{m.postMessage(F.generateSuccessMessage(yield i.isAuthenticated()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "get_sign_out_url":try{m.postMessage(F.generateSuccessMessage(yield i.getSignOutURL()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "refresh_access-token":try{m.postMessage(F.generateSuccessMessage(yield i.refreshAccessToken()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "start_auto_refresh_token":try{m.postMessage(F.generateSuccessMessage(i.startAutoRefreshToken()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "set_session_state":try{m.postMessage(F.generateSuccessMessage(yield i.setSessionState(null==l?void 0:l.data)));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "update_config":try{m.postMessage(F.generateSuccessMessage(yield i.updateConfig(null==l?void 0:l.data)));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;case "get_config_data":try{m.postMessage(F.generateSuccessMessage(yield i.getConfigData()));}catch(e){m.postMessage(F.generateFailureMessage(e));}break;default:null==m||m.postMessage(F.generateFailureMessage(new X("SPA-CLIENT_WORKER-ONMSG-IV02","The message type is invalid.",`The message type provided, ${l.type}, is invalid.`)));}else m.postMessage(F.generateFailureMessage(new X("SPA-CLIENT_WORKER-ONMSG-NF01","The web worker has not been initialized yet.","The initialize method needs to be called before the specified operation can be carried out.")));}));const n=()=>{l.postMessage({type:"request-start"});},o=e=>{l.postMessage({data:JSON.stringify(null!=e?e:""),type:"request-success"});},d=()=>{l.postMessage({type:"request-finish"});};};
/**
* Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).
*
* WSO2 LLC. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
class AuthAPI {
constructor(spaClient) {
this._authState = reactive(Object.assign({}, AuthAPI.DEFAULT_STATE));
/**
* Method to return Auth Client instance authentication state.
*
* @return {AuthStateInterface} Authentication State.
*/
this.getState = () => this._authState;
/**
* Initializes the AuthClient instance with the given authentication configuration.
*
* @param {AuthClientConfig<Config>} config - The authentication configuration object
* containing details such as client ID, redirect URLs, and base URL.
* @returns {Promise<boolean>} A promise that resolves to `true` if initialization is successful.
*/
this.init = (config) => this._client.initialize(config);
/**
* Handles user sign-in by exchanging the authorization code for tokens
* and updating the authentication state if the user is authenticated.
*
* @param {SignInConfig} config - The sign-in configuration containing client-specific settings.
* @param {string} authorizationCode - The authorization code received from the authentication provider.
* @param {string} sessionState - The session state value to track the authentication session.
* @param {string} [authState] - An optional authentication state parameter for additional tracking.
* @param {{ params: Record<string, unknown> }} [tokenRequestConfig] - Optional token request parameters.
* @returns {Promise<BasicUserInfo>} A promise resolving to the authenticated user's basic information.
*/
this.signIn = (config, authorizationCode, sessionState, authState, callback, tokenRequestConfig) => __awaiter(this, void 0, void 0, function* () {
return this._client
.signIn(config, authorizationCode, sessionState, authState, tokenRequestConfig)
.then((response) => __awaiter(this, void 0, void 0, function* () {
if (!response) {
return response;
}
if (yield this._client.isSignedIn()) {
Object.assign(this._authState, {
allowedScopes: response.allowedScopes,
displayName: response.displayName,
email: response.email,
isSignedIn: true,
isLoading: false,
isSigningOut: false,
sub: response.sub,
username: response.username,
});
if (callback) {
callback(response);
}
}
return response;
}))
.catch((error) => Promise.reject(error));
});
/**
* Signs the user out and resets the authentication state.
*
* @param {(response?: boolean) => void} callback - An optional callback function to execute after sign-out.
* @returns {Promise<boolean>} A promise resolving to `true` if sign-out is successful.
*
*/
this.signOut = (callback) => __awaiter(this, void 0, void 0, function* () {
return this._client
.signOut()
.then((response) => {
if (callback) {
callback(response);
}
return response;
})
.catch((error) => Promise.reject(error));
});
/**
* This method return a Promise that resolves with the access token.
*
* @remarks
* This method will not return the access token if the storage type is set to `webWorker`.
*
* @return {Promise<string>} - A Promise that resolves with the access token.
*/
this.getAccessToken = () => __awaiter(this, void 0, void 0, function* () { return this._client.getAccessToken(); });
this._client = spaClient !== null && spaClient !== void 0 ? spaClient : an.getInstance();
}
/**
* Method to update Auth Client instance authentication state.
*
* @param {AuthStateInterface} state - State values to update in authentication state.
*/
updateState(state) {
this._authState = Object.assign(Object.assign({}, this._authState), state);
}
/**
* This method returns a Promise that resolves with the basic user information obtained from the ID token.
*
* @return {Promise<BasicUserInfo>} a promise that resolves with the user information.
*/
getBasicUserInfo() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.getBasicUserInfo();
});
}
/**
* This method sends an API request to a protected endpoint.
* The access token is automatically attached to the header of the request.
* This is the only way by which protected endpoints can be accessed
* when the web worker is used to store session information.
*
* @param {HttpRequestConfig} config - The config object containing attributes necessary to send a request.
*
* @return {Promise<Response>} - Returns a Promise that resolves with the response to the request.
*/
httpRequest(config) {
return __awaiter(this, void 0, void 0, function* () {
return this._client.httpRequest(config);
});
}
/**
* This method sends multiple API requests to a protected endpoint.
* The access token is automatically attached to the header of the request.
* This is the only way by which multiple requests can be sent to protected endpoints
* when the web worker is used to store session information.
*
* @param {HttpRequestConfig[]} configs - The config object containing attributes necessary to send a request.
*
* @return {Promise<Response>} a Promise that resolves with the responses to the requests.
*/
httpRequestAll(configs) {
return __awaiter(this, void 0, void 0, function* () {
return this._client.httpRequestAll(configs);
});
}
/**
* This method allows you to send a request with a custom grant.
*
* @param {CustomGrantRequestParams} config - The request parameters.
* @param {(response: BasicUserInfo | Response) => void} [callback] - An optional callback function.
*
* @return {Promise<Response | SignInResponse>} a promise that resolves with
* the value returned by the custom grant request.
*/
exchangeToken(config, callback) {
return this._client
.exchangeToken(config)
.then((response) => {
if (!response) {
return response;
}
if (config.returnsSession) {
Object.assign(this._authState, Object.assign(Object.assign(Object.assign({}, this._authState), response), { isSignedIn: true, isLoading: false }));
}
if (callback) {
callback(response);
}
return response;
})
.catch((error) => Promise.reject(error));
}
/**
* This method ends a user session. The access token is revoked and the session information is destroyed.
*
* @return {Promise<boolean>} - A promise that resolves with `true` if the process is successful.
*/
revokeAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
return this._client
.revokeAccessToken()
.then(() => {
this._authState = Object.assign(Object.assign({}, AuthAPI.DEFAULT_STATE), { isLoading: false });
return true;
})
.catch((error) => Promise.reject(error));
});
}
/**
* This method returns a Promise that resolves with an object containing the service endpoints.
*
* @return {Promise<ServiceResourcesType>} - A Promise that resolves with an object containing the service endpoints.
*/
getOpenIDProviderEndpoints() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.getOpenIDProviderEndpoints();
});
}
/**
* This methods returns the Axios http client.
*
* @return {HttpClientInstance} - The Axios HTTP client.
*/
getHttpClient() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.getHttpClient();
});
}
/**
* This method decodes the payload of the id token and returns it.
*
* @return {Promise<DecodedIDTokenPayloadInterface>} - A Promise that resolves with
* the decoded payload of the id token.
*/
getDecodedIdToken() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.getDecodedIdToken();
});
}
/**
* This method decodes the payload of the idp id token and returns it.
* @remarks
* This method is intended for retrieving the IdP ID token when extending a plugin.
*
* @return {Promise<DecodedIDTokenPayloadInterface>} - A Promise that resolves with
* the decoded payload of the idp id token.
*/
getDecodedIDPIDToken() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.getDecodedIdToken();
});
}
/**
* This method returns the ID token.
*
* @return {Promise<string>} - A Promise that resolves with the id token.
*/
getIdToken() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.getIdToken();
});
}
/**
* This method returns a Promise that resolves with the IDP access token.
*
* @remarks
* This method will not return the IDP access token if the storage type is set to `webWorker`.
* It can be used to access the IDP access token when custom authentication grant functionalities are used.
*
* @return {Promise<string>} A Promise that resolves with the IDP access token.
*/
getIDPAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.getIDPAccessToken();
});
}
/**
* This method refreshes the access token.
*
* @return {BasicUserInfo} - A Promise that resolves with an object containing
* information about the refreshed access token.
*/
refreshAccessToken() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.refreshAccessToken();
});
}
/**
* This method specifies if the user is authenticated or not.
*
* @return {Promise<boolean>} - A Promise that resolves with `true` if the user is authenticated.
*/
isSignedIn() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.isSignedIn();
});
}
/**
* This method specifies if the session is active or not.
*
* @return {Promise<boolean>} - A Promise that resolves with `true` if there is an active session.
*/
isSessionActive() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.isSessionActive();
});
}
/**
* This method enables callback functions attached to the http client.
*
* @return {Promise<boolean>} - A promise that resolves with `true`.
*/
enableHttpHandler() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.enableHttpHandler();
});
}
/**
* This method disables callback functions attached to the http client.
*
* @return {Promise<boolean>} - A promise that resolves with `true`.
*/
disableHttpHandler() {
return __awaiter(this, void 0, void 0, function* () {
return this._client.disableHttpHandler();
});
}
/**
* This method updates the configuration that was passed into the constructor when instantiating this class.
*
* @param {Partial<AuthClientConfig<T>>} config - A config object to update the SDK configurations with.
*/
reInitialize(config) {
return __awaiter(this, void 0, void 0, function* () {
return this._client.reInitialize(config);
});
}
on(hook, callback, id) {
if (hook === k.CustomGrant) {
return this._client.on(hook, callback, id);
}
return this._client.on(hook, callback);
}
/**
* This method allows you to sign in silently.
* First, this method sends a prompt-none request to check for an active user session in the identity provider.
* If a session exists, it retrieves the access token and stores it. Otherwise, it returns `false`.
*
* @param {Record<string, string | boolean>} [additionalParams] - Optional additional parameters to be sent with the request.
* @param {{ params: Record<string, unknown> }} [tokenRequestConfig] - Optional configuration for the token request.
*
* @returns {Promise<BasicUserInfo | boolean>} A Promise that resolves with the user information after signing in,
* or `false` if the user is not signed in.
*
* @example
* ```
* client.signInSilently();
* ```
*/
signInSilently(additionalParams, tokenRequestConfig) {
return __awaiter(this, void 0, void 0, function* () {
return this._client
.signInSilently(additionalParams, tokenRequestConfig)
.then((response) => __awaiter(this, void 0, void 0, function* () {
if (!response) {
Object.assign(this._authState, { isLoading: false });
return false;
}
if (yield this._client.isSignedIn()) {
const basicUserInfo = response;
Object.assign(this._authState, {
allowedScopes: basicUserInfo.allowedScopes,
displayName: basicUserInfo.displayName,
email: basicUserInfo.email,
isSignedIn: true,
isLoading: false,
sub: basicUserInfo.sub,
username: basicUserInfo.username,
});
}
return response;
}))
.catch((error) => Promise.reject(error));
});
}
}
AuthAPI.DEFAULT_STATE = {
allowedScopes: '',
displayName: '',
email: '',
isSignedIn: false,
isLoading: true,
sub: '',
username: '',
};
/**
* Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).
*
* WSO2 LLC. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Default `AuthVueConfig` config.
*/
const defaultConfig = {
disableAutoSignIn: true,
disableTrySignInSilently: true,
};
const ASGARDEO_INJECTION_KEY = Symbol('asgardeo');
const asgardeoPlugin = {
install(app, options) {
const AuthClient = new AuthAPI();
const isInitialized = ref(false);
const error = ref(null);
const state = reactive(Object.assign({}, AuthClient.getState()));
/* eslint-disable no-useless-catch */
const withStateSync = (cb, refreshState = true) => __awaiter(this, void 0, void 0, function* () {
let result;
try {
result = yield cb();
return result;
}
catch (err) {
throw err;
}
finally {
if (refreshState) {
const currentState = AuthClient.getState();
Object.assign(state, currentState);
}
}
});
const signInSilently = (additionalParams, tokenRequestConfig) => __awaiter(this, void 0, void 0, function* () { return withStateSync(() => __awaiter(this, void 0, void 0, function* () { return AuthClient.signInSilently(additionalParams, tokenRequestConfig); })); });
const checkIsAuthenticated = () => __awaiter(this, void 0, void 0, function* () {
return withStateSync(() => __awaiter(this, void 0, void 0, function* () {
const isAuthenticatedState = yield AuthClient.isSignedIn();
if (!isAuthenticatedState) {
AuthClient.updateState(Object.assign(Object.assign({}, state), { isSignedIn: false, isLoading: false }));
return;
}
const response = yield AuthClient.getUser();
const stateToUpdate = response
? {
allowedScopes: response.allowedScopes,
displayName: response.displayName,
email: response.email,
isSignedIn: true,
isLoading: false,
sub: response.sub,
username: response.username,
}
: Object.assign(Object.assign({}, state), { isSignedIn: isAuthenticatedState, isLoading: false });
AuthClient.updateState(stateToUpdate);
}));
});
const initialize = () => __awaiter(this, void 0, void 0, function* () {
yield withStateSync(() => __awaiter(this, void 0, void 0, function* () {
if (isInitialized.value)
return;
try {
const config = Object.assign(Object.assign({}, defaultConfig), options);
yield AuthClient.init(config);
isInitialized.value = true;
if (!config.skipRedirectCallback) {
const url = new URL(window.location.href);
const authParams = null;
if ((A.hasAuthSearchParamsInURL() &&
new URL(url.origin + url.pathname).toString() === new URL(config === null || config === void 0 ? void 0 : config.afterSignInUrl).toString()) ||
(authParams === null || authParams === void 0 ? void 0 : authParams.authorizationCode) ||
url.searchParams.get('error')) {
yield AuthClient.signIn({ callOnlyOnRedirect: true }, authParams === null || authParams === void 0 ? void 0 : authParams.authorizationCode, authParams === null || authParams === void 0 ? void 0 : authParams.sessionState, authParams === null || authParams === void 0 ? void 0 : authParams.state);
A.removeAuthorizationCode();
return;
}
}
if (!config.disableAutoSignIn && (yield AuthClient.isSessionActive())) {
yield AuthClient.signIn();
}
yield checkIsAuthenticated();
if (state.isSignedIn) {
return;
}
if (!config.disableTrySignInSilently) {
yield signInSilently();
}
}
catch (err) {
error.value = err;
throw err;
}
}));
});
initialize();
const authContext = {
disableHttpHandler: () => AuthClient.disableHttpHandler(),
enableHttpHandler: () => AuthClient.enableHttpHandler(),
error: error.value,
getAccessToken: () => AuthClient.getAccessToken(),
getUser: () => AuthClient.getUser(),
getDecodedIdToken: () => AuthClient.getDecodedIdToken(),
getHttpClient: () => AuthClient.getHttpClient(),
getIdToken: () => AuthClient.getIdToken(),
getOpenIDProviderEndpoints: () => AuthClient.getOpenIDProviderEndpoints(),
httpRequest: (config) => AuthClient.httpRequest(config),
httpRequestAll: (configs) => AuthClient.httpRequestAll(configs),
isSignedIn: () => AuthClient.isSignedIn(),
on: (hook, callback, id) => {
if (hook === k.CustomGrant && id) {
AuthClient.on(hook, callback, id);
}
else {
AuthClient.on(hook, callback);
}
},
refreshAccessToken: () => AuthClient.refreshAccessToken(),
exchangeToken: (config, callback) => __awaiter(this, void 0, void 0, function* () {
try {
const response = yield AuthClient.exchangeToken(config);
callback === null || callback === void 0 ? void 0 : callback(response);
return response;
}
catch (err) {
error.value = err;
throw err;
}
}),
revokeAccessToken: () => AuthClient.revokeAccessToken(),
signIn: (config, authorizationCode, sessionState, authState, callback, tokenRequestConfig) => __awaiter(this, void 0, void 0, function* () {
return withStateSync(() => __awaiter(this, void 0, void 0, function* () {
const result = yield AuthClient.signIn(config, authorizationCode, sessionState, authState, callback, tokenRequestConfig);
if (result) {
error.value = null;
callback === null || callback === void 0 ? void 0 : callback(result);
}
return result;
}));
}),
signOut: (callback) => __awaiter(this, void 0, void 0, function* () {
return withStateSync(() => __awaiter(this, void 0, void 0, function* () {
const result = yield AuthClient.signOut();
callback === null || callback === void 0 ? void 0 : callback(result);
return result;
}));
}),
state,
signInSilently,
reInitialize: (config) => __awaiter(this, void 0, void 0, function* () {
return withStateSync(() => __awaiter(this, void 0, void 0, function* () {
yield AuthClient.reInitialize(config);
}));
}),
};
app.provide(ASGARDEO_INJECTION_KEY, authContext);
},
};
/**
* Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).
*
* WSO2 LLC. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Retrieves the Asgardeo authentication context from Vue's dependency injection system.
*
* @throws {Error} Throws an error if the Vue plugin is not installed.
* @returns {AuthContextInterface} The authentication context containing authentication methods and state.
*/
function useAsgardeoContext() {
const ctx = inject(ASGARDEO_INJECTION_KEY);
if (!ctx) {
throw new Error('This can be only used when vue plugin is installed');
}
return ctx;
}
/**
* Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com).
*
* WSO2 LLC. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Hook to access the Asgardeo authentication context.
*
* @returns {AuthContextInterface} The authentication context containing authentication methods and state.
*/
function useAsgardeo() {
const asgardeo = useAsgardeoContext();
return asgardeo;
}
export { R as ASGARDEO_SESSION_ACTIVE, b as AUTHORIZATION_CODE, v as AsgardeoAuthClient, X as AsgardeoAuthException, an as AsgardeoSPAClient, z as AuthenticationHelper, y as AuthenticationUtils, d as CLIENT_ID_TAG, c as CLIENT_SECRET_TAG, W as CryptoHelper, S as DataLayer, k as Hooks, on as MainThreadClient, p as OIDC_SCOPE, Z as PKCE_CODE_VERIFIER, r as PKCE_SEPARATOR, s as REFRESH_TOKEN_TIMER, l as ResponseMode, o as SCOPE_TAG, h as SESSION_STATE, I as SIGN_OUT_SUCCESS_PARAM, m as SIGN_OUT_URL, w as SPAHelper, A as SPAUtils, G as STATE, u as SUPPORTED_SIGNATURE_ALGORITHMS, a as Stores, L as TOKEN_REQUEST_CONFIG_KEY, i as TOKEN_TAG, n as USERNAME_TAG, sn as WebWorkerClass, dn as WebWorkerClient, asgardeoPlugin, useAsgardeo, Zn as workerReceiver };
//# sourceMappingURL=index.js.map