@i3m/cloud-vault-client
Version:
A TypeScript/JavaScript implementation of a client for the i3M-Wallet Cloud-Vault server
3 lines (2 loc) • 42.2 kB
JavaScript
import{fileURLToPath as t}from"url";import{randomBytes as e,createCipheriv as s,createDecipheriv as i,scrypt as a,createHash as o,createSecretKey as r}from"crypto";import{isMainThread as n,workerData as h,parentPort as u,Worker as l}from"worker_threads";import{EventEmitter as c}from"events";import d from"eventsource";import{config as w}from"dotenv";import p,{AxiosError as m}from"axios";import f,{isNetworkOrIdempotentRequestError as g}from"axios-retry";import{jweEncrypt as y}from"@i3m/non-repudiation-library";class v{key;alg;constructor(t,e){this.key=t,this.alg=e}encrypt(t){const i=e(16),a=s(this.alg,this.key,i),o=Buffer.concat([a.update(t),a.final()]),r=a.getAuthTag();return Buffer.concat([i,r,o])}decrypt(t){const e=t.subarray(0,16),s=t.subarray(16,32),a=t.subarray(32),o=i(this.alg,this.key,e);return o.setAuthTag(s),Buffer.concat([o.update(a),o.final()])}}if(!n&&"object"==typeof h&&"scrypt-thread"===h._name){const{passwordOrKey:t,opts:e}=h;(async function(t,e){const s={...e.alg_options,maxmem:256*e.alg_options.N*e.alg_options.r},i="string"==typeof t?t:t.export(),o=new Promise(((t,o)=>{a(i,e.salt,e.derived_key_length,s,((e,s)=>{null!==e&&o(e),t(s)}))}));return await o})(t,e).then((t=>{u?.postMessage(t)})).catch((t=>{throw t instanceof Error?t:new Error(t)}))}class I{_encKey;_authKey;username;derivationOptions;initialized;_initialized;constructor(t,e,s){this.username=t,this.derivationOptions=s,this._initialized=!1,this.initialized=this.init(e)}async init(t){const{master:e,auth:s,enc:i}=this.derivationOptions,a=_(e.salt_hashing_algorithm,e.salt_pattern,{username:this.username}),o=await E(t,{...e,salt:a}),r=_(s.salt_hashing_algorithm,s.salt_pattern,{username:this.username}),n=_(i.salt_hashing_algorithm,i.salt_pattern,{username:this.username}),[h,u]=await Promise.all([E(o,{...s,salt:r}),E(o,{...i,salt:n})]);this._authKey=h,this._encKey=new v(u,i.enc_algorithm),this._initialized=!0}get authKey(){if(!this._initialized)throw new Error("Unable to get authKey. KeyManager not initialized",{cause:"You may have forgotten to await keymanager.initialized or just to login"});return this._authKey.export().toString("base64url")}get encKey(){if(!this._initialized)throw new Error("Unable to get encKey. KeyManager not initialized",{cause:"You may have forgotten to await keymanager.initialized or just to login"});return this._encKey}}function _(t,e,s){let i="";for(const t in s)i=e.replace(t,s[t]);return o(t).update(i).digest()}async function E(e,s){return await new Promise(((i,a)=>{const o={_name:"scrypt-thread",passwordOrKey:e,opts:s},n=new l(t(import.meta.url),{workerData:o});n.on("message",(t=>{i(r(t))})),n.on("error",(t=>{a(t)})),n.on("messageerror",(t=>{a(t)}))}))}w();const T=(t,e)=>{let s=`Invalid value for ${t}. `;return void 0!==e&&(s+=`Allowed values are ${e} `),s},N=["0","false","FALSE"],O=["1","true","FALSE"],k=N.concat(O);!function(t,e){const s=void 0===(i=process.env[t])?"":i;var i;e=e??{};const a=e?.isBoolean??!1;if(a&&(e={...e,allowedValues:k}),""===s){if(void 0!==e.defaultValue)return e.defaultValue;if(void 0!==e.allowedValues&&!e.allowedValues.includes(""))throw new RangeError(T(t,e.allowedValues.join(", ")))}if(a&&O.includes(s))return!0;if(a&&N.includes(s))return!1;if(void 0!==e.allowedValues&&!e.allowedValues.includes(s))throw new RangeError(T(t,e.allowedValues.join(", ")))}("NODE_ENV",{defaultValue:"production",allowedValues:["production","development"]});const D="v"+"2.6.1".split(".")[0];class S extends Error{data;message;constructor(t,e,s){super(t,s),this.name="VaultError",this.data=e,this.message=t}static from(t){if(t instanceof S)return t;if(t instanceof Object&&"Event"===t.constructor.name)return new S("sse-connection-error",t,{cause:"Likely issues connecting to the events endpoint of the cloud vault server"});if(t instanceof m){const e=t.response?.data;switch(e.name){case"no-storage":return new S("no-uploaded-storage",void 0);case"invalid-credentials":return new S("invalid-credentials",void 0);case"invalid-timestamp":return new S("invalid-timestamp",void 0);case"quota-exceeded":return new S("quota-exceeded",e.description);case"unauthorized":case"not-registered":return new S("unauthorized",void 0)}const s={request:{method:t.config?.method?.toLocaleUpperCase(),url:t.config?.url,headers:t.config?.headers,data:t.config?.data},response:{status:t.response?.status,headers:t.response?.headers,data:t.response?.data}};return new S("http-connection-error",s)}if(t instanceof Error){const e=new S("error",t,{cause:t.cause});return e.stack=t.stack,e}return new S("unknown",t)}}function q(t,e){return t.message===e}class b{axios;_defaultCallOptions;_defaultUrl;_stop;ongoingRequests;constructor(t){this._stop=!1,this.axios=this.getAxiosInstance(t?.retryOptions),this._defaultCallOptions=t?.defaultCallOptions??{},this._defaultUrl=t?.defaultUrl,this.ongoingRequests={}}get defaultUrl(){return this.defaultUrl}set defaultUrl(t){this._defaultUrl=t}get defaultCallOptions(){return this._defaultCallOptions}set defaultCallOptions(t){this._defaultCallOptions={...this._defaultCallOptions,...t}}getAxiosInstance(t){const e=p.create();return void 0!==t?.retries&&f(e,{retries:t.retries,retryDelay:()=>t.retryDelay,retryCondition:t=>{const e=g(t);return!this._stop&&e}}),e}async waitForOngoingRequestsToFinsh(t){const e=void 0!==t?t:this._defaultUrl;if(void 0===e)throw new S("error",new Error("no url or defaultUrl provided"),{cause:"you should create the Request object with a defaultUrl or pass the url oof the uploads you want to wait to finish"});if(void 0!==this.ongoingRequests[e])for(const t of this.ongoingRequests[e])try{await t}catch(t){}}async stop(){this._stop=!0;for(const t in this.ongoingRequests)await this.waitForOngoingRequestsToFinsh(t).catch();this._stop=!1}async request(t,e,s,i){const a={"Content-Type":"application/json"};if(void 0!==i?.bearerToken&&(a.Authorization="Bearer "+i.bearerToken),this._stop)throw new S("http-request-canceled",{request:{method:t.toUpperCase(),url:e,headers:a,data:s}});!0===i?.sequential&&await this.waitForOngoingRequestsToFinsh(e).catch(),this.ongoingRequests[e]=[];const o="post"===t||"put"===t?this.axios[t](e,s,{headers:a}):this.axios[t](e,{headers:a}),r=this.ongoingRequests[e].push(o)-1,n=await o.catch((t=>{throw delete this.ongoingRequests[e][r],S.from(t)})),h=i?.beforeRequestFinish;if(void 0!==h&&await h(n.data),delete this.ongoingRequests[e][r],void 0!==i?.responseStatus&&n.status!==i.responseStatus)throw new S("validation",{description:`Received HTTP status ${n.status} does not match the expected one (${i.responseStatus})`},{cause:"HTTP status does not match the expected one"});return n.data}async delete(t,e){const s="string"==typeof t?t:this._defaultUrl;if(void 0===s)throw new S("error",new Error("no url or defaultUrl provided"),{cause:"you should create the Request object with a defaultUrl or pass the url to the HTTP method"});const i="string"!=typeof t?t:e;return await this.request("delete",s,void 0,i)}async get(t,e){const s="string"==typeof t?t:this._defaultUrl;if(void 0===s)throw new S("error",new Error("no url or defaultUrl provided"),{cause:"you should create the Request object with a defaultUrl or pass the url to the HTTP method"});const i="string"!=typeof t?t:e;return await this.request("get",s,void 0,i)}async post(t,e,s){let i,a,o;if("string"==typeof t?(i=t,a=e,o=s):(i=this._defaultUrl,a=t,o=e),void 0===i)throw new S("error",new Error("no url or defaultUrl provided"),{cause:"you should create the Request object with a defaultUrl or pass the url to the HTTP method"});return await this.request("post",i,a,o)}async put(t,e,s){let i,a,o;if("string"==typeof t?(i=t,a=e,o=s):(i=this._defaultUrl,a=t,o=e),void 0===i)throw new S("error",new Error("no url or defaultUrl provided"),{cause:"you should create the Request object with a defaultUrl or pass the url to the HTTP method"});return await this.request("put",i,a,o)}}const C={NOT_INITIALIZED:0,INITIALIZED:1,LOGGED_IN:2,CONNECTED:3};function L(t,e){switch(S.from(e).message){case"invalid-credentials":case"unauthorized":return C.INITIALIZED;case"sse-connection-error":return t>=C.LOGGED_IN?C.LOGGED_IN:C.INITIALIZED;default:return t}}const A={minLength:10,uppercase:!0,lowercase:!0,numbers:!0,symbols:!0,allowedSymbols:"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"};function R(t,e){const s={...A,...e};if(!(s.uppercase||s.lowercase||s.numbers||s.symbols))throw new S("error",new Error("passwords must have at least one of uppercase, lowercase, digits or symbols"));const i=`minimum length is ${s.minLength}, and the only characters supported are: ${s.uppercase?"A-Z":""}${s.lowercase?"a-z":""}${s.numbers?"0-9":""}${s.symbols?s.allowedSymbols:""}`,a=s.allowedSymbols.replaceAll(/([\^\]\\-])/g,"\\$1");if(s.uppercase&&!/[A-Z]/.test(t))throw new S("weak-password",i);if(s.lowercase&&!/[a-z]/.test(t))throw new S("weak-password",i);if(s.numbers&&!/[0-9]/.test(t))throw new S("weak-password",i);if(s.symbols){if(!new RegExp(`[${a}]`).test(t))throw new S("weak-password",i)}const o=`^[${s.uppercase?"A-Z":""}${s.lowercase?"a-z":""}${s.numbers?"0-9":""}${s.symbols?a:""}]{${s.minLength},}$`;if(!new RegExp(o).test(t))throw new S("weak-password",i)}class U extends c{timestamp;token;name;serverUrl;wellKnownCvsConfiguration;state;request;keyManager;es;switchingState;constructor(t){super({captureRejections:!0}),this.name=t?.name??e(16).toString("hex"),this.request=new b({retryOptions:{retries:28800,retryDelay:3e3,...t?.defaultRetryOptions},defaultCallOptions:{sequential:!0}}),this.state=new Promise(((t,e)=>{t(C.NOT_INITIALIZED)})),this.switchingState=new Promise(((t,e)=>{t()}))}emit(t,...e){return super.emit(t,...e)}on(t,e){return super.on(t,e)}once(t,e){return super.once(t,e)}async switchToState(t,e){let s,i;if(t<C.LOGGED_IN&&await this.request.stop(),await this.switchingState,this.switchingState=new Promise(((a,o)=>{this._switchToStatePromise(t,e).then((t=>{i=t})).catch((t=>{s=S.from(t)})).finally((()=>{a()}))})),await this.switchingState,void 0!==s)throw s;return i}async _switchToStatePromise(t,e){let s=await this.state;if(s===t)return s;if(t<C.NOT_INITIALIZED||t>C.CONNECTED)throw new S("error",new Error("invalid state"));const i=t>s?1:-1;for(;s!==t;){let t;if(this.state=new Promise(((a,o)=>{this._switchToState(s,s+i,e).then((t=>{a(t),this.emit("state-changed",t)})).catch((e=>{t=e,a(s)}))})),s=await this.state,void 0!==t)throw S.from(t)}return s}async _switchToState(t,e,s){switch(e){case C.NOT_INITIALIZED:delete this.serverUrl,delete this.wellKnownCvsConfiguration,this.state=new Promise(((t,e)=>{t(C.NOT_INITIALIZED)}));break;case C.INITIALIZED:t===C.NOT_INITIALIZED?this.wellKnownCvsConfiguration=await this.request.get(this.serverUrl+"/.well-known/cvs-configuration",{responseStatus:200}).catch((t=>{throw new S("not-initialized",t)})):(await(this.request?.stop()),delete this.token,delete this.timestamp,delete this.keyManager,this.es?.close(),delete this.es);break;case C.LOGGED_IN:if(t===C.INITIALIZED){if(void 0===s||void 0===s.username||void 0===s.password)throw new S("invalid-credentials",new Error("you need credentials to log in"));await this._initKeyManager(s.username,s.password);const t={username:s.username,authkey:this.keyManager.authKey},e=this.wellKnownCvsConfiguration,i=await this.request.post(e.vault_configuration.v2.token_endpoint,t,{responseStatus:200});this.token=i.token,this.request.defaultUrl=e.vault_configuration.v2.vault_endpoint,this.timestamp=s.timestamp,this._initEventSourceClient().catch((t=>{throw t}))}case C.CONNECTED:}return e}async _initEventSourceClient(){if(void 0!==this.es)return;const t=this.wellKnownCvsConfiguration.vault_configuration[D].events_endpoint;this.es=new d(t,{headers:{Authorization:"Bearer "+this.token}}),this.es.addEventListener("connected",(t=>{const e=JSON.parse(t.data);void 0===e.timestamp?this.emit("empty-storage"):e.timestamp!==this.timestamp&&(this.timestamp=e.timestamp,this.emit("storage-updated",this.timestamp)),this.switchToState(C.CONNECTED).catch((t=>{throw t}))})),this.es.addEventListener("storage-updated",(t=>{this.request.waitForOngoingRequestsToFinsh().finally((()=>{const e=JSON.parse(t.data);e.timestamp!==this.timestamp&&(this.timestamp=e.timestamp,this.emit("storage-updated",this.timestamp))})).catch((t=>{}))})),this.es.addEventListener("storage-deleted",(t=>{this.request.waitForOngoingRequestsToFinsh().finally((()=>{this.logout().catch((t=>{throw t})),this.emit("storage-deleted")})).catch((t=>{}))})),this.es.onerror=t=>{this.state.then((e=>{this.switchToState(L(e,t)).catch((t=>{console.error(t)}))})).catch((t=>{console.error(t)}))},this.es.onmessage=t=>{console.log(t)}}async _initKeyManager(t,e){const s=this.wellKnownCvsConfiguration;this.keyManager=new I(t,e,s.vault_configuration[D].key_derivation),await this.keyManager.initialized}async init(t){const e=new URL(t),s=e.origin,i=e.pathname.endsWith("/")?e.pathname.slice(0,-1):e.pathname;if(this.serverUrl=s+i,await this.state>C.INITIALIZED)throw new S("error",new Error("to init the client, it should NOT be INITIALIZED"));return await this.switchToState(C.INITIALIZED),this.serverUrl}async login(t,e,s){const i=await this.state;if(i!==C.INITIALIZED&&i!==C.LOGGED_IN)throw new S("error",new Error("in order to login you should be in state INITIALIZED or LOGGED IN but not receiving SSE events"));await this.switchToState(C.LOGGED_IN,{username:t,password:e,timestamp:s})}async logout(){if(await this.state<C.LOGGED_IN)throw new S("error",new Error("in order to log out you should be in state LOGGED IN or CONNECTED"));await this.switchToState(C.INITIALIZED)}async close(){await this.switchToState(C.NOT_INITIALIZED)}async getRemoteStorageTimestamp(){if(await this.state<C.LOGGED_IN)throw new S("unauthorized","you must be logged in");const t=this.wellKnownCvsConfiguration;try{const e=await this.request.get(t.vault_configuration[D].timestamp_endpoint,{responseStatus:200,bearerToken:this.token});return(this.timestamp??0)<e.timestamp&&(this.timestamp=e.timestamp),e.timestamp}catch(t){throw await this.switchToState(L(await this.state,t)),t}}async getStorage(){if(await this.state<C.LOGGED_IN)throw new S("unauthorized",void 0);const t=Date.now();this.emit("sync-start",t);try{const e=await this.request.get({responseStatus:200,bearerToken:this.token});if(e.timestamp<(this.timestamp??0))throw new S("validation",{description:"WEIRD!!! Received timestamp is older than the one received in previous events"});const s=this.keyManager.encKey.decrypt(Buffer.from(e.ciphertext,"base64url"));return this.timestamp=e.timestamp,this.emit("sync-stop",t,Date.now()),{storage:s,timestamp:e.timestamp}}catch(e){this.emit("sync-stop",t,Date.now());const s=L(await this.state,e);throw await this.switchToState(s),S.from(e)}}async updateStorage(t,e=!1){if(await this.state<C.LOGGED_IN)throw new S("unauthorized",void 0);const s=Date.now();this.emit("sync-start",s);try{if(e){const e=await this.getRemoteStorageTimestamp();t.timestamp=null!==e?e:void 0}if(void 0!==this.timestamp&&(t.timestamp??0)<this.timestamp)throw new S("conflict",{localTimestamp:t.timestamp,remoteTimestamp:this.timestamp});const i={ciphertext:this.keyManager.encKey.encrypt(t.storage).toString("base64url"),timestamp:t.timestamp},a=await this.request.post(i,{responseStatus:201,bearerToken:this.token,beforeRequestFinish:async t=>{this.timestamp=t.timestamp}});return this.emit("sync-stop",s,Date.now()),a.timestamp}catch(t){throw this.emit("sync-stop",s,Date.now()),await this.switchToState(L(await this.state,t)),S.from(t)}}async deleteStorage(){if(await this.state<C.LOGGED_IN)throw new S("unauthorized",new Error("you must be logged in"));try{await this.request.stop(),await this.request.delete({bearerToken:this.token,responseStatus:204}),await this.logout()}catch(t){throw t instanceof S&&"unauthorized"===t.message&&await this.logout(),t}}async getRegistrationUrl(t,e,s,i){const a=this.wellKnownCvsConfiguration;R(e,i);const o=(await this.request.get(a.registration_configuration.public_jwk_endpoint,{responseStatus:200})).jwk,r={did:s,username:t,authkey:await this.computeAuthKey(t,e)},n=await y(Buffer.from(JSON.stringify(r)),o,"A256GCM");return a.registration_configuration.registration_endpoint.replace("{data}",n)}async computeAuthKey(t,e){if(await this.state<C.INITIALIZED)throw new S("not-initialized",void 0);const s=this.wellKnownCvsConfiguration,i=new I(t,e,s.vault_configuration[D].key_derivation);return await i.initialized,i.authKey}}export{I as KeyManager,b as Request,v as SecretKey,C as VAULT_STATE,U as VaultClient,S as VaultError,q as checkErrorType,A as defaultPasswordStrengthOptions,E as deriveKey,R as passwordCheck};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubm9kZS5lc20uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy90cy9zZWNyZXQta2V5LnRzIiwiLi4vc3JjL3RzL3NjcnlwdC10aHJlYWQudHMiLCIuLi9zcmMvdHMva2V5LW1hbmFnZXIudHMiLCIuLi9zcmMvdHMvY29uZmlnL3BhcnNlUHJvY2Vzc0VudlZhci50cyIsIi4uL3NyYy90cy9jb25maWcvaW5kZXgudHMiLCIuLi9zcmMvdHMvZXJyb3IudHMiLCIuLi9zcmMvdHMvcmVxdWVzdC50cyIsIi4uL3NyYy90cy92YXVsdC1zdGF0ZS50cyIsIi4uL3NyYy90cy9wYXNzd29yZC1jaGVja2VyLnRzIiwiLi4vc3JjL3RzL3ZhdWx0LWNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6bnVsbCwibmFtZXMiOlsiU2VjcmV0S2V5Iiwia2V5IiwiYWxnIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiZW5jcnlwdCIsImlucHV0IiwiaXYiLCJyYW5kb21CeXRlcyIsImNpcGhlciIsImNyZWF0ZUNpcGhlcml2IiwiZW5jcnlwdGVkIiwiQnVmZmVyIiwiY29uY2F0IiwidXBkYXRlIiwiZmluYWwiLCJ0YWciLCJnZXRBdXRoVGFnIiwiZGVjcnlwdCIsInN1YmFycmF5IiwiY2lwaGVydGV4dCIsImRlY2lwaGVyIiwiY3JlYXRlRGVjaXBoZXJpdiIsInNldEF1dGhUYWciLCJpc01haW5UaHJlYWQiLCJ3b3JrZXJEYXRhIiwiX25hbWUiLCJwYXNzd29yZE9yS2V5Iiwib3B0cyIsImFzeW5jIiwic2NyeXB0T3B0aW9ucyIsImFsZ19vcHRpb25zIiwibWF4bWVtIiwiTiIsInIiLCJwYXNzd29yZCIsImV4cG9ydCIsImtleVByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNjcnlwdCIsInNhbHQiLCJkZXJpdmVkX2tleV9sZW5ndGgiLCJlcnIiLCJzY3J5cHRUaHJlYWQiLCJ0aGVuIiwiZGVyaXZlZEtleSIsInBhcmVudFBvcnQiLCJwb3N0TWVzc2FnZSIsImNhdGNoIiwiRXJyb3IiLCJLZXlNYW5hZ2VyIiwiX2VuY0tleSIsIl9hdXRoS2V5IiwidXNlcm5hbWUiLCJkZXJpdmF0aW9uT3B0aW9ucyIsImluaXRpYWxpemVkIiwiX2luaXRpYWxpemVkIiwiaW5pdCIsIm1hc3RlciIsImF1dGgiLCJlbmMiLCJtYXN0ZXJTYWx0IiwiX3NhbHQiLCJzYWx0X2hhc2hpbmdfYWxnb3JpdGhtIiwic2FsdF9wYXR0ZXJuIiwibWFzdGVyS2V5IiwiZGVyaXZlS2V5IiwiYXV0aFNhbHQiLCJlbmNTYWx0IiwiYXV0aEtleSIsImVuY0tleSIsImFsbCIsImVuY19hbGdvcml0aG0iLCJjYXVzZSIsInRvU3RyaW5nIiwiaGFzaEFsZ29yaXRobSIsInNhbHRQYXR0ZXJuIiwicmVwbGFjZW1lbnRzIiwic2FsdFN0cmluZyIsInNlYXJjaFZhbHVlIiwicmVwbGFjZSIsImNyZWF0ZUhhc2giLCJkaWdlc3QiLCJ3b3JrZXIiLCJXb3JrZXIiLCJmaWxlVVJMVG9QYXRoIiwidXJsIiwib24iLCJjcmVhdGVTZWNyZXRLZXkiLCJsb2FkRW52RmlsZSIsImludmFsaWRNc2ciLCJ2YXJuYW1lIiwidmFsdWVzIiwicmV0IiwidW5kZWZpbmVkIiwiYm9vbGVhbkZhbHNlQWxsb3dlZFZhbHVlcyIsImJvb2xlYW5UcnVlQWxsb3dlZFZhbHVlcyIsImJvb2xlYW5BbGxvd2VkVmFsdWVzIiwidmFyTmFtZSIsIm9wdGlvbnMiLCJ2YWx1ZSIsImEiLCJwcm9jZXNzIiwiZW52IiwiaXNCb29sZWFuIiwiYWxsb3dlZFZhbHVlcyIsImRlZmF1bHRWYWx1ZSIsImluY2x1ZGVzIiwiUmFuZ2VFcnJvciIsImpvaW4iLCJwYXJzZVByb2NjZXNzRW52VmFyIiwiYXBpVmVyc2lvbiIsInNwbGl0IiwiVmF1bHRFcnJvciIsImRhdGEiLCJtZXNzYWdlIiwic3VwZXIiLCJuYW1lIiwic3RhdGljIiwiZXJyb3IiLCJPYmplY3QiLCJBeGlvc0Vycm9yIiwicmVzcG9uc2UiLCJkZXNjcmlwdGlvbiIsInZhdWx0Q29ubkVycm9yIiwicmVxdWVzdCIsIm1ldGhvZCIsImNvbmZpZyIsInRvTG9jYWxlVXBwZXJDYXNlIiwiaGVhZGVycyIsInN0YXR1cyIsInZhdWx0RXJyb3IiLCJzdGFjayIsImNoZWNrRXJyb3JUeXBlIiwidHlwZSIsIlJlcXVlc3QiLCJheGlvcyIsIl9kZWZhdWx0Q2FsbE9wdGlvbnMiLCJfZGVmYXVsdFVybCIsIl9zdG9wIiwib25nb2luZ1JlcXVlc3RzIiwiZ2V0QXhpb3NJbnN0YW5jZSIsInJldHJ5T3B0aW9ucyIsImRlZmF1bHRDYWxsT3B0aW9ucyIsImRlZmF1bHRVcmwiLCJheGlvc0luc3RhbmNlIiwiY3JlYXRlIiwicmV0cmllcyIsImF4aW9zUmV0cnkiLCJyZXRyeURlbGF5IiwicmV0cnlDb25kaXRpb24iLCJjb25kMSIsImlzTmV0d29ya09ySWRlbXBvdGVudFJlcXVlc3RFcnJvciIsInVybDIiLCJwcm9taXNlIiwid2FpdEZvck9uZ29pbmdSZXF1ZXN0c1RvRmluc2giLCJyZXF1ZXN0Qm9keSIsImJlYXJlclRva2VuIiwiQXV0aG9yaXphdGlvbiIsInRvVXBwZXJDYXNlIiwic2VxdWVudGlhbCIsInJlcXVlc3RQcm9taXNlIiwiaW5kZXgiLCJwdXNoIiwicmVzIiwiYXhpb3NFcnJvciIsImZyb20iLCJiZWZvcmVSZXF1ZXN0RmluaXNoZXMiLCJiZWZvcmVSZXF1ZXN0RmluaXNoIiwicmVzcG9uc2VTdGF0dXMiLCJ1cmxPck9wdGlvbnMiLCJ1cmxPclJlcXVlc3RCb2R5IiwicmVxdWVzdEJvZHlPck9wdGlvbnMiLCJWQVVMVF9TVEFURSIsIk5PVF9JTklUSUFMSVpFRCIsIklOSVRJQUxJWkVEIiwiTE9HR0VEX0lOIiwiQ09OTkVDVEVEIiwic3RhdGVGcm9tRXJyb3IiLCJjdXJyZW50U3RhdGUiLCJkZWZhdWx0UGFzc3dvcmRTdHJlbmd0aE9wdGlvbnMiLCJtaW5MZW5ndGgiLCJ1cHBlcmNhc2UiLCJsb3dlcmNhc2UiLCJudW1iZXJzIiwic3ltYm9scyIsImFsbG93ZWRTeW1ib2xzIiwicGFzc3dvcmRDaGVjayIsImVycm9yTXNnIiwicmVwbGFjZUFsbCIsInRlc3QiLCJSZWdFeHAiLCJyZWdleFN0ciIsIlZhdWx0Q2xpZW50IiwiRXZlbnRFbWl0dGVyIiwidGltZXN0YW1wIiwidG9rZW4iLCJzZXJ2ZXJVcmwiLCJ3ZWxsS25vd25DdnNDb25maWd1cmF0aW9uIiwic3RhdGUiLCJrZXlNYW5hZ2VyIiwiZXMiLCJzd2l0Y2hpbmdTdGF0ZSIsImNhcHR1cmVSZWplY3Rpb25zIiwiZGVmYXVsdFJldHJ5T3B0aW9ucyIsImVtaXQiLCJldmVudE5hbWUiLCJhcmdzIiwibGlzdGVuZXIiLCJvbmNlIiwibmV3U3RhdGUiLCJzdG9wIiwiX3N3aXRjaFRvU3RhdGVQcm9taXNlIiwiZmluYWxTdGF0ZSIsImZpbmFsbHkiLCJpIiwiX3N3aXRjaFRvU3RhdGUiLCJnZXQiLCJjbG9zZSIsIl9pbml0S2V5TWFuYWdlciIsInJlcUJvZHkiLCJhdXRoa2V5IiwiY3ZzQ29uZiIsInBvc3QiLCJ2YXVsdF9jb25maWd1cmF0aW9uIiwidjIiLCJ0b2tlbl9lbmRwb2ludCIsInZhdWx0X2VuZHBvaW50IiwiX2luaXRFdmVudFNvdXJjZUNsaWVudCIsImVzVXJsIiwiZXZlbnRzX2VuZHBvaW50IiwiRXZlbnRTb3VyY2UiLCJhZGRFdmVudExpc3RlbmVyIiwiZSIsIm1zZyIsIkpTT04iLCJwYXJzZSIsInN3aXRjaFRvU3RhdGUiLCJyZWFzb24iLCJsb2dvdXQiLCJvbmVycm9yIiwiY29uc29sZSIsIm9ubWVzc2FnZSIsIm0iLCJsb2ciLCJrZXlfZGVyaXZhdGlvbiIsIlVSTCIsInNlcnZlclJvb3RVcmwiLCJvcmlnaW4iLCJzZXJ2ZXJQcmVmaXgiLCJwYXRobmFtZSIsImVuZHNXaXRoIiwic2xpY2UiLCJ0aW1lc3RhbXBfZW5kcG9pbnQiLCJzdGFydFRzIiwiRGF0ZSIsIm5vdyIsInN0b3JhZ2UiLCJmb3JjZSIsInJlbW90ZVRpbWVzdGFtcCIsImdldFJlbW90ZVN0b3JhZ2VUaW1lc3RhbXAiLCJsb2NhbFRpbWVzdGFtcCIsImRlbGV0ZSIsImRpZCIsInBhc3N3b3JkU3RyZW5ndGhPcHRpb25zIiwicHVibGljSndrIiwicmVnaXN0cmF0aW9uX2NvbmZpZ3VyYXRpb24iLCJwdWJsaWNfandrX2VuZHBvaW50IiwiandrIiwidXNlckRhdGEiLCJjb21wdXRlQXV0aEtleSIsInJlZ0RhdGEiLCJqd2VFbmNyeXB0Iiwic3RyaW5naWZ5IiwicmVnaXN0cmF0aW9uX2VuZHBvaW50Il0sIm1hcHBpbmdzIjoid2dCQUdhQSxFQUNNQyxJQUNSQyxJQUVUQyxZQUFhRixFQUFnQkMsR0FDM0JFLEtBQUtILElBQU1BLEVBQ1hHLEtBQUtGLElBQU1BLENBQ1osQ0FFREcsUUFBU0MsR0FFUCxNQUFNQyxFQUFLQyxFQUFZLElBR2pCQyxFQUFTQyxFQUFlTixLQUFLRixJQUFLRSxLQUFLSCxJQUFLTSxHQUc1Q0ksRUFBWUMsT0FBT0MsT0FBTyxDQUFDSixFQUFPSyxPQUFPUixHQUFRRyxFQUFPTSxVQUd4REMsRUFBTVAsRUFBT1EsYUFHbkIsT0FBT0wsT0FBT0MsT0FBTyxDQUFDTixFQUFJUyxFQUFLTCxHQUNoQyxDQUVETyxRQUFTWixHQUVQLE1BQU1DLEVBQUtELEVBQU1hLFNBQVMsRUFBRyxJQUN2QkgsRUFBTVYsRUFBTWEsU0FBUyxHQUFJLElBQ3pCQyxFQUFhZCxFQUFNYSxTQUFTLElBRzVCRSxFQUFXQyxFQUFpQmxCLEtBQUtGLElBQUtFLEtBQUtILElBQUtNLEdBSXRELE9BSEFjLEVBQVNFLFdBQVdQLEdBR2JKLE9BQU9DLE9BQU8sQ0FBQ1EsRUFBU1AsT0FBT00sR0FBYUMsRUFBU04sU0FDN0QsRUMvQkgsSUFBS1MsR0FBc0MsaUJBQWZDLEdBQWdELGtCQUFyQkEsRUFBV0MsTUFBMkIsQ0FDM0YsTUFBTUMsY0FBRUEsRUFBYUMsS0FBRUEsR0FBU0gsR0FFaENJLGVBQTZCRixFQUFtQ0MsR0FDOUQsTUFBTUUsRUFBK0IsSUFDaENGLEVBQUtHLFlBQ1JDLE9BQVEsSUFBTUosRUFBS0csWUFBWUUsRUFBSUwsRUFBS0csWUFBWUcsR0FFaERDLEVBQXFD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