swaf/dist/db/Query.js
2020-04-22 17:49:58 +02:00

176 lines
23 KiB
JavaScript

var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
import { query } from "./MysqlConnectionManager";
export default class Query {
constructor(type, table, fields) {
this._where = [];
this._foundRows = false;
this.type = type;
this.table = table;
this.fields = fields || [];
}
static select(table, ...fields) {
return new Query(QueryType.SELECT, table, fields.length > 0 ? fields : ['*']);
}
static update(table, data) {
const fields = [];
for (let key in data) {
if (data.hasOwnProperty(key)) {
fields.push(new UpdateFieldValue(key, data[key]));
}
}
return new Query(QueryType.UPDATE, table, fields);
}
static delete(table) {
return new Query(QueryType.DELETE, table);
}
where(field, value, operator = WhereOperator.AND, test = WhereTest.EQUALS) {
this._where.push(new WhereFieldValue(field, value, operator, test));
return this;
}
whereNot(field, value, operator = WhereOperator.AND) {
return this.where(field, value, operator, WhereTest.DIFFERENT);
}
orWhere(field, value) {
return this.where(field, value, WhereOperator.OR);
}
whereIn(field, value) {
return this.where(field, value, WhereOperator.AND, WhereTest.IN);
}
limit(limit, offset = 0) {
this._limit = limit;
this._offset = offset;
return this;
}
first() {
return this.limit(1);
}
sortBy(field, direction = 'ASC') {
this._sortBy = field;
this._sortDirection = direction;
return this;
}
withTotalRowCount() {
this._foundRows = true;
return this;
}
toString(final = false) {
var _a;
let query = '';
let fields = (_a = this.fields) === null || _a === void 0 ? void 0 : _a.join(',');
let where = '';
if (this._where.length > 0) {
where = `WHERE ${this._where[0]}`;
for (let i = 1; i < this._where.length; i++) {
where += this._where[i].toString(false);
}
}
let limit = '';
if (typeof this._limit === 'number') {
limit = `LIMIT ${this._limit}`;
if (typeof this._offset === 'number' && this._offset !== 0) {
limit += ` OFFSET ${this._offset}`;
}
}
let orderBy = '';
if (typeof this._sortBy === 'string') {
orderBy = `ORDER BY ${this._sortBy} ${this._sortDirection}`;
}
switch (this.type) {
case QueryType.SELECT:
query = `SELECT ${this._foundRows ? 'SQL_CALC_FOUND_ROWS' : ''} ${fields} FROM ${this.table} ${where} ${orderBy} ${limit}`;
break;
case QueryType.UPDATE:
query = `UPDATE ${this.table} SET ${fields} ${where} ${orderBy} ${limit}`;
break;
case QueryType.DELETE:
query = `DELETE FROM ${this.table} ${where} ${orderBy} ${limit}`;
break;
}
return final ? query : `(${query})`;
}
build() {
return this.toString(true);
}
get variables() {
var _a;
const variables = [];
(_a = this.fields) === null || _a === void 0 ? void 0 : _a.filter(v => v instanceof FieldValue).flatMap(v => v.variables).forEach(v => variables.push(v));
this._where.flatMap(v => v.variables)
.forEach(v => variables.push(v));
return variables;
}
isCacheable() {
return this.type === QueryType.SELECT && this.fields.length === 1 && this.fields[0] === '*';
}
execute(connection) {
return __awaiter(this, void 0, void 0, function* () {
const queryResult = yield query(this.build(), this.variables, connection);
if (this._foundRows) {
const foundRows = yield query('SELECT FOUND_ROWS() as r', undefined, connection);
queryResult.foundRows = foundRows.results[0].r;
}
return queryResult;
});
}
}
export var QueryType;
(function (QueryType) {
QueryType[QueryType["SELECT"] = 0] = "SELECT";
QueryType[QueryType["UPDATE"] = 1] = "UPDATE";
QueryType[QueryType["DELETE"] = 2] = "DELETE";
})(QueryType || (QueryType = {}));
var WhereOperator;
(function (WhereOperator) {
WhereOperator["AND"] = "AND";
WhereOperator["OR"] = "OR";
})(WhereOperator || (WhereOperator = {}));
var WhereTest;
(function (WhereTest) {
WhereTest["EQUALS"] = "=";
WhereTest["DIFFERENT"] = "!=";
WhereTest["IN"] = " IN ";
})(WhereTest || (WhereTest = {}));
class FieldValue {
constructor(field, value) {
this.field = field;
this.value = value;
}
toString(first = true) {
return `${!first ? ',' : ''}${this.field}${this.test}${this.value instanceof Query ? this.value : (Array.isArray(this.value) ? '(?)' : '?')}`;
}
get test() {
return '=';
}
get variables() {
return this.value instanceof Query ? this.value.variables : [this.value];
}
}
class SelectFieldValue extends FieldValue {
toString(first = true) {
return `(${this.value instanceof Query ? this.value : '?'}) AS ${this.field}`;
}
}
class UpdateFieldValue extends FieldValue {
}
class WhereFieldValue extends FieldValue {
constructor(field, value, operator, test) {
super(field, value);
this.operator = operator;
this._test = test;
}
toString(first = true) {
return (!first ? ` ${this.operator} ` : '') + super.toString(true);
}
get test() {
return this._test;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUXVlcnkuanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbImRiL1F1ZXJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUc1RCxNQUFNLENBQUMsT0FBTyxPQUFPLEtBQUs7SUErQnRCLFlBQW9CLElBQWUsRUFBRSxLQUFhLEVBQUUsTUFBeUQ7UUFQckcsV0FBTSxHQUFzQixFQUFFLENBQUM7UUFLL0IsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUdoQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQWxDTSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQWEsRUFBRSxHQUFHLE1BQWdCO1FBQ25ELE9BQU8sSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFTSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQWEsRUFBRSxJQUVuQztRQUNHLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNsQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNyRDtTQUNKO1FBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtB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Q0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0UsQ0FBQztDQUNKO0FBRUQsTUFBTSxnQkFBaUIsU0FBUSxVQUFVO0lBQzlCLFFBQVEsQ0FBQyxRQUFpQixJQUFJO1FBQ2pDLE9BQU8sSUFBSSxJQUFJLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNsRixDQUFDO0NBQ0o7QUFFRCxNQUFNLGdCQUFpQixTQUFRLFVBQVU7Q0FDeEM7QUFFRCxNQUFNLGVBQWdCLFNBQVEsVUFBVTtJQUlwQyxZQUFZLEtBQWEsRUFBRSxLQUFVLEVBQUUsUUFBdUIsRUFBRSxJQUFlO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUVNLFFBQVEsQ0FBQyxRQUFpQixJQUFJO1FBQ2pDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVELElBQWMsSUFBSTtRQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUN0QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3F1ZXJ5LCBRdWVyeVJlc3VsdH0gZnJvbSBcIi4vTXlzcWxDb25uZWN0aW9uTWFuYWdlclwiO1xuaW1wb3J0IHtDb25uZWN0aW9ufSBmcm9tIFwibXlzcWxcIjtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVlcnkge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0KHRhYmxlOiBzdHJpbmcsIC4uLmZpZWxkczogc3RyaW5nW10pOiBRdWVyeSB7XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoUXVlcnlUeXBlLlNFTEVDVCwgdGFibGUsIGZpZWxkcy5sZW5ndGggPiAwID8gZmllbGRzIDogWycqJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgdXBkYXRlKHRhYmxlOiBzdHJpbmcsIGRhdGE6IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogYW55XG4gICAgfSkge1xuICAgICAgICBjb25zdCBmaWVsZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHMucHVzaChuZXcgVXBkYXRlRmllbGRWYWx1ZShrZXksIGRhdGFba2V5XSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUXVlcnkoUXVlcnlUeXBlLlVQREFURSwgdGFibGUsIGZpZWxkcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWxldGUodGFibGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFF1ZXJ5VHlwZS5ERUxFVEUsIHRhYmxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU6IFF1ZXJ5VHlwZTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhYmxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmaWVsZHM6IChzdHJpbmcgfCBTZWxlY3RGaWVsZFZhbHVlIHwgVXBkYXRlRmllbGRWYWx1ZSlbXTtcbiAgICBwcml2YXRlIF93aGVyZTogV2hlcmVGaWVsZFZhbHVlW10gPSBbXTtcbiAgICBwcml2YXRlIF9saW1pdD86IG51bWJlcjtcbiAgICBwcml2YXRlIF9vZmZzZXQ/OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfc29ydEJ5Pzogc3RyaW5nO1xuICAgIHByaXZhdGUgX3NvcnREaXJlY3Rpb24/OiAnQVNDJyB8ICdERVNDJztcbiAgICBwcml2YXRlIF9mb3VuZFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IodHlwZTogUXVlcnlUeXBlLCB0YWJsZTogc3RyaW5nLCBmaWVsZHM/OiAoc3RyaW5nIHwgU2VsZWN0RmllbGRWYWx1ZSB8IFVwZGF0ZUZpZWxkVmFsdWUpW10pIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcyB8fCBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2hlcmUoZmllbGQ6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IERhdGUgfCBRdWVyeSB8IGFueSwgb3BlcmF0b3I6IFdoZXJlT3BlcmF0b3IgPSBXaGVyZU9wZXJhdG9yLkFORCwgdGVzdDogV2hlcmVUZXN0ID0gV2hlcmVUZXN0LkVRVUFMUyk6IFF1ZXJ5IHtcbiAgICAgICAgdGhpcy5fd2hlcmUucHVzaChuZXcgV2hlcmVGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgb3BlcmF0b3IsIHRlc3QpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIHdoZXJlTm90KGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgUXVlcnkgfCBhbnksIG9wZXJhdG9yOiBXaGVyZU9wZXJhdG9yID0gV2hlcmVPcGVyYXRvci5BTkQpOiBRdWVyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLndoZXJlKGZpZWxkLCB2YWx1ZSwgb3BlcmF0b3IsIFdoZXJlVGVzdC5ESUZGRVJFTlQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvcldoZXJlKGZpZWxkOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBEYXRlIHwgUXVlcnkgfCBhbnkpOiBRdWVyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLndoZXJlKGZpZWxkLCB2YWx1ZSwgV2hlcmVPcGVyYXRvci5PUik7XG4gICAgfVxuXG4gICAgcHVibGljIHdoZXJlSW4oZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueVtdKTogUXVlcnkge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZShmaWVsZCwgdmFsdWUsIFdoZXJlT3BlcmF0b3IuQU5ELCBXaGVyZVRlc3QuSU4pO1xuICAgIH1cblxuICAgIHB1YmxpYyBsaW1pdChsaW1pdDogbnVtYmVyLCBvZmZzZXQ6IG51bWJlciA9IDApOiBRdWVyeSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuX29mZnNldCA9IG9mZnNldDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHVibGljIGZpcnN0KCk6IFF1ZXJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGltaXQoMSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNvcnRCeShmaWVsZDogc3RyaW5nLCBkaXJlY3Rpb246ICdBU0MnIHwgJ0RFU0MnID0gJ0FTQycpOiBRdWVyeSB7XG4gICAgICAgIHRoaXMuX3NvcnRCeSA9IGZpZWxkO1xuICAgICAgICB0aGlzLl9zb3J0RGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgd2l0aFRvdGFsUm93Q291bnQoKTogUXVlcnkge1xuICAgICAgICB0aGlzLl9mb3VuZFJvd3MgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoZmluYWw6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIGxldCBxdWVyeSA9ICcnO1xuXG4gICAgICAgIGxldCBmaWVsZHMgPSB0aGlzLmZpZWxkcz8uam9pbignLCcpO1xuXG4gICAgICAgIGxldCB3aGVyZSA9ICcnO1xuICAgICAgICBpZiAodGhpcy5fd2hlcmUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgd2hlcmUgPSBgV0hFUkUgJHt0aGlzLl93aGVyZVswXX1gO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLl93aGVyZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHdoZXJlICs9IHRoaXMuX3doZXJlW2ldLnRvU3RyaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW1pdCA9ICcnO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX2xpbWl0ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgbGltaXQgPSBgTElNSVQgJHt0aGlzLl9saW1pdH1gO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9vZmZzZXQgPT09ICdudW1iZXInICYmIHRoaXMuX29mZnNldCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGxpbWl0ICs9IGAgT0ZGU0VUICR7dGhpcy5fb2Zmc2V0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JkZXJCeSA9ICcnO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3NvcnRCeSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIG9yZGVyQnkgPSBgT1JERVIgQlkgJHt0aGlzLl9zb3J0Qnl9ICR7dGhpcy5fc29ydERpcmVjdGlvbn1gO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgUXVlcnlUeXBlLlNFTEVDVDpcbiAgICAgICAgICAgICAgICBxdWVyeSA9IGBTRUxFQ1QgJHt0aGlzLl9mb3VuZFJvd3MgPyAnU1FMX0NBTENfRk9VTkRfUk9XUycgOiAnJ30gJHtmaWVsZHN9IEZST00gJHt0aGlzLnRhYmxlfSAke3doZXJlfSAke29yZGVyQnl9ICR7bGltaXR9YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUXVlcnlUeXBlLlVQREFURTpcbiAgICAgICAgICAgICAgICBxdWVyeSA9IGBVUERBVEUgJHt0aGlzLnRhYmxlfSBTRVQgJHtmaWVsZHN9ICR7d2hlcmV9ICR7b3JkZXJCeX0gJHtsaW1pdH1gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBRdWVyeVR5cGUuREVMRVRFOlxuICAgICAgICAgICAgICAgIHF1ZXJ5ID0gYERFTEVURSBGUk9NICR7dGhpcy50YWJsZX0gJHt3aGVyZX0gJHtvcmRlckJ5fSAke2xpbWl0fWA7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaW5hbCA/IHF1ZXJ5IDogYCgke3F1ZXJ5fSlgO1xuICAgIH1cblxuICAgIHB1YmxpYyBidWlsZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZyh0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOiBhbnlbXSB7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlczogYW55W10gPSBbXTtcbiAgICAgICAgdGhpcy5maWVsZHM/LmZpbHRlcih2ID0+IHYgaW5zdGFuY2VvZiBGaWVsZFZhbHVlKVxuICAgICAgICAgICAgLmZsYXRNYXAodiA9PiAoPEZpZWxkVmFsdWU+dikudmFyaWFibGVzKVxuICAgICAgICAgICAgLmZvckVhY2godiA9PiB2YXJpYWJsZXMucHVzaCh2KSk7XG4gICAgICAgIHRoaXMuX3doZXJlLmZsYXRNYXAodiA9PiB2LnZhcmlhYmxlcylcbiAgICAgICAgICAgIC5mb3JFYWNoKHYgPT4gdmFyaWFibGVzLnB1c2godikpO1xuICAgICAgICByZXR1cm4gdmFyaWFibGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc0NhY2hlYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gUXVlcnlUeXBlLlNFTEVDVCAmJiB0aGlzLmZpZWxkcy5sZW5ndGggPT09IDEgJiYgdGhpcy5maWVsZHNbMF0gPT09ICcqJztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZShjb25uZWN0aW9uPzogQ29ubmVjdGlvbik6IFByb21pc2U8UXVlcnlSZXN1bHQ+IHtcbiAgICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBhd2FpdCBxdWVyeSh0aGlzLmJ1aWxkKCksIHRoaXMudmFyaWFibGVzLCBjb25uZWN0aW9uKTtcbiAgICAgICAgaWYgKHRoaXMuX2ZvdW5kUm93cykge1xuICAgICAgICAgICAgY29uc3QgZm91bmRSb3dzID0gYXdhaXQgcXVlcnkoJ1NFTEVDVCBGT1VORF9ST1dTKCkgYXMgcicsIHVuZGVmaW5lZCwgY29ubmVjdGlvbik7XG4gICAgICAgICAgICBxdWVyeVJlc3VsdC5mb3VuZFJvd3MgPSBmb3VuZFJvd3MucmVzdWx0c1swXS5yO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBxdWVyeVJlc3VsdDtcbiAgICB9XG59XG5cbmV4cG9ydCBlbnVtIFF1ZXJ5VHlwZSB7XG4gICAgU0VMRUNULFxuICAgIFVQREFURSxcbiAgICBERUxFVEUsXG59XG5cbmVudW0gV2hlcmVPcGVyYXRvciB7XG4gICAgQU5EID0gJ0FORCcsXG4gICAgT1IgPSAnT1InLFxufVxuXG5lbnVtIFdoZXJlVGVzdCB7XG4gICAgRVFVQUxTID0gJz0nLFxuICAgIERJRkZFUkVOVCA9ICchPScsXG4gICAgSU4gPSAnIElOICcsXG59XG5cbmNsYXNzIEZpZWxkVmFsdWUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmaWVsZDogc3RyaW5nO1xuICAgIHByb3RlY3RlZCB2YWx1ZTogYW55O1xuXG4gICAgY29uc3RydWN0b3IoZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9TdHJpbmcoZmlyc3Q6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGAkeyFmaXJzdCA/ICcsJyA6ICcnfSR7dGhpcy5maWVsZH0ke3RoaXMudGVzdH0ke3RoaXMudmFsdWUgaW5zdGFuY2VvZiBRdWVyeSA/IHRoaXMudmFsdWUgOiAoQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSA/ICcoPyknIDogJz8nKX1gO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgdGVzdCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gJz0nO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgdmFyaWFibGVzKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgaW5zdGFuY2VvZiBRdWVyeSA/IHRoaXMudmFsdWUudmFyaWFibGVzIDogW3RoaXMudmFsdWVdO1xuICAgIH1cbn1cblxuY2xhc3MgU2VsZWN0RmllbGRWYWx1ZSBleHRlbmRzIEZpZWxkVmFsdWUge1xuICAgIHB1YmxpYyB0b1N0cmluZyhmaXJzdDogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gYCgke3RoaXMudmFsdWUgaW5zdGFuY2VvZiBRdWVyeSA/IHRoaXMudmFsdWUgOiAnPyd9KSBBUyAke3RoaXMuZmllbGR9YDtcbiAgICB9XG59XG5cbmNsYXNzIFVwZGF0ZUZpZWxkVmFsdWUgZXh0ZW5kcyBGaWVsZFZhbHVlIHtcbn1cblxuY2xhc3MgV2hlcmVGaWVsZFZhbHVlIGV4dGVuZHMgRmllbGRWYWx1ZSB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVyYXRvcjogV2hlcmVPcGVyYXRvcjtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF90ZXN0OiBXaGVyZVRlc3Q7XG5cbiAgICBjb25zdHJ1Y3RvcihmaWVsZDogc3RyaW5nLCB2YWx1ZTogYW55LCBvcGVyYXRvcjogV2hlcmVPcGVyYXRvciwgdGVzdDogV2hlcmVUZXN0KSB7XG4gICAgICAgIHN1cGVyKGZpZWxkLCB2YWx1ZSk7XG4gICAgICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjtcbiAgICAgICAgdGhpcy5fdGVzdCA9IHRlc3Q7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKGZpcnN0OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiAoIWZpcnN0ID8gYCAke3RoaXMub3BlcmF0b3J9IGAgOiAnJykgKyBzdXBlci50b1N0cmluZyh0cnVlKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHRlc3QoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rlc3Q7XG4gICAgfVxufSJdfQ==