@ngutil/data 0.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # list
2
+
3
+ ## Example
4
+
5
+ ```html
6
+ <xyz-grid [nuList]="src" [nuListFilter]="filter" [nuListSorter]="sorter" [nuListTrackBy]="trackBy"> </xyz-grid>
7
+ ```
@@ -0,0 +1,3 @@
1
+ export { sortBy } from "./query/sorter";
2
+ export { filterBy } from "./query/filter";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFZLE1BQU0sZ0JBQWdCLENBQUE7QUFDakQsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLGdCQUFnQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgc29ydEJ5LCBTb3J0ZXJGbiB9IGZyb20gXCIuL3F1ZXJ5L3NvcnRlclwiXG5leHBvcnQgeyBmaWx0ZXJCeSwgRmlsdGVyRm4gfSBmcm9tIFwiLi9xdWVyeS9maWx0ZXJcIlxuIl19
@@ -0,0 +1,2 @@
1
+ export { ModelRefNorm, ModelMeta, ModelRefByIndex, ModelRefByKey, UnknownMeta } from "./meta";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9tb2RlbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR0gsWUFBWSxFQUNaLFNBQVMsRUFJVCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLFFBQVEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7XG4gICAgTW9kZWwsXG4gICAgTW9kZWxSZWYsXG4gICAgTW9kZWxSZWZOb3JtLFxuICAgIE1vZGVsTWV0YSxcbiAgICBNb2RlbE1ldGFQcm9wcyxcbiAgICBNb2RlbFJlZkZpbHRlcixcbiAgICBNb2RlbE1ldGFJbnB1dCxcbiAgICBNb2RlbFJlZkJ5SW5kZXgsXG4gICAgTW9kZWxSZWZCeUtleSxcbiAgICBVbmtub3duTWV0YVxufSBmcm9tIFwiLi9tZXRhXCJcbiJdfQ==
@@ -0,0 +1,125 @@
1
+ import { isEqual } from "lodash";
2
+ import { filterBy, pathGetterCompile } from "../query";
3
+ export class ModelMeta {
4
+ static coerce(value) {
5
+ if (value instanceof ModelMeta) {
6
+ return value;
7
+ }
8
+ else {
9
+ return new ModelMeta(value);
10
+ }
11
+ }
12
+ #getKey;
13
+ constructor(props) {
14
+ this.keys = props.keys;
15
+ if (this.keys.length > 0) {
16
+ const getters = this.keys.map(pathGetterCompile);
17
+ if (props.trackBy == null) {
18
+ this.trackBy = (index, item) => getters.map(p => p(item)).join("∀");
19
+ }
20
+ else {
21
+ this.trackBy = props.trackBy;
22
+ }
23
+ this.#getKey = (item) => getters.map(p => p(item)).join("∀");
24
+ }
25
+ else {
26
+ if (props.trackBy == null) {
27
+ throw new Error("Can't compile track by function without `keys` declaration");
28
+ }
29
+ else {
30
+ this.trackBy = props.trackBy;
31
+ }
32
+ }
33
+ }
34
+ isEqual(a, b) {
35
+ return isEqual(a, b);
36
+ }
37
+ isEqualByTrack(a, b) {
38
+ if (a == null || b == null) {
39
+ return a == null && b == null;
40
+ }
41
+ if (a.index == null || b.index == null) {
42
+ return a.index == null && b.index == null;
43
+ }
44
+ if (a.model == null || b.model == null) {
45
+ return a.model == null && b.model == null;
46
+ }
47
+ return this.trackBy(a.index, a.model) === this.trackBy(b.index, b.model);
48
+ }
49
+ isEqualByKey(a, b) {
50
+ if (this.#getKey != null) {
51
+ if (a == null || b == null) {
52
+ return a == null && b == null;
53
+ }
54
+ return this.#getKey(a) === this.#getKey(b);
55
+ }
56
+ console.warn("Primary keys is not defined for", a, b);
57
+ return false;
58
+ }
59
+ normalizeRef(ref) {
60
+ if (ref instanceof ModelRefNorm) {
61
+ return ref;
62
+ }
63
+ if (ref.key != null && ref.index != null) {
64
+ throw new Error("Only provide `pk` or `index` value not both");
65
+ }
66
+ if (ref.key != null) {
67
+ const keyValue = (Array.isArray(ref.key) ? ref.key : [ref.key]);
68
+ if (keyValue.length > 0) {
69
+ if (this.keys.length === 0) {
70
+ throw new Error("Can't normalize ref without `keys`");
71
+ }
72
+ if (keyValue.length !== this.keys.length) {
73
+ throw new Error(`Wrong number of \`key\` values for this keys: [${this.keys.join(",")}]`);
74
+ }
75
+ return new ModelRefByKey(keyValue, this.keys);
76
+ }
77
+ else {
78
+ console.warn("Empty key in ModelRef", ref);
79
+ }
80
+ }
81
+ if (ref.index != null) {
82
+ return new ModelRefByIndex(ref.index);
83
+ }
84
+ throw new Error("Missing `key` or `index` value");
85
+ }
86
+ }
87
+ export class ModelRefNorm {
88
+ #filter;
89
+ toFilter() {
90
+ if (this.#filter == null) {
91
+ return (this.#filter = this._asFilter());
92
+ }
93
+ return this.#filter;
94
+ }
95
+ }
96
+ export class ModelRefByKey extends ModelRefNorm {
97
+ #keys;
98
+ constructor(key, keys) {
99
+ super();
100
+ this.key = key;
101
+ this.#keys = keys;
102
+ }
103
+ _asFilter() {
104
+ const filter = {};
105
+ for (let i = 0; i < this.#keys.length; i++) {
106
+ filter[this.#keys[i]] = this.key[i];
107
+ }
108
+ return filterBy(filter);
109
+ }
110
+ }
111
+ export class ModelRefByIndex extends ModelRefNorm {
112
+ constructor(index) {
113
+ super();
114
+ this.index = index;
115
+ }
116
+ _asFilter() {
117
+ return (item, index) => this.index === index;
118
+ }
119
+ }
120
+ export class UnknownMeta extends ModelMeta {
121
+ constructor() {
122
+ super({ keys: [], trackBy: (index) => index });
123
+ }
124
+ }
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RhdGEvc3JjL21vZGVsL21ldGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUdoQyxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFBO0FBZ0J0RCxNQUFNLE9BQU8sU0FBUztJQUNsQixNQUFNLENBQUMsTUFBTSxDQUFrQixLQUF3QjtRQUNuRCxJQUFJLEtBQUssWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUM3QixPQUFPLEtBQUssQ0FBQTtRQUNoQixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDL0IsQ0FBQztJQUNMLENBQUM7SUFJUSxPQUFPLENBQXVCO0lBRXZDLFlBQVksS0FBd0I7UUFDaEMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFBO1FBRXRCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUNoRCxJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxLQUFhLEVBQUUsSUFBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2xGLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUE7WUFDaEMsQ0FB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YXIvY29yZVwiXG5cbmltcG9ydCB7IGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoXCJcbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gXCJ1dGlsaXR5LXR5cGVzXCJcblxuaW1wb3J0IHsgZmlsdGVyQnksIHBhdGhHZXR0ZXJDb21waWxlIH0gZnJvbSBcIi4uL3F1ZXJ5XCJcblxuZXhwb3J0IHR5cGUgTW9kZWwgPSB7IFtrZXk6IHN0cmluZ106IGFueSB9XG5cbmV4cG9ydCB0eXBlIE1vZGVsUmVmID0geyBrZXk/OiBQcmltaXRpdmUgfCBBcnJheTxQcmltaXRpdmU+OyBpbmRleD86IG51bWJlciB9XG5leHBvcnQgdHlwZSBNb2RlbFJlZkZpbHRlcjxUPiA9IChpdGVtOiBULCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFuXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxNZXRhUHJvcHM8VCBleHRlbmRzIE1vZGVsPiB7XG4gICAgcmVhZG9ubHkga2V5czogcmVhZG9ubHkgc3RyaW5nW11cbiAgICByZWFkb25seSB0cmFja0J5PzogVHJhY2tCeUZ1bmN0aW9uPFQ+XG59XG5cbmV4cG9ydCB0eXBlIE1vZGVsTWV0YUlucHV0PFQgZXh0ZW5kcyBNb2RlbD4gPSBNb2RlbE1ldGE8VD4gfCBNb2RlbE1ldGFQcm9wczxUPlxuXG5leHBvcnQgdHlwZSBUcmFja2VkTW9kZWw8VCBleHRlbmRzIE1vZGVsPiA9IHsgaW5kZXg6IG51bWJlcjsgbW9kZWw6IFQgfVxuXG5leHBvcnQgY2xhc3MgTW9kZWxNZXRhPFQgZXh0ZW5kcyBNb2RlbD4gaW1wbGVtZW50cyBNb2RlbE1ldGFQcm9wczxUPiB7XG4gICAgc3RhdGljIGNvZXJjZTxNIGV4dGVuZHMgTW9kZWw+KHZhbHVlOiBNb2RlbE1ldGFJbnB1dDxNPik6IE1vZGVsTWV0YTxNPiB7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsTWV0YSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE1vZGVsTWV0YSh2YWx1ZSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlYWRvbmx5IGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgcmVhZG9ubHkgdHJhY2tCeTogVHJhY2tCeUZ1bmN0aW9uPFQ+XG4gICAgcmVhZG9ubHkgI2dldEtleT86IChtb2RlbDogVCkgPT4gc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogTW9kZWxNZXRhUHJvcHM8VD4pIHtcbiAgICAgICAgdGhpcy5rZXlzID0gcHJvcHMua2V5c1xuXG4gICAgICAgIGlmICh0aGlzLmtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ2V0dGVycyA9IHRoaXMua2V5cy5tYXAocGF0aEdldHRlckNvbXBpbGUpXG4gICAgICAgICAgICBpZiAocHJvcHMudHJhY2tCeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmFja0J5ID0gKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpID0+IGdldHRlcnMubWFwKHAgPT4gcChpdGVtKSkuam9pbihcIuKIgFwiKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNrQnkgPSBwcm9wcy50cmFja0J5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLiNnZXRLZXkgPSAoaXRlbTogVCkgPT4gZ2V0dGVycy5tYXAocCA9PiBwKGl0ZW0pKS5qb2luKFwi4oiAXCIpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAocHJvcHMudHJhY2tCeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgY29tcGlsZSB0cmFjayBieSBmdW5jdGlvbiB3aXRob3V0IGBrZXlzYCBkZWNsYXJhdGlvblwiKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyYWNrQnkgPSBwcm9wcy50cmFja0J5XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpc0VxdWFsKGE6IFQsIGI6IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzRXF1YWwoYSwgYilcbiAgICB9XG5cbiAgICBpc0VxdWFsQnlUcmFjayhhOiBUcmFja2VkTW9kZWw8VD4sIGI6IFRyYWNrZWRNb2RlbDxUPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGEgPT0gbnVsbCAmJiBiID09IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhLmluZGV4ID09IG51bGwgfHwgYi5pbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pbmRleCA9PSBudWxsICYmIGIuaW5kZXggPT0gbnVsbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEubW9kZWwgPT0gbnVsbCB8fCBiLm1vZGVsID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhLm1vZGVsID09IG51bGwgJiYgYi5tb2RlbCA9PSBudWxsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy50cmFja0J5KGEuaW5kZXgsIGEubW9kZWwpID09PSB0aGlzLnRyYWNrQnkoYi5pbmRleCwgYi5tb2RlbClcbiAgICB9XG5cbiAgICBpc0VxdWFsQnlLZXkoYTogVCwgYjogVCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcy4jZ2V0S2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEgPT0gbnVsbCAmJiBiID09IG51bGxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLiNnZXRLZXkoYSkgPT09IHRoaXMuI2dldEtleShiKVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybihcIlByaW1hcnkga2V5cyBpcyBub3QgZGVmaW5lZCBmb3JcIiwgYSwgYilcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgbm9ybWFsaXplUmVmKHJlZjogTW9kZWxSZWYgfCBNb2RlbFJlZk5vcm0pOiBNb2RlbFJlZk5vcm0ge1xuICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgTW9kZWxSZWZOb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVmXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmLmtleSAhPSBudWxsICYmIHJlZi5pbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJPbmx5IHByb3ZpZGUgYHBrYCBvciBgaW5kZXhgIHZhbHVlIG5vdCBib3RoXCIpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmLmtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlWYWx1ZSA9IChBcnJheS5pc0FycmF5KHJlZi5rZXkpID8gcmVmLmtleSA6IFtyZWYua2V5XSkgYXMgcmVhZG9ubHkgUHJpbWl0aXZlW11cblxuICAgICAgICAgICAgaWYgKGtleVZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5rZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBub3JtYWxpemUgcmVmIHdpdGhvdXQgYGtleXNgXCIpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGtleVZhbHVlLmxlbmd0aCAhPT0gdGhpcy5rZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFdyb25nIG51bWJlciBvZiBcXGBrZXlcXGAgdmFsdWVzIGZvciB0aGlzIGtleXM6IFske3RoaXMua2V5cy5qb2luKFwiLFwiKX1dYClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbFJlZkJ5S2V5KGtleVZhbHVlLCB0aGlzLmtleXMpXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIkVtcHR5IGtleSBpbiBNb2RlbFJlZlwiLCByZWYpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVmLmluZGV4ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9kZWxSZWZCeUluZGV4KHJlZi5pbmRleClcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYGtleWAgb3IgYGluZGV4YCB2YWx1ZVwiKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE1vZGVsUmVmTm9ybSB7XG4gICAgcmVhZG9ubHkga2V5PzogcmVhZG9ubHkgUHJpbWl0aXZlW11cbiAgICByZWFkb25seSBpbmRleD86IG51bWJlclxuXG4gICAgI2ZpbHRlcj86IE1vZGVsUmVmRmlsdGVyPGFueT5cbiAgICB0b0ZpbHRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuI2ZpbHRlciA9IHRoaXMuX2FzRmlsdGVyKCkpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuI2ZpbHRlclxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhYnN0cmFjdCBfYXNGaWx0ZXIoKTogTW9kZWxSZWZGaWx0ZXI8YW55PlxufVxuXG5leHBvcnQgY2xhc3MgTW9kZWxSZWZCeUtleSBleHRlbmRzIE1vZGVsUmVmTm9ybSB7XG4gICAgb3ZlcnJpZGUgcmVhZG9ubHkga2V5OiByZWFkb25seSBQcmltaXRpdmVbXVxuXG4gICAgI2tleXM6IHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgY29uc3RydWN0b3Ioa2V5OiByZWFkb25seSBQcmltaXRpdmVbXSwga2V5czogcmVhZG9ubHkgc3RyaW5nW10pIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmtleSA9IGtleVxuICAgICAgICB0aGlzLiNrZXlzID0ga2V5c1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBfYXNGaWx0ZXIoKTogTW9kZWxSZWZGaWx0ZXI8YW55PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHt9IGFzIGFueVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuI2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZpbHRlclt0aGlzLiNrZXlzW2ldXSA9IHRoaXMua2V5W2ldXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlckJ5KGZpbHRlcilcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2RlbFJlZkJ5SW5kZXggZXh0ZW5kcyBNb2RlbFJlZk5vcm0ge1xuICAgIG92ZXJyaWRlIHJlYWRvbmx5IGluZGV4OiBudW1iZXJcblxuICAgIGNvbnN0cnVjdG9yKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXhcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2FzRmlsdGVyKCk6IE1vZGVsUmVmRmlsdGVyPGFueT4ge1xuICAgICAgICByZXR1cm4gKGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4gdGhpcy5pbmRleCA9PT0gaW5kZXhcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmtub3duTWV0YTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgTW9kZWxNZXRhPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBrZXlzOiBbXSwgdHJhY2tCeTogKGluZGV4OiBudW1iZXIpID0+IGluZGV4IH0pXG4gICAgfVxufVxuIl19
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './index';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd1dGlsLWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9uZ3V0aWwtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
@@ -0,0 +1,76 @@
1
+ import { groupBy, isEqual, sortBy } from "lodash";
2
+ import { toSorted } from "@ngutil/common";
3
+ import { filterBy } from "./filter";
4
+ const INPUT = Symbol("INPUT");
5
+ export function queryExecutor(query, previous) {
6
+ const executors = {
7
+ filterFn: filterExecutor(query.filter, previous?.filterFn),
8
+ sorterFn: sorterExecutor(query.sorter, previous?.sorterFn),
9
+ grouperFn: grouperExecutor(query.grouper, previous?.grouperFn),
10
+ slicerFn: sliceExecutor(query.slice, previous?.slicerFn)
11
+ };
12
+ const changed = previous == null || Object.entries(executors).some(([k, v]) => previous[k] !== v);
13
+ if (!changed) {
14
+ return previous;
15
+ }
16
+ const executor = (items) => {
17
+ if (items == null || items.length === 0) {
18
+ return { items: [], total: 0 };
19
+ }
20
+ let result = items;
21
+ if (executors.filterFn) {
22
+ result = result.filter(executors.filterFn);
23
+ }
24
+ if (executors.sorterFn) {
25
+ result = toSorted(result, executors.sorterFn);
26
+ }
27
+ const total = result.length;
28
+ // TODO: grouper
29
+ if (executors.slicerFn) {
30
+ result = executors.slicerFn(result);
31
+ }
32
+ return { items: result, total };
33
+ };
34
+ for (const [k, v] of Object.entries(executors)) {
35
+ Object.defineProperty(executor, k, {
36
+ value: v,
37
+ enumerable: true,
38
+ writable: false
39
+ });
40
+ }
41
+ return executor;
42
+ }
43
+ function filterExecutor(filter, prev) {
44
+ return compileExec(filter, prev, filterBy);
45
+ }
46
+ function sorterExecutor(sorter, prev) {
47
+ return compileExec(sorter, prev, sortBy);
48
+ }
49
+ function grouperExecutor(sorter, prev) {
50
+ return compileExec(sorter, prev, groupBy);
51
+ }
52
+ function sliceExecutor(slice, prev) {
53
+ return compileExec(slice, prev, sliceBy);
54
+ }
55
+ function sliceBy(slice) {
56
+ return (items) => items.slice(slice.start, slice.end);
57
+ }
58
+ function compileExec(input, prev, compiler) {
59
+ if (input == null) {
60
+ return undefined;
61
+ }
62
+ if (prev != null) {
63
+ // thorically input is readonly
64
+ if (prev[INPUT] === input || isEqual(prev[INPUT], input)) {
65
+ return prev;
66
+ }
67
+ }
68
+ const exec = compiler(input);
69
+ Object.defineProperty(exec, INPUT, {
70
+ value: input,
71
+ enumerable: true,
72
+ writable: false
73
+ });
74
+ return exec;
75
+ }
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9xdWVyeS9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUE7QUFHakQsT0FBTyxFQUFnQixRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUd2RCxPQUFPLEVBQVUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBSzNDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQWlCN0IsTUFBTSxVQUFVLGFBQWEsQ0FBa0IsS0FBZSxFQUFFLFFBQTJCO0lBQ3ZGLE1BQU0sU0FBUyxHQUFzQjtRQUNqQyxRQUFRLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztRQUMxRCxRQUFRLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztRQUMxRCxTQUFTLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztRQUM5RCxRQUFRLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztLQUMzRCxDQUFBO0lBRUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBRSxRQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQzFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNYLE9BQU8sUUFBUSxDQUFBO0lBQ25CLENB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LENBQUE7SUFDbkMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1FBQy9CLEtBQUssRUFBRSxLQUFLO1FBQ1osVUFBVSxFQUFFLElBQUk7UUFDaEIsUUFBUSxFQUFFLEtBQUs7S0FDbEIsQ0FBQyxDQUFBO0lBQ0YsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ3JvdXBCeSwgaXNFcXVhbCwgc29ydEJ5IH0gZnJvbSBcImxvZGFzaFwiXG5pbXBvcnQgeyBQcmltaXRpdmUgfSBmcm9tIFwidXRpbGl0eS10eXBlc1wiXG5cbmltcG9ydCB7IERlZXBSZWFkb25seSwgdG9Tb3J0ZWQgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuXG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbFwiXG5pbXBvcnQgeyBGaWx0ZXIsIGZpbHRlckJ5IH0gZnJvbSBcIi4vZmlsdGVyXCJcbmltcG9ydCB7IFF1ZXJ5LCBRdWVyeVJlc3VsdCB9IGZyb20gXCIuL3F1ZXJ5XCJcbmltcG9ydCB7IFNsaWNlIH0gZnJvbSBcIi4vc2xpY2VcIlxuaW1wb3J0IHsgU29ydGVyIH0gZnJvbSBcIi4vc29ydGVyXCJcblxuY29uc3QgSU5QVVQgPSBTeW1ib2woXCJJTlBVVFwiKVxuXG5pbnRlcmZhY2UgUGFydGlhbEV4ZWN1dG9yIHtcbiAgICBbSU5QVVRdOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUV4ZWN1dG9yczxUIGV4dGVuZHMgTW9kZWw+IHtcbiAgICByZWFkb25seSBmaWx0ZXJGbj86IEZpbHRlckV4ZWN1dG9yPFQ+XG4gICAgcmVhZG9ubHkgc29ydGVyRm4/OiBTb3J0ZXJFeGVjdXRvcjxUPlxuICAgIHJlYWRvbmx5IGdyb3VwZXJGbj86IEdyb3VwZXJFeGVjdXRvcjxUPlxuICAgIHJlYWRvbmx5IHNsaWNlckZuPzogU2xpY2VFeGVjdXRvcjxUPlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5RXhlY3V0b3I8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFF1ZXJ5RXhlY3V0b3JzPFQ+IHtcbiAgICAoaXRlbXM6IHJlYWRvbmx5IFRbXSk6IFF1ZXJ5UmVzdWx0PFQ+XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeUV4ZWN1dG9yPFQgZXh0ZW5kcyBNb2RlbD4ocXVlcnk6IFF1ZXJ5PFQ+LCBwcmV2aW91cz86IFF1ZXJ5RXhlY3V0b3I8VD4pOiBRdWVyeUV4ZWN1dG9yPFQ+IHtcbiAgICBjb25zdCBleGVjdXRvcnM6IFF1ZXJ5RXhlY3V0b3JzPFQ+ID0ge1xuICAgICAgICBmaWx0ZXJGbjogZmlsdGVyRXhlY3V0b3IocXVlcnkuZmlsdGVyLCBwcmV2aW91cz8uZmlsdGVyRm4pLFxuICAgICAgICBzb3J0ZXJGbjogc29ydGVyRXhlY3V0b3IocXVlcnkuc29ydGVyLCBwcmV2aW91cz8uc29ydGVyRm4pLFxuICAgICAgICBncm91cGVyRm46IGdyb3VwZXJFeGVjdXRvcihxdWVyeS5ncm91cGVyLCBwcmV2aW91cz8uZ3JvdXBlckZuKSxcbiAgICAgICAgc2xpY2VyRm46IHNsaWNlRXhlY3V0b3IocXVlcnkuc2xpY2UsIHByZXZpb3VzPy5zbGljZXJGbilcbiAgICB9XG5cbiAgICBjb25zdCBjaGFuZ2VkID0gcHJldmlvdXMgPT0gbnVsbCB8fCBPYmplY3QuZW50cmllcyhleGVjdXRvcnMpLnNvbWUoKFtrLCB2XSkgPT4gKHByZXZpb3VzIGFzIGFueSlba10gIT09IHYpXG4gICAgaWYgKCFjaGFuZ2VkKSB7XG4gICAgICAgIHJldHVybiBwcmV2aW91c1xuICAgIH1cblxuICAgIGNvbnN0IGV4ZWN1dG9yID0gKGl0ZW1zOiByZWFkb25seSBUW10pOiBRdWVyeVJlc3VsdDxUPiA9PiB7XG4gICAgICAgIGlmIChpdGVtcyA9PSBudWxsIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgaXRlbXM6IFtdLCB0b3RhbDogMCB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0OiByZWFkb25seSBUW10gPSBpdGVtc1xuXG4gICAgICAgIGlmIChleGVjdXRvcnMuZmlsdGVyRm4pIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoZXhlY3V0b3JzLmZpbHRlckZuKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4ZWN1dG9ycy5zb3J0ZXJGbikge1xuICAgICAgICAgICAgcmVzdWx0ID0gdG9Tb3J0ZWQocmVzdWx0LCBleGVjdXRvcnMuc29ydGVyRm4pXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0b3RhbCA9IHJlc3VsdC5sZW5ndGhcblxuICAgICAgICAvLyBUT0RPOiBncm91cGVyXG5cbiAgICAgICAgaWYgKGV4ZWN1dG9ycy5zbGljZXJGbikge1xuICAgICAgICAgICAgcmVzdWx0ID0gZXhlY3V0b3JzLnNsaWNlckZuKHJlc3VsdClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiByZXN1bHQsIHRvdGFsIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhleGVjdXRvcnMpKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleGVjdXRvciwgaywge1xuICAgICAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIGV4ZWN1dG9yXG59XG5cbmludGVyZmFjZSBGaWx0ZXJFeGVjdXRvcjxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgUGFydGlhbEV4ZWN1dG9yIHtcbiAgICAoaXRlbTogVCk6IGJvb2xlYW5cbn1cblxuZnVuY3Rpb24gZmlsdGVyRXhlY3V0b3I8VCBleHRlbmRzIE1vZGVsPihcbiAgICBmaWx0ZXI/OiBEZWVwUmVhZG9ubHk8RmlsdGVyPFQ+PixcbiAgICBwcmV2PzogRmlsdGVyRXhlY3V0b3I8VD5cbik6IEZpbHRlckV4ZWN1dG9yPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gY29tcGlsZUV4ZWM8VD4oZmlsdGVyLCBwcmV2LCBmaWx0ZXJCeSlcbn1cblxuaW50ZXJmYWNlIFNvcnRlckV4ZWN1dG9yPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYXJ0aWFsRXhlY3V0b3Ige1xuICAgIChhOiBULCBiOiBUKTogbnVtYmVyXG59XG5cbmZ1bmN0aW9uIHNvcnRlckV4ZWN1dG9yPFQgZXh0ZW5kcyBNb2RlbD4oXG4gICAgc29ydGVyPzogRGVlcFJlYWRvbmx5PFNvcnRlcjxUPj4sXG4gICAgcHJldj86IFNvcnRlckV4ZWN1dG9yPFQ+XG4pOiBTb3J0ZXJFeGVjdXRvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbXBpbGVFeGVjPFQ+KHNvcnRlciwgcHJldiwgc29ydEJ5KVxufVxuXG5pbnRlcmZhY2UgR3JvdXBlckV4ZWN1dG9yPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYXJ0aWFsRXhlY3V0b3Ige1xuICAgIChpdGVtOiBUKTogUHJpbWl0aXZlXG59XG5cbmZ1bmN0aW9uIGdyb3VwZXJFeGVjdXRvcjxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIHNvcnRlcj86IERlZXBSZWFkb25seTxTb3J0ZXI8VD4+LFxuICAgIHByZXY/OiBHcm91cGVyRXhlY3V0b3I8VD5cbik6IEdyb3VwZXJFeGVjdXRvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbXBpbGVFeGVjPFQ+KHNvcnRlciwgcHJldiwgZ3JvdXBCeSlcbn1cblxuaW50ZXJmYWNlIFNsaWNlRXhlY3V0b3I8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFBhcnRpYWxFeGVjdXRvciB7XG4gICAgKGl0ZW1zOiByZWFkb25seSBUW10pOiBUW11cbn1cblxuZnVuY3Rpb24gc2xpY2VFeGVjdXRvcjxUIGV4dGVuZHMgTW9kZWw+KFxuICAgIHNsaWNlPzogRGVlcFJlYWRvbmx5PFNsaWNlPixcbiAgICBwcmV2PzogU2xpY2VFeGVjdXRvcjxUPlxuKTogU2xpY2VFeGVjdXRvcjxUPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGNvbXBpbGVFeGVjPFQ+KHNsaWNlLCBwcmV2LCBzbGljZUJ5KVxufVxuXG5mdW5jdGlvbiBzbGljZUJ5PFQgZXh0ZW5kcyBNb2RlbD4oc2xpY2U6IFNsaWNlKSB7XG4gICAgcmV0dXJuIChpdGVtczogVFtdKSA9PiBpdGVtcy5zbGljZShzbGljZS5zdGFydCwgc2xpY2UuZW5kKVxufVxuXG5mdW5jdGlvbiBjb21waWxlRXhlYzxUIGV4dGVuZHMgTW9kZWw+KGlucHV0OiBhbnksIHByZXY6IGFueSwgY29tcGlsZXI6IGFueSk6IGFueSB7XG4gICAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cblxuICAgIGlmIChwcmV2ICE9IG51bGwpIHtcbiAgICAgICAgLy8gdGhvcmljYWxseSBpbnB1dCBpcyByZWFkb25seVxuICAgICAgICBpZiAocHJldltJTlBVVF0gPT09IGlucHV0IHx8IGlzRXF1YWwocHJldltJTlBVVF0sIGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGV4ZWMgPSBjb21waWxlcihpbnB1dCkgYXMgYW55XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4ZWMsIElOUFVULCB7XG4gICAgICAgIHZhbHVlOiBpbnB1dCxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgfSlcbiAgICByZXR1cm4gZXhlY1xufVxuIl19
@@ -0,0 +1,288 @@
1
+ import { flattenDeep, intersection } from "lodash";
2
+ import { deepClone, isPlainObject } from "@ngutil/common";
3
+ import { pathGetterCompile } from "./path";
4
+ export const OPERATORS = [
5
+ "==" /* FilterOp.Eq */,
6
+ "===" /* FilterOp.EqStrict */,
7
+ "==*" /* FilterOp.EqInsesitive */,
8
+ "!=" /* FilterOp.Neq */,
9
+ "!==" /* FilterOp.NeqStrict */,
10
+ "!=*" /* FilterOp.NeqInsesitive */,
11
+ ">" /* FilterOp.Gt */,
12
+ ">*" /* FilterOp.GtInsesitive */,
13
+ ">=" /* FilterOp.Gte */,
14
+ ">=*" /* FilterOp.GteInsesitive */,
15
+ "<" /* FilterOp.Lt */,
16
+ "<*" /* FilterOp.LtInsesitive */,
17
+ "<=" /* FilterOp.Lte */,
18
+ "<=*" /* FilterOp.LteInsesitive */,
19
+ "%" /* FilterOp.Contains */,
20
+ "%*" /* FilterOp.ContainsInsesitive */,
21
+ "^" /* FilterOp.StartsWith */,
22
+ "^*" /* FilterOp.StartsWithInsesitive */,
23
+ "$" /* FilterOp.EndsWith */,
24
+ "$*" /* FilterOp.EndsWithInsesitive */,
25
+ "~" /* FilterOp.Regexp */,
26
+ "~*" /* FilterOp.RegexpInsesitive */,
27
+ "|" /* FilterOp.Or */,
28
+ "&" /* FilterOp.And */
29
+ ];
30
+ export function asOperators(value) {
31
+ const ops = intersection(Object.keys(value), OPERATORS);
32
+ if (ops.length > 0) {
33
+ return ops.map(op => {
34
+ return { op, value: value[op] };
35
+ });
36
+ }
37
+ else {
38
+ return [{ op: "==" /* FilterOp.Eq */, value }];
39
+ }
40
+ }
41
+ /**
42
+ * @example
43
+ * ```ts
44
+ * items.filter(filterBy({id: 42}))
45
+ * ```
46
+ */
47
+ export function filterBy(filters) {
48
+ return _filterCompile(filters);
49
+ }
50
+ // TODO: Normalize filter
51
+ // type _Filter = { path: string; op: FilterOp; value: any }
52
+ // type _Or = { "|": Array<_Filter> }
53
+ // type _And = { "&": Array<_Filter> }
54
+ // export type NormalizedFilter = _Or | _And
55
+ // /**
56
+ // * @example
57
+ // * ```ts
58
+ // * normalizeFilter({id: 2, name: {"=*": "AnyName"}}) -> {id: {"==": 2}, name: {"=*": "AnyName"}}}
59
+ // * normalizeFilter({id: {">": 0, "<": 10}}) -> {"&": [{id: {">": 0}}, {id: {"<": 10}}]}
60
+ // * ```
61
+ // */
62
+ // export function normalizeFilter<T extends Model>(filters: Filters<T>): Filters<T> {
63
+ // return _normalizeFilter(filters)
64
+ // }
65
+ // function _normalizeFilter(filters: any, path?: string): any {
66
+ // const result = {} as any
67
+ // for (const [path, v] of Object.entries(filters)) {
68
+ // switch (path) {
69
+ // case FilterOp.And:
70
+ // if (!Array.isArray(v)) {
71
+ // throw new Error("The '&' (AND) operator must have array type")
72
+ // }
73
+ // if (!result[FilterOp.And]) {
74
+ // result[FilterOp.And] = []
75
+ // }
76
+ // result[FilterOp.And] = result[FilterOp.And].concat(v.map(f => _normalizeFilter(f)))
77
+ // break
78
+ // case FilterOp.Or:
79
+ // if (!Array.isArray(v)) {
80
+ // throw new Error("The '|' (OR) operator must have array type")
81
+ // }
82
+ // if (!result[FilterOp.Or]) {
83
+ // result[FilterOp.Or] = []
84
+ // }
85
+ // result[FilterOp.Or] = result[FilterOp.Or].concat(v.map(f => _normalizeFilter(f)))
86
+ // break
87
+ // default:
88
+ // for (const entry of asOperators(v)) {
89
+ // switch (entry.op) {
90
+ // case FilterOp.And:
91
+ // if (!result[FilterOp.And]) {
92
+ // result[FilterOp.And] = []
93
+ // }
94
+ // result[FilterOp.And] = result[FilterOp.And].concat(
95
+ // entry.value.map((v: any) => _normalizeFilter(v, path))
96
+ // )
97
+ // break
98
+ // case FilterOp.Or:
99
+ // if (!result[FilterOp.Or]) {
100
+ // result[FilterOp.Or] = []
101
+ // }
102
+ // result[FilterOp.Or] = result[FilterOp.Or].concat(
103
+ // entry.value.map((v: any) => _normalizeFilter(v, path))
104
+ // )
105
+ // break
106
+ // default:
107
+ // if (!result[FilterOp.And]) {
108
+ // result[FilterOp.And] = []
109
+ // }
110
+ // result[FilterOp.And].push({ path, ...entry })
111
+ // }
112
+ // }
113
+ // }
114
+ // }
115
+ // return result
116
+ // }
117
+ function _filterCompile(filters) {
118
+ let getter;
119
+ const result = [];
120
+ for (const [pth, value] of Object.entries(filters)) {
121
+ switch (pth) {
122
+ case "&" /* FilterOp.And */:
123
+ if (!Array.isArray(value)) {
124
+ throw new Error("Root '&' (AND) operator must have array type");
125
+ }
126
+ result.splice(result.length, 0, ...value.map((_filterCompile)));
127
+ break;
128
+ case "|" /* FilterOp.Or */:
129
+ if (!Array.isArray(value)) {
130
+ throw new Error("Root '|' (OR) operator must have array type");
131
+ }
132
+ result.push(or_(value.map((_filterCompile))));
133
+ break;
134
+ default:
135
+ getter = pathGetterCompile(pth);
136
+ if (isPlainObject(value)) {
137
+ result.push(and_(Object.entries(value).map(([op, opv]) => filterCompileOp(getter, op, opv))));
138
+ }
139
+ else {
140
+ result.push(filterCompileOp(getter, "==" /* FilterOp.Eq */, value));
141
+ }
142
+ break;
143
+ }
144
+ }
145
+ return and_(result);
146
+ }
147
+ function filterCompileOp(getter, op, value) {
148
+ let lower;
149
+ let regex;
150
+ switch (op) {
151
+ case "==" /* FilterOp.Eq */:
152
+ // eslint-disable-next-line eqeqeq
153
+ return matcher(getter, v => v == value);
154
+ case "===" /* FilterOp.EqStrict */:
155
+ return matcher(getter, v => v === value);
156
+ case "==*" /* FilterOp.EqInsesitive */:
157
+ lower = String(value).toLocaleLowerCase();
158
+ return matcher(getter, v => String(v).toLocaleLowerCase() === lower);
159
+ case "!=" /* FilterOp.Neq */:
160
+ // eslint-disable-next-line eqeqeq
161
+ return matcher(getter, v => v != value);
162
+ case "!==" /* FilterOp.NeqStrict */:
163
+ return matcher(getter, v => v !== value);
164
+ case "!=*" /* FilterOp.NeqInsesitive */:
165
+ lower = String(value).toLocaleLowerCase();
166
+ return matcher(getter, v => String(v).toLocaleLowerCase() !== lower);
167
+ case ">" /* FilterOp.Gt */:
168
+ return matcher(getter, v => v > value);
169
+ case ">*" /* FilterOp.GtInsesitive */:
170
+ lower = String(value).toLocaleLowerCase();
171
+ return matcher(getter, v => String(v).toLocaleLowerCase() > lower);
172
+ case ">=" /* FilterOp.Gte */:
173
+ return matcher(getter, v => v >= value);
174
+ case ">=*" /* FilterOp.GteInsesitive */:
175
+ lower = String(value).toLocaleLowerCase();
176
+ return matcher(getter, v => String(v).toLocaleLowerCase() >= lower);
177
+ case "<" /* FilterOp.Lt */:
178
+ return matcher(getter, v => v < value);
179
+ case "<*" /* FilterOp.LtInsesitive */:
180
+ lower = String(value).toLocaleLowerCase();
181
+ return matcher(getter, v => String(v).toLocaleLowerCase() < lower);
182
+ case "<=" /* FilterOp.Lte */:
183
+ return matcher(getter, v => v <= value);
184
+ case "<=*" /* FilterOp.LteInsesitive */:
185
+ lower = String(value).toLocaleLowerCase();
186
+ return matcher(getter, v => String(v).toLocaleLowerCase() <= lower);
187
+ case "%" /* FilterOp.Contains */:
188
+ lower = String(value);
189
+ return matcher(getter, v => (Array.isArray(v) ? v.includes(value) : String(v).includes(lower)));
190
+ case "%*" /* FilterOp.ContainsInsesitive */:
191
+ lower = String(value).toLocaleLowerCase();
192
+ return matcher(getter, v => String(v).toLocaleLowerCase().includes(lower));
193
+ case "^" /* FilterOp.StartsWith */:
194
+ lower = String(value);
195
+ return matcher(getter, v => String(v).startsWith(lower));
196
+ case "^*" /* FilterOp.StartsWithInsesitive */:
197
+ lower = String(value).toLocaleLowerCase();
198
+ return matcher(getter, v => String(v).toLocaleLowerCase().startsWith(lower));
199
+ case "$" /* FilterOp.EndsWith */:
200
+ lower = String(value);
201
+ return matcher(getter, v => String(v).endsWith(lower));
202
+ case "$*" /* FilterOp.EndsWithInsesitive */:
203
+ lower = String(value).toLocaleLowerCase();
204
+ return matcher(getter, v => String(v).toLocaleLowerCase().endsWith(lower));
205
+ case "~" /* FilterOp.Regexp */:
206
+ regex = value instanceof RegExp ? value : new RegExp(value, "msv");
207
+ return matcher(getter, v => regex.test(v));
208
+ case "~*" /* FilterOp.RegexpInsesitive */:
209
+ regex = value instanceof RegExp ? value : new RegExp(value, "msvi");
210
+ return matcher(getter, v => regex.test(v));
211
+ case "&" /* FilterOp.And */:
212
+ if (!Array.isArray(value)) {
213
+ throw new Error("Root '&' (AND) operator must have array type");
214
+ }
215
+ return and_(flattenDeep(value.map(v => {
216
+ if (isPlainObject(v)) {
217
+ return Object.entries(v).map(([op, opv]) => filterCompileOp(getter, op, opv));
218
+ }
219
+ else {
220
+ return filterCompileOp(getter, "==" /* FilterOp.Eq */, v);
221
+ }
222
+ })));
223
+ case "|" /* FilterOp.Or */:
224
+ if (!Array.isArray(value)) {
225
+ throw new Error("Root '|' (OR) operator must have array type");
226
+ }
227
+ return or_(flattenDeep(value.map(v => {
228
+ if (isPlainObject(v)) {
229
+ return Object.entries(v).map(([op, opv]) => filterCompileOp(getter, op, opv));
230
+ }
231
+ else {
232
+ return filterCompileOp(getter, "==" /* FilterOp.Eq */, v);
233
+ }
234
+ })));
235
+ }
236
+ throw new Error(`Unexpected operator: ${op}`);
237
+ }
238
+ function matcher(getter, predict) {
239
+ return obj => getter(obj).some(predict);
240
+ }
241
+ function and_(fns) {
242
+ if (fns.length === 0) {
243
+ return _ => true;
244
+ }
245
+ return item => {
246
+ for (const fn of fns) {
247
+ if (!fn(item)) {
248
+ return false;
249
+ }
250
+ }
251
+ return true;
252
+ };
253
+ }
254
+ function or_(fns) {
255
+ if (fns.length === 0) {
256
+ return _ => true;
257
+ }
258
+ return item => {
259
+ for (const fn of fns) {
260
+ if (fn(item)) {
261
+ return true;
262
+ }
263
+ }
264
+ return false;
265
+ };
266
+ }
267
+ export function filterMerge(...filters) {
268
+ let result = undefined;
269
+ for (const filter of filters) {
270
+ if (filter == null) {
271
+ continue;
272
+ }
273
+ if (result == null) {
274
+ result = deepClone(filter);
275
+ }
276
+ else {
277
+ for (const [k, v] of Object.entries(filter)) {
278
+ if (v === undefined) {
279
+ delete result[k];
280
+ continue;
281
+ }
282
+ result[k] = deepClone(v);
283
+ }
284
+ }
285
+ }
286
+ return result;
287
+ }
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGF0YS9zcmMvcXVlcnkvZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBRWxELE9BQU8sRUFBZSxTQUFTLEVBQUUsYUFBYSxFQUFnQixNQUFNLGdCQUFnQixDQUFBO0FBR3BGLE9BQU8sRUFBYyxpQkFBaUIsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQTZCdEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXlCdkMsQ0FBQTtBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBVTtJQUNsQyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQWUsQ0FBQTtJQUNyRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ2hCLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFBO1FBQ25DLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztTQUFNLENBQUM7UUFDSixPQUFPLENBQUMsRUFBRSxFQUFFLHdCQUFhLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0FBQ0wsQ0FBQztBQW9FRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQWtCLE9BQWtCO0lBQ3hELE9BQU8sY0FBYyxDQUFJLE9BQU8sQ0FBQyxDQUFBO0FBQ3JDLENBQUM7QUFFRCx5QkFBeUI7QUFDekIsNERBQTREO0FBQzVELHFDQUFxQztBQUNyQyxzQ0FBc0M7QUFDdEMsNENBQTRDO0FBRTVD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SSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7UUFFMUM7WUFDSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDekMsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUE7UUFFdEU7WUFDSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUE7UUFFM0M7WUFDSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDekMsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLElBQUksS0FBSyxDQUFDLENBQUE7UUFFdkU7WUFDSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7UUFFMUM7WUFDSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDekMsT0FBTyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUE7UUFFdEU7WUFDSSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUE7UUFFM0M7WUFDSSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUE7WUFDekMsT0FB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SSxNQUFNLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakIsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QixDQUFDO2FBQU0sQ0FBQztZQUNKLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNsQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtvQkFDaEIsU0FBUTtnQkFDWixDQUFDO2dCQUVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDNUIsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFhLENBQUE7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZsYXR0ZW5EZWVwLCBpbnRlcnNlY3Rpb24gfSBmcm9tIFwibG9kYXNoXCJcblxuaW1wb3J0IHsgQXNQcmltaXRpdmUsIGRlZXBDbG9uZSwgaXNQbGFpbk9iamVjdCwgTWF4UmVjdXJzaW9uIH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxcIlxuaW1wb3J0IHsgUGF0aEdldHRlciwgcGF0aEdldHRlckNvbXBpbGUgfSBmcm9tIFwiLi9wYXRoXCJcblxuZXhwb3J0IGNvbnN0IGVudW0gRmlsdGVyT3Age1xuICAgIEVxID0gXCI9PVwiLFxuICAgIEVxU3RyaWN0ID0gXCI9PT1cIixcbiAgICBFcUluc2VzaXRpdmUgPSBcIj09KlwiLFxuICAgIE5lcSA9IFwiIT1cIixcbiAgICBOZXFTdHJpY3QgPSBcIiE9PVwiLFxuICAgIE5lcUluc2VzaXRpdmUgPSBcIiE9KlwiLFxuICAgIEd0ID0gXCI+XCIsXG4gICAgR3RJbnNlc2l0aXZlID0gXCI+KlwiLFxuICAgIEd0ZSA9IFwiPj1cIixcbiAgICBHdGVJbnNlc2l0aXZlID0gXCI+PSpcIixcbiAgICBMdCA9IFwiPFwiLFxuICAgIEx0SW5zZXNpdGl2ZSA9IFwiPCpcIixcbiAgICBMdGUgPSBcIjw9XCIsXG4gICAgTHRlSW5zZXNpdGl2ZSA9IFwiPD0qXCIsXG4gICAgQ29udGFpbnMgPSBcIiVcIixcbiAgICBDb250YWluc0luc2VzaXRpdmUgPSBcIiUqXCIsXG4gICAgU3RhcnRzV2l0aCA9IFwiXlwiLFxuICAgIFN0YXJ0c1dpdGhJbnNlc2l0aXZlID0gXCJeKlwiLFxuICAgIEVuZHNXaXRoID0gXCIkXCIsXG4gICAgRW5kc1dpdGhJbnNlc2l0aXZlID0gXCIkKlwiLFxuICAgIFJlZ2V4cCA9IFwiflwiLFxuICAgIFJlZ2V4cEluc2VzaXRpdmUgPSBcIn4qXCIsXG4gICAgT3IgPSBcInxcIixcbiAgICBBbmQgPSBcIiZcIlxufVxuXG5leHBvcnQgY29uc3QgT1BFUkFUT1JTOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgIEZpbHRlck9wLkVxLFxuICAgIEZpbHRlck9wLkVxU3RyaWN0LFxuICAgIEZpbHRlck9wLkVxSW5zZXNpdGl2ZSxcbiAgICBGaWx0ZXJPcC5OZXEsXG4gICAgRmlsdGVyT3AuTmVxU3RyaWN0LFxuICAgIEZpbHRlck9wLk5lcUluc2VzaXRpdmUsXG4gICAgRmlsdGVyT3AuR3QsXG4gICAgRmlsdGVyT3AuR3RJbnNlc2l0aXZlLFxuICAgIEZpbHRlck9wLkd0ZSxcbiAgICBGaWx0ZXJPcC5HdGVJbnNlc2l0aXZlLFxuICAgIEZpbHRlck9wLkx0LFxuICAgIEZpbHRlck9wLkx0SW5zZXNpdGl2ZSxcbiAgICBGaWx0ZXJPcC5MdGUsXG4gICAgRmlsdGVyT3AuTHRlSW5zZXNpdGl2ZSxcbiAgICBGaWx0ZXJPcC5Db250YWlucyxcbiAgICBGaWx0ZXJPcC5Db250YWluc0luc2VzaXRpdmUsXG4gICAgRmlsdGVyT3AuU3RhcnRzV2l0aCxcbiAgICBGaWx0ZXJPcC5TdGFydHNXaXRoSW5zZXNpdGl2ZSxcbiAgICBGaWx0ZXJPcC5FbmRzV2l0aCxcbiAgICBGaWx0ZXJPcC5FbmRzV2l0aEluc2VzaXRpdmUsXG4gICAgRmlsdGVyT3AuUmVnZXhwLFxuICAgIEZpbHRlck9wLlJlZ2V4cEluc2VzaXRpdmUsXG4gICAgRmlsdGVyT3AuT3IsXG4gICAgRmlsdGVyT3AuQW5kXG5dXG5cbmV4cG9ydCBmdW5jdGlvbiBhc09wZXJhdG9ycyh2YWx1ZTogYW55KTogQXJyYXk8eyBvcDogRmlsdGVyT3A7IHZhbHVlOiBhbnkgfT4ge1xuICAgIGNvbnN0IG9wcyA9IGludGVyc2VjdGlvbihPYmplY3Qua2V5cyh2YWx1ZSksIE9QRVJBVE9SUykgYXMgRmlsdGVyT3BbXVxuICAgIGlmIChvcHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gb3BzLm1hcChvcCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBvcCwgdmFsdWU6IHZhbHVlW29wXSB9XG4gICAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFt7IG9wOiBGaWx0ZXJPcC5FcSwgdmFsdWUgfV1cbiAgICB9XG59XG5cbi8vIGV4cG9ydCB0eXBlIEZpbHRlcjxUIGV4dGVuZHMgTW9kZWw+ID0gX0ZpbHRlcjxGbGF0dGVuPFQ+LCBbXSwgTWF4UmVjdXJzaW9uPlxuLy8gVE9ETzogZml4IHJlY3Vyc2lvblxuZXhwb3J0IHR5cGUgRmlsdGVyPFQgZXh0ZW5kcyBNb2RlbD4gPSB7IFtrZXk6IHN0cmluZ106IGFueSB9XG5cbnR5cGUgX0ZpbHRlcjxGLCBQIGV4dGVuZHMgbnVtYmVyW10sIEQgZXh0ZW5kcyBudW1iZXI+ID0gUFtcImxlbmd0aFwiXSBleHRlbmRzIEQgPyBuZXZlciA6IF9PYmplY3RGaWx0ZXI8RiwgUCwgRD5cblxudHlwZSBfT2JqZWN0RmlsdGVyPEYsIFAgZXh0ZW5kcyBudW1iZXJbXSwgRCBleHRlbmRzIG51bWJlcj4gPSBQW1wibGVuZ3RoXCJdIGV4dGVuZHMgRFxuICAgID8gbmV2ZXJcbiAgICA6IHsgW0sgaW4ga2V5b2YgRl0/OiBPcGVyYXRvcnM8RltLXSwgUCwgRD4gfVxuXG50eXBlIFJvb3RPcjxGLCBQIGV4dGVuZHMgbnVtYmVyW10sIEQgZXh0ZW5kcyBudW1iZXI+ID0gUFtcImxlbmd0aFwiXSBleHRlbmRzIERcbiAgICA/IG5ldmVyXG4gICAgOiB7IFtGaWx0ZXJPcC5Pcl06IEFycmF5PF9GaWx0ZXI8RiwgWy4uLlAsIDBdLCBEPj4gfCB1bmRlZmluZWQgfVxuXG50eXBlIFJvb3RBbmQ8RiwgUCBleHRlbmRzIG51bWJlcltdLCBEIGV4dGVuZHMgbnVtYmVyPiA9IFBbXCJsZW5ndGhcIl0gZXh0ZW5kcyBEXG4gICAgPyBuZXZlclxuICAgIDogeyBbRmlsdGVyT3AuQW5kXTogQXJyYXk8X0ZpbHRlcjxGLCBbLi4uUCwgMF0sIEQ+PiB8IHVuZGVmaW5lZCB9XG5cbmV4cG9ydCB0eXBlIE9wZXJhdG9yczxULCBQIGV4dGVuZHMgbnVtYmVyW10sIEQgZXh0ZW5kcyBudW1iZXIgPSBNYXhSZWN1cnNpb24+ID0gUFtcImxlbmd0aFwiXSBleHRlbmRzIERcbiAgICA/IG5ldmVyXG4gICAgOiBTaW1wbGVPcGVyYXRvcnM8VD5cblxudHlwZSBMb2NhbE9yPFQsIFAgZXh0ZW5kcyBudW1iZXJbXSwgRCBleHRlbmRzIG51bWJlcj4gPSBQW1wibGVuZ3RoXCJdIGV4dGVuZHMgRFxuICAgID8gbmV2ZXJcbiAgICA6IHsgW0ZpbHRlck9wLk9yXTogQXJyYXk8T3BlcmF0b3JzPFQsIFsuLi5QLCAwXSwgRD4+IHwgdW5kZWZpbmVkIH1cblxudHlwZSBMb2NhbEFuZDxULCBQIGV4dGVuZHMgbnVtYmVyW10sIEQgZXh0ZW5kcyBudW1iZXI+ID0gUFtcImxlbmd0aFwiXSBleHRlbmRzIERcbiAgICA/IG5ldmVyXG4gICAgOiB7IFtGaWx0ZXJPcC5BbmRdOiBBcnJheTxPcGVyYXRvcnM8VCwgWy4uLlAsIDBdLCBEPj4gfCB1bmRlZmluZWQgfVxuXG50eXBlIFNpbXBsZU9wZXJhdG9yczxUPiA9XG4gICAgfCBFcVN0cmljdDxUPlxuICAgIHwgTmVxU3RyaWN0PFQ+XG4gICAgfCBFcTxUPlxuICAgIHwgTmVxPFQ+XG4gICAgfCBHdDxUPlxuICAgIHwgR3RlPFQ+XG4gICAgfCBMdDxUPlxuICAgIHwgTHRlPFQ+XG4gICAgfCBDb250YWluczxUPlxuICAgIHwgU3RhcnRzV2l0aDxUPlxuICAgIHwgRW5kc1dpdGg8VD5cbiAgICB8IFJlZ2V4cDxUPlxuICAgIHwgVFxuICAgIHwgdW5kZWZpbmVkXG4gICAgfCBudWxsXG5cbnR5cGUgRXFTdHJpY3Q8VD4gPSBPcGVyYXRvcjxULCBULCBGaWx0ZXJPcC5FcVN0cmljdCwgbmV2ZXIsIG51bGw+XG50eXBlIE5lcVN0cmljdDxUPiA9IE9wZXJhdG9yPFQsIFQsIEZpbHRlck9wLk5lcVN0cmljdCwgbmV2ZXIsIG51bGw+XG50eXBlIEVxPFQ+ID0gT3BlcmF0b3I8VCwgVCB8IEFzUHJpbWl0aXZlPFQ+LCBGaWx0ZXJPcC5FcSwgRmlsdGVyT3AuRXFJbnNlc2l0aXZlLCBudWxsPlxudHlwZSBOZXE8VD4gPSBPcGVyYXRvcjxULCBUIHwgQXNQcmltaXRpdmU8VD4sIEZpbHRlck9wLk5lcSwgRmlsdGVyT3AuTmVxSW5zZXNpdGl2ZSwgbnVsbD5cbnR5cGUgR3Q8VD4gPSBPcGVyYXRvcjxULCBUIHwgQXNQcmltaXRpdmU8VD4sIEZpbHRlck9wLkd0LCBGaWx0ZXJPcC5HdEluc2VzaXRpdmU+XG50eXBlIEd0ZTxUPiA9IE9wZXJhdG9yPFQsIFQgfCBBc1ByaW1pdGl2ZTxUPiwgRmlsdGVyT3AuR3RlLCBGaWx0ZXJPcC5HdGVJbnNlc2l0aXZlPlxudHlwZSBMdDxUPiA9IE9wZXJhdG9yPFQsIFQgfCBBc1ByaW1pdGl2ZTxUPiwgRmlsdGVyT3AuTHQsIEZpbHRlck9wLkx0SW5zZXNpdGl2ZT5cbnR5cGUgTHRlPFQ+ID0gT3BlcmF0b3I8VCwgVCB8IEFzUHJpbWl0aXZlPFQ+LCBGaWx0ZXJPcC5MdGUsIEZpbHRlck9wLkx0ZUluc2VzaXRpdmU+XG50eXBlIENvbnRhaW5zPFQ+ID0gT3BlcmF0b3I8VCwgc3RyaW5nLCBGaWx0ZXJPcC5Db250YWlucywgRmlsdGVyT3AuQ29udGFpbnNJbnNlc2l0aXZlPlxudHlwZSBTdGFydHNXaXRoPFQ+ID0gT3BlcmF0b3I8VCwgc3RyaW5nLCBGaWx0ZXJPcC5TdGFydHNXaXRoLCBGaWx0ZXJPcC5TdGFydHNXaXRoSW5zZXNpdGl2ZT5cbnR5cGUgRW5kc1dpdGg8VD4gPSBPcGVyYXRvcjxULCBzdHJpbmcsIEZpbHRlck9wLkVuZHNXaXRoLCBGaWx0ZXJPcC5FbmRzV2l0aEluc2VzaXRpdmU+XG50eXBlIFJlZ2V4cDxUPiA9IE9wZXJhdG9yPFQsIHN0cmluZywgRmlsdGVyT3AuUmVnZXhwLCBGaWx0ZXJPcC5SZWdleHBJbnNlc2l0aXZlLCBSZWdFeHA+XG5cbnR5cGUgT3BlcmF0b3I8VCwgUiwgT1AgZXh0ZW5kcyBzdHJpbmcsIE9QSSBleHRlbmRzIHN0cmluZyA9IG5ldmVyLCBFVCA9IG5ldmVyPiA9XG4gICAgfCAoVCBleHRlbmRzIFIgPyB7IFtrIGluIE9QXTogVCB8IEVUIHwgUiB9IDogbmV2ZXIpXG4gICAgfCAoVCBleHRlbmRzIHN0cmluZyA/IChPUEkgZXh0ZW5kcyBuZXZlciA/IG5ldmVyIDogeyBbayBpbiBPUEldOiBzdHJpbmcgfSkgOiBuZXZlcilcblxuZXhwb3J0IHR5cGUgRmlsdGVyRm48VCA9IGFueT4gPSAoaXRlbTogVCkgPT4gYm9vbGVhblxuXG4vKipcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaXRlbXMuZmlsdGVyKGZpbHRlckJ5KHtpZDogNDJ9KSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQnk8VCBleHRlbmRzIE1vZGVsPihmaWx0ZXJzOiBGaWx0ZXI8VD4pOiBGaWx0ZXJGbjxUPiB7XG4gICAgcmV0dXJuIF9maWx0ZXJDb21waWxlPFQ+KGZpbHRlcnMpXG59XG5cbi8vIFRPRE86IE5vcm1hbGl6ZSBmaWx0ZXJcbi8vIHR5cGUgX0ZpbHRlciA9IHsgcGF0aDogc3RyaW5nOyBvcDogRmlsdGVyT3A7IHZhbHVlOiBhbnkgfVxuLy8gdHlwZSBfT3IgPSB7IFwifFwiOiBBcnJheTxfRmlsdGVyPiB9XG4vLyB0eXBlIF9BbmQgPSB7IFwiJlwiOiBBcnJheTxfRmlsdGVyPiB9XG4vLyBleHBvcnQgdHlwZSBOb3JtYWxpemVkRmlsdGVyID0gX09yIHwgX0FuZFxuXG4vLyAvKipcbi8vICAqIEBleGFtcGxlXG4vLyAgKiBgYGB0c1xuLy8gICogbm9ybWFsaXplRmlsdGVyKHtpZDogMiwgbmFtZToge1wiPSpcIjogXCJBbnlOYW1lXCJ9fSkgLT4ge2lkOiB7XCI9PVwiOiAyfSwgbmFtZToge1wiPSpcIjogXCJBbnlOYW1lXCJ9fX1cbi8vICAqIG5vcm1hbGl6ZUZpbHRlcih7aWQ6IHtcIj5cIjogMCwgXCI8XCI6IDEwfX0pIC0+IHtcIiZcIjogW3tpZDoge1wiPlwiOiAwfX0sIHtpZDoge1wiPFwiOiAxMH19XX1cbi8vICAqIGBgYFxuLy8gICovXG4vLyBleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplRmlsdGVyPFQgZXh0ZW5kcyBNb2RlbD4oZmlsdGVyczogRmlsdGVyczxUPik6IEZpbHRlcnM8VD4ge1xuLy8gICAgIHJldHVybiBfbm9ybWFsaXplRmlsdGVyKGZpbHRlcnMpXG4vLyB9XG5cbi8vIGZ1bmN0aW9uIF9ub3JtYWxpemVGaWx0ZXIoZmlsdGVyczogYW55LCBwYXRoPzogc3RyaW5nKTogYW55IHtcbi8vICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBhbnlcblxuLy8gICAgIGZvciAoY29uc3QgW3BhdGgsIHZdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpKSB7XG4vLyAgICAgICAgIHN3aXRjaCAocGF0aCkge1xuLy8gICAgICAgICAgICAgY2FzZSBGaWx0ZXJPcC5BbmQ6XG4vLyAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHYpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSAnJicgKEFORCkgb3BlcmF0b3IgbXVzdCBoYXZlIGFycmF5IHR5cGVcIilcbi8vICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdFtGaWx0ZXJPcC5BbmRdKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtGaWx0ZXJPcC5BbmRdID0gW11cbi8vICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICByZXN1bHRbRmlsdGVyT3AuQW5kXSA9IHJlc3VsdFtGaWx0ZXJPcC5BbmRdLmNvbmNhdCh2Lm1hcChmID0+IF9ub3JtYWxpemVGaWx0ZXIoZikpKVxuLy8gICAgICAgICAgICAgICAgIGJyZWFrXG5cbi8vICAgICAgICAgICAgIGNhc2UgRmlsdGVyT3AuT3I6XG4vLyAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHYpKSB7XG4vLyAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSAnfCcgKE9SKSBvcGVyYXRvciBtdXN0IGhhdmUgYXJyYXkgdHlwZVwiKVxuLy8gICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W0ZpbHRlck9wLk9yXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICByZXN1bHRbRmlsdGVyT3AuT3JdID0gW11cbi8vICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICByZXN1bHRbRmlsdGVyT3AuT3JdID0gcmVzdWx0W0ZpbHRlck9wLk9yXS5jb25jYXQodi5tYXAoZiA9PiBfbm9ybWFsaXplRmlsdGVyKGYpKSlcbi8vICAgICAgICAgICAgICAgICBicmVha1xuXG4vLyAgICAgICAgICAgICBkZWZhdWx0OlxuLy8gICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYXNPcGVyYXRvcnModikpIHtcbi8vICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlbnRyeS5vcCkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWx0ZXJPcC5BbmQ6XG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRbRmlsdGVyT3AuQW5kXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbRmlsdGVyT3AuQW5kXSA9IFtdXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0ZpbHRlck9wLkFuZF0gPSByZXN1bHRbRmlsdGVyT3AuQW5kXS5jb25jYXQoXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlLm1hcCgodjogYW55KSA9PiBfbm9ybWFsaXplRmlsdGVyKHYsIHBhdGgpKVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpbHRlck9wLk9yOlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W0ZpbHRlck9wLk9yXSkge1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbRmlsdGVyT3AuT3JdID0gW11cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbRmlsdGVyT3AuT3JdID0gcmVzdWx0W0ZpbHRlck9wLk9yXS5jb25jYXQoXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnZhbHVlLm1hcCgodjogYW55KSA9PiBfbm9ybWFsaXplRmlsdGVyKHYsIHBhdGgpKVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0W0ZpbHRlck9wLkFuZF0pIHtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W0ZpbHRlck9wLkFuZF0gPSBbXVxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtGaWx0ZXJPcC5BbmRdLnB1c2goeyBwYXRoLCAuLi5lbnRyeSB9KVxuLy8gICAgICAgICAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICB9XG4vLyAgICAgfVxuXG4vLyAgICAgcmV0dXJuIHJlc3VsdFxuLy8gfVxuXG5mdW5jdGlvbiBfZmlsdGVyQ29tcGlsZTxUIGV4dGVuZHMgTW9kZWw+KGZpbHRlcnM6IEZpbHRlcjxUPik6IEZpbHRlckZuPFQ+IHtcbiAgICBsZXQgZ2V0dGVyOiBQYXRoR2V0dGVyXG4gICAgY29uc3QgcmVzdWx0OiBGaWx0ZXJGbjxUPltdID0gW11cbiAgICBmb3IgKGNvbnN0IFtwdGgsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXJzKSkge1xuICAgICAgICBzd2l0Y2ggKHB0aCkge1xuICAgICAgICAgICAgY2FzZSBGaWx0ZXJPcC5BbmQ6XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSb290ICcmJyAoQU5EKSBvcGVyYXRvciBtdXN0IGhhdmUgYXJyYXkgdHlwZVwiKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQuc3BsaWNlKHJlc3VsdC5sZW5ndGgsIDAsIC4uLnZhbHVlLm1hcChfZmlsdGVyQ29tcGlsZTxUPikpXG4gICAgICAgICAgICAgICAgYnJlYWtcblxuICAgICAgICAgICAgY2FzZSBGaWx0ZXJPcC5PcjpcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJvb3QgJ3wnIChPUikgb3BlcmF0b3IgbXVzdCBoYXZlIGFycmF5IHR5cGVcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3JfKHZhbHVlLm1hcChfZmlsdGVyQ29tcGlsZTxUPikpKVxuICAgICAgICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgZ2V0dGVyID0gcGF0aEdldHRlckNvbXBpbGUocHRoKVxuICAgICAgICAgICAgICAgIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChhbmRfKE9iamVjdC5lbnRyaWVzKHZhbHVlKS5tYXAoKFtvcCwgb3B2XSkgPT4gZmlsdGVyQ29tcGlsZU9wKGdldHRlciwgb3AgYXMgYW55LCBvcHYpKSkpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZmlsdGVyQ29tcGlsZU9wKGdldHRlciwgRmlsdGVyT3AuRXEsIHZhbHVlKSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbmRfKHJlc3VsdClcbn1cblxuZnVuY3Rpb24gZmlsdGVyQ29tcGlsZU9wKGdldHRlcjogUGF0aEdldHRlciwgb3A6IEZpbHRlck9wLCB2YWx1ZTogYW55KTogRmlsdGVyRm4ge1xuICAgIGxldCBsb3dlcjogc3RyaW5nXG4gICAgbGV0IHJlZ2V4OiBSZWdFeHBcbiAgICBzd2l0Y2ggKG9wKSB7XG4gICAgICAgIGNhc2UgRmlsdGVyT3AuRXE6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihnZXR0ZXIsIHYgPT4gdiA9PSB2YWx1ZSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLkVxU3RyaWN0OlxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IHYgPT09IHZhbHVlKVxuXG4gICAgICAgIGNhc2UgRmlsdGVyT3AuRXFJbnNlc2l0aXZlOlxuICAgICAgICAgICAgbG93ZXIgPSBTdHJpbmcodmFsdWUpLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGdldHRlciwgdiA9PiBTdHJpbmcodikudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gbG93ZXIpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5OZXE6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihnZXR0ZXIsIHYgPT4gdiAhPSB2YWx1ZSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLk5lcVN0cmljdDpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGdldHRlciwgdiA9PiB2ICE9PSB2YWx1ZSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLk5lcUluc2VzaXRpdmU6XG4gICAgICAgICAgICBsb3dlciA9IFN0cmluZyh2YWx1ZSkudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IFN0cmluZyh2KS50b0xvY2FsZUxvd2VyQ2FzZSgpICE9PSBsb3dlcilcblxuICAgICAgICBjYXNlIEZpbHRlck9wLkd0OlxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IHYgPiB2YWx1ZSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLkd0SW5zZXNpdGl2ZTpcbiAgICAgICAgICAgIGxvd2VyID0gU3RyaW5nKHZhbHVlKS50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihnZXR0ZXIsIHYgPT4gU3RyaW5nKHYpLnRvTG9jYWxlTG93ZXJDYXNlKCkgPiBsb3dlcilcblxuICAgICAgICBjYXNlIEZpbHRlck9wLkd0ZTpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGdldHRlciwgdiA9PiB2ID49IHZhbHVlKVxuXG4gICAgICAgIGNhc2UgRmlsdGVyT3AuR3RlSW5zZXNpdGl2ZTpcbiAgICAgICAgICAgIGxvd2VyID0gU3RyaW5nKHZhbHVlKS50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihnZXR0ZXIsIHYgPT4gU3RyaW5nKHYpLnRvTG9jYWxlTG93ZXJDYXNlKCkgPj0gbG93ZXIpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5MdDpcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGdldHRlciwgdiA9PiB2IDwgdmFsdWUpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5MdEluc2VzaXRpdmU6XG4gICAgICAgICAgICBsb3dlciA9IFN0cmluZyh2YWx1ZSkudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IFN0cmluZyh2KS50b0xvY2FsZUxvd2VyQ2FzZSgpIDwgbG93ZXIpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5MdGU6XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihnZXR0ZXIsIHYgPT4gdiA8PSB2YWx1ZSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLkx0ZUluc2VzaXRpdmU6XG4gICAgICAgICAgICBsb3dlciA9IFN0cmluZyh2YWx1ZSkudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IFN0cmluZyh2KS50b0xvY2FsZUxvd2VyQ2FzZSgpIDw9IGxvd2VyKVxuXG4gICAgICAgIGNhc2UgRmlsdGVyT3AuQ29udGFpbnM6XG4gICAgICAgICAgICBsb3dlciA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGdldHRlciwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSA/IHYuaW5jbHVkZXModmFsdWUpIDogU3RyaW5nKHYpLmluY2x1ZGVzKGxvd2VyKSkpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5Db250YWluc0luc2VzaXRpdmU6XG4gICAgICAgICAgICBsb3dlciA9IFN0cmluZyh2YWx1ZSkudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IFN0cmluZyh2KS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyKSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLlN0YXJ0c1dpdGg6XG4gICAgICAgICAgICBsb3dlciA9IFN0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGdldHRlciwgdiA9PiBTdHJpbmcodikuc3RhcnRzV2l0aChsb3dlcikpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5TdGFydHNXaXRoSW5zZXNpdGl2ZTpcbiAgICAgICAgICAgIGxvd2VyID0gU3RyaW5nKHZhbHVlKS50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihnZXR0ZXIsIHYgPT4gU3RyaW5nKHYpLnRvTG9jYWxlTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChsb3dlcikpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5FbmRzV2l0aDpcbiAgICAgICAgICAgIGxvd2VyID0gU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IFN0cmluZyh2KS5lbmRzV2l0aChsb3dlcikpXG5cbiAgICAgICAgY2FzZSBGaWx0ZXJPcC5FbmRzV2l0aEluc2VzaXRpdmU6XG4gICAgICAgICAgICBsb3dlciA9IFN0cmluZyh2YWx1ZSkudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXIoZ2V0dGVyLCB2ID0+IFN0cmluZyh2KS50b0xvY2FsZUxvd2VyQ2FzZSgpLmVuZHNXaXRoKGxvd2VyKSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLlJlZ2V4cDpcbiAgICAgICAgICAgIHJlZ2V4ID0gdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgPyB2YWx1ZSA6IG5ldyBSZWdFeHAodmFsdWUsIFwibXN2XCIpXG4gICAgICAgICAgICByZXR1cm4gbWF0Y2hlcihnZXR0ZXIsIHYgPT4gcmVnZXgudGVzdCh2KSlcblxuICAgICAgICBjYXNlIEZpbHRlck9wLlJlZ2V4cEluc2VzaXRpdmU6XG4gICAgICAgICAgICByZWdleCA9IHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwID8gdmFsdWUgOiBuZXcgUmVnRXhwKHZhbHVlLCBcIm1zdmlcIilcbiAgICAgICAgICAgIHJldHVybiBtYXRjaGVyKGdldHRlciwgdiA9PiByZWdleC50ZXN0KHYpKVxuXG4gICAgICAgIGNhc2UgRmlsdGVyT3AuQW5kOlxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJvb3QgJyYnIChBTkQpIG9wZXJhdG9yIG11c3QgaGF2ZSBhcnJheSB0eXBlXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYW5kXyhcbiAgICAgICAgICAgICAgICBmbGF0dGVuRGVlcChcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUubWFwKHYgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QodikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModikubWFwKChbb3AsIG9wdl0pID0+IGZpbHRlckNvbXBpbGVPcChnZXR0ZXIsIG9wIGFzIGFueSwgb3B2KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckNvbXBpbGVPcChnZXR0ZXIsIEZpbHRlck9wLkVxLCB2KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcblxuICAgICAgICBjYXNlIEZpbHRlck9wLk9yOlxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJvb3QgJ3wnIChPUikgb3BlcmF0b3IgbXVzdCBoYXZlIGFycmF5IHR5cGVcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvcl8oXG4gICAgICAgICAgICAgICAgZmxhdHRlbkRlZXAoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLm1hcCh2ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYWluT2JqZWN0KHYpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHYpLm1hcCgoW29wLCBvcHZdKSA9PiBmaWx0ZXJDb21waWxlT3AoZ2V0dGVyLCBvcCBhcyBhbnksIG9wdikpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJDb21waWxlT3AoZ2V0dGVyLCBGaWx0ZXJPcC5FcSwgdilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG9wZXJhdG9yOiAke29wfWApXG59XG5cbmZ1bmN0aW9uIG1hdGNoZXIoZ2V0dGVyOiBQYXRoR2V0dGVyLCBwcmVkaWN0OiAodmFsdWU6IGFueSkgPT4gYm9vbGVhbik6IEZpbHRlckZuIHtcbiAgICByZXR1cm4gb2JqID0+IGdldHRlcihvYmopLnNvbWUocHJlZGljdClcbn1cblxuZnVuY3Rpb24gYW5kXyhmbnM6IEZpbHRlckZuW10pOiBGaWx0ZXJGbiB7XG4gICAgaWYgKGZucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIF8gPT4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiBmbnMpIHtcbiAgICAgICAgICAgIGlmICghZm4oaXRlbSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbn1cblxuZnVuY3Rpb24gb3JfKGZuczogRmlsdGVyRm5bXSk6IEZpbHRlckZuIHtcbiAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXyA9PiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW0gPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIGZucykge1xuICAgICAgICAgICAgaWYgKGZuKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJNZXJnZSguLi5maWx0ZXJzOiBhbnlbXSk6IGFueSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgZmlsdGVycykge1xuICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBkZWVwQ2xvbmUoZmlsdGVyKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgICAgICAgICAgIGlmICh2ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrXVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc3VsdFtrXSA9IGRlZXBDbG9uZSh2KVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBhbnlcbn1cbiJdfQ==