angular-odata
Version:
Client side OData typescript library for Angular
238 lines • 30.5 kB
JavaScript
import { Expression } from './base';
import { FilterExpression } from './filter';
import { SearchExpression } from './search';
import { FieldFactory, functions, operators, syntax, transformations, RenderableFactory, } from './syntax';
export class GroupByTransformations extends Expression {
methods;
aliases;
constructor({ children, methods, aliases, } = {}) {
super({ children });
this.methods = methods || [];
this.aliases = aliases || [];
}
get [Symbol.toStringTag]() {
return 'GroupByTransformations';
}
toJson() {
const json = super.toJson();
return Object.assign(json, {
methods: this.methods,
aliases: this.aliases,
});
}
static fromJson(json) {
return new GroupByTransformations({
children: json['children'].map((c) => typeof c !== 'string' ? RenderableFactory(c) : c),
methods: json['methods'],
aliases: json['aliases'],
});
}
render({ aliases, escape, prefix, parser, options, } = {}) {
const children = this._children.map((n) => typeof n !== 'string'
? n.render({ aliases, escape, prefix, parser, options })
: n);
return `aggregate(${children
.map((child, index) => !child
? `${this.methods[index]} as ${this.aliases[index]}`
: `${child} with ${this.methods[index]} as ${this.aliases[index]}`)
.join(',')})`;
}
clone() {
return new GroupByTransformations({
children: this._children.map((c) => typeof c !== 'string' ? c.clone() : c),
methods: this.methods,
aliases: this.aliases,
});
}
_add(node, method, alias) {
this._children.push(node);
this.methods.push(method);
this.aliases.push(alias);
return this;
}
aggregate(value, method, alias) {
return this._add(value, method, alias);
}
sum(value, alias) {
return this.aggregate(value, 'sum', alias);
}
min(value, alias) {
return this.aggregate(value, 'min', alias);
}
max(value, alias) {
return this.aggregate(value, 'max', alias);
}
average(value, alias) {
return this.aggregate(value, 'average', alias);
}
countdistinct(value, alias) {
return this.aggregate(value, 'countdistinct', alias);
}
count(alias) {
return this.aggregate('', '$count', alias);
}
}
export class ApplyExpression extends Expression {
constructor({ children, } = {}) {
super({ children });
}
get [Symbol.toStringTag]() {
return 'ApplyExpression';
}
static factory(opts, current) {
return opts({
t: FieldFactory(),
e: () => new ApplyExpression(),
}, current);
}
toJson() {
const json = super.toJson();
return Object.assign(json, {});
}
static fromJson(json) {
return new ApplyExpression({
children: json['children'].map((c) => RenderableFactory(c)),
});
}
render({ aliases, escape, prefix, parser, options, } = {}) {
return this._children
.map((n) => n.render({ aliases, escape, prefix, parser, options }))
.join('/');
}
clone() {
return new ApplyExpression({
children: this._children.map((c) => c.clone()),
});
}
_add(node) {
this._children.push(node);
return this;
}
aggregate(value, method, alias) {
return this._add(syntax.aggregate(value, method, alias));
}
//topcount
topCount(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
//topsum
topSum(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
//toppercent
topPercent(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
//bottomcount
bottomCount(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
//bottomsum
bottomSum(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
//bottompercent
bottomPercent(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
identity(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
concat(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
//groupby
groupBy(props, opts) {
let properties = props({ rollup: (e) => syntax.rollup(e) });
properties = Array.isArray(properties) ? properties : [properties];
const transformations = opts !== undefined ? opts(new GroupByTransformations()) : undefined;
return this._add(syntax.groupby(properties, transformations));
}
//filter
filter(opts) {
const exp = opts({
t: FieldFactory(),
o: operators,
f: functions,
e: (connector = 'and') => new FilterExpression({ connector }),
});
return this._add(transformations.filter(exp));
}
/*
orderBy(
opts: (
builder: OrderByExpressionBuilder<T>,
current?: OrderByExpression<T>
) => OrderByExpression<T>,
current?: OrderByExpression<T>
) {
const exp = opts(
{
t: FieldFactory<Required<T>>(),
e: () => new OrderByExpression<T>(),
},
current
) as OrderByExpression<T>;
return this._add(transformations.orderby(exp));
}
*/
//expand
expand(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
//search
search(opts) {
const exp = opts({
t: FieldFactory(),
o: operators,
f: functions,
e: (connector = 'AND') => new SearchExpression({ connector }),
});
return this._add(transformations.search(exp));
}
//compute
compute(opts) {
const node = opts({
o: operators,
f: functions,
});
return this._add(node);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwbHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvcmVzb3VyY2VzL3F1ZXJ5L2V4cHJlc3Npb25zL2FwcGx5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFtQixnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3RCxPQUFPLEVBQW1CLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdELE9BQU8sRUFDTCxZQUFZLEVBQ1osU0FBUyxFQUdULFNBQVMsRUFDVCxNQUFNLEVBQ04sZUFBZSxFQUVmLGlCQUFpQixHQUVsQixNQUFNLFVBQVUsQ0FBQztBQUVsQixNQUFNLE9BQU8sc0JBQTBCLFNBQVEsVUFBYTtJQUNoRCxPQUFPLENBQStCO0lBQ3RDLE9BQU8sQ0FBVztJQUM1QixZQUFZLEVBQ1YsUUFBUSxFQUNSLE9BQU8sRUFDUCxPQUFPLE1BS0wsRUFBRTtRQUNKLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEIsT0FBTyx3QkFBd0IsQ0FBQztJQUNsQyxDQUFDO0lBRVEsTUFBTTtRQUNiLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUM1QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87U0FDdEIsQ0FBQyxDQUFDO0lB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WUFDaEIsQ0FBQyxFQUFFLFNBQThCO1lBQ2pDLENBQUMsRUFBRSxTQUE4QjtTQUNsQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztDQWVGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyLCBQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgUXVlcnlDdXN0b21UeXBlIH0gZnJvbSAnLi4vYnVpbGRlcic7XG5pbXBvcnQgeyBFeHByZXNzaW9uIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7IEZpbHRlckNvbm5lY3RvciwgRmlsdGVyRXhwcmVzc2lvbiB9IGZyb20gJy4vZmlsdGVyJztcbmltcG9ydCB7IFNlYXJjaENvbm5lY3RvciwgU2VhcmNoRXhwcmVzc2lvbiB9IGZyb20gJy4vc2VhcmNoJztcbmltcG9ydCB7XG4gIEZpZWxkRmFjdG9yeSxcbiAgZnVuY3Rpb25zLFxuICBPRGF0YUZ1bmN0aW9ucyxcbiAgT0RhdGFPcGVyYXRvcnMsXG4gIG9wZXJhdG9ycyxcbiAgc3ludGF4LFxuICB0cmFuc2Zvcm1hdGlvbnMsXG4gIFJlbmRlcmFibGUsXG4gIFJlbmRlcmFibGVGYWN0b3J5LFxuICBBZ2dyZWdhdGVNZXRob2QsXG59IGZyb20gJy4vc3ludGF4JztcblxuZXhwb3J0IGNsYXNzIEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnM8VD4gZXh0ZW5kcyBFeHByZXNzaW9uPFQ+IHtcbiAgcHJvdGVjdGVkIG1ldGhvZHM6IChBZ2dyZWdhdGVNZXRob2QgfCBzdHJpbmcpW107XG4gIHByb3RlY3RlZCBhbGlhc2VzOiBzdHJpbmdbXTtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNoaWxkcmVuLFxuICAgIG1ldGhvZHMsXG4gICAgYWxpYXNlcyxcbiAgfToge1xuICAgIGNoaWxkcmVuPzogUmVuZGVyYWJsZVtdO1xuICAgIG1ldGhvZHM/OiAoQWdncmVnYXRlTWV0aG9kIHwgc3RyaW5nKVtdO1xuICAgIGFsaWFzZXM/OiBzdHJpbmdbXTtcbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoeyBjaGlsZHJlbiB9KTtcbiAgICB0aGlzLm1ldGhvZHMgPSBtZXRob2RzIHx8IFtdO1xuICAgIHRoaXMuYWxpYXNlcyA9IGFsaWFzZXMgfHwgW107XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdHcm91cEJ5VHJhbnNmb3JtYXRpb25zJztcbiAgfVxuXG4gIG92ZXJyaWRlIHRvSnNvbigpIHtcbiAgICBjb25zdCBqc29uID0gc3VwZXIudG9Kc29uKCk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwge1xuICAgICAgbWV0aG9kczogdGhpcy5tZXRob2RzLFxuICAgICAgYWxpYXNlczogdGhpcy5hbGlhc2VzLFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGZyb21Kc29uPFQ+KGpzb246IHsgW25hbWU6IHN0cmluZ106IGFueSB9KTogR3JvdXBCeVRyYW5zZm9ybWF0aW9uczxUPiB7XG4gICAgcmV0dXJuIG5ldyBHcm91cEJ5VHJhbnNmb3JtYXRpb25zPFQ+KHtcbiAgICAgIGNoaWxkcmVuOiBqc29uWydjaGlsZHJlbiddLm1hcCgoYzogYW55KSA9PlxuICAgICAgICB0eXBlb2YgYyAhPT0gJ3N0cmluZycgPyBSZW5kZXJhYmxlRmFjdG9yeShjKSA6IGMsXG4gICAgICApLFxuICAgICAgbWV0aG9kczoganNvblsnbWV0aG9kcyddLFxuICAgICAgYWxpYXNlczoganNvblsnYWxpYXNlcyddLFxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107XG4gICAgZXNjYXBlPzogYm9vbGVhbjtcbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgcGFyc2VyPzogUGFyc2VyPFQ+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9ID0ge30pOiBzdHJpbmcge1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fY2hpbGRyZW4ubWFwKChuKSA9PlxuICAgICAgdHlwZW9mIG4gIT09ICdzdHJpbmcnXG4gICAgICAgID8gbi5yZW5kZXIoeyBhbGlhc2VzLCBlc2NhcGUsIHByZWZpeCwgcGFyc2VyLCBvcHRpb25zIH0pXG4gICAgICAgIDogbixcbiAgICApO1xuICAgIHJldHVybiBgYWdncmVnYXRlKCR7Y2hpbGRyZW5cbiAgICAgIC5tYXAoKGNoaWxkLCBpbmRleCkgPT5cbiAgICAgICAgIWNoaWxkXG4gICAgICAgICAgPyBgJHt0aGlzLm1ldGhvZHNbaW5kZXhdfSBhcyAke3RoaXMuYWxpYXNlc1tpbmRleF19YFxuICAgICAgICAgIDogYCR7Y2hpbGR9IHdpdGggJHt0aGlzLm1ldGhvZHNbaW5kZXhdfSBhcyAke3RoaXMuYWxpYXNlc1tpbmRleF19YCxcbiAgICAgIClcbiAgICAgIC5qb2luKCcsJyl9KWA7XG4gIH1cblxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gbmV3IEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnM8VD4oe1xuICAgICAgY2hpbGRyZW46IHRoaXMuX2NoaWxkcmVuLm1hcCgoYykgPT5cbiAgICAgICAgdHlwZW9mIGMgIT09ICdzdHJpbmcnID8gYy5jbG9uZSgpIDogYyxcbiAgICAgICksXG4gICAgICBtZXRob2RzOiB0aGlzLm1ldGhvZHMsXG4gICAgICBhbGlhc2VzOiB0aGlzLmFsaWFzZXMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hZGQoXG4gICAgbm9kZTogUmVuZGVyYWJsZSxcbiAgICBtZXRob2Q6IEFnZ3JlZ2F0ZU1ldGhvZCB8IHN0cmluZyxcbiAgICBhbGlhczogc3RyaW5nLFxuICApOiBHcm91cEJ5VHJhbnNmb3JtYXRpb25zPFQ+IHtcbiAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIHRoaXMubWV0aG9kcy5wdXNoKG1ldGhvZCk7XG4gICAgdGhpcy5hbGlhc2VzLnB1c2goYWxpYXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWdncmVnYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAgbWV0aG9kOiBBZ2dyZWdhdGVNZXRob2QgfCBzdHJpbmcsXG4gICAgYWxpYXM6IHN0cmluZyxcbiAgKTogR3JvdXBCeVRyYW5zZm9ybWF0aW9uczxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZCh2YWx1ZSwgbWV0aG9kLCBhbGlhcyk7XG4gIH1cblxuICBzdW0odmFsdWU6IGFueSwgYWxpYXM6IHN0cmluZyk6IEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnM8VD4ge1xuICAgIHJldHVybiB0aGlzLmFnZ3JlZ2F0ZSh2YWx1ZSwgJ3N1bScsIGFsaWFzKTtcbiAgfVxuXG4gIG1pbih2YWx1ZTogYW55LCBhbGlhczogc3RyaW5nKTogR3JvdXBCeVRyYW5zZm9ybWF0aW9uczxUPiB7XG4gICAgcmV0dXJuIHRoaXMuYWdncmVnYXRlKHZhbHVlLCAnbWluJywgYWxpYXMpO1xuICB9XG5cbiAgbWF4KHZhbHVlOiBhbnksIGFsaWFzOiBzdHJpbmcpOiBHcm91cEJ5VHJhbnNmb3JtYXRpb25zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZ2dyZWdhdGUodmFsdWUsICdtYXgnLCBhbGlhcyk7XG4gIH1cblxuICBhdmVyYWdlKHZhbHVlOiBhbnksIGFsaWFzOiBzdHJpbmcpOiBHcm91cEJ5VHJhbnNmb3JtYXRpb25zPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZ2dyZWdhdGUodmFsdWUsICdhdmVyYWdlJywgYWxpYXMpO1xuICB9XG4gIGNvdW50ZGlzdGluY3QodmFsdWU6IGFueSwgYWxpYXM6IHN0cmluZyk6IEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnM8VD4ge1xuICAgIHJldHVybiB0aGlzLmFnZ3JlZ2F0ZSh2YWx1ZSwgJ2NvdW50ZGlzdGluY3QnLCBhbGlhcyk7XG4gIH1cblxuICBjb3VudChhbGlhczogc3RyaW5nKTogR3JvdXBCeVRyYW5zZm9ybWF0aW9uczxUPiB7XG4gICAgcmV0dXJuIHRoaXMuYWdncmVnYXRlKCcnIGFzIGFueSwgJyRjb3VudCcsIGFsaWFzKTtcbiAgfVxufVxuXG5leHBvcnQgdHlwZSBBcHBseUV4cHJlc3Npb25CdWlsZGVyPFQ+ID0ge1xuICB0OiBSZXF1aXJlZDxUPjtcbiAgZTogKCkgPT4gQXBwbHlFeHByZXNzaW9uPFQ+O1xufTtcbmV4cG9ydCBjbGFzcyBBcHBseUV4cHJlc3Npb248VD4gZXh0ZW5kcyBFeHByZXNzaW9uPFQ+IHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGNoaWxkcmVuLFxuICB9OiB7XG4gICAgY2hpbGRyZW4/OiBSZW5kZXJhYmxlW107XG4gIH0gPSB7fSkge1xuICAgIHN1cGVyKHsgY2hpbGRyZW4gfSk7XG4gIH1cblxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdBcHBseUV4cHJlc3Npb24nO1xuICB9XG5cbiAgc3RhdGljIGZhY3Rvcnk8VD4oXG4gICAgb3B0czogKFxuICAgICAgYnVpbGRlcjogQXBwbHlFeHByZXNzaW9uQnVpbGRlcjxUPixcbiAgICAgIGN1cnJlbnQ/OiBBcHBseUV4cHJlc3Npb248VD4sXG4gICAgKSA9PiBBcHBseUV4cHJlc3Npb248VD4sXG4gICAgY3VycmVudD86IEFwcGx5RXhwcmVzc2lvbjxUPixcbiAgKTogQXBwbHlFeHByZXNzaW9uPFQ+IHtcbiAgICByZXR1cm4gb3B0cyhcbiAgICAgIHtcbiAgICAgICAgdDogRmllbGRGYWN0b3J5PFJlcXVpcmVkPFQ+PigpLFxuICAgICAgICBlOiAoKSA9PiBuZXcgQXBwbHlFeHByZXNzaW9uPFQ+KCksXG4gICAgICB9LFxuICAgICAgY3VycmVudCxcbiAgICApIGFzIEFwcGx5RXhwcmVzc2lvbjxUPjtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvSnNvbigpIHtcbiAgICBjb25zdCBqc29uID0gc3VwZXIudG9Kc29uKCk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oanNvbiwge30pO1xuICB9XG5cbiAgc3RhdGljIGZyb21Kc29uPFQ+KGpzb246IHsgW25hbWU6IHN0cmluZ106IGFueSB9KTogQXBwbHlFeHByZXNzaW9uPFQ+IHtcbiAgICByZXR1cm4gbmV3IEFwcGx5RXhwcmVzc2lvbjxUPih7XG4gICAgICBjaGlsZHJlbjoganNvblsnY2hpbGRyZW4nXS5tYXAoKGM6IGFueSkgPT4gUmVuZGVyYWJsZUZhY3RvcnkoYykpLFxuICAgIH0pO1xuICB9XG5cbiAgcmVuZGVyKHtcbiAgICBhbGlhc2VzLFxuICAgIGVzY2FwZSxcbiAgICBwcmVmaXgsXG4gICAgcGFyc2VyLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBhbGlhc2VzPzogUXVlcnlDdXN0b21UeXBlW107XG4gICAgZXNjYXBlPzogYm9vbGVhbjtcbiAgICBwcmVmaXg/OiBzdHJpbmc7XG4gICAgcGFyc2VyPzogUGFyc2VyPFQ+O1xuICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICB9ID0ge30pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlblxuICAgICAgLm1hcCgobikgPT4gbi5yZW5kZXIoeyBhbGlhc2VzLCBlc2NhcGUsIHByZWZpeCwgcGFyc2VyLCBvcHRpb25zIH0pKVxuICAgICAgLmpvaW4oJy8nKTtcbiAgfVxuXG4gIGNsb25lKCkge1xuICAgIHJldHVybiBuZXcgQXBwbHlFeHByZXNzaW9uPFQ+KHtcbiAgICAgIGNoaWxkcmVuOiB0aGlzLl9jaGlsZHJlbi5tYXAoKGMpID0+IGMuY2xvbmUoKSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hZGQobm9kZTogUmVuZGVyYWJsZSk6IEFwcGx5RXhwcmVzc2lvbjxUPiB7XG4gICAgdGhpcy5fY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGFnZ3JlZ2F0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIG1ldGhvZDogQWdncmVnYXRlTWV0aG9kLFxuICAgIGFsaWFzOiBzdHJpbmcsXG4gICk6IEFwcGx5RXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChzeW50YXguYWdncmVnYXRlKHZhbHVlLCBtZXRob2QsIGFsaWFzKSk7XG4gIH1cblxuICAvL3RvcGNvdW50XG4gIHRvcENvdW50KFxuICAgIG9wdHM6IChlOiB7IG86IE9EYXRhT3BlcmF0b3JzPFQ+OyBmOiBPRGF0YUZ1bmN0aW9uczxUPiB9KSA9PiBSZW5kZXJhYmxlLFxuICApOiBBcHBseUV4cHJlc3Npb248VD4ge1xuICAgIGNvbnN0IG5vZGUgPSBvcHRzKHtcbiAgICAgIG86IG9wZXJhdG9ycyBhcyBPRGF0YU9wZXJhdG9yczxUPixcbiAgICAgIGY6IGZ1bmN0aW9ucyBhcyBPRGF0YUZ1bmN0aW9uczxUPixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG5vZGUpO1xuICB9XG5cbiAgLy90b3BzdW1cbiAgdG9wU3VtKFxuICAgIG9wdHM6IChlOiB7IG86IE9EYXRhT3BlcmF0b3JzPFQ+OyBmOiBPRGF0YUZ1bmN0aW9uczxUPiB9KSA9PiBSZW5kZXJhYmxlLFxuICApOiBBcHBseUV4cHJlc3Npb248VD4ge1xuICAgIGNvbnN0IG5vZGUgPSBvcHRzKHtcbiAgICAgIG86IG9wZXJhdG9ycyBhcyBPRGF0YU9wZXJhdG9yczxUPixcbiAgICAgIGY6IGZ1bmN0aW9ucyBhcyBPRGF0YUZ1bmN0aW9uczxUPixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG5vZGUpO1xuICB9XG5cbiAgLy90b3BwZXJjZW50XG4gIHRvcFBlcmNlbnQoXG4gICAgb3B0czogKGU6IHsgbzogT0RhdGFPcGVyYXRvcnM8VD47IGY6IE9EYXRhRnVuY3Rpb25zPFQ+IH0pID0+IFJlbmRlcmFibGUsXG4gICk6IEFwcGx5RXhwcmVzc2lvbjxUPiB7XG4gICAgY29uc3Qgbm9kZSA9IG9wdHMoe1xuICAgICAgbzogb3BlcmF0b3JzIGFzIE9EYXRhT3BlcmF0b3JzPFQ+LFxuICAgICAgZjogZnVuY3Rpb25zIGFzIE9EYXRhRnVuY3Rpb25zPFQ+LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9hZGQobm9kZSk7XG4gIH1cblxuICAvL2JvdHRvbWNvdW50XG4gIGJvdHRvbUNvdW50KFxuICAgIG9wdHM6IChlOiB7IG86IE9EYXRhT3BlcmF0b3JzPFQ+OyBmOiBPRGF0YUZ1bmN0aW9uczxUPiB9KSA9PiBSZW5kZXJhYmxlLFxuICApOiBBcHBseUV4cHJlc3Npb248VD4ge1xuICAgIGNvbnN0IG5vZGUgPSBvcHRzKHtcbiAgICAgIG86IG9wZXJhdG9ycyBhcyBPRGF0YU9wZXJhdG9yczxUPixcbiAgICAgIGY6IGZ1bmN0aW9ucyBhcyBPRGF0YUZ1bmN0aW9uczxUPixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG5vZGUpO1xuICB9XG5cbiAgLy9ib3R0b21zdW1cbiAgYm90dG9tU3VtKFxuICAgIG9wdHM6IChlOiB7IG86IE9EYXRhT3BlcmF0b3JzPFQ+OyBmOiBPRGF0YUZ1bmN0aW9uczxUPiB9KSA9PiBSZW5kZXJhYmxlLFxuICApOiBBcHBseUV4cHJlc3Npb248VD4ge1xuICAgIGNvbnN0IG5vZGUgPSBvcHRzKHtcbiAgICAgIG86IG9wZXJhdG9ycyBhcyBPRGF0YU9wZXJhdG9yczxUPixcbiAgICAgIGY6IGZ1bmN0aW9ucyBhcyBPRGF0YUZ1bmN0aW9uczxUPixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG5vZGUpO1xuICB9XG5cbiAgLy9ib3R0b21wZXJjZW50XG4gIGJvdHRvbVBlcmNlbnQoXG4gICAgb3B0czogKGU6IHsgbzogT0RhdGFPcGVyYXRvcnM8VD47IGY6IE9EYXRhRnVuY3Rpb25zPFQ+IH0pID0+IFJlbmRlcmFibGUsXG4gICk6IEFwcGx5RXhwcmVzc2lvbjxUPiB7XG4gICAgY29uc3Qgbm9kZSA9IG9wdHMoe1xuICAgICAgbzogb3BlcmF0b3JzIGFzIE9EYXRhT3BlcmF0b3JzPFQ+LFxuICAgICAgZjogZnVuY3Rpb25zIGFzIE9EYXRhRnVuY3Rpb25zPFQ+LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9hZGQobm9kZSk7XG4gIH1cblxuICBpZGVudGl0eShcbiAgICBvcHRzOiAoZTogeyBvOiBPRGF0YU9wZXJhdG9yczxUPjsgZjogT0RhdGFGdW5jdGlvbnM8VD4gfSkgPT4gUmVuZGVyYWJsZSxcbiAgKTogQXBwbHlFeHByZXNzaW9uPFQ+IHtcbiAgICBjb25zdCBub2RlID0gb3B0cyh7XG4gICAgICBvOiBvcGVyYXRvcnMgYXMgT0RhdGFPcGVyYXRvcnM8VD4sXG4gICAgICBmOiBmdW5jdGlvbnMgYXMgT0RhdGFGdW5jdGlvbnM8VD4sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChub2RlKTtcbiAgfVxuXG4gIGNvbmNhdChcbiAgICBvcHRzOiAoZTogeyBvOiBPRGF0YU9wZXJhdG9yczxUPjsgZjogT0RhdGFGdW5jdGlvbnM8VD4gfSkgPT4gUmVuZGVyYWJsZSxcbiAgKTogQXBwbHlFeHByZXNzaW9uPFQ+IHtcbiAgICBjb25zdCBub2RlID0gb3B0cyh7XG4gICAgICBvOiBvcGVyYXRvcnMgYXMgT0RhdGFPcGVyYXRvcnM8VD4sXG4gICAgICBmOiBmdW5jdGlvbnMgYXMgT0RhdGFGdW5jdGlvbnM8VD4sXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChub2RlKTtcbiAgfVxuXG4gIC8vZ3JvdXBieVxuICBncm91cEJ5KFxuICAgIHByb3BzOiAoZTogeyByb2xsdXA6IChmOiBhbnkpID0+IGFueSB9KSA9PiBhbnkgfCBhbnlbXSxcbiAgICBvcHRzPzogKGU6IEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnM8VD4pID0+IEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnM8VD4sXG4gICk6IEFwcGx5RXhwcmVzc2lvbjxUPiB7XG4gICAgbGV0IHByb3BlcnRpZXMgPSBwcm9wcyh7IHJvbGx1cDogKGU6IGFueSkgPT4gc3ludGF4LnJvbGx1cChlKSB9KTtcbiAgICBwcm9wZXJ0aWVzID0gQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzKSA/IHByb3BlcnRpZXMgOiBbcHJvcGVydGllc107XG4gICAgY29uc3QgdHJhbnNmb3JtYXRpb25zID1cbiAgICAgIG9wdHMgIT09IHVuZGVmaW5lZCA/IG9wdHMobmV3IEdyb3VwQnlUcmFuc2Zvcm1hdGlvbnMoKSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuX2FkZChzeW50YXguZ3JvdXBieShwcm9wZXJ0aWVzLCB0cmFuc2Zvcm1hdGlvbnMpKTtcbiAgfVxuXG4gIC8vZmlsdGVyXG4gIGZpbHRlcihcbiAgICBvcHRzOiAoZToge1xuICAgICAgdDogVDtcbiAgICAgIGU6IChjb25uZWN0b3I/OiBGaWx0ZXJDb25uZWN0b3IpID0+IEZpbHRlckV4cHJlc3Npb248VD47XG4gICAgICBvOiBPRGF0YU9wZXJhdG9yczxUPjtcbiAgICAgIGY6IE9EYXRhRnVuY3Rpb25zPFQ+O1xuICAgIH0pID0+IEZpbHRlckV4cHJlc3Npb248VD4sXG4gICkge1xuICAgIGNvbnN0IGV4cCA9IG9wdHMoe1xuICAgICAgdDogRmllbGRGYWN0b3J5PFJlcXVpcmVkPFQ+PigpLFxuICAgICAgbzogb3BlcmF0b3JzIGFzIE9EYXRhT3BlcmF0b3JzPFQ+LFxuICAgICAgZjogZnVuY3Rpb25zIGFzIE9EYXRhRnVuY3Rpb25zPFQ+LFxuICAgICAgZTogKGNvbm5lY3RvcjogRmlsdGVyQ29ubmVjdG9yID0gJ2FuZCcpID0+XG4gICAgICAgIG5ldyBGaWx0ZXJFeHByZXNzaW9uPFQ+KHsgY29ubmVjdG9yIH0pLFxuICAgIH0pIGFzIEZpbHRlckV4cHJlc3Npb248VD47XG4gICAgcmV0dXJuIHRoaXMuX2FkZCh0cmFuc2Zvcm1hdGlvbnMuZmlsdGVyKGV4cCkpO1xuICB9XG5cbiAgLypcbiAgb3JkZXJCeShcbiAgICBvcHRzOiAoXG4gICAgICBidWlsZGVyOiBPcmRlckJ5RXhwcmVzc2lvbkJ1aWxkZXI8VD4sXG4gICAgICBjdXJyZW50PzogT3JkZXJCeUV4cHJlc3Npb248VD5cbiAgICApID0+IE9yZGVyQnlFeHByZXNzaW9uPFQ+LFxuICAgIGN1cnJlbnQ/OiBPcmRlckJ5RXhwcmVzc2lvbjxUPlxuICApIHtcbiAgICBjb25zdCBleHAgPSBvcHRzKFxuICAgICAge1xuICAgICAgICB0OiBGaWVsZEZhY3Rvcnk8UmVxdWlyZWQ8VD4+KCksXG4gICAgICAgIGU6ICgpID0+IG5ldyBPcmRlckJ5RXhwcmVzc2lvbjxUPigpLFxuICAgICAgfSxcbiAgICAgIGN1cnJlbnRcbiAgICApIGFzIE9yZGVyQnlFeHByZXNzaW9uPFQ+O1xuICAgIHJldHVybiB0aGlzLl9hZGQodHJhbnNmb3JtYXRpb25zLm9yZGVyYnkoZXhwKSk7XG4gIH1cbiAgKi9cblxuICAvL2V4cGFuZFxuICBleHBhbmQoXG4gICAgb3B0czogKGU6IHsgbzogT0RhdGFPcGVyYXRvcnM8VD47IGY6IE9EYXRhRnVuY3Rpb25zPFQ+IH0pID0+IFJlbmRlcmFibGUsXG4gICk6IEFwcGx5RXhwcmVzc2lvbjxUPiB7XG4gICAgY29uc3Qgbm9kZSA9IG9wdHMoe1xuICAgICAgbzogb3BlcmF0b3JzIGFzIE9EYXRhT3BlcmF0b3JzPFQ+LFxuICAgICAgZjogZnVuY3Rpb25zIGFzIE9EYXRhRnVuY3Rpb25zPFQ+LFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLl9hZGQobm9kZSk7XG4gIH1cblxuICAvL3NlYXJjaFxuICBzZWFyY2goXG4gICAgb3B0czogKGU6IHtcbiAgICAgIHQ6IFQ7XG4gICAgICBlOiAoY29ubmVjdG9yPzogU2VhcmNoQ29ubmVjdG9yKSA9PiBTZWFyY2hFeHByZXNzaW9uPFQ+O1xuICAgICAgbzogT0RhdGFPcGVyYXRvcnM8VD47XG4gICAgICBmOiBPRGF0YUZ1bmN0aW9uczxUPjtcbiAgICB9KSA9PiBTZWFyY2hFeHByZXNzaW9uPFQ+LFxuICApIHtcbiAgICBjb25zdCBleHAgPSBvcHRzKHtcbiAgICAgIHQ6IEZpZWxkRmFjdG9yeTxSZXF1aXJlZDxUPj4oKSxcbiAgICAgIG86IG9wZXJhdG9ycyBhcyBPRGF0YU9wZXJhdG9yczxUPixcbiAgICAgIGY6IGZ1bmN0aW9ucyBhcyBPRGF0YUZ1bmN0aW9uczxUPixcbiAgICAgIGU6IChjb25uZWN0b3I6IFNlYXJjaENvbm5lY3RvciA9ICdBTkQnKSA9PlxuICAgICAgICBuZXcgU2VhcmNoRXhwcmVzc2lvbjxUPih7IGNvbm5lY3RvciB9KSxcbiAgICB9KSBhcyBTZWFyY2hFeHByZXNzaW9uPFQ+O1xuICAgIHJldHVybiB0aGlzLl9hZGQodHJhbnNmb3JtYXRpb25zLnNlYXJjaChleHApKTtcbiAgfVxuXG4gIC8vY29tcHV0ZVxuICBjb21wdXRlKFxuICAgIG9wdHM6IChlOiB7IG86IE9EYXRhT3BlcmF0b3JzPFQ+OyBmOiBPRGF0YUZ1bmN0aW9uczxUPiB9KSA9PiBSZW5kZXJhYmxlLFxuICApOiBBcHBseUV4cHJlc3Npb248VD4ge1xuICAgIGNvbnN0IG5vZGUgPSBvcHRzKHtcbiAgICAgIG86IG9wZXJhdG9ycyBhcyBPRGF0YU9wZXJhdG9yczxUPixcbiAgICAgIGY6IGZ1bmN0aW9ucyBhcyBPRGF0YUZ1bmN0aW9uczxUPixcbiAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5fYWRkKG5vZGUpO1xuICB9XG5cbiAgLypcbiAgc2tpcChcbiAgICB0b3RhbDogbnVtYmVyXG4gICk6IEFwcGx5RXhwcmVzc2lvbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZCh0cmFuc2Zvcm1hdGlvbnMuc2tpcCh0b3RhbCkpO1xuICB9XG5cbiAgdG9wKFxuICAgIHRvdGFsOiBudW1iZXJcbiAgKTogQXBwbHlFeHByZXNzaW9uPFQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYWRkKHRyYW5zZm9ybWF0aW9ucy50b3AodG90YWwpKTtcbiAgfVxuICAqL1xufVxuIl19