metaapi.cloud-sdk
Version:
SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)
139 lines (138 loc) • 18.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return ClientApiClient;
}
});
const _metaApiclient = /*#__PURE__*/ _interop_require_default(require("../metaApi.client"));
const _logger = /*#__PURE__*/ _interop_require_default(require("../../logger"));
const _errorHandler = require("../errorHandler");
function _define_property(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
let ClientApiClient = class ClientApiClient extends _metaApiclient.default {
/**
* Type hashing ignored field lists
* @typedef {Object} TypeHashingIgnoredFieldLists
* @property {String[]} specification specification ignored fields
* @property {String[]} position position ignored fields
* @property {String[]} order order ignored fields
*/ /**
* Hashing ignored field lists
* @typedef {Object} HashingIgnoredFieldLists
* @property {TypeHashingIgnoredFieldLists} g1 g1 hashing ignored field lists
* @property {TypeHashingIgnoredFieldLists} g2 g2 hashing ignored field lists
*/ /**
* Refreshes hashing ignored field lists
* @param {String} region account region
* @returns {Promise} promise resolving when the hashing field lists are updated.
*/ async refreshIgnoredFieldLists(region) {
if (this._ignoredFieldListsCaches[region] && this._ignoredFieldListsCaches[region].requestPromise) {
await this._ignoredFieldListsCaches[region].requestPromise;
} else if (this._ignoredFieldListsCaches[region] && Date.now() - this._ignoredFieldListsCaches[region].lastUpdated < this._updateInterval) {
return;
} else {
if (!this._ignoredFieldListsCaches[region]) {
this._ignoredFieldListsCaches[region] = {
lastUpdated: 0,
data: null,
requestPromise: null,
updateJob: setInterval(()=>this._refreshIgnoredFieldListsJob(region), 60000)
};
}
let resolve, reject;
this._ignoredFieldListsCaches[region].requestPromise = new Promise((res, rej)=>{
resolve = res, reject = rej;
});
let isCacheUpdated = false;
while(!isCacheUpdated){
try {
const host = await this._domainClient.getUrl(this._host, region);
const opts = {
url: `${host}/hashing-ignored-field-lists`,
method: "GET",
json: true,
headers: {
"auth-token": this._token
}
};
const response = await this._httpClient.request(opts, "getHashingIgnoredFieldLists");
this._ignoredFieldListsCaches[region] = {
lastUpdated: Date.now(),
data: response,
requestPromise: null
};
this._ignoredFieldListsFreshestCache = response;
resolve(response);
isCacheUpdated = true;
this._ignoredFieldListsCaches[region].retryIntervalInSeconds = this._retryIntervalInSeconds;
} catch (err) {
this._logger.error("Failed to update hashing ignored field list", err);
this._ignoredFieldListsCaches[region].retryIntervalInSeconds = Math.min(this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 2, 300);
await new Promise((res)=>setTimeout(res, this._ignoredFieldListsCaches[region].retryIntervalInSeconds * 1000));
}
}
}
}
/**
* Retrieves hashing ignored field lists
* @param {String} region account region
* @returns {HashingIgnoredFieldLists} promise resolving with hashing ignored field lists
*/ getHashingIgnoredFieldLists(region) {
if (region === "combined") {
if (this._ignoredFieldListsFreshestCache) {
return this._ignoredFieldListsFreshestCache;
} else {
throw new _errorHandler.NotFoundError("Ignored field lists not found");
}
}
if (this._ignoredFieldListsCaches[region] && this._ignoredFieldListsCaches[region].data) {
return this._ignoredFieldListsCaches[region].data;
} else {
throw new _errorHandler.NotFoundError(`Ignored field lists for region ${region} not found`);
}
}
async _refreshIgnoredFieldListsJob(region) {
if (!this._ignoredFieldListsCaches[region].requestPromise && Date.now() - this._ignoredFieldListsCaches[region].lastUpdated > this._updateInterval) {
await this.refreshIgnoredFieldLists(region);
}
}
/**
* Constructs client API client instance
* @param {HttpClient} httpClient HTTP client
* @param {DomainClient} domainClient domain client
*/ constructor(httpClient, domainClient){
super(httpClient, domainClient);
_define_property(this, "_retryIntervalInSeconds", void 0);
_define_property(this, "_updateInterval", void 0);
_define_property(this, "_ignoredFieldListsCaches", void 0);
_define_property(this, "_ignoredFieldListsFreshestCache", void 0);
_define_property(this, "_logger", void 0);
this._host = "https://mt-client-api-v1";
this._retryIntervalInSeconds = 1;
this._updateInterval = 60 * 60 * 1000;
this._ignoredFieldListsCaches = {};
this._ignoredFieldListsFreshestCache = null;
this._logger = _logger.default.getLogger("ClientApiClient");
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBNZXRhQXBpQ2xpZW50IGZyb20gJy4uL21ldGFBcGkuY2xpZW50JztcbmltcG9ydCBMb2dnZXJNYW5hZ2VyLCB7TG9nZ2VyfSBmcm9tICcuLi8uLi9sb2dnZXInO1xuaW1wb3J0IHtOb3RGb3VuZEVycm9yfSBmcm9tICcuLi9lcnJvckhhbmRsZXInO1xuaW1wb3J0IEh0dHBDbGllbnQgZnJvbSAnLi4vaHR0cENsaWVudCc7XG5pbXBvcnQgRG9tYWluQ2xpZW50IGZyb20gJy4uL2RvbWFpbi5jbGllbnQnO1xuXG4vKipcbiAqIG1ldGFhcGkuY2xvdWQgY2xpZW50IEFQSSBjbGllbnQgKHNlZSBodHRwczovL21ldGFhcGkuY2xvdWQvZG9jcy9jbGllbnQvKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDbGllbnRBcGlDbGllbnQgZXh0ZW5kcyBNZXRhQXBpQ2xpZW50IHtcbiAgXG4gIHByaXZhdGUgX3JldHJ5SW50ZXJ2YWxJblNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdXBkYXRlSW50ZXJ2YWw6IG51bWJlcjtcbiAgcHJpdmF0ZSBfaWdub3JlZEZpZWxkTGlzdHNDYWNoZXM6IHt9O1xuICBwcml2YXRlIF9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGU6IG51bGw7XG4gIHByaXZhdGUgX2xvZ2dlcjogTG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGNsaWVudCBBUEkgY2xpZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7SHR0cENsaWVudH0gaHR0cENsaWVudCBIVFRQIGNsaWVudFxuICAgKiBAcGFyYW0ge0RvbWFpbkNsaWVudH0gZG9tYWluQ2xpZW50IGRvbWFpbiBjbGllbnRcbiAgICovXG4gIGNvbnN0cnVjdG9yKGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIGRvbWFpbkNsaWVudDogRG9tYWluQ2xpZW50KSB7XG4gICAgc3VwZXIoaHR0cENsaWVudCwgZG9tYWluQ2xpZW50KTtcbiAgICB0aGlzLl9ob3N0ID0gJ2h0dHBzOi8vbXQtY2xpZW50LWFwaS12MSc7XG4gICAgdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcyA9IDE7XG4gICAgdGhpcy5fdXBkYXRlSW50ZXJ2YWwgPSA2MCAqIDYwICogMTAwMDtcbiAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlcyA9IHt9O1xuICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZSA9IG51bGw7XG4gICAgdGhpcy5fbG9nZ2VyID0gTG9nZ2VyTWFuYWdlci5nZXRMb2dnZXIoJ0NsaWVudEFwaUNsaWVudCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IFR5cGVIYXNoaW5nSWdub3JlZEZpZWxkTGlzdHNcbiAgICogQHByb3BlcnR5IHtTdHJpbmdbXX0gc3BlY2lmaWNhdGlvbiBzcGVjaWZpY2F0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IHBvc2l0aW9uIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nW119IG9yZGVyIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBIYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHR5cGVkZWYge09iamVjdH0gSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzEgZzEgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwcm9wZXJ0eSB7VHlwZUhhc2hpbmdJZ25vcmVkRmllbGRMaXN0c30gZzIgZzIgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgaGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gICAqIEBwYXJhbSB7U3RyaW5nfSByZWdpb24gYWNjb3VudCByZWdpb25cbiAgICogQHJldHVybnMge1Byb21pc2V9IHByb21pc2UgcmVzb2x2aW5nIHdoZW4gdGhlIGhhc2hpbmcgZmllbGQgbGlzdHMgYXJlIHVwZGF0ZWQuXG4gICAqL1xuICBhc3luYyByZWZyZXNoSWdub3JlZEZpZWxkTGlzdHMocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSkge1xuICAgICAgYXdhaXQgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gJiYgXG4gICAgICBEYXRlLm5vdygpIC0gdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5sYXN0VXBkYXRlZCA8IHRoaXMuX3VwZGF0ZUludGVydmFsKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKCF0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dKSB7XG4gICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7XG4gICAgICAgICAgbGFzdFVwZGF0ZWQ6IDAsXG4gICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICByZXF1ZXN0UHJvbWlzZTogbnVsbCxcbiAgICAgICAgICB1cGRhdGVKb2I6IHNldEludGVydmFsKCgpID0+IHRoaXMuX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pLCA2MDAwMClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGxldCByZXNvbHZlLCByZWplY3Q7XG4gICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJlcXVlc3RQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSByZXMsIHJlamVjdCA9IHJlajtcbiAgICAgIH0pO1xuICAgICAgbGV0IGlzQ2FjaGVVcGRhdGVkID0gZmFsc2U7XG4gICAgICB3aGlsZSghaXNDYWNoZVVwZGF0ZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBob3N0ID0gYXdhaXQgdGhpcy5fZG9tYWluQ2xpZW50LmdldFVybCh0aGlzLl9ob3N0LCByZWdpb24pO1xuICAgICAgICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICAgICAgICB1cmw6IGAke2hvc3R9L2hhc2hpbmctaWdub3JlZC1maWVsZC1saXN0c2AsXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAganNvbjogdHJ1ZSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl90b2tlblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLl9odHRwQ2xpZW50LnJlcXVlc3Qob3B0cywgJ2dldEhhc2hpbmdJZ25vcmVkRmllbGRMaXN0cycpO1xuICAgICAgICAgIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0gPSB7IGxhc3RVcGRhdGVkOiBEYXRlLm5vdygpLCBkYXRhOiByZXNwb25zZSwgcmVxdWVzdFByb21pc2U6IG51bGwgfTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUgPSByZXNwb25zZTtcbiAgICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgICBpc0NhY2hlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzID0gdGhpcy5fcmV0cnlJbnRlcnZhbEluU2Vjb25kcztcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gdXBkYXRlIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0JywgZXJyKTtcbiAgICAgICAgICB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLnJldHJ5SW50ZXJ2YWxJblNlY29uZHMgPVxuICAgICAgICAgICAgTWF0aC5taW4odGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMiwgMzAwKTtcbiAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gc2V0VGltZW91dChyZXMsIFxuICAgICAgICAgICAgdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXRyeUludGVydmFsSW5TZWNvbmRzICogMTAwMCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHJlZ2lvbiBhY2NvdW50IHJlZ2lvblxuICAgKiBAcmV0dXJucyB7SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzfSBwcm9taXNlIHJlc29sdmluZyB3aXRoIGhhc2hpbmcgaWdub3JlZCBmaWVsZCBsaXN0c1xuICAgKi9cbiAgZ2V0SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbjogc3RyaW5nKTogSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzIHtcbiAgICBpZihyZWdpb24gPT09ICdjb21iaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0ZyZXNoZXN0Q2FjaGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZTtcbiAgICAgIH0gZWxzZXsgXG4gICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKCdJZ25vcmVkIGZpZWxkIGxpc3RzIG5vdCBmb3VuZCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZih0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dICYmIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2lnbm9yZWRGaWVsZExpc3RzQ2FjaGVzW3JlZ2lvbl0uZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYElnbm9yZWQgZmllbGQgbGlzdHMgZm9yIHJlZ2lvbiAke3JlZ2lvbn0gbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3JlZnJlc2hJZ25vcmVkRmllbGRMaXN0c0pvYihyZWdpb24pIHtcbiAgICBpZighdGhpcy5faWdub3JlZEZpZWxkTGlzdHNDYWNoZXNbcmVnaW9uXS5yZXF1ZXN0UHJvbWlzZSAmJiBcbiAgICAgIERhdGUubm93KCkgLSB0aGlzLl9pZ25vcmVkRmllbGRMaXN0c0NhY2hlc1tyZWdpb25dLmxhc3RVcGRhdGVkID4gdGhpcy5fdXBkYXRlSW50ZXJ2YWwpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVmcmVzaElnbm9yZWRGaWVsZExpc3RzKHJlZ2lvbik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVHlwZSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAqL1xuZXhwb3J0IGRlY2xhcmUgdHlwZSBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBzcGVjaWZpY2F0aW9ucyBpZ25vcmVkIGZpZWxkc1xuICAgKi9cbiAgc3BlY2lmaWNhdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIHBvc2l0aW9uIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBwb3NpdGlvbjogc3RyaW5nW10sXG5cbiAgLyoqXG4gICAqIG9yZGVyIGlnbm9yZWQgZmllbGRzXG4gICAqL1xuICBvcmRlcjogc3RyaW5nW10sXG59XG5cbi8qKlxuICogSGFzaGluZyBpZ25vcmVkIGZpZWxkIGxpc3RzXG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzID0ge1xuXG4gIC8qKlxuICAgKiBnMSBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcxOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxuXG4gIC8qKlxuICAgKiBnMiBoYXNoaW5nIGlnbm9yZWQgZmllbGQgbGlzdHNcbiAgICovXG4gIGcyOiBUeXBlSGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzLFxufVxuIl0sIm5hbWVzIjpbIkNsaWVudEFwaUNsaWVudCIsIk1ldGFBcGlDbGllbnQiLCJyZWZyZXNoSWdub3JlZEZpZWxkTGlzdHMiLCJyZWdpb24iLCJfaWdub3JlZEZpZWxkTGlzdHNDYWNoZXMiLCJyZXF1ZXN0UHJvbWlzZSIsIkRhdGUiLCJub3ciLCJsYXN0VXBkYXRlZCIsIl91cGRhdGVJbnRlcnZhbCIsImRhdGEiLCJ1cGRhdGVKb2IiLCJzZXRJbnRlcnZhbCIsIl9yZWZyZXNoSWdub3JlZEZpZWxkTGlzdHNKb2IiLCJyZXNvbHZlIiwicmVqZWN0IiwiUHJvbWlzZSIsInJlcyIsInJlaiIsImlzQ2FjaGVVcGRhdGVkIiwiaG9zdCIsIl9kb21haW5DbGllbnQiLCJnZXRVcmwiLCJfaG9zdCIsIm9wdHMiLCJ1cmwiLCJtZXRob2QiLCJqc29uIiwiaGVhZGVycyIsIl90b2tlbiIsInJlc3BvbnNlIiwiX2h0dHBDbGllbnQiLCJyZXF1ZXN0IiwiX2lnbm9yZWRGaWVsZExpc3RzRnJlc2hlc3RDYWNoZSIsInJldHJ5SW50ZXJ2YWxJblNlY29uZHMiLCJfcmV0cnlJbnRlcnZhbEluU2Vjb25kcyIsImVyciIsIl9sb2dnZXIiLCJlcnJvciIsIk1hdGgiLCJtaW4iLCJzZXRUaW1lb3V0IiwiZ2V0SGFzaGluZ0lnbm9yZWRGaWVsZExpc3RzIiwiTm90Rm91bmRFcnJvciIsImNvbnN0cnVjdG9yIiwiaHR0cENsaWVudCIsImRvbWFpbkNsaWVudCIsIkxvZ2dlck1hbmFnZXIiLCJnZXRMb2dnZXIiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O2VBV3FCQTs7O3NFQVRLOytEQUNVOzhCQUNSOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBT2IsSUFBQSxBQUFNQSxrQkFBTixNQUFNQSx3QkFBd0JDLHNCQUFhO0lBdUJ4RDs7Ozs7O0dBTUMsR0FFRDs7Ozs7R0FLQyxHQUVEOzs7O0dBSUMsR0FDRCxNQUFNQyx5QkFBeUJDLE1BQWMsRUFBZ0I7UUFDM0QsSUFBRyxJQUFJLENBQUNDLHdCQUF3QixDQUFDRCxPQUFPLElBQUksSUFBSSxDQUFDQyx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDRSxjQUFjLEVBQUU7WUFDaEcsTUFBTSxJQUFJLENBQUNELHdCQUF3QixDQUFDRCxPQUFPLENBQUNFLGNBQWM7UUFDNUQsT0FBTyxJQUFJLElBQUksQ0FBQ0Qsd0JBQXdCLENBQUNELE9BQU8sSUFDOUNHLEtBQUtDLEdBQUcsS0FBSyxJQUFJLENBQUNILHdCQUF3QixDQUFDRCxPQUFPLENBQUNLLFdBQVcsR0FBRyxJQUFJLENBQUNDLGVBQWUsRUFBRTtZQUN2RjtRQUNGLE9BQU87WUFDTCxJQUFHLENBQUMsSUFBSSxDQUFDTCx3QkFBd0IsQ0FBQ0QsT0FBTyxFQUFFO2dCQUN6QyxJQUFJLENBQUNDLHdCQUF3QixDQUFDRCxPQUFPLEdBQUc7b0JBQ3RDSyxhQUFhO29CQUNiRSxNQUFNO29CQUNOTCxnQkFBZ0I7b0JBQ2hCTSxXQUFXQyxZQUFZLElBQU0sSUFBSSxDQUFDQyw0QkFBNEIsQ0FBQ1YsU0FBUztnQkFDMUU7WUFDRjtZQUNBLElBQUlXLFNBQVNDO1lBQ2IsSUFBSSxDQUFDWCx3QkFBd0IsQ0FBQ0QsT0FBTyxDQUFDRSxjQUFjLEdBQUcsSUFBSVcsUUFBUSxDQUFDQyxLQUFLQztn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