@ema/js-base-library
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.
485 lines • 34.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
var BaseApi = /** @class */ (function () {
function BaseApi() {
this.headers = {};
this.routes = {};
this.baseUrl = '/api';
this.idField = 'id';
this.requestCredentials = 'same-origin'; // include, same-origin, *omit (default)
// include, same-origin, *omit (default)
this.corsMode = 'same-origin'; // no-cors, cors, *same-origin (default)
// no-cors, cors, *same-origin (default)
this.cachePolicy = 'no-cache'; // *default, no-cache, reload, force-cache, only-if-cached
this.entities = {};
this.hasDebugger = false;
}
/**
* @param {?} settings
* @return {?}
*/
BaseApi.prototype.init = /**
* @param {?} settings
* @return {?}
*/
function (settings) {
var _this = this;
this.settings = settings;
if (this.settings.host) {
this.baseUrl = settings.host;
}
if (this.settings.routes) {
this.initApiRoutes(this.settings.routes);
}
if (this.settings.headers) {
/** @type {?} */
var self_1 = this;
this.settings.headers.forEach((/**
* @param {?} obj
* @return {?}
*/
function (obj) {
for (var k in obj) {
self_1.headers[k] = obj[k];
}
}));
}
if (this['httpHeaders']) {
// AngularJs only
Object.keys(this.headers).forEach((/**
* @param {?} k
* @return {?}
*/
function (k) {
_this['httpHeaders'].set(k, _this.headers[k]);
}));
}
// if ('withCredentials' in new XMLHttpRequest) {
// this.cors = true;
// }
};
;
/**
* @param {?} url
* @return {?}
*/
BaseApi.prototype.route = /**
* @param {?} url
* @return {?}
*/
function (url) {
var _this = this;
/** @type {?} */
var mappedUrl;
Object.keys(this.routes).forEach((/**
* @param {?} k
* @return {?}
*/
function (k) {
if (k === url) {
mappedUrl = _this.routes[k];
}
}));
if (mappedUrl) {
return mappedUrl;
}
else {
return url;
}
};
// CRUD
// CRUD
/**
* @param {?} path
* @param {?} data
* @return {?}
*/
BaseApi.prototype.post =
// CRUD
/**
* @param {?} path
* @param {?} data
* @return {?}
*/
function (path, data) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
var result;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fetch("" + this.baseUrl + path, {
body: JSON.stringify(data),
// must match 'Content-Type' header
cache: this.cachePolicy,
credentials: this.requestCredentials,
headers: this.headers,
mode: this.corsMode,
method: 'POST',
})
.then((/**
* @param {?} response
* @return {?}
*/
function (response) {
if (response.status >= 400) {
console.log(response);
console.error('Bad response from server');
return response;
}
return response.json();
}))
.catch(this.errorHandler)
.then((/**
* @param {?} data
* @return {?}
*/
function (data) {
return data;
}))];
case 1:
result = _a.sent();
return [2 /*return*/, result];
}
});
});
};
/**
* @param {?} path
* @param {?=} params
* @return {?}
*/
BaseApi.prototype.get = /**
* @param {?} path
* @param {?=} params
* @return {?}
*/
function (path, params) {
if (params === void 0) { params = undefined; }
return tslib_1.__awaiter(this, void 0, void 0, function () {
var result;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
if (params) {
path += '?';
Object.keys(params).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) { return path += key + '=' + params[key] + '&'; }));
}
return [4 /*yield*/, fetch("" + this.baseUrl + path, {
cache: this.cachePolicy,
credentials: this.requestCredentials,
headers: this.headers,
mode: this.corsMode,
method: 'GET',
}).then((/**
* @param {?} response
* @return {?}
*/
function (response) {
if (response.status >= 400) {
console.log(response);
console.log('Bad response from server');
return response;
}
return response.json();
}))
.catch(this.errorHandler)
.then((/**
* @param {?} data
* @return {?}
*/
function (data) {
return data;
}))];
case 1:
result = _a.sent();
return [2 /*return*/, result];
}
});
});
};
// todo: patch
// todo: patch
/**
* @param {?} path
* @param {?} id
* @param {?} data
* @return {?}
*/
BaseApi.prototype.patch =
// todo: patch
/**
* @param {?} path
* @param {?} id
* @param {?} data
* @return {?}
*/
function (path, id, data) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, fetch("" + this.baseUrl + path + "/" + id, {
headers: this.headers,
// method: 'PATCH',
method: 'patch',
body: JSON.stringify(data)
})];
case 1:
_a.sent();
return [2 /*return*/];
}
});
});
};
// fixme: causes php server error on drupal content page
// fixme: causes php server error on drupal content page
/**
* @param {?} path
* @param {?} id
* @return {?}
*/
BaseApi.prototype.delete =
// fixme: causes php server error on drupal content page
/**
* @param {?} path
* @param {?} id
* @return {?}
*/
function (path, id) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
console.log(path, id);
return [2 /*return*/];
});
});
};
/**
* @param {?} username
* @param {?} password
* @return {?}
*/
BaseApi.prototype.login = /**
* @param {?} username
* @param {?} password
* @return {?}
*/
function (username, password) {
console.log(username, password.length);
};
/**
* @param {?=} namespace
* @param {?=} refresh
* @return {?}
*/
BaseApi.prototype.logout = /**
* @param {?=} namespace
* @param {?=} refresh
* @return {?}
*/
function (namespace, refresh) {
if (namespace === void 0) { namespace = 'app:authData'; }
if (refresh === void 0) { refresh = false; }
this.clearCredentials(namespace);
this.settings.authenticated = false;
if (refresh) {
// location.href = location.origin;
location.href = location.href;
}
};
// todo: use btoa + atob
// todo: use btoa + atob
/**
* @param {?} credentials
* @param {?=} namespace
* @return {?}
*/
BaseApi.prototype.setCredentials =
// todo: use btoa + atob
/**
* @param {?} credentials
* @param {?=} namespace
* @return {?}
*/
function (credentials, namespace) {
if (namespace === void 0) { namespace = 'app-auth'; }
this.credentials = credentials;
// window.localStorage.setItem(namespace, btoa(JSON.stringify(credentials)));
if (typeof window !== 'undefined' && window.localStorage) {
window.localStorage.setItem(namespace, JSON.stringify(credentials));
}
};
/**
* @param {?=} namespace
* @return {?}
*/
BaseApi.prototype.getCredentials = /**
* @param {?=} namespace
* @return {?}
*/
function (namespace) {
if (namespace === void 0) { namespace = 'app:authData'; }
if (typeof window !== 'undefined' && window.localStorage && window.localStorage.getItem(namespace)) {
// return JSON.parse(atob(window.localStorage.getItem(namespace)));
return JSON.parse(window.localStorage.getItem(namespace));
}
};
/**
* @param {?=} namespace
* @return {?}
*/
BaseApi.prototype.clearCredentials = /**
* @param {?=} namespace
* @return {?}
*/
function (namespace) {
if (namespace === void 0) { namespace = 'app:authData'; }
if (typeof window !== 'undefined' && window.localStorage.getItem(namespace)) {
window.localStorage.removeItem(namespace);
}
};
/**
* @param {?} routes
* @return {?}
*/
BaseApi.prototype.initApiRoutes = /**
* @param {?} routes
* @return {?}
*/
function (routes) {
/** @type {?} */
var self = this;
routes.forEach((/**
* @param {?} obj
* @return {?}
*/
function (obj) {
for (var k in obj) {
self.routes[k] = obj[k];
}
}));
if (self.settings.dev && self.settings.routes_dev) {
self.settings.routes_dev.forEach((/**
* @param {?} obj
* @return {?}
*/
function (obj) {
for (var k in obj) {
self.routes[k] = obj[k];
}
}));
}
};
// todo
// todo
/**
* @param {?} error
* @return {?}
*/
BaseApi.prototype.errorHandler =
// todo
/**
* @param {?} error
* @return {?}
*/
function (error) {
// AppService.scope.$broadcast('formError', error);
console.error(error);
if (!error) {
return;
}
// if(error.data === "token expired"){
// toastr.warning($filter('translate')('LOGIN EXPIRED')+'.');
// service.logOut();
// return;
// }
// if (error.statusText === 'Bad Request' || error.status == 400) {
// if (error.data.message) {
// toastr.warning($filter('translate')(error.data.message));
// } else {
// toastr.warning($filter('translate')('ERROR BAD REQUEST') + '.');
// }
// }
// if(error.statusText === 'Unauthorized' || error.status == 401){
// toastr.warning($filter('translate')('UNAUTHORIZED ERROR')+'.');
// service.logOut();
// return;
// }
// if(error.statusText === 'Not found' || error.status == 404){
// toastr.warning($filter('translate')('ERROR NOT FOUND')+'.');
// }
};
// entities local storage todo: move to storage.js
// entities local storage todo: move to storage.js
/**
* @param {?} resource
* @return {?}
*/
BaseApi.prototype.saveLocalResource =
// entities local storage todo: move to storage.js
/**
* @param {?} resource
* @return {?}
*/
function (resource) {
localStorage.setItem(resource[this.idField], resource);
};
/**
* @param {?} ID
* @return {?}
*/
BaseApi.prototype.loadLocalResource = /**
* @param {?} ID
* @return {?}
*/
function (ID) {
if (localStorage.getItem(ID)) {
localStorage.getItem(ID);
}
};
/**
* @param {?} ID
* @return {?}
*/
BaseApi.prototype.flushLocalResource = /**
* @param {?} ID
* @return {?}
*/
function (ID) {
if (localStorage.getItem(ID)) {
localStorage.removeItem(ID);
}
};
return BaseApi;
}());
export { BaseApi };
if (false) {
/** @type {?} */
BaseApi.prototype.headers;
/** @type {?} */
BaseApi.prototype.settings;
/** @type {?} */
BaseApi.prototype.routes;
/** @type {?} */
BaseApi.prototype.baseUrl;
/** @type {?} */
BaseApi.prototype.idField;
/** @type {?} */
BaseApi.prototype.requestCredentials;
/** @type {?} */
BaseApi.prototype.corsMode;
/** @type {?} */
BaseApi.prototype.cachePolicy;
/** @type {?} */
BaseApi.prototype.credentials;
/** @type {?} */
BaseApi.prototype.entities;
/** @type {?} */
BaseApi.prototype.hasDebugger;
/* Skipping unhandled member: ;*/
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1hcGkuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZW1hL2pzLWJhc2UtbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9iYXNlL2Jhc2UtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUE7SUFjSTtRQVpPLFlBQU8sR0FBUSxFQUFFLENBQUM7UUFFbEIsV0FBTSxHQUFHLEVBQUUsQ0FBQztRQUNaLFlBQU8sR0FBRyxNQUFNLENBQUM7UUFDakIsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLHVCQUFrQixHQUFHLGFBQWEsQ0FBQyxDQUFDLHdDQUF3Qzs7UUFDNUUsYUFBUSxHQUFHLGFBQWEsQ0FBQyxDQUFDLHdDQUF3Qzs7UUFDbEUsZ0JBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQywwREFBMEQ7UUFFcEYsYUFBUSxHQUFRLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFHLEtBQUssQ0FBQztJQUVYLENBQUM7Ozs7O0lBRVYsc0JBQUk7Ozs7SUFBWCxVQUFZLFFBQVE7UUFBcEIsaUJBeUJDO1FBeEJHLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUM7UUFDRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFOztnQkFDakIsTUFBSSxHQUFHLElBQUk7WUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTzs7OztZQUFDLFVBQUMsR0FBRztnQkFDOUIsS0FBSyxJQUFNLENBQUMsSUFBSSxHQUFHLEVBQUU7b0JBQ2pCLE1BQUksQ0FBQyxPQUFPLENBQUMs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OztJQUMxQiw4QkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJkZWNsYXJlIHZhciBmZXRjaDogYW55O1xyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2VBcGkge1xyXG5cclxuICAgIHB1YmxpYyBoZWFkZXJzOiBhbnkgPSB7fTtcclxuICAgIHB1YmxpYyBzZXR0aW5nczogYW55O1xyXG4gICAgcHVibGljIHJvdXRlcyA9IHt9O1xyXG4gICAgcHVibGljIGJhc2VVcmwgPSAnL2FwaSc7XHJcbiAgICBwdWJsaWMgaWRGaWVsZCA9ICdpZCc7XHJcbiAgICBwdWJsaWMgcmVxdWVzdENyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJzsgLy8gaW5jbHVkZSwgc2FtZS1vcmlnaW4sICpvbWl0IChkZWZhdWx0KVxyXG4gICAgcHVibGljIGNvcnNNb2RlID0gJ3NhbWUtb3JpZ2luJzsgLy8gbm8tY29ycywgY29ycywgKnNhbWUtb3JpZ2luIChkZWZhdWx0KVxyXG4gICAgcHVibGljIGNhY2hlUG9saWN5ID0gJ25vLWNhY2hlJzsgLy8gKmRlZmF1bHQsIG5vLWNhY2hlLCByZWxvYWQsIGZvcmNlLWNhY2hlLCBvbmx5LWlmLWNhY2hlZFxyXG4gICAgcHVibGljIGNyZWRlbnRpYWxzOiBhbnk7XHJcbiAgICBwdWJsaWMgZW50aXRpZXM6IGFueSA9IHt9O1xyXG4gICAgcHVibGljIGhhc0RlYnVnZ2VyID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgICBwdWJsaWMgaW5pdChzZXR0aW5ncykge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5ob3N0KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYmFzZVVybCA9IHNldHRpbmdzLmhvc3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnJvdXRlcykge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRBcGlSb3V0ZXModGhpcy5zZXR0aW5ncy5yb3V0ZXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5zZXR0aW5ncy5oZWFkZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgICAgICB0aGlzLnNldHRpbmdzLmhlYWRlcnMuZm9yRWFjaCgob2JqKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzW2tdID0gb2JqW2tdO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpc1snaHR0cEhlYWRlcnMnXSkge1xyXG4gICAgICAgICAgICAvLyBBbmd1bGFySnMgb25seVxyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmhlYWRlcnMpLmZvckVhY2goKGspID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXNbJ2h0dHBIZWFkZXJzJ10uc2V0KGssIHRoaXMuaGVhZGVyc1trXSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZiAoJ3dpdGhDcmVkZW50aWFscycgaW4gbmV3IFhNTEh0dHBSZXF1ZXN0KSB7XHJcbiAgICAgICAgLy8gICAgIHRoaXMuY29ycyA9IHRydWU7XHJcbiAgICAgICAgLy8gfVxyXG4gICAgfTtcclxuXHJcbiAgICBwdWJsaWMgcm91dGUodXJsOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbWFwcGVkVXJsOiBzdHJpbmc7XHJcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5yb3V0ZXMpLmZvckVhY2goKGspID0+IHtcclxuICAgICAgICAgICAgaWYoayA9PT0gdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBtYXBwZWRVcmwgPSB0aGlzLnJvdXRlc1trXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG1hcHBlZFVybCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbWFwcGVkVXJsO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDUlVEXHJcbiAgICBwdWJsaWMgYXN5bmMgcG9zdChwYXRoLCBkYXRhOiBhbnkpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IGZldGNoKGAke3RoaXMuYmFzZVVybH0ke3BhdGh9YCwge1xyXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShkYXRhKSwgLy8gbXVzdCBtYXRjaCAnQ29udGVudC1UeXBlJyBoZWFkZXJcclxuICAgICAgICAgICAgY2FjaGU6IHRoaXMuY2FjaGVQb2xpY3ksXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0aGlzLnJlcXVlc3RDcmVkZW50aWFscyxcclxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxyXG4gICAgICAgICAgICBtb2RlOiB0aGlzLmNvcnNNb2RlLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgLy8gcmVkaXJlY3Q6ICdmb2xsb3cnLCAvLyBtYW51YWwsICpmb2xsb3csIGVycm9yXHJcbiAgICAgICAgICAgIC8vIHJlZmVycmVyOiAnbm8tcmVmZXJyZXInLCAvLyAqY2xpZW50LCBuby1yZWZlcnJlclxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA0MDApIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXNwb25zZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQmFkIHJlc3BvbnNlIGZyb20gc2VydmVyJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyKVxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzeW5jIGdldChwYXRoOiBzdHJpbmcsIHBhcmFtczogYW55ID0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHBhcmFtcykge1xyXG4gICAgICAgICAgICBwYXRoICs9ICc/JztcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKGtleSA9PiBwYXRoICs9IGtleSArICc9JyArIHBhcmFtc1trZXldICsgJyYnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCBmZXRjaChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofWAsIHtcclxuICAgICAgICAgICAgY2FjaGU6IHRoaXMuY2FjaGVQb2xpY3ksXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB0aGlzLnJlcXVlc3RDcmVkZW50aWFscyxcclxuICAgICAgICAgICAgaGVhZGVyczogdGhpcy5oZWFkZXJzLFxyXG4gICAgICAgICAgICBtb2RlOiB0aGlzLmNvcnNNb2RlLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICAvLyByZWRpcmVjdDogJ2ZvbGxvdycsIC8vIG1hbnVhbCwgKmZvbGxvdywgZXJyb3JcclxuICAgICAgICAgICAgLy8gcmVmZXJyZXI6ICduby1yZWZlcnJlcicsIC8vICpjbGllbnQsIG5vLXJlZmVycmVyXHJcbiAgICAgICAgfSkudGhlbigocmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gNDAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdCYWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIpXHJcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0b2RvOiBwYXRjaFxyXG4gICAgcHVibGljIGFzeW5jIHBhdGNoKHBhdGgsIGlkLCBkYXRhKSB7XHJcbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5iYXNlVXJsfSR7cGF0aH0vYCtpZCwge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIC8vIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgbWV0aG9kOiAncGF0Y2gnLFxyXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSggZGF0YSApXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcblxyXG4gICAgLy8gZml4bWU6IGNhdXNlcyBwaHAgc2VydmVyIGVycm9yIG9uIGRydXBhbCBjb250ZW50IHBhZ2VcclxuICAgIHB1YmxpYyBhc3luYyBkZWxldGUocGF0aCwgaWQpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhwYXRoLGlkKTtcclxuICAgICAgICAvLyBhd2FpdCBmZXRjaChgJHt0aGlzLmJhc2VVcmx9JHtwYXRofS9gICsgaWQsIHtcclxuICAgICAgICAvL+KAguKAguKAguKAgiBoZWFkZXJzOiB0aGlzLmhlYWRlcnMsXHJcbiAgICAgICAgLy8gLy/igILigIJtZXRob2Q6ICdERUxFVEUnXHJcbiAgICAgICAgLy/igILigILigILigIIgbWV0aG9kOiAnZGVsZXRlJ1xyXG4gICAgICAgIC8vIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2codXNlcm5hbWUscGFzc3dvcmQubGVuZ3RoKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2dvdXQobmFtZXNwYWNlOiBzdHJpbmcgPSAnYXBwOmF1dGhEYXRhJywgcmVmcmVzaDogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5jbGVhckNyZWRlbnRpYWxzKG5hbWVzcGFjZSk7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5ncy5hdXRoZW50aWNhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHJlZnJlc2gpIHtcclxuICAgICAgICAgICAgLy8gbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLm9yaWdpbjtcclxuICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWY7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIHRvZG86IHVzZSBidG9hICsgYXRvYlxyXG4gICAgc2V0Q3JlZGVudGlhbHMoY3JlZGVudGlhbHM6IGFueSwgbmFtZXNwYWNlOiBzdHJpbmcgPSAnYXBwLWF1dGgnKSB7XHJcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzO1xyXG4gICAgICAgIC8vIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShuYW1lc3BhY2UsIGJ0b2EoSlNPTi5zdHJpbmdpZnkoY3JlZGVudGlhbHMpKSk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKG5hbWVzcGFjZSwgSlNPTi5zdHJpbmdpZnkoY3JlZGVudGlhbHMpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3JlZGVudGlhbHMobmFtZXNwYWNlOiBzdHJpbmcgPSAnYXBwOmF1dGhEYXRhJykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubG9jYWxTdG9yYWdlICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShuYW1lc3BhY2UpKSB7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiBKU09OLnBhcnNlKGF0b2Iod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWVzcGFjZSkpKTtcclxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uod2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWVzcGFjZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckNyZWRlbnRpYWxzKG5hbWVzcGFjZTogc3RyaW5nID0gJ2FwcDphdXRoRGF0YScpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKG5hbWVzcGFjZSkpIHtcclxuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKG5hbWVzcGFjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluaXRBcGlSb3V0ZXMocm91dGVzKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcm91dGVzLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBrIGluIG9iaikge1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yb3V0ZXNba10gPSBvYmpba107XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoc2VsZi5zZXR0aW5ncy5kZXYgJiYgc2VsZi5zZXR0aW5ncy5yb3V0ZXNfZGV2KSB7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0dGluZ3Mucm91dGVzX2Rldi5mb3JFYWNoKChvYmopID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGsgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5yb3V0ZXNba10gPSBvYmpba107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB0b2RvXHJcbiAgICBlcnJvckhhbmRsZXIoZXJyb3IpIHtcclxuICAgICAgICAvLyBBcHBTZXJ2aWNlLnNjb3BlLiRicm9hZGNhc3QoJ2Zvcm1FcnJvcicsIGVycm9yKTtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICBpZiAoIWVycm9yKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYoZXJyb3IuZGF0YSA9PT0gXCJ0b2tlbiBleHBpcmVkXCIpe1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHRvYXN0ci53YXJuaW5nKCRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdMT0dJTiBFWFBJUkVEJykrJy4nKTtcclxuICAgICAgICAvL+KAguKAguKAguKAgiBzZXJ2aWNlLmxvZ091dCgpO1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHJldHVybjtcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgLy8gaWYgKGVycm9yLnN0YXR1c1RleHQgPT09ICdCYWQgUmVxdWVzdCcgfHwgZXJyb3Iuc3RhdHVzID09IDQwMCkge1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIGlmIChlcnJvci5kYXRhLm1lc3NhZ2UpIHtcclxuICAgICAgICAvL+KAguKAguKAguKAguKAguKAguKAguKAgiB0b2FzdHIud2FybmluZygkZmlsdGVyKCd0cmFuc2xhdGUnKShlcnJvci5kYXRhLm1lc3NhZ2UpKTtcclxuICAgICAgICAvL+KAguKAguKAguKAgiB9IGVsc2Uge1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCC4oCC4oCC4oCC4oCCIHRvYXN0ci53YXJuaW5nKCRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdFUlJPUiBCQUQgUkVRVUVTVCcpICsgJy4nKTtcclxuICAgICAgICAvL+KAguKAguKAguKAgiB9XHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIC8vIGlmKGVycm9yLnN0YXR1c1RleHQgPT09ICdVbmF1dGhvcml6ZWQnIHx8IGVycm9yLnN0YXR1cyA9PSA0MDEpe1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHRvYXN0ci53YXJuaW5nKCRmaWx0ZXIoJ3RyYW5zbGF0ZScpKCdVTkFVVEhPUklaRUQgRVJST1InKSsnLicpO1xyXG4gICAgICAgIC8v4oCC4oCC4oCC4oCCIHNlcnZpY2UubG9nT3V0KCk7XHJcbiAgICAgICAgLy/igILigILigILigIIgcmV0dXJuO1xyXG4gICAgICAgIC8vIH1cclxuICAgICAgICAvLyBpZihlcnJvci5zdGF0dXNUZXh0ID09PSAnTm90IGZvdW5kJyB8fCBlcnJvci5zdGF0dXMgPT0gNDA0KXtcclxuICAgICAgICAvL+KAguKAguKAguKAgiB0b2FzdHIud2FybmluZygkZmlsdGVyKCd0cmFuc2xhdGUnKSgnRVJST1IgTk9UIEZPVU5EJykrJy4nKTtcclxuICAgICAgICAvLyB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZW50aXRpZXMgbG9jYWwgc3RvcmFnZSB0b2RvOiBtb3ZlIHRvIHN0b3JhZ2UuanNcclxuICAgIHNhdmVMb2NhbFJlc291cmNlKHJlc291cmNlKSB7XHJcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocmVzb3VyY2VbdGhpcy5pZEZpZWxkXSwgcmVzb3VyY2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRMb2NhbFJlc291cmNlKElEKSB7XHJcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKElEKSkge1xyXG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShJRCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZsdXNoTG9jYWxSZXNvdXJjZShJRCkge1xyXG4gICAgICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShJRCkpIHtcclxuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oSUQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==