ontimize-web-ngx
Version:
Ontimize Web framework using Angular 15
237 lines • 33.3 kB
JavaScript
export class FilterExpressionUtils {
static instanceofBasicExpression(arg) {
return arg.hasOwnProperty(FilterExpressionUtils.BASIC_EXPRESSION_KEY)
&& FilterExpressionUtils.instanceofExpression(arg[FilterExpressionUtils.BASIC_EXPRESSION_KEY]);
}
static buildBasicExpression(exp) {
if (exp) {
if (!FilterExpressionUtils.instanceofExpression(exp)) {
console.error('The expression provided is not an instance of \'Expression\'');
}
const be = {
'@basic_expression': exp
};
return be;
}
return undefined;
}
static instanceofFilterExpression(exp) {
return exp.hasOwnProperty(FilterExpressionUtils.FILTER_EXPRESSION_KEY)
&& FilterExpressionUtils.instanceofExpression(exp[FilterExpressionUtils.FILTER_EXPRESSION_KEY]);
}
static buildFilterExpression(exp) {
if (exp) {
if (!FilterExpressionUtils.instanceofExpression(exp)) {
console.error('The expression provided is not an instance of \'Expression\'');
}
const be = {
'@filter_expression': exp
};
return be;
}
return undefined;
}
static instanceofExpression(exp) {
return exp.hasOwnProperty('lop') && exp.hasOwnProperty('op');
}
static buildComplexExpression(expr1, expr2, op) {
if (expr1.lop === undefined && expr1.op === undefined) {
return expr2;
}
if (expr2.lop === undefined && expr2.op === undefined) {
return expr1;
}
const expr = {
lop: expr1,
op: op,
rop: expr2
};
return expr;
}
static buildExpressionEquals(key, value) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_EQUAL,
rop: value
};
return expr;
}
static buildExpressionIsNotNull(key) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_NOT_NULL
};
return expr;
}
static buildExpressionIsNull(key) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_NULL
};
return expr;
}
static buildExpressionLess(key, value) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_LESS,
rop: value
};
return expr;
}
static buildExpressionLessEqual(key, value) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_LESS_EQUAL,
rop: value
};
return expr;
}
static buildExpressionMore(key, value) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_MORE,
rop: value
};
return expr;
}
static buildExpressionMoreEqual(key, value) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_MORE_EQUAL,
rop: value
};
return expr;
}
static buildExpressionIn(key, values) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_IN,
rop: values
};
return expr;
}
static buildExpressionNotLike(key, value) {
if (value !== undefined) {
value = value.replace(new RegExp('\\*', 'g'), '%');
if (value.indexOf('%') === -1) {
value = '%' + value + '%';
}
}
const expr = {
lop: key,
op: FilterExpressionUtils.OP_NOT_LIKE,
rop: value
};
return expr;
}
static buildExpressionLike(key, value) {
if (value !== undefined) {
value = value.replace(new RegExp('\\*', 'g'), '%');
if (value.indexOf('%') === -1) {
value = '%' + value + '%';
}
}
const expr = {
lop: key,
op: FilterExpressionUtils.OP_LIKE,
rop: value
};
return expr;
}
static buildExpressionLikeEnd(key, value) {
if (value !== undefined) {
value = '%' + value;
}
const expr = {
lop: key,
op: FilterExpressionUtils.OP_LIKE,
rop: value
};
return expr;
}
static buildExpressionLikeStart(key, value) {
if (value !== undefined) {
value = value + '%';
}
const expr = {
lop: key,
op: FilterExpressionUtils.OP_LIKE,
rop: value
};
return expr;
}
static buildExpressionNotEquals(key, value) {
const expr = {
lop: key,
op: FilterExpressionUtils.OP_NOT_EQUAL,
rop: value
};
return expr;
}
static buildExpressionNullAndValue(key, value, op) {
const isNull = FilterExpressionUtils.buildExpressionIsNull(key);
const equals = FilterExpressionUtils.buildExpressionEquals(key, value);
const expr = {
lop: isNull,
op: op,
rop: equals
};
return expr;
}
static buildArrayExpressionLike(keys, value) {
let result = {
lop: undefined,
op: undefined
};
keys.forEach((col) => {
result = FilterExpressionUtils.stackExpressionLikeOR(col, value, result);
});
return result;
}
static buildExpressionFromObject(obj) {
let result = {
lop: undefined,
op: undefined
};
Object.keys(obj || {}).forEach((key) => {
result = FilterExpressionUtils.stackExpressionEqualsAND(key, obj[key], result);
});
return result;
}
static stackExpressionLikeOR(key, value, expr) {
const likeExpr = FilterExpressionUtils.buildExpressionLike(key, value);
if (expr.lop === undefined && expr.op === undefined) {
return likeExpr;
}
else {
expr = FilterExpressionUtils.buildComplexExpression(expr, likeExpr, FilterExpressionUtils.OP_OR);
}
return expr;
}
static stackExpressionEqualsAND(key, value, expr) {
const equalsExpr = FilterExpressionUtils.buildExpressionEquals(key, value);
if (expr.lop === undefined && expr.op === undefined) {
return equalsExpr;
}
else {
expr = FilterExpressionUtils.buildComplexExpression(expr, equalsExpr, FilterExpressionUtils.OP_AND);
}
return expr;
}
}
FilterExpressionUtils.BASIC_EXPRESSION_KEY = '@basic_expression';
FilterExpressionUtils.FILTER_EXPRESSION_KEY = '@filter_expression';
FilterExpressionUtils.OP_OR = 'OR';
FilterExpressionUtils.OP_AND = 'AND';
FilterExpressionUtils.OP_LIKE = 'LIKE';
FilterExpressionUtils.OP_NOT_LIKE = 'NOT LIKE';
FilterExpressionUtils.OP_EQUAL = '=';
FilterExpressionUtils.OP_NOT_EQUAL = '<>';
FilterExpressionUtils.OP_NULL = 'IS NULL';
FilterExpressionUtils.OP_NOT_NULL = 'IS NOT NULL';
FilterExpressionUtils.OP_LESS = '<';
FilterExpressionUtils.OP_LESS_EQUAL = '<=';
FilterExpressionUtils.OP_MORE = '>';
FilterExpressionUtils.OP_MORE_EQUAL = '>=';
FilterExpressionUtils.OP_IN = 'IN';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWV4cHJlc3Npb24udXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvdXRpbC9maWx0ZXItZXhwcmVzc2lvbi51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLE9BQU8scUJBQXFCO0lBa0ZoQyxNQUFNLENBQUMseUJBQXlCLENBQUMsR0FBUTtRQUN2QyxPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUM7ZUFDaEUscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUNuRyxDQUFDO0lBT0QsTUFBTSxDQUFDLG9CQUFvQixDQUFDLEdBQWU7UUFDekMsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3BELE9BQU8sQ0FBQyxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQzthQUMvRTtZQUNELE1BQU0sRUFBRSxHQUFvQjtnQkFDMUIsbUJBQW1CLEVBQUUsR0FBRzthQUN6QixDQUFDO1lBQ0YsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFPRCxNQUFNLENBQUMsMEJBQTBCLENBQUMsR0FBUTtRQUN4QyxPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMscUJBQXFCLENBQUM7ZUFDakUscUJBQXFCLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDO0lBT0QsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEdBQWU7UUFDMUMsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFJLENBQUMscUJBQXFCLENBQUMsb0JB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Q0FBQztBQUs1QixpQ0FBVyxHQUFXLGFBQWEsQ0FBQztBQUtwQyw2QkFBTyxHQUFXLEdBQUcsQ0FBQztBQUt0QixtQ0FBYSxHQUFXLElBQUksQ0FBQztBQUs3Qiw2QkFBTyxHQUFXLEdBQUcsQ0FBQztBQUt0QixtQ0FBYSxHQUFXLElBQUksQ0FBQztBQUs3QiwyQkFBSyxHQUFXLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2ljRXhwcmVzc2lvbiB9IGZyb20gJy4uL3R5cGVzL2Jhc2ljLWV4cHJlc3Npb24udHlwZSc7XG5pbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi4vdHlwZXMvZXhwcmVzc2lvbi50eXBlJztcbmltcG9ydCB7IEZpbHRlckV4cHJlc3Npb24gfSBmcm9tICcuLi90eXBlcy9maWx0ZXItZXhwcmVzc2lvbi50eXBlJztcblxuLyoqXG4gKiBVdGlsaXR5IGNsYXNzIGZvciBidWlsZGluZyBiYXNpYyBhbmQgZmlsdGVyIGV4cHJlc3Npb25zLlxuICovXG5leHBvcnQgY2xhc3MgRmlsdGVyRXhwcmVzc2lvblV0aWxzIHtcblxuICAvKipcbiAgICogVGhlIGJhc2ljIGV4cHJlc2lvbiBrZXkuXG4gICAqL1xuICBzdGF0aWMgQkFTSUNfRVhQUkVTU0lPTl9LRVkgPSAnQGJhc2ljX2V4cHJlc3Npb24nO1xuXG4gIC8qKlxuICAgKiBUaGUgZmlsdGVyIGV4cHJlc2lvbiBrZXkuXG4gICAqL1xuICBzdGF0aWMgRklMVEVSX0VYUFJFU1NJT05fS0VZID0gJ0BmaWx0ZXJfZXhwcmVzc2lvbic7XG5cbiAgLyoqXG4gICAqIFRoZSBgT1JgIG9wZXJhdG9yLlxuICAgKi9cbiAgc3RhdGljIE9QX09SOiBzdHJpbmcgPSAnT1InO1xuXG4gIC8qKlxuICAgKiBUaGUgYEFORGAgb3BlcmF0b3IuXG4gICAqL1xuICBzdGF0aWMgT1BfQU5EOiBzdHJpbmcgPSAnQU5EJztcblxuICAvKipcbiAgICogVGhlIGBMSUtFYCBvcGVyYXRvclxuICAgKi9cbiAgc3RhdGljIE9QX0xJS0U6IHN0cmluZyA9ICdMSUtFJztcblxuICAvKipcbiAgICogVGhlIGBOT1QgTElLRWAgb3BlcmF0b3IuXG4gICAqL1xuICBzdGF0aWMgT1BfTk9UX0xJS0U6IHN0cmluZyA9ICdOT1QgTElLRSc7XG5cbiAgLyoqXG4gICAqIFRoZSBgRVFVQUxgIG9wZXJhdG9yLlxuICAgKi9cbiAgc3RhdGljIE9QX0VRVUFMOiBzdHJpbmcgPSAnPSc7XG5cbiAgLyoqXG4gICAqIFRoZSBgTk9UIEVRVUFMYCBvcGVyYXRvci5cbiAgICovXG4gIHN0YXRpYyBPUF9OT1RfRVFVQUw6IHN0cmluZyA9ICc8Pic7XG5cbiAgLyoqXG4gICAqIFRoZSBgSVMgTlVMTGAgb3BlcmF0b3IuXG4gICAqL1xuICBzdGF0aWMgT1BfTlVMTDogc3RyaW5nID0gJ0lTIE5VTEwnO1xuXG4gIC8qKlxuICAgKiBUaGUgYElTIE5PVCBOVUxMYCBvcGVyYXRvci5cbiAgICovXG4gIHN0YXRpYyBPUF9OT1RfTlVMTDogc3RyaW5nID0gJ0lTIE5PVCBOVUxMJztcblxuICAvKipcbiAgICogVGhlIGBMRVNTYCBvcGVyYXRvci5cbiAgICovXG4gIHN0YXRpYyBPUF9MRVNTOiBzdHJpbmcgPSAnPCc7XG5cbiAgLyoqXG4gICAqIFRoZSBgTEVTIEVRVUFMYCBvcGVyYXRvci5cbiAgICovXG4gIHN0YXRpYyBPUF9MRVNTX0VRVUFMOiBzdHJpbmcgPSAnPD0nO1xuXG4gIC8qKlxuICAgKiBUaGUgYE1PUkVgIG9wZXJhdG9yLlxuICAgKi9cbiAgc3RhdGljIE9QX01PUkU6IHN0cmluZyA9ICc+JztcblxuICAvKipcbiAgICogVGhlIGBNT1JFIEVRVUFMYCBvcGVyYXRvci5cbiAgICovXG4gIHN0YXRpYyBPUF9NT1JFX0VRVUFMOiBzdHJpbmcgPSAnPj0nO1xuXG4gIC8qKlxuICAgKiBUaGUgYElOYCBvcGVyYXRvci5cbiAgICovXG4gIHN0YXRpYyBPUF9JTjogc3RyaW5nID0gJ0lOJztcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGlmIHRoZSB0aGUgZXhwcmVzc2lvbiBwcm92aWRlZCBpcyBhbiBpbnN0YW5jZSBvZiBgQmFzaWNFeHByZXNzaW9uYC4uXG4gICAqIEBwYXJhbSBhcmcgdGhlIGV4cHJlc3Npb24gdG8gZXZhbHVhdGUuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcHJvdmlkZWQgZXhwcmVzc2lvbiBpcyBhbiBpbnN0YW5jZSBvZiBgQmFzaWNFeHByZXNzaW9uYCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBzdGF0aWMgaW5zdGFuY2VvZkJhc2ljRXhwcmVzc2lvbihhcmc6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhcmcuaGFzT3duUHJvcGVydHkoRmlsdGVyRXhwcmVzc2lvblV0aWxzLkJBU0lDX0VYUFJFU1NJT05fS0VZKVxuICAgICAgJiYgRmlsdGVyRXhwcmVzc2lvblV0aWxzLmluc3RhbmNlb2ZFeHByZXNzaW9uKGFyZ1tGaWx0ZXJFeHByZXNzaW9uVXRpbHMuQkFTSUNfRVhQUkVTU0lPTl9LRVldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBgQmFzaWNFeHByZXNzaW9uYCBpbnN0YW5jZSBmcm9tIHRoZSBmaWx0ZXJpbmcgZXhwcmVzc2lvbiAoYEV4cHJlc3Npb25gKSBwcm92aWRlZC5cbiAgICogQHBhcmFtIGV4cCB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm5zIHRoZSBiYXNpYyBleHByZXNzaW9uLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkQmFzaWNFeHByZXNzaW9uKGV4cDogRXhwcmVzc2lvbik6IEJhc2ljRXhwcmVzc2lvbiB7XG4gICAgaWYgKGV4cCkge1xuICAgICAgaWYgKCFGaWx0ZXJFeHByZXNzaW9uVXRpbHMuaW5zdGFuY2VvZkV4cHJlc3Npb24oZXhwKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdUaGUgZXhwcmVzc2lvbiBwcm92aWRlZCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgXFwnRXhwcmVzc2lvblxcJycpO1xuICAgICAgfVxuICAgICAgY29uc3QgYmU6IEJhc2ljRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgJ0BiYXNpY19leHByZXNzaW9uJzogZXhwXG4gICAgICB9O1xuICAgICAgcmV0dXJuIGJlO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBpZiBhbiBleHByZXNpb24gaXMgaW5zdGFuY2Ugb2YgYEZpbHRlckV4cHJlc3Npb25gLlxuICAgKiBAcGFyYW0gZXhwIHRoZSBleHByZXNzaW9uIHRvIGV2YWx1YXRlLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3ZpZGVkIGV4cHJlc3Npb24gaXMgYW4gaW5zdGFuY2Ugb2YgYEZpbHRlckV4cHJlc3Npb25gLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZW9mRmlsdGVyRXhwcmVzc2lvbihleHA6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBleHAuaGFzT3duUHJvcGVydHkoRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWSlcbiAgICAgICYmIEZpbHRlckV4cHJlc3Npb25VdGlscy5pbnN0YW5jZW9mRXhwcmVzc2lvbihleHBbRmlsdGVyRXhwcmVzc2lvblV0aWxzLkZJTFRFUl9FWFBSRVNTSU9OX0tFWV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBgRmlsdGVyRXhwcmVzc2lvbmAgaW5zdGFuY2UgZnJvbSB0aGUgZmlsdGVyaW5nIGV4cHJlc3Npb24gKGBFeHByZXNzaW9uYCkgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSBleHAgdGhlIGZpbHRlcmluZyBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyB0aGUgYEZpbHRlckV4cHJlc3Npb25gLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkRmlsdGVyRXhwcmVzc2lvbihleHA6IEV4cHJlc3Npb24pOiBGaWx0ZXJFeHByZXNzaW9uIHtcbiAgICBpZiAoZXhwKSB7XG4gICAgICBpZiAoIUZpbHRlckV4cHJlc3Npb25VdGlscy5pbnN0YW5jZW9mRXhwcmVzc2lvbihleHApKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZSBleHByZXNzaW9uIHByb3ZpZGVkIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBcXCdFeHByZXNzaW9uXFwnJyk7XG4gICAgICB9XG4gICAgICBjb25zdCBiZTogRmlsdGVyRXhwcmVzc2lvbiA9IHtcbiAgICAgICAgJ0BmaWx0ZXJfZXhwcmVzc2lvbic6IGV4cFxuICAgICAgfTtcbiAgICAgIHJldHVybiBiZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgaWYgYW4gZXhwcmVzaW9uIGlzIGluc3RhbmNlIG9mIGBFeHByZXNzaW9uYC5cbiAgICogQHBhcmFtIGV4cCB0aGUgZXhwcmVzc2lvbiB0byBldmFsdWF0ZS5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBwcm92aWRlZCBleHByZXNzaW9uIGlzIGFuIGluc3RhbmNlIG9mIGBFeHByZXNzaW9uYCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBzdGF0aWMgaW5zdGFuY2VvZkV4cHJlc3Npb24oZXhwOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXhwLmhhc093blByb3BlcnR5KCdsb3AnKSAmJiBleHAuaGFzT3duUHJvcGVydHkoJ29wJyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgY29tcGxleCBgRXhwcmVzc2lvbmAgaW5zdGFuY2Ugam9pbmluZyB0d28gZXhwcmVzc2lvbnMgd2l0aCB0aGUgcHJvdmlkZWQgb3BlcmF0b3IuXG4gICAqIEBwYXJhbSBleHByMSB0aGUgZmlyc3QgYEV4cHJlc3Npb25gIHRvIGpvaW4uXG4gICAqIEBwYXJhbSBleHByMiB0aGUgc2Vjb25kIGBFeHByZXNzaW9uYCB0byBqb2luLlxuICAgKiBAcGFyYW0gb3AgdGhlIGpvaW5pbmcgb3BlcmF0b3IuXG4gICAqIEByZXR1cm5zIHRoZSBjb21wbGV4IGBFeHByZXNzaW9uYC5cbiAgICovXG4gIHN0YXRpYyBidWlsZENvbXBsZXhFeHByZXNzaW9uKGV4cHIxOiBFeHByZXNzaW9uLCBleHByMjogRXhwcmVzc2lvbiwgb3A6IHN0cmluZyk6IEV4cHJlc3Npb24ge1xuICAgIGlmIChleHByMS5sb3AgPT09IHVuZGVmaW5lZCAmJiBleHByMS5vcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXhwcjI7XG4gICAgfVxuICAgIGlmIChleHByMi5sb3AgPT09IHVuZGVmaW5lZCAmJiBleHByMi5vcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXhwcjE7XG4gICAgfVxuICAgIGNvbnN0IGV4cHI6IEV4cHJlc3Npb24gPSB7XG4gICAgICBsb3A6IGV4cHIxLFxuICAgICAgb3A6IG9wLFxuICAgICAgcm9wOiBleHByMlxuICAgIH07XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGBFeHByZXNzaW9uYCBpbnN0YW5jZSBmb3IgZmlsdGVyaW5nIHRoZSBwcm92aWRlZCBrZXkgRVFVQUwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHRoZSBgRXhwcmVzc2lvbmAuXG4gICAqL1xuICBzdGF0aWMgYnVpbGRFeHByZXNzaW9uRXF1YWxzKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgZXhwcjogRXhwcmVzc2lvbiA9IHtcbiAgICAgIGxvcDoga2V5LFxuICAgICAgb3A6IEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9FUVVBTCxcbiAgICAgIHJvcDogdmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBgRXhwcmVzc2lvbmAgaW5zdGFuY2UgZm9yIGZpbHRlcmluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggYSBOT1QgTlVMTCB2YWx1ZS5cbiAgICogQHBhcmFtIGtleSB0aGUga2V5LlxuICAgKiBAcmV0dXJucyB0aGUgYEV4cHJlc3Npb25gLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkRXhwcmVzc2lvbklzTm90TnVsbChrZXk6IHN0cmluZyk6IEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IGV4cHI6IEV4cHJlc3Npb24gPSB7XG4gICAgICBsb3A6IGtleSxcbiAgICAgIG9wOiBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfTk9UX05VTExcbiAgICB9O1xuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBgRXhwcmVzc2lvbmAgaW5zdGFuY2UgZm9yIGZpbHRlcmluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggYSBOVUxMIHZhbHVlLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gICAqIEByZXR1cm5zIHRoZSBgRXhwcmVzc2lvbmAuXG4gICAqL1xuICBzdGF0aWMgYnVpbGRFeHByZXNzaW9uSXNOdWxsKGtleTogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgZXhwcjogRXhwcmVzc2lvbiA9IHtcbiAgICAgIGxvcDoga2V5LFxuICAgICAgb3A6IEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9OVUxMXG4gICAgfTtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYEV4cHJlc3Npb25gIGluc3RhbmNlIGZvciBmaWx0ZXJpbmcgdGhlIHByb3ZpZGVkIGtleSBMRVNTIHRoYW4gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHRoZSBgRXhwcmVzc2lvbmAuXG4gICAqL1xuICBzdGF0aWMgYnVpbGRFeHByZXNzaW9uTGVzcyhrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IGV4cHI6IEV4cHJlc3Npb24gPSB7XG4gICAgICBsb3A6IGtleSxcbiAgICAgIG9wOiBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfTEVTUyxcbiAgICAgIHJvcDogdmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbiBgRXhwcmVzc2lvbmAgaW5zdGFuY2UgZm9yIGZpbHRlcmluZyB0aGUgcHJvdmlkZWQga2V5IExFU1MgT1IgRVFVQUwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHRoZSBgRXhwcmVzc2lvbmAuXG4gICAqL1xuICBzdGF0aWMgYnVpbGRFeHByZXNzaW9uTGVzc0VxdWFsKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgZXhwcjogRXhwcmVzc2lvbiA9IHtcbiAgICAgIGxvcDoga2V5LFxuICAgICAgb3A6IEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9MRVNTX0VRVUFMLFxuICAgICAgcm9wOiB2YWx1ZVxuICAgIH07XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGBFeHByZXNzaW9uYCBpbnN0YW5jZSBmb3IgZmlsdGVyaW5nIHRoZSBwcm92aWRlZCBrZXkgTU9SRSB0aGFuIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICogQHBhcmFtIGtleSB0aGUga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB0aGUgYEV4cHJlc3Npb25gLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkRXhwcmVzc2lvbk1vcmUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBFeHByZXNzaW9uIHtcbiAgICBjb25zdCBleHByOiBFeHByZXNzaW9uID0ge1xuICAgICAgbG9wOiBrZXksXG4gICAgICBvcDogRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX01PUkUsXG4gICAgICByb3A6IHZhbHVlXG4gICAgfTtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYEV4cHJlc3Npb25gIGluc3RhbmNlIGZvciBmaWx0ZXJpbmcgdGhlIHByb3ZpZGVkIGtleSBNT1JFIE9SIEVRVUFMIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICogQHBhcmFtIGtleSB0aGUga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB0aGUgYEV4cHJlc3Npb25gLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkRXhwcmVzc2lvbk1vcmVFcXVhbChrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IGV4cHI6IEV4cHJlc3Npb24gPSB7XG4gICAgICBsb3A6IGtleSxcbiAgICAgIG9wOiBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfTU9SRV9FUVVBTCxcbiAgICAgIHJvcDogdmFsdWVcbiAgICB9O1xuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgc3RhdGljIGJ1aWxkRXhwcmVzc2lvbkluKGtleTogc3RyaW5nLCB2YWx1ZXM6IGFueVtdKTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgZXhwcjogRXhwcmVzc2lvbiA9IHtcbiAgICAgIGxvcDoga2V5LFxuICAgICAgb3A6IEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9JTixcbiAgICAgIHJvcDogdmFsdWVzXG4gICAgfTtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYEV4cHJlc3Npb25gIGluc3RhbmNlIGZvciBmaWx0ZXJpbmcgdGhlIHByb3ZpZGVkIGtleSBOT1QgTElLRSB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS5cbiAgICogQHJldHVybnMgdGhlIGBFeHByZXNzaW9uYC5cbiAgICovXG4gIHN0YXRpYyBidWlsZEV4cHJlc3Npb25Ob3RMaWtlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcKicsICdnJyksICclJyk7XG4gICAgICBpZiAodmFsdWUuaW5kZXhPZignJScpID09PSAtMSkge1xuICAgICAgICB2YWx1ZSA9ICclJyArIHZhbHVlICsgJyUnO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBleHByOiBFeHByZXNzaW9uID0ge1xuICAgICAgbG9wOiBrZXksXG4gICAgICBvcDogRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX05PVF9MSUtFLFxuICAgICAgcm9wOiB2YWx1ZVxuICAgIH07XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGBFeHByZXNzaW9uYCBpbnN0YW5jZSBmb3IgZmlsdGVyaW5nIHRoZSBwcm92aWRlZCBrZXkgTElLRSB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS5cbiAgICogQHJldHVybnMgdGhlIGBFeHByZXNzaW9uYC5cbiAgICovXG4gIHN0YXRpYyBidWlsZEV4cHJlc3Npb25MaWtlKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcKicsICdnJyksICclJyk7XG4gICAgICBpZiAodmFsdWUuaW5kZXhPZignJScpID09PSAtMSkge1xuICAgICAgICB2YWx1ZSA9ICclJyArIHZhbHVlICsgJyUnO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBleHByOiBFeHByZXNzaW9uID0ge1xuICAgICAgbG9wOiBrZXksXG4gICAgICBvcDogRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0xJS0UsXG4gICAgICByb3A6IHZhbHVlXG4gICAgfTtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYEV4cHJlc3Npb25gIGluc3RhbmNlIGZvciBmaWx0ZXJpbmcgdGhlIHByb3ZpZGVkIGtleSBFTkRTIExJS0UgdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHRoZSBgRXhwcmVzc2lvbmAuXG4gICAqL1xuICBzdGF0aWMgYnVpbGRFeHByZXNzaW9uTGlrZUVuZChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IEV4cHJlc3Npb24ge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZSA9ICclJyArIHZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBleHByOiBFeHByZXNzaW9uID0ge1xuICAgICAgbG9wOiBrZXksXG4gICAgICBvcDogRmlsdGVyRXhwcmVzc2lvblV0aWxzLk9QX0xJS0UsXG4gICAgICByb3A6IHZhbHVlXG4gICAgfTtcbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYEV4cHJlc3Npb25gIGluc3RhbmNlIGZvciBmaWx0ZXJpbmcgdGhlIHByb3ZpZGVkIGtleSBTVEFSVFMgTElLRSB0aGUgcHJvdmlkZWQgdmFsdWUuXG4gICAqIEBwYXJhbSBrZXkgdGhlIGtleS5cbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZS5cbiAgICogQHJldHVybnMgdGhlIGBFeHByZXNzaW9uYC5cbiAgICovXG4gIHN0YXRpYyBidWlsZEV4cHJlc3Npb25MaWtlU3RhcnQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiBFeHByZXNzaW9uIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdmFsdWUgPSB2YWx1ZSArICclJztcbiAgICB9XG4gICAgY29uc3QgZXhwcjogRXhwcmVzc2lvbiA9IHtcbiAgICAgIGxvcDoga2V5LFxuICAgICAgb3A6IEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9MSUtFLFxuICAgICAgcm9wOiB2YWx1ZVxuICAgIH07XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGBFeHByZXNzaW9uYCBpbnN0YW5jZSBmb3IgZmlsdGVyaW5nIHRoZSBwcm92aWRlZCBrZXkgTk9UIEVRVUFMIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAgICogQHBhcmFtIGtleSB0aGUga2V5LlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB0aGUgYEV4cHJlc3Npb25gLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkRXhwcmVzc2lvbk5vdEVxdWFscyhrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24ge1xuICAgIGNvbnN0IGV4cHI6IEV4cHJlc3Npb24gPSB7XG4gICAgICBsb3A6IGtleSxcbiAgICAgIG9wOiBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuT1BfTk9UX0VRVUFMLFxuICAgICAgcm9wOiB2YWx1ZVxuICAgIH07XG4gICAgcmV0dXJuIGV4cHI7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgY29tcGxleCBgRXhwcmVzc2lvbmAgZm9yIGZpbHRlcmluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdHdvIGNvbmRpdGlvbnM6XG4gICAqICogVGhlIGZpcnN0IGZpbHRlciB0aGUgcHJvdmlkZWQga2V5IHdpdGggYSBOVUxMIHZhbHVlLlxuICAgKiAqIFRoZSBzZWNvbmQgZmlsdGVyIHRoZSBwcm92aWRlZCBrZXkgRVFVQUwgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLlxuICAgKlxuICAgKiBCb3RoIGV4cHJlc3Npb25zIGFyZSBqb2luZWQgdXNpbmcgdGhlIHByb3ZpZGVkIG9wZXJhdG9yLlxuICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkuXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUuXG4gICAqIEBwYXJhbSBvcCB0aGUgb3BlcmF0b3IuXG4gICAqIEByZXR1cm5zIHRoZSBgRXhwcmVzc2lvbmAuXG4gICAqL1xuICBzdGF0aWMgYnVpbGRFeHByZXNzaW9uTnVsbEFuZFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBvcDogc3RyaW5nKTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgaXNOdWxsOiBFeHByZXNzaW9uID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkRXhwcmVzc2lvbklzTnVsbChrZXkpO1xuICAgIGNvbnN0IGVxdWFsczogRXhwcmVzc2lvbiA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25FcXVhbHMoa2V5LCB2YWx1ZSk7XG4gICAgY29uc3QgZXhwcjogRXhwcmVzc2lvbiA9IHtcbiAgICAgIGxvcDogaXNOdWxsLFxuICAgICAgb3A6IG9wLFxuICAgICAgcm9wOiBlcXVhbHNcbiAgICB9O1xuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGNvbXBsZXggYEV4cHJlc3Npb25gIGZvciBmaWx0ZXJpbmcgdGhlIHByb3ZpZGVkIGtleXMgTElLRSB0aGUgdmFsdWUgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSBrZXlzIHRoZSBrZXlzLlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB0aGUgYEV4cHJlc3Npb25gLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkQXJyYXlFeHByZXNzaW9uTGlrZShrZXlzOiBhbnlbXSwgdmFsdWU6IGFueSk6IEV4cHJlc3Npb24ge1xuICAgIGxldCByZXN1bHQ6IEV4cHJlc3Npb24gPSB7XG4gICAgICBsb3A6IHVuZGVmaW5lZCxcbiAgICAgIG9wOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIGtleXMuZm9yRWFjaCgoY29sKSA9PiB7XG4gICAgICByZXN1bHQgPSBGaWx0ZXJFeHByZXNzaW9uVXRpbHMuc3RhY2tFeHByZXNzaW9uTGlrZU9SKGNvbCwgdmFsdWUsIHJlc3VsdCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYEV4cHJlc3Npb25gIGluc3RhbmNlIGZyb20gdGhlIHByb3ZpZGVkIG9iamVjdC5cbiAgICogQHBhcmFtIG9iaiB0aGUgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB0aGUgYEV4cHJlc3Npb25gLlxuICAgKi9cbiAgc3RhdGljIGJ1aWxkRXhwcmVzc2lvbkZyb21PYmplY3Qob2JqOiBhbnkpOiBFeHByZXNzaW9uIHtcbiAgICBsZXQgcmVzdWx0OiBFeHByZXNzaW9uID0ge1xuICAgICAgbG9wOiB1bmRlZmluZWQsXG4gICAgICBvcDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICBPYmplY3Qua2V5cyhvYmogfHwge30pLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgcmVzdWx0ID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLnN0YWNrRXhwcmVzc2lvbkVxdWFsc0FORChrZXksIG9ialtrZXldLCByZXN1bHQpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzdGFja0V4cHJlc3Npb25MaWtlT1Ioa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGV4cHI6IEV4cHJlc3Npb24pOiBFeHByZXNzaW9uIHtcbiAgICBjb25zdCBsaWtlRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25MaWtlKGtleSwgdmFsdWUpO1xuICAgIGlmIChleHByLmxvcCA9PT0gdW5kZWZpbmVkICYmIGV4cHIub3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGxpa2VFeHByO1xuICAgIH0gZWxzZSB7XG4gICAgICBleHByID0gRmlsdGVyRXhwcmVzc2lvblV0aWxzLmJ1aWxkQ29tcGxleEV4cHJlc3Npb24oZXhwciwgbGlrZUV4cHIsIEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9PUik7XG4gICAgfVxuICAgIHJldHVybiBleHByO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc3RhY2tFeHByZXNzaW9uRXF1YWxzQU5EKGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBleHByOiBFeHByZXNzaW9uKTogRXhwcmVzc2lvbiB7XG4gICAgY29uc3QgZXF1YWxzRXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZEV4cHJlc3Npb25FcXVhbHMoa2V5LCB2YWx1ZSk7XG4gICAgaWYgKGV4cHIubG9wID09PSB1bmRlZmluZWQgJiYgZXhwci5vcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXF1YWxzRXhwcjtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhwciA9IEZpbHRlckV4cHJlc3Npb25VdGlscy5idWlsZENvbXBsZXhFeHByZXNzaW9uKGV4cHIsIGVxdWFsc0V4cHIsIEZpbHRlckV4cHJlc3Npb25VdGlscy5PUF9BTkQpO1xuICAgIH1cbiAgICByZXR1cm4gZXhwcjtcbiAgfVxuXG59XG4iXX0=