UNPKG

@i3m/cloud-vault-client

Version:
3 lines (2 loc) 42.3 kB
"use strict";var t=require("crypto"),e=require("worker_threads"),s=require("events"),i=require("eventsource"),a=require("dotenv"),r=require("axios"),o=require("axios-retry"),n=require("@i3m/non-repudiation-library");function u(t){return t&&t.__esModule?t:{default:t}}var h=u(i),l=u(r),c=u(o);class d{key;alg;constructor(t,e){this.key=t,this.alg=e}encrypt(e){const s=t.randomBytes(16),i=t.createCipheriv(this.alg,this.key,s),a=Buffer.concat([i.update(e),i.final()]),r=i.getAuthTag();return Buffer.concat([s,r,a])}decrypt(e){const s=e.subarray(0,16),i=e.subarray(16,32),a=e.subarray(32),r=t.createDecipheriv(this.alg,this.key,s);return r.setAuthTag(i),Buffer.concat([r.update(a),r.final()])}}if(!e.isMainThread&&"object"==typeof e.workerData&&"scrypt-thread"===e.workerData._name){const{passwordOrKey:D,opts:S}=e.workerData;async function b(e,s){const i={...s.alg_options,maxmem:256*s.alg_options.N*s.alg_options.r},a="string"==typeof e?e:e.export(),r=new Promise(((e,r)=>{t.scrypt(a,s.salt,s.derived_key_length,i,((t,s)=>{null!==t&&r(t),e(s)}))}));return await r}b(D,S).then((t=>{e.parentPort?.postMessage(t)})).catch((t=>{throw t instanceof Error?t:new Error(t)}))}class w{_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=p(e.salt_hashing_algorithm,e.salt_pattern,{username:this.username}),r=await m(t,{...e,salt:a}),o=p(s.salt_hashing_algorithm,s.salt_pattern,{username:this.username}),n=p(i.salt_hashing_algorithm,i.salt_pattern,{username:this.username}),[u,h]=await Promise.all([m(r,{...s,salt:o}),m(r,{...i,salt:n})]);this._authKey=u,this._encKey=new d(h,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 p(e,s,i){let a="";for(const t in i)a=s.replace(t,i[t]);return t.createHash(e).update(a).digest()}async function m(s,i){return await new Promise(((a,r)=>{const o={_name:"scrypt-thread",passwordOrKey:s,opts:i},n=new e.Worker(__filename,{workerData:o});n.on("message",(e=>{a(t.createSecretKey(e))})),n.on("error",(t=>{r(t)})),n.on("messageerror",(t=>{r(t)}))}))}a.config();const g=(t,e)=>{let s=`Invalid value for ${t}. `;return void 0!==e&&(s+=`Allowed values are ${e} `),s},f=["0","false","FALSE"],y=["1","true","FALSE"],v=f.concat(y);!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:v}),""===s){if(void 0!==e.defaultValue)return e.defaultValue;if(void 0!==e.allowedValues&&!e.allowedValues.includes(""))throw new RangeError(g(t,e.allowedValues.join(", ")))}if(a&&y.includes(s))return!0;if(a&&f.includes(s))return!1;if(void 0!==e.allowedValues&&!e.allowedValues.includes(s))throw new RangeError(g(t,e.allowedValues.join(", ")))}("NODE_ENV",{defaultValue:"production",allowedValues:["production","development"]});const _="v"+"2.6.1".split(".")[0];class I 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 I)return t;if(t instanceof Object&&"Event"===t.constructor.name)return new I("sse-connection-error",t,{cause:"Likely issues connecting to the events endpoint of the cloud vault server"});if(t instanceof r.AxiosError){const e=t.response?.data;switch(e.name){case"no-storage":return new I("no-uploaded-storage",void 0);case"invalid-credentials":return new I("invalid-credentials",void 0);case"invalid-timestamp":return new I("invalid-timestamp",void 0);case"quota-exceeded":return new I("quota-exceeded",e.description);case"unauthorized":case"not-registered":return new I("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 I("http-connection-error",s)}if(t instanceof Error){const e=new I("error",t,{cause:t.cause});return e.stack=t.stack,e}return new I("unknown",t)}}class E{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=l.default.create();return void 0!==t?.retries&&c.default(e,{retries:t.retries,retryDelay:()=>t.retryDelay,retryCondition:t=>{const e=o.isNetworkOrIdempotentRequestError(t);return!this._stop&&e}}),e}async waitForOngoingRequestsToFinsh(t){const e=void 0!==t?t:this._defaultUrl;if(void 0===e)throw new I("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 I("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 r="post"===t||"put"===t?this.axios[t](e,s,{headers:a}):this.axios[t](e,{headers:a}),o=this.ongoingRequests[e].push(r)-1,n=await r.catch((t=>{throw delete this.ongoingRequests[e][o],I.from(t)})),u=i?.beforeRequestFinish;if(void 0!==u&&await u(n.data),delete this.ongoingRequests[e][o],void 0!==i?.responseStatus&&n.status!==i.responseStatus)throw new I("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 I("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 I("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,r;if("string"==typeof t?(i=t,a=e,r=s):(i=this._defaultUrl,a=t,r=e),void 0===i)throw new I("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,r)}async put(t,e,s){let i,a,r;if("string"==typeof t?(i=t,a=e,r=s):(i=this._defaultUrl,a=t,r=e),void 0===i)throw new I("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,r)}}const T={NOT_INITIALIZED:0,INITIALIZED:1,LOGGED_IN:2,CONNECTED:3};function q(t,e){switch(I.from(e).message){case"invalid-credentials":case"unauthorized":return T.INITIALIZED;case"sse-connection-error":return t>=T.LOGGED_IN?T.LOGGED_IN:T.INITIALIZED;default:return t}}const N={minLength:10,uppercase:!0,lowercase:!0,numbers:!0,symbols:!0,allowedSymbols:"!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~"};function k(t,e){const s={...N,...e};if(!(s.uppercase||s.lowercase||s.numbers||s.symbols))throw new I("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 I("weak-password",i);if(s.lowercase&&!/[a-z]/.test(t))throw new I("weak-password",i);if(s.numbers&&!/[0-9]/.test(t))throw new I("weak-password",i);if(s.symbols){if(!new RegExp(`[${a}]`).test(t))throw new I("weak-password",i)}const r=`^[${s.uppercase?"A-Z":""}${s.lowercase?"a-z":""}${s.numbers?"0-9":""}${s.symbols?a:""}]{${s.minLength},}$`;if(!new RegExp(r).test(t))throw new I("weak-password",i)}class O extends s.EventEmitter{timestamp;token;name;serverUrl;wellKnownCvsConfiguration;state;request;keyManager;es;switchingState;constructor(e){super({captureRejections:!0}),this.name=e?.name??t.randomBytes(16).toString("hex"),this.request=new E({retryOptions:{retries:28800,retryDelay:3e3,...e?.defaultRetryOptions},defaultCallOptions:{sequential:!0}}),this.state=new Promise(((t,e)=>{t(T.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<T.LOGGED_IN&&await this.request.stop(),await this.switchingState,this.switchingState=new Promise(((a,r)=>{this._switchToStatePromise(t,e).then((t=>{i=t})).catch((t=>{s=I.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<T.NOT_INITIALIZED||t>T.CONNECTED)throw new I("error",new Error("invalid state"));const i=t>s?1:-1;for(;s!==t;){let t;if(this.state=new Promise(((a,r)=>{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 I.from(t)}return s}async _switchToState(t,e,s){switch(e){case T.NOT_INITIALIZED:delete this.serverUrl,delete this.wellKnownCvsConfiguration,this.state=new Promise(((t,e)=>{t(T.NOT_INITIALIZED)}));break;case T.INITIALIZED:t===T.NOT_INITIALIZED?this.wellKnownCvsConfiguration=await this.request.get(this.serverUrl+"/.well-known/cvs-configuration",{responseStatus:200}).catch((t=>{throw new I("not-initialized",t)})):(await(this.request?.stop()),delete this.token,delete this.timestamp,delete this.keyManager,this.es?.close(),delete this.es);break;case T.LOGGED_IN:if(t===T.INITIALIZED){if(void 0===s||void 0===s.username||void 0===s.password)throw new I("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 T.CONNECTED:}return e}async _initEventSourceClient(){if(void 0!==this.es)return;const t=this.wellKnownCvsConfiguration.vault_configuration[_].events_endpoint;this.es=new h.default(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(T.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(q(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 w(t,e,s.vault_configuration[_].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>T.INITIALIZED)throw new I("error",new Error("to init the client, it should NOT be INITIALIZED"));return await this.switchToState(T.INITIALIZED),this.serverUrl}async login(t,e,s){const i=await this.state;if(i!==T.INITIALIZED&&i!==T.LOGGED_IN)throw new I("error",new Error("in order to login you should be in state INITIALIZED or LOGGED IN but not receiving SSE events"));await this.switchToState(T.LOGGED_IN,{username:t,password:e,timestamp:s})}async logout(){if(await this.state<T.LOGGED_IN)throw new I("error",new Error("in order to log out you should be in state LOGGED IN or CONNECTED"));await this.switchToState(T.INITIALIZED)}async close(){await this.switchToState(T.NOT_INITIALIZED)}async getRemoteStorageTimestamp(){if(await this.state<T.LOGGED_IN)throw new I("unauthorized","you must be logged in");const t=this.wellKnownCvsConfiguration;try{const e=await this.request.get(t.vault_configuration[_].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(q(await this.state,t)),t}}async getStorage(){if(await this.state<T.LOGGED_IN)throw new I("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 I("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=q(await this.state,e);throw await this.switchToState(s),I.from(e)}}async updateStorage(t,e=!1){if(await this.state<T.LOGGED_IN)throw new I("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 I("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(q(await this.state,t)),I.from(t)}}async deleteStorage(){if(await this.state<T.LOGGED_IN)throw new I("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 I&&"unauthorized"===t.message&&await this.logout(),t}}async getRegistrationUrl(t,e,s,i){const a=this.wellKnownCvsConfiguration;k(e,i);const r=(await this.request.get(a.registration_configuration.public_jwk_endpoint,{responseStatus:200})).jwk,o={did:s,username:t,authkey:await this.computeAuthKey(t,e)},u=await n.jweEncrypt(Buffer.from(JSON.stringify(o)),r,"A256GCM");return a.registration_configuration.registration_endpoint.replace("{data}",u)}async computeAuthKey(t,e){if(await this.state<T.INITIALIZED)throw new I("not-initialized",void 0);const s=this.wellKnownCvsConfiguration,i=new w(t,e,s.vault_configuration[_].key_derivation);return await i.initialized,i.authKey}}exports.KeyManager=w,exports.Request=E,exports.SecretKey=d,exports.VAULT_STATE=T,exports.VaultClient=O,exports.VaultError=I,exports.checkErrorType=function(t,e){return t.message===e},exports.defaultPasswordStrengthOptions=N,exports.deriveKey=m,exports.passwordCheck=k; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubm9kZS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy90cy9zZWNyZXQta2V5LnRzIiwiLi4vc3JjL3RzL3NjcnlwdC10aHJlYWQudHMiLCIuLi9zcmMvdHMva2V5LW1hbmFnZXIudHMiLCIuLi9zcmMvdHMvY29uZmlnL3BhcnNlUHJvY2Vzc0VudlZhci50cyIsIi4uL3NyYy90cy9jb25maWcvaW5kZXgudHMiLCIuLi9zcmMvdHMvZXJyb3IudHMiLCIuLi9zcmMvdHMvcmVxdWVzdC50cyIsIi4uL3NyYy90cy92YXVsdC1zdGF0ZS50cyIsIi4uL3NyYy90cy9wYXNzd29yZC1jaGVja2VyLnRzIiwiLi4vc3JjL3RzL3ZhdWx0LWNsaWVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6bnVsbCwibmFtZXMiOlsiU2VjcmV0S2V5Iiwia2V5IiwiYWxnIiwiY29uc3RydWN0b3IiLCJ0aGlzIiwiZW5jcnlwdCIsImlucHV0IiwiaXYiLCJyYW5kb21CeXRlcyIsImNpcGhlciIsImNyZWF0ZUNpcGhlcml2IiwiZW5jcnlwdGVkIiwiQnVmZmVyIiwiY29uY2F0IiwidXBkYXRlIiwiZmluYWwiLCJ0YWciLCJnZXRBdXRoVGFnIiwiZGVjcnlwdCIsInN1YmFycmF5IiwiY2lwaGVydGV4dCIsImRlY2lwaGVyIiwiY3JlYXRlRGVjaXBoZXJpdiIsInNldEF1dGhUYWciLCJpc01haW5UaHJlYWQiLCJ3b3JrZXJEYXRhIiwiX25hbWUiLCJwYXNzd29yZE9yS2V5Iiwib3B0cyIsImFzeW5jIiwic2NyeXB0VGhyZWFkIiwic2NyeXB0T3B0aW9ucyIsImFsZ19vcHRpb25zIiwibWF4bWVtIiwiTiIsInIiLCJwYXNzd29yZCIsImV4cG9ydCIsImtleVByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInNjcnlwdCIsInNhbHQiLCJkZXJpdmVkX2tleV9sZW5ndGgiLCJlcnIiLCJ0aGVuIiwiZGVyaXZlZEtleSIsInBhcmVudFBvcnQiLCJwb3N0TWVzc2FnZSIsImNhdGNoIiwiRXJyb3IiLCJLZXlNYW5hZ2VyIiwiX2VuY0tleSIsIl9hdXRoS2V5IiwidXNlcm5hbWUiLCJkZXJpdmF0aW9uT3B0aW9ucyIsImluaXRpYWxpemVkIiwiX2luaXRpYWxpemVkIiwiaW5pdCIsIm1hc3RlciIsImF1dGgiLCJlbmMiLCJtYXN0ZXJTYWx0IiwiX3NhbHQiLCJzYWx0X2hhc2hpbmdfYWxnb3JpdGhtIiwic2FsdF9wYXR0ZXJuIiwibWFzdGVyS2V5IiwiZGVyaXZlS2V5IiwiYXV0aFNhbHQiLCJlbmNTYWx0IiwiYXV0aEtleSIsImVuY0tleSIsImFsbCIsImVuY19hbGdvcml0aG0iLCJjYXVzZSIsInRvU3RyaW5nIiwiaGFzaEFsZ29yaXRobSIsInNhbHRQYXR0ZXJuIiwicmVwbGFjZW1lbnRzIiwic2FsdFN0cmluZyIsInNlYXJjaFZhbHVlIiwicmVwbGFjZSIsImNyZWF0ZUhhc2giLCJkaWdlc3QiLCJ3b3JrZXIiLCJXb3JrZXIiLCJfX2ZpbGVuYW1lIiwib24iLCJjcmVhdGVTZWNyZXRLZXkiLCJsb2FkRW52RmlsZSIsImludmFsaWRNc2ciLCJ2YXJuYW1lIiwidmFsdWVzIiwicmV0IiwidW5kZWZpbmVkIiwiYm9vbGVhbkZhbHNlQWxsb3dlZFZhbHVlcyIsImJvb2xlYW5UcnVlQWxsb3dlZFZhbHVlcyIsImJvb2xlYW5BbGxvd2VkVmFsdWVzIiwidmFyTmFtZSIsIm9wdGlvbnMiLCJ2YWx1ZSIsImEiLCJwcm9jZXNzIiwiZW52IiwiaXNCb29sZWFuIiwiYWxsb3dlZFZhbHVlcyIsImRlZmF1bHRWYWx1ZSIsImluY2x1ZGVzIiwiUmFuZ2VFcnJvciIsImpvaW4iLCJwYXJzZVByb2NjZXNzRW52VmFyIiwiYXBpVmVyc2lvbiIsInNwbGl0IiwiVmF1bHRFcnJvciIsImRhdGEiLCJtZXNzYWdlIiwic3VwZXIiLCJuYW1lIiwic3RhdGljIiwiZXJyb3IiLCJPYmplY3QiLCJBeGlvc0Vycm9yIiwicmVzcG9uc2UiLCJkZXNjcmlwdGlvbiIsInZhdWx0Q29ubkVycm9yIiwicmVxdWVzdCIsIm1ldGhvZCIsImNvbmZpZyIsInRvTG9jYWxlVXBwZXJDYXNlIiwidXJsIiwiaGVhZGVycyIsInN0YXR1cyIsInZhdWx0RXJyb3IiLCJzdGFjayIsIlJlcXVlc3QiLCJheGlvcyIsIl9kZWZhdWx0Q2FsbE9wdGlvbnMiLCJfZGVmYXVsdFVybCIsIl9zdG9wIiwib25nb2luZ1JlcXVlc3RzIiwiZ2V0QXhpb3NJbnN0YW5jZSIsInJldHJ5T3B0aW9ucyIsImRlZmF1bHRDYWxsT3B0aW9ucyIsImRlZmF1bHRVcmwiLCJheGlvc0luc3RhbmNlIiwiY3JlYXRlIiwicmV0cmllcyIsImF4aW9zUmV0cnkiLCJyZXRyeURlbGF5IiwicmV0cnlDb25kaXRpb24iLCJjb25kMSIsImlzTmV0d29ya09ySWRlbXBvdGVudFJlcXVlc3RFcnJvciIsInVybDIiLCJwcm9taXNlIiwid2FpdEZvck9uZ29pbmdSZXF1ZXN0c1RvRmluc2giLCJyZXF1ZXN0Qm9keSIsImJlYXJlclRva2VuIiwiQXV0aG9yaXphdGlvbiIsInRvVXBwZXJDYXNlIiwic2VxdWVudGlhbCIsInJlcXVlc3RQcm9taXNlIiwiaW5kZXgiLCJwdXNoIiwicmVzIiwiYXhpb3NFcnJvciIsImZyb20iLCJiZWZvcmVSZXF1ZXN0RmluaXNoZXMiLCJiZWZvcmVSZXF1ZXN0RmluaXNoIiwicmVzcG9uc2VTdGF0dXMiLCJ1cmxPck9wdGlvbnMiLCJ1cmxPclJlcXVlc3RCb2R5IiwicmVxdWVzdEJvZHlPck9wdGlvbnMiLCJWQVVMVF9TVEFURSIsIk5PVF9JTklUSUFMSVpFRCIsIklOSVRJQUxJWkVEIiwiTE9HR0VEX0lOIiwiQ09OTkVDVEVEIiwic3RhdGVGcm9tRXJyb3IiLCJjdXJyZW50U3RhdGUiLCJkZWZhdWx0UGFzc3dvcmRTdHJlbmd0aE9wdGlvbnMiLCJtaW5MZW5ndGgiLCJ1cHBlcmNhc2UiLCJsb3dlcmNhc2UiLCJudW1iZXJzIiwic3ltYm9scyIsImFsbG93ZWRTeW1ib2xzIiwicGFzc3dvcmRDaGVjayIsImVycm9yTXNnIiwicmVwbGFjZUFsbCIsInRlc3QiLCJSZWdFeHAiLCJyZWdleFN0ciIsIlZhdWx0Q2xpZW50IiwiRXZlbnRFbWl0dGVyIiwidGltZXN0YW1wIiwidG9rZW4iLCJzZXJ2ZXJVcmwiLCJ3ZWxsS25vd25DdnNDb25maWd1cmF0aW9uIiwic3RhdGUiLCJrZXlNYW5hZ2VyIiwiZXMiLCJzd2l0Y2hpbmdTdGF0ZSIsImNhcHR1cmVSZWplY3Rpb25zIiwiZGVmYXVsdFJldHJ5T3B0aW9ucyIsImVtaXQiLCJldmVudE5hbWUiLCJhcmdzIiwibGlzdGVuZXIiLCJvbmNlIiwibmV3U3RhdGUiLCJzdG9wIiwiX3N3aXRjaFRvU3RhdGVQcm9taXNlIiwiZmluYWxTdGF0ZSIsImZpbmFsbHkiLCJpIiwiX3N3aXRjaFRvU3RhdGUiLCJnZXQiLCJjbG9zZSIsIl9pbml0S2V5TWFuYWdlciIsInJlcUJvZHkiLCJhdXRoa2V5IiwiY3ZzQ29uZiIsInBvc3QiLCJ2YXVsdF9jb25maWd1cmF0aW9uIiwidjIiLCJ0b2tlbl9lbmRwb2ludCIsInZhdWx0X2VuZHBvaW50IiwiX2luaXRFdmVudFNvdXJjZUNsaWVudCIsImVzVXJsIiwiZXZlbnRzX2VuZHBvaW50IiwiRXZlbnRTb3VyY2UiLCJkZWZhdWx0IiwiYWRkRXZlbnRMaXN0ZW5lciIsImUiLCJtc2ciLCJKU09OIiwicGFyc2UiLCJzd2l0Y2hUb1N0YXRlIiwicmVhc29uIiwibG9nb3V0Iiwib25lcnJvciIsImNvbnNvbGUiLCJvbm1lc3NhZ2UiLCJtIiwibG9nIiwia2V5X2Rlcml2YXRpb24iLCJVUkwiLCJzZXJ2ZXJSb290VXJsIiwib3JpZ2luIiwic2VydmVyUHJlZml4IiwicGF0aG5hbWUiLCJlbmRzV2l0aCIsInNsaWNlIiwidGltZXN0YW1wX2VuZHBvaW50Iiwic3RhcnRUcyIsIkRhdGUiLCJub3ciLCJzdG9yYWdlIiwiZm9yY2UiLCJyZW1vdGVUaW1lc3RhbXAiLCJnZXRSZW1vdGVTdG9yYWdlVGltZXN0YW1wIiwibG9jYWxUaW1lc3RhbXAiLCJkZWxldGUiLCJkaWQiLCJwYXNzd29yZFN0cmVuZ3RoT3B0aW9ucyIsInB1YmxpY0p3ayIsInJlZ2lzdHJhdGlvbl9jb25maWd1cmF0aW9uIiwicHVibGljX2p3a19lbmRwb2ludCIsImp3ayIsInVzZXJEYXRhIiwiY29tcHV0ZUF1dGhLZXkiLCJyZWdEYXRhIiwiandlRW5jcnlwdCIsInN0cmluZ2lmeSIsInJlZ2lzdHJhdGlvbl9lbmRwb2ludCIsInR5cGUiXSwibWFwcGluZ3MiOiIwU0FHYUEsRUFDTUMsSUFDUkMsSUFFVEMsWUFBYUYsRUFBZ0JDLEdBQzNCRSxLQUFLSCxJQUFNQSxFQUNYRyxLQUFLRixJQUFNQSxDQUNaLENBRURHLFFBQVNDLEdBRVAsTUFBTUMsRUFBS0MsY0FBWSxJQUdqQkMsRUFBU0MsRUFBQUEsZUFBZU4sS0FBS0YsSUFBS0UsS0FBS0gsSUFBS00sR0FHNUNJLEVBQVlDLE9BQU9DLE9BQU8sQ0FBQ0osRUFBT0ssT0FBT1IsR0FBUUcsRUFBT00sVUFHeERDLEVBQU1QLEVBQU9RLGFBR25CLE9BQU9MLE9BQU9DLE9BQU8sQ0FBQ04sRUFBSVMsRUFBS0wsR0FDaEMsQ0FFRE8sUUFBU1osR0FFUCxNQUFNQyxFQUFLRCxFQUFNYSxTQUFTLEVBQUcsSUFDdkJILEVBQU1WLEVBQU1hLFNBQVMsR0FBSSxJQUN6QkMsRUFBYWQsRUFBTWEsU0FBUyxJQUc1QkUsRUFBV0MsRUFBQUEsaUJBQWlCbEIsS0FBS0YsSUFBS0UsS0FBS0gsSUFBS00sR0FJdEQsT0FIQWMsRUFBU0UsV0FBV1AsR0FHYkosT0FBT0MsT0FBTyxDQUFDUSxFQUFTUCxPQUFPTSxHQUFhQyxFQUFTTixTQUM3RCxFQy9CSCxJQUFLUyxFQUFBQSxjQUFzQyxpQkFBZkMsRUFBVUEsWUFBc0Msa0JBQXJCQSxFQUFVQSxXQUFDQyxNQUEyQixDQUMzRixNQUFNQyxjQUFFQSxFQUFhQyxLQUFFQSxHQUFTSCxhQUVoQ0ksZUFBZUMsRUFBY0gsRUFBbUNDLEdBQzlELE1BQU1HLEVBQStCLElBQ2hDSCxFQUFLSSxZQUNSQyxPQUFRLElBQU1MLEVBQUtJLFlBQVlFLEVBQUlOLEVBQUtJLFlBQVlHLEdBRWhEQyxFQUFxQyxpQkFBbEJULEVBQThCQSxFQUFnQkEsRUFBY1UsU0FDL0VDLEVBQThCLElBQUlDLFNBQVEsQ0FBQ0MsRUFBU0MsS0FDeERDLFNBQU9OLEVBQVVSLEVBQUtlLEtBQU1mLEVBQUtnQixtQkFBb0JiLEdBQWUsQ0FBQ2MsRUFBSzVDLEtBQzVELE9BQVI0QyxHQUFjSixFQUFPSSxHQUN6QkwsRUFBUXZDLEVBQUksR0FDWixJQUVKLGFBQWFxQyxDQUNkLENBRURSLEVBQWFILEVBQWVDLEdBQU1rQixNQUFNQyxJQUN0Q0MsY0FBWUMsWUFBWUYsRUFBVyxJQUNsQ0csT0FBTUwsSUFDUCxNQUFPQSxhQUFlTSxNQUFTTixFQUFNLElBQUlNLE1BQU1OLEVBQUksR0FFdEQsT0NmWU8sRUFDSEMsUUFDQUMsU0FDUkMsU0FDQUMsa0JBQ0FDLFlBQ1FDLGFBRVJ2RCxZQUFhb0QsRUFBa0JuQixFQUFrQlIsR0FDL0N4QixLQUFLbUQsU0FBV0EsRUFDaEJuRCxLQUFLb0Qsa0JBQW9CNUIsRUFDekJ4QixLQUFLc0QsY0FBZSxFQUNwQnRELEtBQUtxRCxZQUFjckQsS0FBS3VELEtBQUt2QixFQUM5QixDQUVPUCxXQUFZTyxHQUNsQixNQUFNd0IsT0FBRUEsRUFBTUMsS0FBRUEsRUFBSUMsSUFBRUEsR0FBUTFELEtBQUtvRCxrQkFDN0JPLEVBQWFDLEVBQU1KLEVBQU9LLHVCQUF3QkwsRUFBT00sYUFBYyxDQUFFWCxTQUFVbkQsS0FBS21ELFdBQ3hGWSxRQUFrQkMsRUFBVWhDLEVBQVUsSUFBS3dCLEVBQVFqQixLQUFNb0IsSUFFekRNLEVBQVdMLEVBQU1ILEVBQUtJLHVCQUF3QkosRUFBS0ssYUFBYyxDQUFFWCxTQUFVbkQsS0FBS21ELFdBQ2xGZSxFQUFVTixFQUFNRixFQUFJRyx1QkFBd0JILEVBQUlJLGFBQWMsQ0FBRVgsU0FBVW5ELEtBQUttRCxZQUU5RWdCLEVBQVNDLFNBQWdCakMsUUFBUWtDLElBQUksQ0FDMUNMLEVBQVVELEVBQVcsSUFBS04sRUFBTWxCLEtBQU0wQixJQUN0Q0QsRUFBVUQsRUFBVyxJQUFLTCxFQUFLbkIsS0FBTTJCLE1BR3ZDbEUsS0FBS2tELFNBQVdpQixFQUNoQm5FLEtBQUtpRCxRQUFVLElBQUlyRCxFQUFVd0UsRUFBUVYsRUFBSVksZUFDekN0RSxLQUFLc0QsY0FBZSxDQUNyQixDQUVHYSxjQUNGLElBQUtuRSxLQUFLc0QsYUFDUixNQUFNLElBQUlQLE1BQU0sb0RBQXFELENBQUV3QixNQUFPLDRFQUVoRixPQUFPdkUsS0FBS2tELFNBQVNqQixTQUFTdUMsU0FBUyxZQUN4QyxDQUVHSixhQUNGLElBQUtwRSxLQUFLc0QsYUFDUixNQUFNLElBQUlQLE1BQU0sbURBQW9ELENBQUV3QixNQUFPLDRFQUUvRSxPQUFPdkUsS0FBS2lELE9BQ2IsRUFHSCxTQUFTVyxFQUFPYSxFQUF5RkMsRUFBcUJDLEdBQzVILElBQUlDLEVBQWEsR0FDakIsSUFBSyxNQUFNQyxLQUFlRixFQUN4QkMsRUFBYUYsRUFBWUksUUFBUUQsRUFBYUYsRUFBYUUsSUFJN0QsT0FGYUUsYUFBV04sR0FDTi9ELE9BQU9rRSxHQUFZSSxRQUV2QyxDQUlPdkQsZUFBZXVDLEVBQVd6QyxFQUFtQ0MsR0FDbEUsYUFBYSxJQUFJVyxTQUFRLENBQUNDLEVBQVNDLEtBQ2pDLE1BQU1oQixFQUFxQyxDQUN6Q0MsTUFBTyxnQkFDUEMsZ0JBQ0FDLFFBRUl5RCxFQUFTLElBQUlDLEVBQU1BLE9BQUNDLFdBQVksQ0FBRTlELGVBQ3hDNEQsRUFBT0csR0FBRyxXQUFZekMsSUFDcEJQLEVBQVFpRCxFQUFBQSxnQkFBZ0IxQyxHQUFZLElBRXRDc0MsRUFBT0csR0FBRyxTQUFVM0MsSUFDbEJKLEVBQU9JLEVBQUksSUFFYndDLEVBQU9HLEdBQUcsZ0JBQWlCM0MsSUFDekJKLEVBQU9JLEVBQUksR0FDWCxHQUVOLENDOUZBNkMsRUFBQUEsU0FNQSxNQUFNQyxFQUFhLENBQUNDLEVBQWlCQyxLQUNuQyxJQUFJQyxFQUFNLHFCQUFxQkYsTUFFL0IsWUFEZUcsSUFBWEYsSUFBc0JDLEdBQU8sc0JBQXNCRCxNQUNoREMsQ0FBRyxFQUVORSxFQUE0QixDQUFDLElBQUssUUFBUyxTQUMzQ0MsRUFBMkIsQ0FBQyxJQUFLLE9BQVEsU0FDekNDLEVBQXVCRixFQUEwQm5GLE9BQU9vRixJQVE5QyxTQUFxQkUsRUFBaUJDLEdBQ3BELE1BQU1DLE9BbkJRTixLQURRTyxFQW9CY0MsUUFBUUMsSUFBSUwsSUFuQnJCLEdBQUtHLEVBRGxDLElBQXdCQSxFQXFCdEJGLEVBQVVBLEdBQVcsR0FDckIsTUFBTUssRUFBWUwsR0FBU0ssWUFBYSxFQU94QyxHQU5JQSxJQUNGTCxFQUFVLElBQ0xBLEVBQ0hNLGNBQWVSLElBR0wsS0FBVkcsRUFBYyxDQUNoQixRQUE2Qk4sSUFBekJLLEVBQVFPLGFBS1YsT0FBT1AsRUFBUU8sYUFKZixRQUE4QlosSUFBMUJLLEVBQVFNLGdCQUFnQ04sRUFBUU0sY0FBY0UsU0FBUyxJQUN6RSxNQUFNLElBQUlDLFdBQVdsQixFQUFXUSxFQUFTQyxFQUFRTSxjQUFjSSxLQUFLLE9BS3pFLENBQ0QsR0FBSUwsR0FBYVIsRUFBeUJXLFNBQVNQLEdBQVEsT0FBTyxFQUNsRSxHQUFJSSxHQUFhVCxFQUEwQlksU0FBU1AsR0FBUSxPQUFPLEVBQ25FLFFBQThCTixJQUExQkssRUFBUU0sZ0JBQWdDTixFQUFRTSxjQUFjRSxTQUFTUCxHQUN6RSxNQUFNLElBQUlRLFdBQVdsQixFQUFXUSxFQUFTQyxFQUFRTSxjQUFjSSxLQUFLLE9BR3hFLENDOUN1QkMsQ0FBb0IsV0FBWSxDQUFFSixhQUFjLGFBQWNELGNBQWUsQ0FBQyxhQUFjLGlCQUU1RyxNQUVNTSxFQUFhLElBRkgsUUFFaUJDLE1BQU0sS0FBSyxHQzBDN0MsTUFBT0MsVUFBOEQvRCxNQUN6RWdFLEtBQ0FDLFFBR0FqSCxZQUFhaUgsRUFBaUJELEVBQVlmLEdBQ3hDaUIsTUFBTUQsRUFBU2hCLEdBQ2ZoRyxLQUFLa0gsS0FBTyxhQUNabEgsS0FBSytHLEtBQU9BLEVBQ1ovRyxLQUFLZ0gsUUFBVUEsQ0FDaEIsQ0FFREcsWUFBYUMsR0FDWCxHQUFJQSxhQUFpQk4sRUFBYyxPQUFPTSxFQUMxQyxHQUFJQSxhQUFpQkMsUUFBcUMsVUFBM0JELEVBQU1ySCxZQUFZbUgsS0FDL0MsT0FBTyxJQUFJSixFQUFXLHVCQUF3Qk0sRUFBTyxDQUFFN0MsTUFBTyw4RUFFaEUsR0FBSTZDLGFBQWlCRSxFQUFBQSxXQUFZLENBQy9CLE1BQU03RSxFQUFNMkUsRUFBTUcsVUFBVVIsS0FDNUIsT0FBUXRFLEVBQUl5RSxNQUNWLElBQUssYUFDSCxPQUFPLElBQUlKLEVBQVcsMkJBQXVCbkIsR0FDL0MsSUFBSyxzQkFDSCxPQUFPLElBQUltQixFQUFXLDJCQUF1Qm5CLEdBQy9DLElBQUssb0JBQ0gsT0FBTyxJQUFJbUIsRUFBVyx5QkFBcUJuQixHQUM3QyxJQUFLLGlCQUNILE9BQU8sSUFBSW1CLEVBQVcsaUJBQWtCckUsRUFBSStFLGFBQzlDLElBQUssZUFDTCxJQUFLLGlCQUNILE9BQU8sSUFBSVYsRUFBVyxvQkFBZ0JuQixHQUkxQyxNQUFNOEIsRUFBMEQsQ0FDOURDLFFBQVMsQ0FDUEMsT0FBUVAsRUFBTVEsUUFBUUQsUUFBUUUsb0JBQzlCQyxJQUFLVixFQUFNUSxRQUFRRSxJQUNuQkMsUUFBU1gsRUFBTVEsUUFBUUcsUUFDdkJoQixLQUFNSyxFQUFNUSxRQUFRYixNQUV0QlEsU0FBVSxDQUNSUyxPQUFRWixFQUFNRyxVQUFVUyxPQUN4QkQsUUFBU1gsRUFBTUcsVUFBVVEsUUFDekJoQixLQUFNSyxFQUFNRyxVQUFVUixPQUcxQixPQUFPLElBQUlELEVBQVcsd0JBQXlCVyxFQUNoRCxDQUNELEdBQUlMLGFBQWlCckUsTUFBTyxDQUMxQixNQUFNa0YsRUFBYSxJQUFJbkIsRUFBVyxRQUFTTSxFQUFPLENBQUU3QyxNQUFPNkMsRUFBTTdDLFFBRWpFLE9BREEwRCxFQUFXQyxNQUFRZCxFQUFNYyxNQUNsQkQsQ0FDUixDQUNELE9BQU8sSUFBSW5CLEVBQVcsVUFBV00sRUFDbEMsUUN2RlVlLEVBQ01DLE1BQ2pCQyxvQkFDQUMsWUFDUUMsTUFDUkMsZ0JBSUF6SSxZQUFheUIsR0FLWHhCLEtBQUt1SSxPQUFRLEVBQ2J2SSxLQUFLb0ksTUFBUXBJLEtBQUt5SSxpQkFBaUJqSCxHQUFNa0gsY0FDekMxSSxLQUFLcUksb0JBQXNCN0csR0FBTW1ILG9CQUFzQixDQUFBLEVBQ3ZEM0ksS0FBS3NJLFlBQWM5RyxHQUFNb0gsV0FDekI1SSxLQUFLd0ksZ0JBQWtCLEVBQ3hCLENBRUdJLGlCQUNGLE9BQU81SSxLQUFLNEksVUFDYixDQUVHQSxlQUFZZCxHQUNkOUgsS0FBS3NJLFlBQWNSLENBQ3BCLENBRUdhLHlCQUNGLE9BQU8zSSxLQUFLcUksbUJBQ2IsQ0FFR00sdUJBQW9CbkgsR0FDdEJ4QixLQUFLcUksb0JBQXNCLElBQ3RCckksS0FBS3FJLHVCQUNMN0csRUFFTixDQUVPaUgsaUJBQWtCQyxHQUN4QixNQUFNRyxFQUFnQlQsVUFBTVUsU0FnQjVCLFlBZDhCbkQsSUFBMUIrQyxHQUFjSyxTQUNoQkMsRUFBQUEsUUFBV0gsRUFBZSxDQUN4QkUsUUFBU0wsRUFBYUssUUFDdEJFLFdBQVksSUFDSFAsRUFBYU8sV0FFdEJDLGVBQWlCekcsSUFDZixNQUFNMEcsRUFBUUMsb0NBQWtDM0csR0FFaEQsT0FEZXpDLEtBQUt1SSxPQUNKWSxDQUFLLElBS3BCTixDQUNSLENBRURwSCxvQ0FBcUNxRyxHQUNuQyxNQUFNdUIsT0FBZ0IxRCxJQUFSbUMsRUFBcUJBLEVBQU05SCxLQUFLc0ksWUFDOUMsUUFBYTNDLElBQVQwRCxFQUNGLE1BQU0sSUFBSXZDLEVBQVcsUUFBUyxJQUFJL0QsTUFBTSxpQ0FBa0MsQ0FBRXdCLE1BQU8sc0hBRXJGLFFBQW1Db0IsSUFBL0IzRixLQUFLd0ksZ0JBQWdCYSxHQUN2QixJQUFLLE1BQU1DLEtBQVd0SixLQUFLd0ksZ0JBQWdCYSxHQUN6QyxVQUNRQyxDQUNQLENBQUMsTUFBT2xDLEdBQVUsQ0FHeEIsQ0FFRDNGLGFBQ0V6QixLQUFLdUksT0FBUSxFQUNiLElBQUssTUFBTVQsS0FBTzlILEtBQUt3SSxzQkFDZnhJLEtBQUt1Siw4QkFBOEJ6QixHQUFLaEYsUUFFaEQ5QyxLQUFLdUksT0FBUSxDQUNkLENBRU85RyxjQUFrQmtHLEVBQTJDRyxFQUFhMEIsRUFBbUJ4RCxHQUNuRyxNQUFNK0IsRUFBeUMsQ0FDN0MsZUFBZ0Isb0JBS2xCLFFBSDZCcEMsSUFBekJLLEdBQVN5RCxjQUNYMUIsRUFBUTJCLGNBQWdCLFVBQVkxRCxFQUFReUQsYUFFMUN6SixLQUFLdUksTUFDUCxNQUFNLElBQUl6QixFQUFXLHdCQUF5QixDQUM1Q1ksUUFBUyxDQUNQQyxPQUFRQSxFQUFPZ0MsY0FDZjdCLE1BQ0FDLFFBQVNBLEVBQ1RoQixLQUFNeUMsTUFLZ0IsSUFBeEJ4RCxHQUFTNEQsa0JBQ0w1SixLQUFLdUosOEJBQThCekIsR0FBS2hGLFFBRWhEOUMsS0FBS3dJLGdCQUFnQlYsR0FBTyxHQUU1QixNQUFNK0IsRUFBNkIsU0FBWGxDLEdBQWdDLFFBQVhBLEVBQ3pDM0gsS0FBS29JLE1BQU1ULEdBQ1hHLEVBQ0EwQixFQUNBLENBQ0V6QixZQUdGL0gsS0FBS29JLE1BQU1ULEdBQ1hHLEVBQ0EsQ0FDRUMsWUFJQStCLEVBQVE5SixLQUFLd0ksZ0JBQWdCVixHQUFLaUMsS0FBS0YsR0FBa0IsRUFFekRHLFFBQVlILEVBQ2YvRyxPQUFPbUgsSUFFTixhQURPakssS0FBS3dJLGdCQUFnQlYsR0FBS2dDLEdBQzNCaEQsRUFBV29ELEtBQUtELEVBQVcsSUFHL0JFLEVBQXdCbkUsR0FBU29FLG9CQU92QyxRQU44QnpFLElBQTFCd0UsU0FDSUEsRUFBc0JILEVBQUlqRCxhQUczQi9HLEtBQUt3SSxnQkFBZ0JWLEdBQUtnQyxRQUVEbkUsSUFBNUJLLEdBQVNxRSxnQkFBZ0NMLEVBQUloQyxTQUFXaEMsRUFBUXFFLGVBQ2xFLE1BQU0sSUFBSXZELEVBQVcsYUFBYyxDQUNqQ1UsWUFBYSx3QkFBd0J3QyxFQUFJaEMsMkNBQTJDaEMsRUFBUXFFLG1CQUMzRixDQUFFOUYsTUFBTyxnREFFZCxPQUFPeUYsRUFBSWpELElBQ1osQ0FJRHRGLGFBQWlCNkksRUFBcUM5SSxHQUNwRCxNQUFNc0csRUFBK0IsaUJBQWpCd0MsRUFBNkJBLEVBQWV0SyxLQUFLc0ksWUFDckUsUUFBWTNDLElBQVJtQyxFQUNGLE1BQU0sSUFBSWhCLEVBQVcsUUFBUyxJQUFJL0QsTUFBTSxpQ0FBa0MsQ0FBRXdCLE1BQU8sOEZBRXJGLE1BQU15QixFQUFtQyxpQkFBakJzRSxFQUE2QkEsRUFBZTlJLEVBRXBFLGFBQWF4QixLQUFLMEgsUUFBUSxTQUFVSSxPQUFLbkMsRUFBV0ssRUFDckQsQ0FJRHZFLFVBQWM2SSxFQUF3QzlJLEdBQ3BELE1BQU1zRyxFQUErQixpQkFBakJ3QyxFQUE2QkEsRUFBZXRLLEtBQUtzSSxZQUNyRSxRQUFZM0MsSUFBUm1DLEVBQ0YsTUFBTSxJQUFJaEIsRUFBVyxRQUFTLElBQUkvRCxNQUFNLGlDQUFrQyxDQUFFd0IsTUFBTyw4RkFFckYsTUFBTXlCLEVBQW1DLGlCQUFqQnNFLEVBQTZCQSxFQUFlOUksRUFFcEUsYUFBYXhCLEtBQUswSCxRQUFRLE1BQU9JLE9BQUtuQyxFQUFXSyxFQUNsRCxDQUlEdkUsV0FBZThJLEVBQWdDQyxFQUE0Q2hKLEdBQ3pGLElBQUlzRyxFQUFLMEIsRUFBYXhELEVBVXRCLEdBVGdDLGlCQUFyQnVFLEdBQ1R6QyxFQUFNeUMsRUFDTmYsRUFBY2dCLEVBQ2R4RSxFQUFVeEUsSUFFVnNHLEVBQU05SCxLQUFLc0ksWUFDWGtCLEVBQWNlLEVBQ2R2RSxFQUFVd0UsUUFFQTdFLElBQVJtQyxFQUNGLE1BQU0sSUFBSWhCLEVBQVcsUUFBUyxJQUFJL0QsTUFBTSxpQ0FBa0MsQ0FBRXdCLE1BQU8sOEZBRXJGLGFBQWF2RSxLQUFLMEgsUUFBUSxPQUFRSSxFQUFLMEIsRUFBYXhELEVBQ3JELENBSUR2RSxVQUFjOEksRUFBZ0NDLEVBQTRDaEosR0FDeEYsSUFBSXNHLEVBQUswQixFQUFheEQsRUFVdEIsR0FUZ0MsaUJBQXJCdUUsR0FDVHpDLEVBQU15QyxFQUNOZixFQUFjZ0IsRUFDZHhFLEVBQVV4RSxJQUVWc0csRUFBTTlILEtBQUtzSSxZQUNYa0IsRUFBY2UsRUFDZHZFLEVBQVV3RSxRQUVBN0UsSUFBUm1DLEVBQ0YsTUFBTSxJQUFJaEIsRUFBVyxRQUFTLElBQUkvRCxNQUFNLGlDQUFrQyxDQUFFd0IsTUFBTyw4RkFFckYsYUFBYXZFLEtBQUswSCxRQUFRLE1BQU9JLEVBQUswQixFQUFheEQsRUFDcEQsRUN6TlUsTUFBQXlFLEVBQWMsQ0FDekJDLGdCQUFpQixFQUNqQkMsWUFBYSxFQUNiQyxVQUFXLEVBQ1hDLFVBQVcsR0FLRyxTQUFBQyxFQUFnQkMsRUFBMEIzRCxHQUV4RCxPQURtQk4sRUFBV29ELEtBQUs5QyxHQUNoQkosU0FDakIsSUFBSyxzQkFDTCxJQUFLLGVBQ0gsT0FBT3lELEVBQVlFLFlBQ3JCLElBQUssdUJBQ0gsT0FBUUksR0FBZ0JOLEVBQVlHLFVBQWFILEVBQVlHLFVBQVlILEVBQVlFLFlBQ3ZGLFFBQ0UsT0FBT0ksRUFFYixDQ1hhLE1BQUFDLEVBQW9FLENBQy9FQyxVQUFXLEdBQ1hDLFdBQVcsRUFDWEMsV0FBVyxFQUNYQyxTQUFTLEVBQ1RDLFNBQVMsRUFDVEMsZUFBZ0Isc0NBR0YsU0FBQUMsRUFBZXZKLEVBQWtCZ0UsR0FDL0MsTUFBTXhFLEVBQTBDLElBQzNDd0osS0FDQWhGLEdBR0wsS0FBS3hFLEVBQUswSixXQUFjMUosRUFBSzJKLFdBQWMzSixFQUFLNEosU0FBWTVKLEVBQUs2SixTQUMvRCxNQUFNLElBQUl2RSxFQUFXLFFBQVMsSUFBSS9ELE1BQU0sZ0ZBRzFDLE1BQU15SSxFQUFXLHFCQUFxQmhLLEVBQUt5SixxREFBcUR6SixFQUFLMEosVUFBWSxNQUFRLEtBQUsxSixFQUFLMkosVUFBWSxNQUFRLEtBQUszSixFQUFLNEosUUFBVSxNQUFRLEtBQUs1SixFQUFLNkosUUFBVTdKLEVBQUs4SixlQUFpQixLQUV2TkEsRUFBaUI5SixFQUFLOEosZUFBZUcsV0FBVyxlQUFnQixRQUV0RSxHQUFJakssRUFBSzBKLFlBQ0YsUUFBUVEsS0FBSzFKLEdBQ2hCLE1BQU0sSUFBSThFLEVBQVcsZ0JBQWlCMEUsR0FJMUMsR0FBSWhLLEVBQUsySixZQUNGLFFBQVFPLEtBQUsxSixHQUNoQixNQUFNLElBQUk4RSxFQUFXLGdCQUFpQjBFLEdBSTFDLEdBQUloSyxFQUFLNEosVUFDRixRQUFRTSxLQUFLMUosR0FDaEIsTUFBTSxJQUFJOEUsRUFBVyxnQkFBaUIwRSxHQUkxQyxHQUFJaEssRUFBSzZKLFFBQVMsQ0FFaEIsSUFEZSxJQUFJTSxPQUFPLElBQUlMLE1BQ2xCSSxLQUFLMUosR0FDZixNQUFNLElBQUk4RSxFQUFXLGdCQUFpQjBFLEVBRXpDLENBRUQsTUFBTUksRUFBVyxLQUFLcEssRUFBSzBKLFVBQVksTUFBUSxLQUFLMUosRUFBSzJKLFVBQVksTUFBUSxLQUFLM0osRUFBSzRKLFFBQVUsTUFBUSxLQUFLNUosRUFBSzZKLFFBQVVDLEVBQWlCLE9BQU85SixFQUFLeUosZUFJMUosSUFGZSxJQUFJVSxPQUFPQyxHQUVkRixLQUFLMUosR0FDZixNQUFNLElBQUk4RSxFQUFXLGdCQUFpQjBFLEVBRTFDLENDaENNLE1BQU9LLFVBQW9CQyxFQUFBQSxhQUMvQkMsVUFDQUMsTUFDQTlFLEtBQ0ErRSxVQUVBQywwQkFFQUMsTUFFaUJ6RSxRQUNUMEUsV0FFQUMsR0FFQUMsZUFFUnZNLFlBQWF5QixHQUNYeUYsTUFBTSxDQUFFc0YsbUJBQW1CLElBRTNCdk0sS0FBS2tILEtBQU8xRixHQUFNMEYsTUFBUTlHLEVBQVdBLFlBQUMsSUFBSW9FLFNBQVMsT0FFbkR4RSxLQUFLMEgsUUFBVSxJQUFJUyxFQUFRLENBQ3pCTyxhQUFjLENBQ1pLLFFBQVMsTUFDVEUsV0FBWSxPQUNUekgsR0FBTWdMLHFCQUVYN0QsbUJBQW9CLENBQ2xCaUIsWUFBWSxLQUloQjVKLEtBQUttTSxNQUFRLElBQUloSyxTQUFRLENBQUNDLEVBQVNDLEtBQ2pDRCxFQUFRcUksRUFBWUMsZ0JBQWdCLElBR3RDMUssS0FBS3NNLGVBQWlCLElBQUluSyxTQUFRLENBQUNDLEVBQVNDLEtBQzFDRCxHQUFTLEdBRVosQ0FHRHFLLEtBQU1DLEtBQStCQyxHQUNuQyxPQUFPMUYsTUFBTXdGLEtBQUtDLEtBQWNDLEVBQ2pDLENBR0R2SCxHQUFJc0gsRUFBNEJFLEdBQzlCLE9BQU8zRixNQUFNN0IsR0FBR3NILEVBQVdFLEVBQzVCLENBR0RDLEtBQU1ILEVBQTRCRSxHQUNoQyxPQUFPM0YsTUFBTTRGLEtBQUtILEVBQVdFLEVBQzlCLENBRVNuTCxvQkFBcUJxTCxFQUFzQnRMLEdBS25ELElBQUk0RixFQUNBK0UsRUFjSixHQW5CSVcsRUFBV3JDLEVBQVlHLGlCQUNuQjVLLEtBQUswSCxRQUFRcUYsYUFFZi9NLEtBQUtzTSxlQUdYdE0sS0FBS3NNLGVBQWlCLElBQUluSyxTQUFRLENBQUNDLEVBQVNDLEtBQzFDckMsS0FBS2dOLHNCQUFzQkYsRUFBVXRMLEdBQ2xDa0IsTUFBTXVLLElBQ0xkLEVBQVFjLENBQVUsSUFFbkJuSyxPQUFPTCxJQUNOMkUsRUFBUU4sRUFBV29ELEtBQUt6SCxFQUFJLElBRTdCeUssU0FBUSxLQUNQOUssR0FBUyxHQUNULFVBRUFwQyxLQUFLc00sb0JBQ0czRyxJQUFWeUIsRUFDRixNQUFNQSxFQUVSLE9BQU8rRSxDQUNSLENBRU8xSyw0QkFBNkJxTCxFQUFzQnRMLEdBQ3pELElBQUl1SixRQUFxQi9LLEtBQUttTSxNQUM5QixHQUFJcEIsSUFBaUIrQixFQUNuQixPQUFPL0IsRUFHVCxHQUFJK0IsRUFBV3JDLEVBQVlDLGlCQUFtQm9DLEVBQVdyQyxFQUFZSSxVQUNuRSxNQUFNLElBQUkvRCxFQUFXLFFBQVMsSUFBSS9ELE1BQU0sa0JBRzFDLE1BQU1vSyxFQUFLTCxFQUFXL0IsRUFBZ0IsR0FBSyxFQUMzQyxLQUFPQSxJQUFpQitCLEdBQVUsQ0FDaEMsSUFBSTFGLEVBV0osR0FWQXBILEtBQUttTSxNQUFRLElBQUloSyxTQUFRLENBQUNDLEVBQVNDLEtBQ2pDckMsS0FBS29OLGVBQWVyQyxFQUFjQSxFQUFlb0MsRUFBaUIzTCxHQUFNa0IsTUFBTXlKLElBQzVFL0osRUFBUStKLEdBQ1JuTSxLQUFLeU0sS0FBSyxnQkFBaUJOLEVBQU0sSUFDaENySixPQUFPTCxJQUNSMkUsRUFBUTNFLEVBQ1JMLEVBQVEySSxFQUFhLEdBQ3JCLElBRUpBLFFBQXFCL0ssS0FBS21NLFdBQ1p4RyxJQUFWeUIsRUFDRixNQUFNTixFQUFXb0QsS0FBSzlDLEVBRXpCLENBQ0QsT0FBTzJELENBQ1IsQ0FFT3RKLHFCQUFzQnNKLEVBQTBCK0IsRUFBc0J0TCxHQUM1RSxPQUFRc0wsR0FDTixLQUFLckMsRUFBWUMsdUJBRVIxSyxLQUFLaU0saUJBQ0xqTSxLQUFLa00sMEJBQ1psTSxLQUFLbU0sTUFBUSxJQUFJaEssU0FBUSxDQUFDQyxFQUFTQyxLQUNqQ0QsRUFBUXFJLEVBQVlDLGdCQUFnQixJQUV0QyxNQUVGLEtBQUtELEVBQVlFLFlBQ1hJLElBQWlCTixFQUFZQyxnQkFDL0IxSyxLQUFLa00sZ0NBQWtDbE0sS0FBSzBILFFBQVEyRixJQUFnRHJOLEtBQUtpTSxVQUFzQixpQ0FBa0MsQ0FBRTVCLGVBQWdCLE1BQU92SCxPQUFNTCxJQUM5TCxNQUFNLElBQUlxRSxFQUFXLGtCQUFtQnJFLEVBQUksV0FHeEN6QyxLQUFLMEgsU0FBU3FGLGVBRWIvTSxLQUFLZ00sYUFDTGhNLEtBQUsrTCxpQkFDTC9MLEtBQUtvTSxXQUVacE0sS0FBS3FNLElBQUlpQixlQUNGdE4sS0FBS3FNLElBRWQsTUFFRixLQUFLNUIsRUFBWUcsVUFDZixHQUFJRyxJQUFpQk4sRUFBWUUsWUFBYSxDQUM1QyxRQUFhaEYsSUFBVG5FLFFBQXdDbUUsSUFBbEJuRSxFQUFLMkIsZUFBNEN3QyxJQUFsQm5FLEVBQUtRLFNBQzVELE1BQU0sSUFBSThFLEVBQVcsc0JBQXVCLElBQUkvRCxNQUFNLHlDQUdsRC9DLEtBQUt1TixnQkFBZ0IvTCxFQUFLMkIsU0FBVTNCLEVBQUtRLFVBRS9DLE1BQU13TCxFQUF5RCxDQUM3RHJLLFNBQVUzQixFQUFLMkIsU0FDZnNLLFFBQVV6TixLQUFLb00sV0FBMEJqSSxTQUdyQ3VKLEVBQVUxTixLQUFLa00sMEJBRWZuRixRQUFhL0csS0FBSzBILFFBQVFpRyxLQUM5QkQsRUFBUUUsb0JBQW9CQyxHQUFHQyxlQUMvQk4sRUFDQSxDQUFFbkQsZUFBZ0IsTUFHcEJySyxLQUFLZ00sTUFBUWpGLEVBQUtpRixNQUVsQmhNLEtBQUswSCxRQUFRa0IsV0FBYThFLEVBQVFFLG9CQUFvQkMsR0FBR0UsZUFFekQvTixLQUFLK0wsVUFBWXZLLEVBQUt1SyxVQUV0Qi9MLEtBQUtnTyx5QkFBeUJsTCxPQUFNTCxJQUNsQyxNQUFNQSxDQUFHLEdBRVosQ0FHSCxLQUFLZ0ksRUFBWUksV0FPbkIsT0FBT2lDLENBQ1IsQ0FFT3JMLCtCQUNOLFFBQWdCa0UsSUFBWjNGLEtBQUtxTSxHQUNQLE9BRUYsTUFDTTRCLEVBRFVqTyxLQUFLa00sMEJBQ0MwQixvQkFBb0JoSCxHQUFZc0gsZ0JBQ3REbE8sS0FBS3FNLEdBQUssSUFBSThCLEVBQVdDLFFBQUNILEVBQU8sQ0FDL0JsRyxRQUFTLENBQ1AyQixjQUFlLFVBQWExSixLQUFLZ00sU0FJckNoTSxLQUFLcU0sR0FBR2dDLGlCQUFpQixhQUFjQyxJQUNyQyxNQUFNQyxFQUFNQyxLQUFLQyxNQUFNSCxFQUFFdkgsV0FDSHBCLElBQWxCNEksRUFBSXhDLFVBQ04vTCxLQUFLeU0sS0FBSyxpQkFDRDhCLEVBQUl4QyxZQUFjL0wsS0FBSytMLFlBQ2hDL0wsS0FBSytMLFVBQVl3QyxFQUFJeEMsVUFDckIvTCxLQUFLeU0sS0FBSyxrQkFBbUJ6TSxLQUFLK0wsWUFFcEMvTCxLQUFLME8sY0FBY2pFLEVBQVlJLFdBQVcvSCxPQUFNTCxJQUM5QyxNQUFNQSxDQUFHLEdBQ1QsSUFHSnpDLEtBQUtxTSxHQUFHZ0MsaUJBQWlCLG1CQUFvQkMsSUFDdEJ0TyxLQUFLMEgsUUFDYjZCLGdDQUFnQzJELFNBQVEsS0FDbkQsTUFBTXFCLEVBQU1DLEtBQUtDLE1BQU1ILEVBQUV2SCxNQUNyQndILEVBQUl4QyxZQUFjL0wsS0FBSytMLFlBQ3pCL0wsS0FBSytMLFVBQVl3QyxFQUFJeEMsVUFDckIvTCxLQUFLeU0sS0FBSyxrQkFBbUJ6TSxLQUFLK0wsV0FDbkMsSUFDQWpKLE9BQU02TCxPQUFhLElBR3hCM08sS0FBS3FNLEdBQUdnQyxpQkFBaUIsbUJBQW9CQyxJQUN0QnRPLEtBQUswSCxRQUNiNkIsZ0NBQWdDMkQsU0FBUSxLQUNuRGxOLEtBQUs0TyxTQUFTOUwsT0FBTUwsSUFBUyxNQUFNQSxDQUFHLElBQ3RDekMsS0FBS3lNLEtBQUssa0JBQWtCLElBQzNCM0osT0FBTTZMLE9BQWEsSUFHeEIzTyxLQUFLcU0sR0FBR3dDLFFBQVdQLElBQ2pCdE8sS0FBS21NLE1BQU16SixNQUFNeUosSUFDZm5NLEtBQUswTyxjQUFjNUQsRUFBZXFCLEVBQU9tQyxJQUFJeEwsT0FBTzZMLElBQ2xERyxRQUFRMUgsTUFBTXVILEVBQU8sR0FDckIsSUFDRDdMLE9BQU02TCxJQUNQRyxRQUFRMUgsTUFBTXVILEVBQU8sR0FDckIsRUFHSjNPLEtBQUtxTSxHQUFHMEMsVUFBYUMsSUFDbkJGLFFBQVFHLElBQUlELEVBQUUsQ0FFakIsQ0FFT3ZOLHNCQUF1QjBCLEVBQWtCbkIsR0FDL0MsTUFBTTBMLEVBQVUxTixLQUFLa00sMEJBRXJCbE0sS0FBS29NLFdBQWEsSUFBSXBKLEVBQVdHLEVBQVVuQixFQUFVMEwsRUFBUUUsb0JBQW9CaEgsR0FBWXNJLHNCQUN2RmxQLEtBQUtvTSxXQUFXL0ksV0FDdkIsQ0FFRDVCLFdBQVl3SyxHQUNWLE1BQU1uRSxFQUFNLElBQUlxSCxJQUFJbEQsR0FDZG1ELEVBQWdCdEgsRUFBSXVILE9BQ3BCQyxFQUFleEgsRUFBSXlILFNBQVNDLFNBQVMsS0FBTzFILEVBQUl5SCxTQUFTRSxNQUFNLEdBQUksR0FBSzNILEVBQUl5SCxTQUdsRixHQUZBdlAsS0FBS2lNLFVBQVltRCxFQUFnQkUsUUFFdkJ0UCxLQUFLbU0sTUFBUTFCLEVBQVlFLFlBQ2pDLE1BQU0sSUFBSTdELEVBQVcsUUFBUyxJQUFJL0QsTUFBTSxxREFHMUMsYUFETS9DLEtBQUswTyxjQUFjakUsRUFBWUUsYUFDOUIzSyxLQUFLaU0sU0FDYixDQUVEeEssWUFBYTBCLEVBQWtCbkIsRUFBa0IrSixHQUMvQyxNQUFNaEIsUUFBcUIvSyxLQUFLbU0sTUFDaEMsR0FBSXBCLElBQWlCTixFQUFZRSxhQUFlSSxJQUFpQk4sRUFBWUcsVUFDM0UsTUFBTSxJQUFJOUQsRUFBVyxRQUFTLElBQUkvRCxNQUFNLHlHQUVwQy9DLEtBQUswTyxjQUFjakUsRUFBWUcsVUFBVyxDQUM5Q3pILFdBQ0FuQixXQUNBK0osYUFFSCxDQUVEdEssZUFDRSxTQUFVekIsS0FBS21NLE1BQVExQixFQUFZRyxVQUNqQyxNQUFNLElBQUk5RCxFQUFXLFFBQVMsSUFBSS9ELE1BQU0sNEVBRXBDL0MsS0FBSzBPLGNBQWNqRSxFQUFZRSxZQUN0QyxDQUVEbEosb0JBQ1F6QixLQUFLME8sY0FBY2pFLEVBQVlDLGdCQUN0QyxDQUVEakosa0NBQ0UsU0FBVXpCLEtBQUttTSxNQUFRMUIsRUFBWUcsVUFDakMsTUFBTSxJQUFJOUQsRUFBVyxlQUFnQix5QkFHdkMsTUFBTTRHLEVBQVUxTixLQUFLa00sMEJBQ3JCLElBQ0UsTUFBTW5GLFFBQWEvRyxLQUFLMEgsUUFBUTJGLElBQzlCSyxFQUFRRSxvQkFBb0JoSCxHQUFZOEksbUJBQ3hDLENBQ0VyRixlQUFnQixJQUNoQlosWUFBYXpKLEtBQUtnTSxRQVF0QixPQUpLaE0sS0FBSytMLFdBQWEsR0FBS2hGLEVBQUtnRixZQUMvQi9MLEtBQUsrTCxVQUFZaEYsRUFBS2dGLFdBR2pCaEYsRUFBS2dGLFNBQ2IsQ0FBQyxNQUFPM0UsR0FFUCxZQURNcEgsS0FBSzBPLGNBQWM1RCxRQUFxQjlLLEtBQUttTSxNQUFPL0UsSUFDcERBLENBQ1AsQ0FDRixDQUVEM0YsbUJBQ0UsU0FBVXpCLEtBQUttTSxNQUFRMUIsRUFBWUcsVUFDakMsTUFBTSxJQUFJOUQsRUFBVyxvQkFBZ0JuQixHQUV2QyxNQUFNZ0ssRUFBVUMsS0FBS0MsTUFDckI3UCxLQUFLeU0sS0FBSyxhQUFja0QsR0FFeEIsSUFDRSxNQUFNNUksUUFBYS9HLEtBQUswSCxRQUFRMkYsSUFDOUIsQ0FDRWhELGVBQWdCLElBQ2hCWixZQUFhekosS0FBS2dNLFFBSXRCLEdBQUlqRixFQUFLZ0YsV0FBYS9MLEtBQUsrTCxXQUFhLEdBQ3RDLE1BQU0sSUFBSWpGLEVBQVcsYUFBYyxDQUNqQ1UsWUFBYSxrRkFHakIsTUFBTXNJLEVBQVc5UCxLQUFLb00sV0FBMEJoSSxPQUFPdEQsUUFBUU4sT0FBTzBKLEtBQUtuRCxFQUFLL0YsV0FBWSxjQUs1RixPQUpBaEIsS0FBSytMLFVBQVloRixFQUFLZ0YsVUFFdEIvTCxLQUFLeU0sS0FBSyxZQUFha0QsRUFBU0MsS0FBS0MsT0FFOUIsQ0FDTEMsVUFDQS9ELFVBQVdoRixFQUFLZ0YsVUFFbkIsQ0FBQyxNQUFPM0UsR0FDUHBILEtBQUt5TSxLQUFLLFlBQWFrRCxFQUFTQyxLQUFLQyxPQUNyQyxNQUFNL0MsRUFBV2hDLFFBQXFCOUssS0FBS21NLE1BQU8vRSxHQUVsRCxZQURNcEgsS0FBSzBPLGNBQWM1QixHQUNuQmhHLEVBQVdvRCxLQUFLOUMsRUFDdkIsQ0FDRixDQUVEM0Ysb0JBQXFCcU8sRUFBdUJDLEdBQWlCLEdBQzNELFNBQVUvUCxLQUFLbU0sTUFBUTFCLEVBQVlHLFVBQ2pDLE1BQU0sSUFBSTlELEVBQVcsb0JBQWdCbkIsR0FHdkMsTUFBTWdLLEVBQVVDLEtBQUtDLE1BQ3JCN1AsS0FBS3lNLEtBQUssYUFBY2tELEdBRXhCLElBQ0UsR0FBSUksRUFBTyxDQUNULE1BQU1DLFFBQXdCaFEsS0FBS2lRLDRCQUNuQ0gsRUFBUS9ELFVBQWlDLE9BQXBCaUUsRUFBNEJBLE9BQWtCckssQ0FDcEUsQ0FFRCxRQUF1QkEsSUFBbkIzRixLQUFLK0wsWUFBNEIrRCxFQUFRL0QsV0FBYSxHQUFLL0wsS0FBSytMLFVBQ2xFLE1BQU0sSUFBSWpGLEVBQVcsV0FBWSxDQUMvQm9KLGVBQWdCSixFQUFRL0QsVUFDeEJpRSxnQkFBaUJoUSxLQUFLK0wsWUFJMUIsTUFFTXZDLEVBQXdELENBQzVEeEksV0FId0JoQixLQUFLb00sV0FBMEJoSSxPQUFPbkUsUUFBUTZQLEVBQVFBLFNBR2pEdEwsU0FBUyxhQUN0Q3VILFVBQVcrRCxFQUFRL0QsV0FHZmhGLFFBQWEvRyxLQUFLMEgsUUFBUWlHLEtBQWtEbkUsRUFBYSxDQUM3RmEsZUFBZ0IsSUFDaEJaLFlBQWF6SixLQUFLZ00sTUFDbEI1QixvQkFBcUIzSSxNQUFPc0YsSUFDMUIvRyxLQUFLK0wsVUFBWWhGLEVBQUtnRixTQUFTLElBTW5DLE9BRkEvTCxLQUFLeU0sS0FBSyxZQUFha0QsRUFBU0MsS0FBS0MsT0FFOUI5SSxFQUFLZ0YsU0FDYixDQUFDLE1BQU8zRSxHQUdQLE1BRkFwSCxLQUFLeU0sS0FBSyxZQUFha0QsRUFBU0MsS0FBS0MsYUFDL0I3UCxLQUFLME8sY0FBYzVELFFBQXFCOUssS0FBS21NLE1BQU8vRSxJQUNwRE4sRUFBV29ELEtBQUs5QyxFQUN2QixDQUNGLENBRUQzRixzQkFDRSxTQUFVekIsS0FBS21NLE1BQVExQixFQUFZRyxVQUNqQyxNQUFNLElBQUk5RCxFQUFXLGVBQWdCLElBQUkvRCxNQUFNLDBCQUdqRCxVQUNRL0MsS0FBSzBILFFBQVFxRixhQUNiL00sS0FBSzBILFFBQVF5SSxPQUNqQixDQUNFMUcsWUFBYXpKLEtBQUtnTSxNQUNsQjNCLGVBQWdCLFlBR2RySyxLQUFLNE8sUUFDWixDQUFDLE1BQU94SCxHQUlQLE1BSElBLGFBQWlCTixHQUFnQyxpQkFBbEJNLEVBQU1KLGVBQ2pDaEgsS0FBSzRPLFNBRVB4SCxDQUNQLENBQ0YsQ0FFRDNGLHlCQUEwQjBCLEVBQWtCbkIsRUFBa0JvTyxFQUFhQyxHQUN6RSxNQUFNM0MsRUFBVTFOLEtBQUtrTSwwQkFFckJYLEVBQWN2SixFQUFVcU8sR0FFeEIsTUFJTUMsU0FKcUJ0USxLQUFLMEgsUUFBUTJGLElBQ3RDSyxFQUFRNkMsMkJBQTJCQyxvQkFDbkMsQ0FBRW5HLGVBQWdCLE9BRVdvRyxJQUV6QkMsRUFBVyxDQUNmTixNQUNBak4sV0FDQXNLLGNBQWV6TixLQUFLMlEsZUFBZXhOLEVBQVVuQixJQUd6QzRPLFFBQWdCQyxhQUNwQnJRLE9BQU8wSixLQUFLc0UsS0FBS3NDLFVBQVVKLElBQzNCSixFQUNBLFdBR0YsT0FBTzVDLEVBQVE2QywyQkFBMkJRLHNCQUFzQmpNLFFBQVEsU0FBVThMLEVBQ25GLENBRU9uUCxxQkFBc0IwQixFQUFrQm5CLEdBQzlDLFNBQVVoQyxLQUFLbU0sTUFBUTFCLEVBQVlFLFlBQ2pDLE1BQU0sSUFBSTdELEVBQVcsdUJBQW1CbkIsR0FFMUMsTUFBTStILEVBQVUxTixLQUFLa00sMEJBQ2ZFLEVBQWEsSUFBSXBKLEVBQVdHLEVBQVVuQixFQUFVMEwsRUFBUUUsb0JBQW9CaEgsR0FBWXNJLGdCQUU5RixhQURNOUMsRUFBVy9JLFlBQ1YrSSxFQUFXakksT0FDbkIscUpKM1hhLFNBQTJDMUIsRUFBaUJ1TyxHQUMxRSxPQUFPdk8sRUFBSXVFLFVBQVlnSyxDQUN6QiJ9