io.parrots
Version:
Parrots.io App
660 lines (659 loc) • 62.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Headers, RequestOptions } from '@angular/http';
import { DataField } from 'com.phloxui';
import { ParrotsDataSchema } from '../../share/model/ParrotsDataSchema';
import { ClassesResource } from '../../share/resource/ClassesResource';
var ParrotsDataService = /** @class */ (function () {
function ParrotsDataService(className, connectionMgr) {
this.connectionMgr = connectionMgr;
this.className = className;
this.classesResource = connectionMgr.createResource(ClassesResource);
}
/**
* @return {?}
*/
ParrotsDataService.prototype.loadDataSchema = /**
* @return {?}
*/
function () {
var _this = this;
return new Promise(function (resolve, reject) {
try {
_this.classesResource.getSchemaInfo(_this.className).then(function (response) {
try {
// response should by in json if not reject in catch
var /** @type {?} */ responseObj = response;
var /** @type {?} */ dataFields = [];
var /** @type {?} */ jsonSchema = responseObj;
for (var /** @type {?} */ key in jsonSchema.properties) {
var /** @type {?} */ selfJsonSchema = jsonSchema.properties[key];
if (selfJsonSchema === null || selfJsonSchema === undefined) {
continue;
}
var /** @type {?} */ dataField = new DataField(key, key, selfJsonSchema.type, selfJsonSchema, null);
dataFields.push(dataField);
}
var /** @type {?} */ resultSchema = new ParrotsDataSchema(responseObj.id, responseObj.id, dataFields, jsonSchema);
resolve(resultSchema);
}
catch (/** @type {?} */ error) {
reject(error);
}
}).catch(function (error) {
reject(error);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
};
/**
* @return {?}
*/
ParrotsDataService.prototype.loadData = /**
* @return {?}
*/
function () {
var _this = this;
return new Promise(function (resolve, reject) {
try {
_this.classesResource.query(_this.className).then(function (response) {
try {
var /** @type {?} */ result = [];
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined &&
responseObj.items !== null && responseObj.items !== undefined) {
result = responseObj.items;
}
resolve(result);
}
catch (/** @type {?} */ err) {
reject(err);
}
}, function (error) {
reject(error);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype.createData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
return new Promise(function (resolve, reject) {
_this.classesResource.create(data, _this.className).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype._updateData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise(function (resolve, reject) {
_this.classesResource.update(data._uuid, _this.className, data).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype.updateData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
return new Promise(function (resolve, reject) {
try {
var /** @type {?} */ promArray = [];
var /** @type {?} */ isDataArray_1 = Array.isArray(data);
if (isDataArray_1) {
try {
for (var data_1 = tslib_1.__values(data), data_1_1 = data_1.next(); !data_1_1.done; data_1_1 = data_1.next()) {
var d = data_1_1.value;
promArray.push(_this._updateData(d));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (data_1_1 && !data_1_1.done && (_a = data_1.return)) _a.call(data_1);
}
finally { if (e_1) throw e_1.error; }
}
}
else {
promArray.push(_this._updateData(data));
}
// wait for all
Promise.all(promArray).then(function (values) {
if (isDataArray_1) {
resolve(values);
}
else {
resolve(values[0]);
}
}, function (erros) {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
var e_1, _a;
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype._deleteData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise(function (resolve, reject) {
_this.classesResource.delete(data._uuid, _this.className).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype.deleteData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
return new Promise(function (resolve, reject) {
try {
var /** @type {?} */ promArray = [];
var /** @type {?} */ isDataArray_2 = Array.isArray(data);
if (isDataArray_2) {
try {
for (var data_2 = tslib_1.__values(data), data_2_1 = data_2.next(); !data_2_1.done; data_2_1 = data_2.next()) {
var d = data_2_1.value;
promArray.push(_this._deleteData(d));
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (data_2_1 && !data_2_1.done && (_a = data_2.return)) _a.call(data_2);
}
finally { if (e_2) throw e_2.error; }
}
}
else {
promArray.push(_this._deleteData(data));
}
// wait for all
Promise.all(promArray).then(function (values) {
if (isDataArray_2) {
resolve(values);
}
else {
resolve(values[0]);
}
}, function (erros) {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
var e_2, _a;
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype._destroyData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise(function (resolve, reject) {
_this.classesResource.delete(data._uuid, _this.className, true).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype.destroyData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
return new Promise(function (resolve, reject) {
try {
var /** @type {?} */ promArray = [];
var /** @type {?} */ isDataArray_3 = Array.isArray(data);
if (isDataArray_3) {
try {
for (var data_3 = tslib_1.__values(data), data_3_1 = data_3.next(); !data_3_1.done; data_3_1 = data_3.next()) {
var d = data_3_1.value;
promArray.push(_this._destroyData(d));
}
}
catch (e_3_1) { e_3 = { error: e_3_1 }; }
finally {
try {
if (data_3_1 && !data_3_1.done && (_a = data_3.return)) _a.call(data_3);
}
finally { if (e_3) throw e_3.error; }
}
}
else {
promArray.push(_this._destroyData(data));
}
// wait for all
Promise.all(promArray).then(function (values) {
if (isDataArray_3) {
resolve(values);
}
else {
resolve(values[0]);
}
}, function (erros) {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
var e_3, _a;
});
};
/**
* @param {?} data
* @param {?=} fetchFields
* @return {?}
*/
ParrotsDataService.prototype.fetchData = /**
* @param {?} data
* @param {?=} fetchFields
* @return {?}
*/
function (data, fetchFields) {
var _this = this;
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise(function (resolve, reject) {
try {
var /** @type {?} */ requestOptions = new RequestOptions();
if (fetchFields !== null && fetchFields !== undefined && fetchFields !== '') {
var /** @type {?} */ headers = new Headers();
headers.append("Fetch-Fields", fetchFields);
requestOptions.headers = headers;
}
_this.classesResource.find(data._uuid, _this.className, undefined, undefined, requestOptions).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
// try to fetch obj
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ err) {
reject(err);
}
}, function (error) {
reject(error);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype.findData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise(function (resolve, reject) {
_this.classesResource.find(data._uuid, _this.className).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} filterData
* @return {?}
*/
ParrotsDataService.prototype.queryData = /**
* @param {?} filterData
* @return {?}
*/
function (filterData) {
var _this = this;
return new Promise(function (resolve, reject) {
var /** @type {?} */ queryFilterDTO = {};
if (filterData !== null && filterData !== undefined) {
if (filterData.filter !== null && filterData.filter !== undefined) {
}
if (filterData.sorting !== null && filterData.sorting !== undefined && filterData.sorting !== '') {
var /** @type {?} */ sorting = filterData.sorting;
var /** @type {?} */ sortStmt = "";
var /** @type {?} */ split = sorting.split(",");
for (var /** @type {?} */ i = 0; i < split.length; i++) {
sortStmt += split[i] + " and ";
}
if (sortStmt !== '') {
sortStmt = sortStmt.slice(0, sortStmt.length - 5);
}
console.log("sortStmt: " + sortStmt);
queryFilterDTO["ordering"] = sortStmt;
}
}
_this.classesResource.queryWithFilter(_this.className, queryFilterDTO).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined &&
responseObj.items !== null && responseObj.items !== undefined) {
result = responseObj.items;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype._recycleData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (data === null || data === undefined || data === '') {
return Promise.reject("Data's uuid was missing.");
}
return new Promise(function (resolve, reject) {
_this.classesResource.recycle(data._uuid, _this.className).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype.recycleData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
return new Promise(function (resolve, reject) {
try {
var /** @type {?} */ promArray = [];
var /** @type {?} */ isDataArray_4 = Array.isArray(data);
if (isDataArray_4) {
try {
for (var data_4 = tslib_1.__values(data), data_4_1 = data_4.next(); !data_4_1.done; data_4_1 = data_4.next()) {
var d = data_4_1.value;
promArray.push(_this._recycleData(d));
}
}
catch (e_4_1) { e_4 = { error: e_4_1 }; }
finally {
try {
if (data_4_1 && !data_4_1.done && (_a = data_4.return)) _a.call(data_4);
}
finally { if (e_4) throw e_4.error; }
}
}
else {
promArray.push(_this._recycleData(data));
}
// wait for all
Promise.all(promArray).then(function (values) {
if (isDataArray_4) {
resolve(values);
}
else {
resolve(values[0]);
}
}, function (erros) {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
var e_4, _a;
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype._promoteData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
if (data !== null && data !== undefined && data !== '') {
if (data._version === null || data._version === undefined || data._version == '') {
return Promise.reject("No Version to promote.");
}
}
else {
return Promise.reject("Data's uuid was missing.");
}
return new Promise(function (resolve, reject) {
_this.classesResource.promoteVersion(data._version, data._uuid, _this.className).then(function (response) {
try {
var /** @type {?} */ result = {};
var /** @type {?} */ responseObj = response;
if (responseObj !== null && responseObj !== undefined) {
result = responseObj;
}
resolve(result);
}
catch (/** @type {?} */ error) {
reject(error);
}
}, function (error) {
reject(error);
});
});
};
/**
* @param {?} data
* @return {?}
*/
ParrotsDataService.prototype.promoteData = /**
* @param {?} data
* @return {?}
*/
function (data) {
var _this = this;
return new Promise(function (resolve, reject) {
try {
var /** @type {?} */ promArray = [];
var /** @type {?} */ isDataArray_5 = Array.isArray(data);
if (isDataArray_5) {
try {
for (var data_5 = tslib_1.__values(data), data_5_1 = data_5.next(); !data_5_1.done; data_5_1 = data_5.next()) {
var d = data_5_1.value;
promArray.push(_this._promoteData(d));
}
}
catch (e_5_1) { e_5 = { error: e_5_1 }; }
finally {
try {
if (data_5_1 && !data_5_1.done && (_a = data_5.return)) _a.call(data_5);
}
finally { if (e_5) throw e_5.error; }
}
}
else {
promArray.push(_this._promoteData(data));
}
// wait for all
Promise.all(promArray).then(function (values) {
if (isDataArray_5) {
resolve(values);
}
else {
resolve(values[0]);
}
}, function (erros) {
reject(erros);
});
}
catch (/** @type {?} */ error) {
reject(error);
}
var e_5, _a;
});
};
return ParrotsDataService;
}());
export { ParrotsDataService };
function ParrotsDataService_tsickle_Closure_declarations() {
/** @type {?} */
ParrotsDataService.prototype.connectionMgr;
/** @type {?} */
ParrotsDataService.prototype.className;
/** @type {?} */
ParrotsDataService.prototype.classesResource;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFycm90c0RhdGFTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vaW8ucGFycm90cy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvZWRpdG9yL1BhcnJvdHNEYXRhU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBa0IsT0FBTyxFQUFFLGNBQWMsRUFBc0IsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFjLFNBQVMsRUFBYyxNQUFNLGFBQWEsQ0FBQztBQUVoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFdkUsSUFBQTtJQU1FLDRCQUFZLFNBQWlCLEVBQUUsYUFBd0M7UUFDckUsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBQ3RFOzs7O0lBRU0sMkNBQWM7Ozs7O1FBRW5CLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO1lBQ2pDLElBQUksQ0FBQztnQkFDSCxLQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsUUFBUTtvQkFFL0QsSUFBSSxDQUFDOzt3QkFFSCxxQkFBSSxXQUFXLEdBQUcsUUFBUSxDQUFBO3dCQUMxQixxQkFBSSxVQUFVLEdBQWdCLEVBQUUsQ0FBQzt3QkFDakMscUJBQUksVUFBVSxHQUFlLFdBQVcsQ0FBQzt3QkFFekMsR0FBRyxDQUFDLENBQUMscUJBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDOzRCQUN0QyxxQkFBSSxjQUFjLEdBQWUsVUFBVSxD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b2hCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHAsIFJlc3BvbnNlLCBIZWFkZXJzLCBSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnNBcmdzIH0gZnJvbSAnQGFuZ3VsYXIvaHR0cCc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhRmllbGQsIEpzb25TY2hlbWEgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBJUGFycm90c0RhdGFTZXJ2aWNlLCB9IGZyb20gJy4vSVBhcnJvdHNEYXRhU2VydmljZSc7XG5pbXBvcnQgeyBQYXJyb3RzRGF0YVNjaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlL21vZGVsL1BhcnJvdHNEYXRhU2NoZW1hJztcbmltcG9ydCB7IEluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL0luc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDbGFzc2VzUmVzb3VyY2UgfSBmcm9tICcuLi8uLi9zaGFyZS9yZXNvdXJjZS9DbGFzc2VzUmVzb3VyY2UnO1xuXG5leHBvcnQgY2xhc3MgUGFycm90c0RhdGFTZXJ2aWNlIGltcGxlbWVudHMgSVBhcnJvdHNEYXRhU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBjb25uZWN0aW9uTWdyOiBJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyO1xuICBwcml2YXRlIGNsYXNzTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGNsYXNzZXNSZXNvdXJjZTogQ2xhc3Nlc1Jlc291cmNlO1xuXG4gIGNvbnN0cnVjdG9yKGNsYXNzTmFtZTogc3RyaW5nLCBjb25uZWN0aW9uTWdyOiBJbnN0YW5jZUNvbm5lY3Rpb25NYW5hZ2VyKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uTWdyID0gY29ubmVjdGlvbk1ncjtcbiAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTtcbiAgICB0aGlzLmNsYXNzZXNSZXNvdXJjZSA9IGNvbm5lY3Rpb25NZ3IuY3JlYXRlUmVzb3VyY2UoQ2xhc3Nlc1Jlc291cmNlKTtcbiAgfVxuXG4gIHB1YmxpYyBsb2FkRGF0YVNjaGVtYSgpOiBQcm9taXNlPFBhcnJvdHNEYXRhU2NoZW1hPiB7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5jbGFzc2VzUmVzb3VyY2UuZ2V0U2NoZW1hSW5mbyh0aGlzLmNsYXNzTmFtZSkudGhlbigocmVzcG9uc2UpID0+IHtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyByZXNwb25zZSBzaG91bGQgYnkgaW4ganNvbiBpZiBub3QgcmVqZWN0IGluIGNhdGNoXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VPYmogPSByZXNwb25zZVxuICAgICAgICAgICAgbGV0IGRhdGFGaWVsZHM6IERhdGFGaWVsZFtdID0gW107XG4gICAgICAgICAgICBsZXQganNvblNjaGVtYTogSnNvblNjaGVtYSA9IHJlc3BvbnNlT2JqO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4ganNvblNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgIGxldCBzZWxmSnNvblNjaGVtYTogSnNvblNjaGVtYSA9IGpzb25TY2hlbWEucHJvcGVydGllc1trZXldO1xuXG4gICAgICAgICAgICAgIGlmIChzZWxmSnNvblNjaGVtYSA9PT0gbnVsbCB8fCBzZWxmSnNvblNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBsZXQgZGF0YUZpZWxkOiBEYXRhRmllbGQgPSBuZXcgRGF0YUZpZWxkKGtleSwga2V5LCBzZWxmSnNvblNjaGVtYS50eXBlLCBzZWxmSnNvblNjaGVtYSwgbnVsbCk7XG4gICAgICAgICAgICAgIGRhdGFGaWVsZHMucHVzaChkYXRhRmllbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmVzdWx0U2NoZW1hOiBQYXJyb3RzRGF0YVNjaGVtYSA9IG5ldyBQYXJyb3RzRGF0YVNjaGVtYShyZXNwb25zZU9iai5pZCwgcmVzcG9uc2VPYmouaWQsIGRhdGFGaWVsZHMsIGpzb25TY2hlbWEpO1xuXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdFNjaGVtYSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbG9hZERhdGEoKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0cnkge1xuXG4gICAgICAgIHRoaXMuY2xhc3Nlc1Jlc291cmNlLnF1ZXJ5KHRoaXMuY2xhc3NOYW1lKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICBsZXQgcmVzcG9uc2VPYmogPSByZXNwb25zZVxuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT09IG51bGwgJiYgcmVzcG9uc2VPYmogIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICByZXNwb25zZU9iai5pdGVtcyAhPT0gbnVsbCAmJiByZXNwb25zZU9iai5pdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlT2JqLml0ZW1zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoZXJyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHRoaXMuY2xhc3Nlc1Jlc291cmNlLmNyZWF0ZShkYXRhLCB0aGlzLmNsYXNzTmFtZSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdHJ5IHtcblxuICAgICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHt9O1xuXG4gICAgICAgICAgbGV0IHJlc3BvbnNlT2JqID0gcmVzcG9uc2VcblxuICAgICAgICAgIGlmIChyZXNwb25zZU9iaiAhPT0gbnVsbCAmJiByZXNwb25zZU9iaiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXNwb25zZU9iajtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG5cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIF91cGRhdGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkRhdGEncyB1dWlkIHdhcyBtaXNzaW5nLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0aGlzLmNsYXNzZXNSZXNvdXJjZS51cGRhdGUoZGF0YS5fdXVpZCwgdGhpcy5jbGFzc05hbWUsIGRhdGEpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7fTtcblxuICAgICAgICAgIGxldCByZXNwb25zZU9iaiA9IHJlc3BvbnNlXG5cbiAgICAgICAgICBpZiAocmVzcG9uc2VPYmogIT09IG51bGwgJiYgcmVzcG9uc2VPYmogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2VPYmo7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHByb21BcnJheTogUHJvbWlzZTxhbnk+W10gPSBbXTtcbiAgICAgICAgbGV0IGlzRGF0YUFycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICAgICAgaWYgKGlzRGF0YUFycmF5KSB7XG4gICAgICAgICAgZm9yIChsZXQgZCBvZiBkYXRhKSB7XG4gICAgICAgICAgICBwcm9tQXJyYXkucHVzaCh0aGlzLl91cGRhdGVEYXRhKGQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbUFycmF5LnB1c2godGhpcy5fdXBkYXRlRGF0YShkYXRhKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3YWl0IGZvciBhbGxcbiAgICAgICAgUHJvbWlzZS5hbGwocHJvbUFycmF5KS50aGVuKCh2YWx1ZXMpID0+IHtcbiAgICAgICAgICBpZiAoaXNEYXRhQXJyYXkpIHtcbiAgICAgICAgICAgIHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZXNbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSwgKGVycm9zKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9zKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9kZWxldGVEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG5cbiAgICBpZiAoZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gJycpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIkRhdGEncyB1dWlkIHdhcyBtaXNzaW5nLlwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG4gICAgICB0aGlzLmNsYXNzZXNSZXNvdXJjZS5kZWxldGUoZGF0YS5fdXVpZCwgdGhpcy5jbGFzc05hbWUpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICA