angular-odata
Version:
Client side OData typescript library for Angular
770 lines • 97.3 kB
JavaScript
import { ODataStructuredTypeFieldParser } from '../../../schema';
import { Objects, Types } from '../../../utils';
import { normalizeValue } from '../builder';
import { ApplyExpression, GroupByTransformations } from './apply';
import { ComputeExpression } from './compute';
import { CountExpression } from './count';
import { ExpandExpression } from './expand';
import { FilterExpression } from './filter';
import { OrderByExpression } from './orderby';
import { SearchExpression } from './search';
import { SelectExpression } from './select';
export const FieldFactory = (names = []) => new Proxy({ _names: names }, {
get(target, key) {
let names = target['_names'];
if (key === 'render') {
return ({ aliases, escape, prefix, parser, options, }) => {
let values = names.map((n) => render(n, { aliases, escape, prefix, parser, options }));
if (prefix && (names.length === 0 || typeof names[0] === 'string')) {
values = [prefix, ...values];
}
return values.join('/');
};
}
else if (key === 'clone') {
return () => FieldFactory([...names]);
}
else if (key === 'isField') {
return () => true;
}
else if (key === 'toJson') {
return () => ({
$type: 'Field',
names: names,
});
}
else if (key === 'resolve') {
return (parser) => names.reduce((acc, name) => typeof name === 'string'
? acc?.field(name)
: name?.resolve(parser), parser);
}
else {
return FieldFactory([...names, key]);
}
},
has(target, key) {
return (['toJson', 'isField', 'clone', 'render', 'resolve'].includes(key) ||
key in target);
},
});
export const RenderableFactory = (value) => {
if (Types.isPlainObject(value) && '$type' in value) {
switch (value.$type) {
case 'SelectExpression':
return SelectExpression.fromJson(value);
case 'ExpandExpression':
return ExpandExpression.fromJson(value);
case 'ComputeExpression':
return ComputeExpression.fromJson(value);
case 'ApplyExpression':
return ApplyExpression.fromJson(value);
case 'FilterExpression':
return FilterExpression.fromJson(value);
case 'OrderByExpression':
return OrderByExpression.fromJson(value);
case 'SearchExpression':
return SearchExpression.fromJson(value);
case 'CountExpression':
return CountExpression.fromJson(value);
case 'GroupByTransformations':
return GroupByTransformations.fromJson(value);
case 'Function':
return Function.fromJson(value);
case 'Operator':
return Operator.fromJson(value);
case 'Grouping':
return Grouping.fromJson(value);
case 'Aggregate':
return Aggregate.fromJson(value);
case 'GroupBy':
return GroupBy.fromJson(value);
case 'Lambda':
return Lambda.fromJson(value);
case 'Type':
return Type.fromJson(value);
case 'Field':
return FieldFactory(value['names']);
default:
return value;
}
}
return value;
};
function applyMixins(derivedCtor, constructors) {
constructors.forEach((baseCtor) => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {
Object.defineProperty(derivedCtor.prototype, name, Object.getOwnPropertyDescriptor(baseCtor.prototype, name) ||
Object.create(null));
});
});
}
export function render(value, { aliases, normalize, escape, prefix, parser, options, } = {}) {
if (Types.isFunction(value)) {
return render(value(syntax), {
aliases,
normalize,
prefix,
parser,
options,
});
}
if (Types.isObject(value) && 'render' in value) {
return render(value.render({ aliases, escape, prefix, parser, options }), {
aliases,
normalize,
escape,
prefix,
parser,
options,
});
}
return normalize ? normalizeValue(value, { aliases, escape }) : value;
}
export function resolve(values, parser) {
if (parser !== undefined) {
let fields = values.filter((v) => Types.isObject(v) && 'isField' in v && v.isField());
if (fields.length === 1 && Types.isObject(parser) && 'field' in parser) {
return fields[0].resolve(parser);
}
}
return parser;
}
export function encode(values, parser, options) {
if (parser !== undefined) {
return values.map((v) => {
if (Types.isArray(v))
return encode(v, parser, options);
if (Types.isObject(v) || v == null)
return v;
try {
return parser.encode(v, options);
}
catch {
return v;
}
});
}
return values;
}
export class Function {
name;
values;
normalize;
escape;
constructor(name, values, normalize, escape = false) {
this.name = name;
this.values = values;
this.normalize = normalize;
this.escape = escape;
}
get [Symbol.toStringTag]() {
return 'Function';
}
toJson() {
return {
$type: Types.rawType(this),
name: this.name,
values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v),
normalize: this.normalize,
};
}
static fromJson(json) {
return new Function(json['name'], json['values'].map((v) => RenderableFactory(v)), json['normalize'], json['escape']);
}
render({ aliases, escape, prefix, parser, options, }) {
parser = resolve(this.values, parser);
let [left, ...values] = encode(this.values, parser, options);
left = render(left, {
aliases,
escape,
prefix,
parser,
normalize: this.normalize === 'all' || this.normalize === 'left',
options,
});
const params = [
left,
...values.map((v) => render(v, {
aliases,
escape,
prefix,
parser,
normalize: this.normalize === 'all' || this.normalize === 'right',
options,
})),
];
return `${this.name}(${params.join(', ')})`;
}
clone() {
return new Function(this.name, this.values.map((v) => Objects.clone(v)), this.normalize, this.escape);
}
resolve(parser) {
return parser;
}
}
export class StringAndCollectionFunctions {
concat(left, right, normalize = 'right') {
return new Function('concat', [left, right], normalize);
}
contains(left, right, normalize = 'right') {
return new Function('contains', [left, right], normalize);
}
endsWith(left, right, normalize = 'right') {
return new Function('endswith', [left, right], normalize);
}
indexOf(left, right, normalize = 'right') {
return new Function('indexof', [left, right], normalize);
}
length(left, normalize = 'right') {
return new Function('length', [left], normalize);
}
startsWith(left, right, normalize = 'right') {
return new Function('startswith', [left, right], normalize);
}
subString(left, right, length, normalize = 'none') {
let values = [left, right];
if (length !== undefined) {
values.push(length);
}
return new Function('substring', values, normalize);
}
}
export class CollectionFunctions {
hasSubset(left, right, normalize = 'none') {
return new Function('hassubset', [left, right], normalize);
}
hasSubsequence(left, right, normalize = 'none') {
return new Function('hassubsequence', [left, right], normalize);
}
}
export class StringFunctions {
matchesPattern(left, pattern, normalize = 'none') {
return new Function('matchesPattern', [left, pattern], normalize);
}
toLower(left, normalize = 'none') {
return new Function('tolower', [left], normalize);
}
toUpper(left, normalize = 'none') {
return new Function('toupper', [left], normalize);
}
trim(left, normalize = 'none') {
return new Function('trim', [left], normalize);
}
}
export class DateAndTimeFunctions {
date(left, normalize = 'none') {
return new Function('date', [left], normalize);
}
day(left, normalize = 'none') {
return new Function('day', [left], normalize);
}
fractionalseconds(left, normalize = 'none') {
return new Function('fractionalseconds', [left], normalize);
}
hour(left, normalize = 'none') {
return new Function('hour', [left], normalize);
}
maxdatetime(left, normalize = 'none') {
return new Function('maxdatetime', [left], normalize);
}
mindatetime(left, normalize = 'none') {
return new Function('mindatetime', [left], normalize);
}
minute(left, normalize = 'none') {
return new Function('minute', [left], normalize);
}
month(left, normalize = 'none') {
return new Function('month', [left], normalize);
}
now() {
return new Function('now', [], 'none');
}
second(left, normalize = 'none') {
return new Function('second', [left], normalize);
}
time(left, normalize = 'none') {
return new Function('time', [left], normalize);
}
totaloffsetminutes(left, normalize = 'none') {
return new Function('totaloffsetminutes', [left], normalize);
}
totalseconds(left, normalize = 'none') {
return new Function('totalseconds', [left], normalize);
}
year(left, normalize = 'none') {
return new Function('year', [left], normalize);
}
}
export class ArithmeticFunctions {
ceiling(left, normalize = 'none') {
return new Function('ceiling', [left], normalize);
}
floor(left, normalize = 'none') {
return new Function('floor', [left], normalize);
}
round(left, normalize = 'none') {
return new Function('round', [left], normalize);
}
}
export class TypeFunctions {
cast(left, type) {
return FieldFactory([
type !== undefined
? new Type('cast', type, left)
: new Type('cast', left),
]);
}
isof(left, type) {
return type !== undefined
? new Type('isof', type, left)
: new Type('isof', left);
}
}
export class GeoFunctions {
geoDistance(left, right, normalize = 'right') {
return new Function('geo.distance', [left, right], normalize);
}
geoIntersects(left, right, normalize = 'right') {
return new Function('geo.intersects', [left, right], normalize);
}
geoLength(left, normalize = 'none') {
return new Function('geo.length', [left], normalize);
}
}
export class ConditionalFunctions {
case(left, right, normalize = 'none') {
return new Function('case', [left, right], normalize);
}
}
export class Operator {
op;
values;
normalize;
constructor(op, values, normalize) {
this.op = op;
this.values = values;
this.normalize = normalize;
}
get [Symbol.toStringTag]() {
return 'Operator';
}
toJson() {
return {
$type: Types.rawType(this),
op: this.op,
values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v),
normalize: this.normalize,
};
}
static fromJson(json) {
return new Operator(json['op'], json['values'].map((v) => RenderableFactory(v)), json['normalize']);
}
render({ aliases, escape, prefix, parser, options, }) {
parser = resolve(this.values, parser);
let [left, right] = encode(this.values, parser, options);
left = render(left, {
aliases,
escape,
prefix,
parser,
normalize: this.normalize === 'all' || this.normalize === 'left',
options,
});
if (right !== undefined) {
right = Array.isArray(right)
? `(${right
.map((v) => render(v, {
aliases,
escape,
prefix,
parser,
normalize: this.normalize === 'all' || this.normalize === 'right',
options,
}))
.join(',')})`
: render(right, {
aliases,
escape,
prefix,
parser,
normalize: this.normalize === 'all' || this.normalize === 'right',
options,
});
return `${left} ${this.op} ${right}`;
}
return `${this.op}(${left})`;
}
clone() {
return new Operator(this.op, this.values.map((v) => Objects.clone(v)), this.normalize);
}
resolve(parser) {
return parser;
}
}
export class LogicalOperators {
eq(left, right, normalize = 'right') {
return new Operator('eq', [left, right], normalize);
}
ne(left, right, normalize = 'right') {
return new Operator('ne', [left, right], normalize);
}
gt(left, right, normalize = 'right') {
return new Operator('gt', [left, right], normalize);
}
ge(left, right, normalize = 'right') {
return new Operator('ge', [left, right], normalize);
}
lt(left, right, normalize = 'right') {
return new Operator('lt', [left, right], normalize);
}
le(left, right, normalize = 'right') {
return new Operator('le', [left, right], normalize);
}
/*
and(left: any, right: any, normalize: Normalize = 'right') {
return new Operator('and', [left, right], normalize);
}
or(left: any, right: any, normalize: Normalize = 'right') {
return new Operator('or', [left, right], normalize);
}
*/
not(left, normalize = 'none') {
return new Operator('not', [left], normalize);
}
has(left, right, normalize = 'right') {
return new Operator('has', [left, right], normalize);
}
in(left, right, normalize = 'right') {
return new Operator('in', [left, right], normalize);
}
}
export class ArithmeticOperators {
add(left, right, normalize = 'right') {
return new Operator('add', [left, right], normalize);
}
sub(left, right, normalize = 'right') {
return new Operator('sub', [left, right], normalize);
}
mul(left, right, normalize = 'right') {
return new Operator('mul', [left, right], normalize);
}
div(left, right, normalize = 'right') {
return new Operator('div', [left, right], normalize);
}
mod(left, right, normalize = 'right') {
return new Operator('mod', [left, right], normalize);
}
neg(value, normalize = 'right') {
return new Operator('-', [value], normalize);
}
}
export class Grouping {
group;
constructor(group) {
this.group = group;
}
get [Symbol.toStringTag]() {
return 'Grouping';
}
toJson() {
return {
$type: Types.rawType(this),
group: this.group.toJson(),
};
}
static fromJson(json) {
return new Grouping(json['group'].map((v) => RenderableFactory(v)));
}
render({ aliases, escape, prefix, parser, options, }) {
return `(${render(this.group, {
aliases,
escape,
prefix,
parser,
options,
})})`;
}
clone() {
return new Grouping(Objects.clone(this.group));
}
resolve(parser) {
return parser;
}
}
export class GroupingOperators {
group(value) {
return new Grouping(value);
}
rollup(...values) {
return new Function('rollup', values, 'none');
}
}
export class Aggregate {
value;
method;
alias;
constructor(value, method, alias) {
this.value = value;
this.method = method;
this.alias = alias;
}
get [Symbol.toStringTag]() {
return 'Aggregate';
}
toJson() {
return {
$type: Types.rawType(this),
value: this.value.toJson(),
method: this.method,
alias: this.alias,
};
}
static fromJson(json) {
return new Aggregate(RenderableFactory(json['value']), json['method'], json['alias']);
}
render({ aliases, escape, prefix, parser, options, }) {
return `aggregate(${render(this.value, {
aliases,
escape,
prefix,
parser,
options,
})} with ${this.method} as ${this.alias})`;
}
clone() {
return new Aggregate(Objects.clone(this.value), this.method, this.alias);
}
resolve(parser) {
return parser;
}
}
export class GroupBy {
properties;
transformations;
constructor(properties, transformations) {
this.properties = properties;
this.transformations = transformations;
}
get [Symbol.toStringTag]() {
return 'GroupBy';
}
toJson() {
return {
$type: Types.rawType(this),
properties: this.properties.map((p) => p.toJson()),
transformations: this.transformations?.toJson(),
};
}
static fromJson(json) {
return new GroupBy(json['properties'].map((p) => RenderableFactory(p)), RenderableFactory(json['transformations']));
}
render({ aliases, escape, prefix, parser, options, }) {
const properties = this.properties
.map((p) => render(p, {
aliases,
escape,
prefix,
parser,
options,
}))
.join(',');
const transformations = this.transformations
? ', ' +
render(this.transformations, {
aliases,
escape,
prefix,
parser,
options,
})
: '';
return `groupby((${properties})${transformations})`;
}
clone() {
return new GroupBy(Objects.clone(this.properties), Objects.clone(this.transformations));
}
resolve(parser) {
return parser;
}
}
export class Transformations {
aggregate(value, method, alias) {
return new Aggregate(value, method, alias);
}
groupby(properties, options) {
return new GroupBy(properties, options);
}
topCount(value, field, normalize = 'none') {
return new Function('topcount', [value, field], normalize);
}
topSum(value, field, normalize = 'none') {
return new Function('topsum', [value, field], normalize);
}
topPercent(value, field, normalize = 'none') {
return new Function('toppercent', [value, field], normalize);
}
bottomCount(value, field, normalize = 'none') {
return new Function('bottomcount', [value, field], normalize);
}
bottomSum(value, field, normalize = 'none') {
return new Function('bottomsum', [value, field], normalize);
}
bottomPercent(value, field, normalize = 'none') {
return new Function('bottompercent', [value, field], normalize);
}
identity() {
return new Function('identity', [], 'none');
}
search(value, normalize = 'none') {
return new Function('search', [value], normalize);
}
filter(value, normalize = 'none') {
return new Function('filter', [value], normalize);
}
skip(value, normalize = 'none') {
return new Function('top', [value], normalize);
}
top(value, normalize = 'none') {
return new Function('top', [value], normalize);
}
orderby(value, normalize = 'none') {
return new Function('filter', [value], normalize);
}
}
export class Type {
name;
type;
value;
constructor(name, type, value) {
this.name = name;
this.type = type;
this.value = value;
}
get [Symbol.toStringTag]() {
return 'Type';
}
toJson() {
return {
$type: Types.rawType(this),
name: this.name,
type: this.type,
value: this.value,
};
}
static fromJson(json) {
return new Type(json['name'], json['type'], RenderableFactory(json['value']));
}
render({ aliases, escape, prefix, parser, options, }) {
let value;
if (this.value) {
parser = resolve([this.value], parser);
let [left, right] = encode([this.value], parser, options);
value = render(left, { aliases, escape, prefix, parser, options });
}
return value
? `${this.name}(${value}, '${this.type}')`
: `${this.name}('${this.type}')`;
}
clone() {
return new Type(this.name, this.type, Objects.clone(this.value));
}
resolve(parser) {
parser =
parser instanceof ODataStructuredTypeFieldParser &&
parser.isStructuredType()
? parser.structuredType()
: parser;
return parser?.findChildParser((p) => p.isTypeOf(this.type));
}
}
export class Lambda {
op;
values;
alias;
constructor(op, values, alias) {
this.op = op;
this.values = values;
this.alias = alias;
}
get [Symbol.toStringTag]() {
return 'Lambda';
}
toJson() {
return {
$type: Types.rawType(this),
op: this.op,
values: this.values.map((v) => Types.isObject(v) && 'toJson' in v ? v.toJson() : v),
alias: this.alias,
};
}
static fromJson(json) {
return new Lambda(json['op'], json['values'].map((v) => RenderableFactory(v)), json['alias']);
}
render({ aliases, escape, prefix, parser, options, }) {
parser = resolve(this.values, parser);
let [left, right] = encode(this.values, parser, options);
left = render(left, { aliases, escape, prefix, parser });
if (right) {
let alias = this.alias || left.split('/').pop().toLowerCase()[0];
return `${left}/${this.op}(${alias}:${render(right, {
aliases,
escape,
prefix: alias,
options,
parser,
})})`;
}
else {
return `${left}/${this.op}()`;
}
}
clone() {
return new Lambda(this.op, this.values.map((v) => Objects.clone(v)), this.alias);
}
resolve(parser) {
return parser;
}
}
export class LambdaOperators {
any(left, right, alias) {
return new Lambda('any', [left, right], alias);
}
all(left, right, alias) {
return new Lambda('all', [left, right], alias);
}
}
export class ODataOperators {
}
applyMixins(ODataOperators, [
LogicalOperators,
ArithmeticOperators,
GroupingOperators,
LambdaOperators,
]);
export const operators = new ODataOperators();
export class ODataFunctions {
}
applyMixins(ODataFunctions, [
StringAndCollectionFunctions,
CollectionFunctions,
StringFunctions,
DateAndTimeFunctions,
ArithmeticFunctions,
TypeFunctions,
GeoFunctions,
ConditionalFunctions,
]);
export const functions = new ODataFunctions();
export class ODataTransformations {
}
applyMixins(ODataTransformations, [Transformations]);
export const transformations = new ODataTransformations();
export class ODataSyntax {
}
applyMixins(ODataSyntax, [
ODataOperators,
ODataFunctions,
ODataTransformations,
]);
export const syntax = new ODataSyntax();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3Jlc291cmNlcy9xdWVyeS9leHByZXNzaW9ucy9zeW50YXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFakUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQXVCNUMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLFFBQWlDLEVBQUUsRUFDOUIsRUFBRSxDQUNQLElBQUksS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBTyxFQUFFO0lBQ2hDLEdBQUcsQ0FBQyxNQUFTLEVBQUUsR0FBb0I7UUFDakMsSUFBSSxLQUFLLEdBQUksTUFBYyxDQUFDLFFBQVEsQ0FBNEIsQ0FBQztRQUNqRSxJQUFJLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNyQixPQUFP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Q2YsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLENBQUMsTUFBVztRQUNqQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sZ0JBQWdCO0lBQzNCLEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELEVBQUUsQ0FBQyxJQUFTLEVBQUUsS0FBVSxFQUFFLFlBQXVCLE9BQU87UUFDdEQsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUs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