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)
131 lines (130 loc) • 17 kB
JavaScript
;
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
try {
var info = gen[key](arg);
var value = info.value;
} catch (error) {
reject(error);
return;
}
if (info.done) {
resolve(value);
} else {
Promise.resolve(value).then(_next, _throw);
}
}
function _async_to_generator(fn) {
return function() {
var self = this, args = arguments;
return new Promise(function(resolve, reject) {
var gen = fn.apply(self, args);
function _next(value) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
}
function _throw(err) {
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
}
_next(undefined);
});
};
}
import MetatraderAccount from './metatraderAccount';
import MetatraderAccountReplica from './metatraderAccountReplica';
let MetatraderAccountApi = class MetatraderAccountApi {
/**
* Returns trading accounts belonging to the current user, provides pagination in infinite scroll style
* @param {AccountsFilter} [accountsFilter] optional filter
* @return {Promise<Array<MetatraderAccount>>} promise resolving with MetaTrader account entities
*/ getAccountsWithInfiniteScrollPagination(accountsFilter) {
var _this = this;
return _async_to_generator(function*() {
let accounts = yield _this._metatraderAccountClient.getAccounts(accountsFilter, '1');
return accounts.map((a)=>new MetatraderAccount(a, _this._metatraderAccountClient, _this._metaApiWebsocketClient, _this._connectionRegistry, _this._expertAdvisorClient, _this._historicalMarketDataClient, _this._application));
})();
}
/**
* Returns trading accounts belonging to the current user with accounts count,
* provides pagination in a classic style
* @param {AccountsFilter} [accountsFilter] optional filter
* @return {Promise<MetatraderAccountList>} promise resolving with an array of MetaTrader account entities and count
*/ getAccountsWithClassicPagination(accountsFilter) {
var _this = this;
return _async_to_generator(function*() {
let accounts = yield _this._metatraderAccountClient.getAccounts(accountsFilter, '2');
return {
count: accounts.count,
items: accounts.items.map((a)=>new MetatraderAccount(a, _this._metatraderAccountClient, _this._metaApiWebsocketClient, _this._connectionRegistry, _this._expertAdvisorClient, _this._historicalMarketDataClient, _this._application))
};
})();
}
/**
* Returns trading account by id
* @param {string} accountId MetaTrader account id
* @return {Promise<MetatraderAccount>} promise resolving with MetaTrader account entity
*/ getAccount(accountId) {
var _this = this;
return _async_to_generator(function*() {
let account = yield _this._metatraderAccountClient.getAccount(accountId);
return new MetatraderAccount(account, _this._metatraderAccountClient, _this._metaApiWebsocketClient, _this._connectionRegistry, _this._expertAdvisorClient, _this._historicalMarketDataClient, _this._application);
})();
}
/**
* Returns trading account replica by trading account id and replica id
* @param {string} accountId MetaTrader primary account id
* @param {string} replicaId MetaTrader account replica id
* @return {Promise<MetatraderAccountReplica>} promise resolving with MetaTrader account replica found
*/ getAccountReplica(accountId, replicaId) {
var _this = this;
return _async_to_generator(function*() {
let account = yield _this._metatraderAccountClient.getAccount(accountId);
let replica = yield _this._metatraderAccountClient.getAccountReplica(accountId, replicaId);
return new MetatraderAccountReplica(replica, account, _this._metatraderAccountClient);
})();
}
/**
* Returns replicas for a trading account
* @param {string} accountId Primary account id
* @return {Promise<Array<MetatraderAccountReplica>>} promise resolving with MetaTrader account replicas found
*/ getAccountReplicas(accountId) {
var _this = this;
return _async_to_generator(function*() {
let account = yield _this._metatraderAccountClient.getAccount(accountId);
let replicas = yield _this._metatraderAccountClient.getAccountReplicas(accountId);
if (replicas.items) {
replicas = replicas.items;
}
return replicas.map((replica)=>new MetatraderAccountReplica(replica, account, _this._metatraderAccountClient));
})();
}
/**
* Adds a trading account and starts a cloud API server for the trading account
* @param {NewMetatraderAccountDto} account MetaTrader account data
* @return {Promise<MetatraderAccount>} promise resolving with created MetaTrader account entity
*/ createAccount(account) {
var _this = this;
return _async_to_generator(function*() {
let id = yield _this._metatraderAccountClient.createAccount(account);
return _this.getAccount(id.id);
})();
}
/**
* Constructs a MetaTrader account API instance
* @param {MetatraderAccountClient} metatraderAccountClient MetaTrader account REST API client
* @param {MetaApiWebsocketClient} metaApiWebsocketClient MetaApi websocket client
* @param {ConnectionRegistry} connectionRegistry metatrader account connection registry
* @param {ExpertAdvisorClient} expertAdvisorClient expert advisor REST API client
* @param {HistoricalMarketDataClient} historicalMarketDataClient historical market data HTTP API client
* @param {string} application application name
*/ constructor(metatraderAccountClient, metaApiWebsocketClient, connectionRegistry, expertAdvisorClient, historicalMarketDataClient, application){
this._metatraderAccountClient = metatraderAccountClient;
this._metaApiWebsocketClient = metaApiWebsocketClient;
this._connectionRegistry = connectionRegistry;
this._expertAdvisorClient = expertAdvisorClient;
this._historicalMarketDataClient = historicalMarketDataClient;
this._application = application;
}
};
/**
* Exposes MetaTrader account API logic to the consumers
*/ export { MetatraderAccountApi as default };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmltcG9ydCBNZXRhdHJhZGVyQWNjb3VudCBmcm9tICcuL21ldGF0cmFkZXJBY2NvdW50JztcbmltcG9ydCBNZXRhdHJhZGVyQWNjb3VudFJlcGxpY2EgZnJvbSAnLi9tZXRhdHJhZGVyQWNjb3VudFJlcGxpY2EnO1xuaW1wb3J0IHsgTWV0YXRyYWRlckFjY291bnRMaXN0IH0gZnJvbSAnLi9tZXRhdHJhZGVyQWNjb3VudEFwaSc7XG5cbi8qKlxuICogRXhwb3NlcyBNZXRhVHJhZGVyIGFjY291bnQgQVBJIGxvZ2ljIHRvIHRoZSBjb25zdW1lcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWV0YXRyYWRlckFjY291bnRBcGkge1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgTWV0YVRyYWRlciBhY2NvdW50IEFQSSBpbnN0YW5jZVxuICAgKiBAcGFyYW0ge01ldGF0cmFkZXJBY2NvdW50Q2xpZW50fSBtZXRhdHJhZGVyQWNjb3VudENsaWVudCBNZXRhVHJhZGVyIGFjY291bnQgUkVTVCBBUEkgY2xpZW50XG4gICAqIEBwYXJhbSB7TWV0YUFwaVdlYnNvY2tldENsaWVudH0gbWV0YUFwaVdlYnNvY2tldENsaWVudCBNZXRhQXBpIHdlYnNvY2tldCBjbGllbnRcbiAgICogQHBhcmFtIHtDb25uZWN0aW9uUmVnaXN0cnl9IGNvbm5lY3Rpb25SZWdpc3RyeSBtZXRhdHJhZGVyIGFjY291bnQgY29ubmVjdGlvbiByZWdpc3RyeVxuICAgKiBAcGFyYW0ge0V4cGVydEFkdmlzb3JDbGllbnR9IGV4cGVydEFkdmlzb3JDbGllbnQgZXhwZXJ0IGFkdmlzb3IgUkVTVCBBUEkgY2xpZW50XG4gICAqIEBwYXJhbSB7SGlzdG9yaWNhbE1hcmtldERhdGFDbGllbnR9IGhpc3RvcmljYWxNYXJrZXREYXRhQ2xpZW50IGhpc3RvcmljYWwgbWFya2V0IGRhdGEgSFRUUCBBUEkgY2xpZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiBuYW1lXG4gICAqL1xuICBjb25zdHJ1Y3RvcihtZXRhdHJhZGVyQWNjb3VudENsaWVudCwgbWV0YUFwaVdlYnNvY2tldENsaWVudCwgY29ubmVjdGlvblJlZ2lzdHJ5LCBleHBlcnRBZHZpc29yQ2xpZW50LCBcbiAgICBoaXN0b3JpY2FsTWFya2V0RGF0YUNsaWVudCwgYXBwbGljYXRpb24pIHtcbiAgICB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudCA9IG1ldGF0cmFkZXJBY2NvdW50Q2xpZW50O1xuICAgIHRoaXMuX21ldGFBcGlXZWJzb2NrZXRDbGllbnQgPSBtZXRhQXBpV2Vic29ja2V0Q2xpZW50O1xuICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeSA9IGNvbm5lY3Rpb25SZWdpc3RyeTtcbiAgICB0aGlzLl9leHBlcnRBZHZpc29yQ2xpZW50ID0gZXhwZXJ0QWR2aXNvckNsaWVudDtcbiAgICB0aGlzLl9oaXN0b3JpY2FsTWFya2V0RGF0YUNsaWVudCA9IGhpc3RvcmljYWxNYXJrZXREYXRhQ2xpZW50O1xuICAgIHRoaXMuX2FwcGxpY2F0aW9uID0gYXBwbGljYXRpb247XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cmFkaW5nIGFjY291bnRzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCB1c2VyLCBwcm92aWRlcyBwYWdpbmF0aW9uIGluIGluZmluaXRlIHNjcm9sbCBzdHlsZVxuICAgKiBAcGFyYW0ge0FjY291bnRzRmlsdGVyfSBbYWNjb3VudHNGaWx0ZXJdIG9wdGlvbmFsIGZpbHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEFycmF5PE1ldGF0cmFkZXJBY2NvdW50Pj59IHByb21pc2UgcmVzb2x2aW5nIHdpdGggTWV0YVRyYWRlciBhY2NvdW50IGVudGl0aWVzXG4gICAqL1xuICBhc3luYyBnZXRBY2NvdW50c1dpdGhJbmZpbml0ZVNjcm9sbFBhZ2luYXRpb24oYWNjb3VudHNGaWx0ZXIpIHtcbiAgICBsZXQgYWNjb3VudHMgPSBhd2FpdCB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudC5nZXRBY2NvdW50cyhhY2NvdW50c0ZpbHRlciwgJzEnKTtcbiAgICByZXR1cm4gYWNjb3VudHMubWFwKGEgPT4gbmV3IE1ldGF0cmFkZXJBY2NvdW50KGEsIHRoaXMuX21ldGF0cmFkZXJBY2NvdW50Q2xpZW50LCB0aGlzLl9tZXRhQXBpV2Vic29ja2V0Q2xpZW50LCBcbiAgICAgIHRoaXMuX2Nvbm5lY3Rpb25SZWdpc3RyeSwgdGhpcy5fZXhwZXJ0QWR2aXNvckNsaWVudCwgdGhpcy5faGlzdG9yaWNhbE1hcmtldERhdGFDbGllbnQsIHRoaXMuX2FwcGxpY2F0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cmFkaW5nIGFjY291bnRzIGJlbG9uZ2luZyB0byB0aGUgY3VycmVudCB1c2VyIHdpdGggYWNjb3VudHMgY291bnQsXG4gICAqIHByb3ZpZGVzIHBhZ2luYXRpb24gaW4gYSBjbGFzc2ljIHN0eWxlXG4gICAqIEBwYXJhbSB7QWNjb3VudHNGaWx0ZXJ9IFthY2NvdW50c0ZpbHRlcl0gb3B0aW9uYWwgZmlsdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TWV0YXRyYWRlckFjY291bnRMaXN0Pn0gcHJvbWlzZSByZXNvbHZpbmcgd2l0aCBhbiBhcnJheSBvZiBNZXRhVHJhZGVyIGFjY291bnQgZW50aXRpZXMgYW5kIGNvdW50XG4gICAqL1xuICBhc3luYyBnZXRBY2NvdW50c1dpdGhDbGFzc2ljUGFnaW5hdGlvbihhY2NvdW50c0ZpbHRlcikge1xuICAgIGxldCBhY2NvdW50cyA9IGF3YWl0IHRoaXMuX21ldGF0cmFkZXJBY2NvdW50Q2xpZW50LmdldEFjY291bnRzKGFjY291bnRzRmlsdGVyLCAnMicpO1xuICAgIHJldHVybiB7XG4gICAgICBjb3VudDogYWNjb3VudHMuY291bnQsXG4gICAgICBpdGVtczogYWNjb3VudHMuaXRlbXMubWFwKGEgPT4gbmV3IE1ldGF0cmFkZXJBY2NvdW50KGEsIHRoaXMuX21ldGF0cmFkZXJBY2NvdW50Q2xpZW50LCBcbiAgICAgICAgdGhpcy5fbWV0YUFwaVdlYnNvY2tldENsaWVudCwgdGhpcy5fY29ubmVjdGlvblJlZ2lzdHJ5LCB0aGlzLl9leHBlcnRBZHZpc29yQ2xpZW50LCBcbiAgICAgICAgdGhpcy5faGlzdG9yaWNhbE1hcmtldERhdGFDbGllbnQsIHRoaXMuX2FwcGxpY2F0aW9uKSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJhZGluZyBhY2NvdW50IGJ5IGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NvdW50SWQgTWV0YVRyYWRlciBhY2NvdW50IGlkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TWV0YXRyYWRlckFjY291bnQ+fSBwcm9taXNlIHJlc29sdmluZyB3aXRoIE1ldGFUcmFkZXIgYWNjb3VudCBlbnRpdHlcbiAgICovXG4gIGFzeW5jIGdldEFjY291bnQoYWNjb3VudElkKSB7XG4gICAgbGV0IGFjY291bnQgPSBhd2FpdCB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudC5nZXRBY2NvdW50KGFjY291bnRJZCk7XG4gICAgcmV0dXJuIG5ldyBNZXRhdHJhZGVyQWNjb3VudChhY2NvdW50LCB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudCwgdGhpcy5fbWV0YUFwaVdlYnNvY2tldENsaWVudCwgXG4gICAgICB0aGlzLl9jb25uZWN0aW9uUmVnaXN0cnksICB0aGlzLl9leHBlcnRBZHZpc29yQ2xpZW50LCB0aGlzLl9oaXN0b3JpY2FsTWFya2V0RGF0YUNsaWVudCwgdGhpcy5fYXBwbGljYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJhZGluZyBhY2NvdW50IHJlcGxpY2EgYnkgdHJhZGluZyBhY2NvdW50IGlkIGFuZCByZXBsaWNhIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NvdW50SWQgTWV0YVRyYWRlciBwcmltYXJ5IGFjY291bnQgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGxpY2FJZCBNZXRhVHJhZGVyIGFjY291bnQgcmVwbGljYSBpZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1ldGF0cmFkZXJBY2NvdW50UmVwbGljYT59IHByb21pc2UgcmVzb2x2aW5nIHdpdGggTWV0YVRyYWRlciBhY2NvdW50IHJlcGxpY2EgZm91bmRcbiAgICovXG4gIGFzeW5jIGdldEFjY291bnRSZXBsaWNhKGFjY291bnRJZCwgcmVwbGljYUlkKSB7XG4gICAgbGV0IGFjY291bnQgPSBhd2FpdCB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudC5nZXRBY2NvdW50KGFjY291bnRJZCk7XG4gICAgbGV0IHJlcGxpY2EgPSBhd2FpdCB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudC5nZXRBY2NvdW50UmVwbGljYShhY2NvdW50SWQsIHJlcGxpY2FJZCk7XG4gICAgcmV0dXJuIG5ldyBNZXRhdHJhZGVyQWNjb3VudFJlcGxpY2EocmVwbGljYSwgYWNjb3VudCwgdGhpcy5fbWV0YXRyYWRlckFjY291bnRDbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgcmVwbGljYXMgZm9yIGEgdHJhZGluZyBhY2NvdW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhY2NvdW50SWQgUHJpbWFyeSBhY2NvdW50IGlkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8TWV0YXRyYWRlckFjY291bnRSZXBsaWNhPj59IHByb21pc2UgcmVzb2x2aW5nIHdpdGggTWV0YVRyYWRlciBhY2NvdW50IHJlcGxpY2FzIGZvdW5kXG4gICAqL1xuICBhc3luYyBnZXRBY2NvdW50UmVwbGljYXMoYWNjb3VudElkKSB7XG4gICAgbGV0IGFjY291bnQgPSBhd2FpdCB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudC5nZXRBY2NvdW50KGFjY291bnRJZCk7XG4gICAgbGV0IHJlcGxpY2FzID0gYXdhaXQgdGhpcy5fbWV0YXRyYWRlckFjY291bnRDbGllbnQuZ2V0QWNjb3VudFJlcGxpY2FzKGFjY291bnRJZCk7XG4gICAgaWYgKHJlcGxpY2FzLml0ZW1zKSB7XG4gICAgICByZXBsaWNhcyA9IHJlcGxpY2FzLml0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gcmVwbGljYXMubWFwKHJlcGxpY2EgPT4gbmV3IE1ldGF0cmFkZXJBY2NvdW50UmVwbGljYShyZXBsaWNhLCBhY2NvdW50LCB0aGlzLl9tZXRhdHJhZGVyQWNjb3VudENsaWVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0cmFkaW5nIGFjY291bnQgYW5kIHN0YXJ0cyBhIGNsb3VkIEFQSSBzZXJ2ZXIgZm9yIHRoZSB0cmFkaW5nIGFjY291bnRcbiAgICogQHBhcmFtIHtOZXdNZXRhdHJhZGVyQWNjb3VudER0b30gYWNjb3VudCBNZXRhVHJhZGVyIGFjY291bnQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1ldGF0cmFkZXJBY2NvdW50Pn0gcHJvbWlzZSByZXNvbHZpbmcgd2l0aCBjcmVhdGVkIE1ldGFUcmFkZXIgYWNjb3VudCBlbnRpdHlcbiAgICovXG4gIGFzeW5jIGNyZWF0ZUFjY291bnQoYWNjb3VudCkge1xuICAgIGxldCBpZCA9IGF3YWl0IHRoaXMuX21ldGF0cmFkZXJBY2NvdW50Q2xpZW50LmNyZWF0ZUFjY291bnQoYWNjb3VudCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWNjb3VudChpZC5pZCk7XG4gIH1cblxufVxuIl0sIm5hbWVzIjpbIk1ldGF0cmFkZXJBY2NvdW50IiwiTWV0YXRyYWRlckFjY291bnRSZXBsaWNhIiwiTWV0YXRyYWRlckFjY291bnRBcGkiLCJnZXRBY2NvdW50c1dpdGhJbmZpbml0ZVNjcm9sbFBhZ2luYXRpb24iLCJhY2NvdW50c0ZpbHRlciIsImFjY291bnRzIiwiX21ldGF0cmFkZXJBY2NvdW50Q2xpZW50IiwiZ2V0QWNjb3VudHMiLCJtYXAiLCJhIiwiX21ldGFBcGlXZWJzb2NrZXRDbGllbnQiLCJfY29ubmVjdGlvblJlZ2lzdHJ5IiwiX2V4cGVydEFkdmlzb3JDbGllbnQiLCJfaGlzdG9yaWNhbE1hcmtldERhdGFDbGllbnQiLCJfYXBwbGljYXRpb24iLCJnZXRBY2NvdW50c1dpdGhDbGFzc2ljUGFnaW5hdGlvbiIsImNvdW50IiwiaXRlbXMiLCJnZXRBY2NvdW50IiwiYWNjb3VudElkIiwiYWNjb3VudCIsImdldEFjY291bnRSZXBsaWNhIiwicmVwbGljYUlkIiwicmVwbGljYSIsImdldEFjY291bnRSZXBsaWNhcyIsInJlcGxpY2FzIiwiY3JlYXRlQWNjb3VudCIsImlkIiwiY29uc3RydWN0b3IiLCJtZXRhdHJhZGVyQWNjb3VudENsaWVudCIsIm1ldGFBcGlXZWJzb2NrZXRDbGllbnQiLCJjb25uZWN0aW9uUmVnaXN0cnkiLCJleHBlcnRBZHZpc29yQ2xpZW50IiwiaGlzdG9yaWNhbE1hcmtldERhdGFDbGllbnQiLCJhcHBsaWNhdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLE9BQU9BLHVCQUF1QixzQkFBc0I7QUFDcEQsT0FBT0MsOEJBQThCLDZCQUE2QjtBQU1uRCxJQUFBLEFBQU1DLHVCQUFOLE1BQU1BO0lBcUJuQjs7OztHQUlDLEdBQ0QsQUFBTUMsd0NBQXdDQyxjQUFjOztlQUE1RCxvQkFBQTtZQUNFLElBQUlDLFdBQVcsTUFBTSxNQUFLQyx3QkFBd0IsQ0FBQ0MsV0FBVyxDQUFDSCxnQkFBZ0I7WUFDL0UsT0FBT0MsU0FBU0csR0FBRyxDQUFDQyxDQUFBQSxJQUFLLElBQUlULGtCQUFrQlMsR0FBRyxNQUFLSCx3QkFBd0IsRUFBRSxNQUFLSSx1QkFBdUIsRUFDM0csTUFBS0MsbUJBQW1CLEVBQUUsTUFBS0Msb0JBQW9CLEVBQUUsTUFBS0MsMkJBQTJCLEVBQUUsTUFBS0MsWUFBWTtRQUM1Rzs7SUFFQTs7Ozs7R0FLQyxHQUNELEFBQU1DLGlDQUFpQ1gsY0FBYzs7ZUFBckQsb0JBQUE7WUFDRSxJQUFJQyxXQUFXLE1BQU0sTUFBS0Msd0JBQXdCLENBQUNDLFdBQVcsQ0FBQ0gsZ0JBQWdCO1lBQy9FLE9BQU87Z0JBQ0xZLE9BQU9YLFNBQVNXLEtBQUs7Z0JBQ3JCQyxPQUFPWixTQUFTWSxLQUFLLENBQUNULEdBQUcsQ0FBQ0MsQ0FBQUEsSUFBSyxJQUFJVCxrQkFBa0JTLEdBQUcsTUFBS0gsd0JBQXdCLEVBQ25GLE1BQUtJLHVCQUF1QixFQUFFLE1BQUtDLG1CQUFtQixFQUFFLE1BQUtDLG9CQUFvQixFQUNqRixNQUFLQywyQkFBMkIsRUFBRSxNQUFLQyxZQUFZO1lBQ3ZEO1FBQ0Y7O0lBRUE7Ozs7R0FJQyxHQUNELEFBQU1JLFdBQVdDLFNBQVM7O2VBQTFCLG9CQUFBO1lBQ0UsSUFBSUMsVUFBVSxNQUFNLE1BQUtkLHdCQUF3QixDQUFDWSxVQUFVLENBQUNDO1lBQzdELE9BQU8sSUFBSW5CLGtCQUFrQm9CLFNBQVMsTUFBS2Qsd0JBQXdCLEVBQUUsTUFBS0ksdUJBQXVCLEVBQy9GLE1BQUtDLG1CQUFtQixFQUFHLE1BQUtDLG9CQUFvQixFQUFFLE1BQUtDLDJCQUEyQixFQUFFLE1BQUtDLFlBQVk7UUFDN0c7O0lBRUE7Ozs7O0dBS0MsR0FDRCxBQUFNTyxrQkFBa0JGLFNBQVMsRUFBRUcsU0FBUzs7ZUFBNUMsb0JBQUE7WUFDRSxJQUFJRixVQUFVLE1BQU0sTUFBS2Qsd0JBQXdCLENBQUNZLFVBQVUsQ0FBQ0M7WUFDN0QsSUFBSUksVUFBVSxNQUFNLE1BQUtqQix3QkFBd0IsQ0FBQ2UsaUJBQWlCLENBQUNGLFdBQVdHO1lBQy9FLE9BQU8sSUFBSXJCLHlCQUF5QnNCLFNBQVNILFNBQVMsTUFBS2Qsd0JBQXdCO1FBQ3JGOztJQUVBOzs7O0dBSUMsR0FDRCxBQUFNa0IsbUJBQW1CTCxTQUFTOztlQUFsQyxvQkFBQTtZQUNFLElBQUlDLFVBQVUsTUFBTSxNQUFLZCx3QkFBd0IsQ0FBQ1ksVUFBVSxDQUFDQztZQUM3RCxJQUFJTSxXQUFXLE1BQU0sTUFBS25CLHdCQUF3QixDQUFDa0Isa0JBQWtCLENBQUNMO1lBQ3RFLElBQUlNLFNBQVNSLEtBQUssRUFBRTtnQkFDbEJRLFdBQVdBLFNBQVNSLEtBQUs7WUFDM0I7WUFDQSxPQUFPUSxTQUFTakIsR0FBRyxDQUFDZSxDQUFBQSxVQUFXLElBQUl0Qix5QkFBeUJzQixTQUFTSCxTQUFTLE1BQUtkLHdCQUF3QjtRQUM3Rzs7SUFFQTs7OztHQUlDLEdBQ0QsQUFBTW9CLGNBQWNOLE9BQU87O2VBQTNCLG9CQUFBO1lBQ0UsSUFBSU8sS0FBSyxNQUFNLE1BQUtyQix3QkFBd0IsQ0FBQ29CLGFBQWEsQ0FBQ047WUFDM0QsT0FBTyxNQUFLRixVQUFVLENBQUNTLEdBQUdBLEVBQUU7UUFDOUI7O0lBM0ZBOzs7Ozs7OztHQVFDLEdBQ0RDLFlBQVlDLHVCQUF1QixFQUFFQyxzQkFBc0IsRUFBRUMsa0JBQWtCLEVBQUVDLG1CQUFtQixFQUNsR0MsMEJBQTBCLEVBQUVDLFdBQVcsQ0FBRTtRQUN6QyxJQUFJLENBQUM1Qix3QkFBd0IsR0FBR3VCO1FBQ2hDLElBQUksQ0FBQ25CLHVCQUF1QixHQUFHb0I7UUFDL0IsSUFBSSxDQUFDbkIsbUJBQW1CLEdBQUdvQjtRQUMzQixJQUFJLENBQUNuQixvQkFBb0IsR0FBR29CO1FBQzVCLElBQUksQ0FBQ25CLDJCQUEyQixHQUFHb0I7UUFDbkMsSUFBSSxDQUFDbkIsWUFBWSxHQUFHb0I7SUFDdEI7QUE0RUY7QUFsR0E7O0NBRUMsR0FDRCxTQUFxQmhDLGtDQStGcEIifQ==