angular-odata 0.78.1 → 0.95.0
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 +133 -62
- package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
- package/esm2020/lib/api.mjs +303 -0
- package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +12 -5
- package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
- package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +0 -0
- package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +1 -1
- package/esm2020/lib/client.mjs +271 -0
- package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +9 -3
- package/esm2020/lib/helper.mjs +268 -0
- package/esm2020/lib/index.mjs +19 -0
- package/esm2020/lib/models/collection.mjs +741 -0
- package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
- package/esm2020/lib/models/model.mjs +453 -0
- package/esm2020/lib/models/options.mjs +945 -0
- package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +6 -6
- package/esm2020/lib/options.mjs +32 -0
- package/esm2020/lib/resources/index.mjs +7 -0
- package/esm2020/lib/resources/path/handlers.mjs +69 -0
- package/esm2020/lib/resources/path/index.mjs +3 -0
- package/esm2020/lib/resources/path/segments.mjs +124 -0
- package/esm2020/lib/resources/query/builder.mjs +590 -0
- package/esm2020/lib/resources/query/expressions.mjs +207 -0
- package/esm2020/lib/resources/query/handlers.mjs +186 -0
- package/esm2020/lib/resources/query/index.mjs +4 -0
- package/esm2020/lib/resources/query/options.mjs +103 -0
- package/esm2020/lib/resources/query/syntax.mjs +406 -0
- package/esm2020/lib/resources/request.mjs +167 -0
- package/esm2020/lib/resources/resource.mjs +326 -0
- package/esm2020/lib/resources/responses/annotations.mjs +119 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
- package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
- package/esm2020/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +1 -1
- package/esm2020/lib/resources/responses/response.mjs +170 -0
- package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +1 -1
- package/esm2020/lib/resources/types/action.mjs +101 -0
- package/esm2020/lib/resources/types/batch.mjs +288 -0
- package/esm2020/lib/resources/types/count.mjs +27 -0
- package/esm2020/lib/resources/types/entity-set.mjs +94 -0
- package/esm2020/lib/resources/types/entity.mjs +106 -0
- package/esm2020/lib/resources/types/function.mjs +137 -0
- package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
- package/esm2020/lib/resources/types/media.mjs +41 -0
- package/esm2020/lib/resources/types/metadata.mjs +30 -0
- package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
- package/esm2020/lib/resources/types/options.mjs +2 -0
- package/esm2020/lib/resources/types/property.mjs +183 -0
- package/esm2020/lib/resources/types/reference.mjs +85 -0
- package/esm2020/lib/resources/types/singleton.mjs +126 -0
- package/esm2020/lib/resources/types/value.mjs +41 -0
- package/esm2020/lib/schema/annotation.mjs +37 -0
- package/esm2020/lib/schema/callable.mjs +62 -0
- package/esm2020/lib/schema/element.mjs +51 -0
- package/esm2020/lib/schema/entity-container.mjs +9 -0
- package/esm2020/lib/schema/entity-set.mjs +9 -0
- package/esm2020/lib/schema/enum-type.mjs +71 -0
- package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
- package/esm2020/lib/schema/parsers/callable.mjs +113 -0
- package/esm2020/lib/schema/parsers/edm.mjs +95 -0
- package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
- package/esm2020/lib/schema/parsers/index.mjs +5 -0
- package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
- package/esm2020/lib/schema/schema.mjs +61 -0
- package/esm2020/lib/schema/structured-type.mjs +198 -0
- package/esm2020/lib/services/base.mjs +29 -0
- package/esm2020/lib/services/entity-set.mjs +143 -0
- package/esm2020/lib/services/entity.mjs +12 -0
- package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
- package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
- package/esm2020/lib/services/singleton.mjs +48 -0
- package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
- package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
- package/esm2020/lib/types.mjs +37 -0
- package/esm2020/lib/utils/arraybuffers.mjs +46 -0
- package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
- package/esm2020/lib/utils/durations.mjs +40 -0
- package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
- package/esm2020/lib/utils/http.mjs +93 -0
- package/esm2020/lib/utils/index.mjs +10 -0
- package/esm2020/lib/utils/objects.mjs +195 -0
- package/esm2020/lib/utils/odata.mjs +22 -0
- package/esm2020/lib/utils/strings.mjs +20 -0
- package/esm2020/lib/utils/types.mjs +134 -0
- package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{angular-odata.js → angular-odata.mjs} +5068 -3943
- package/fesm2015/angular-odata.mjs.map +1 -0
- package/fesm2020/angular-odata.mjs +10274 -0
- package/fesm2020/angular-odata.mjs.map +1 -0
- package/lib/api.d.ts +17 -16
- package/lib/cache/cache.d.ts +2 -2
- package/lib/client.d.ts +93 -18
- package/lib/constants.d.ts +6 -2
- package/lib/helper.d.ts +3 -3
- package/lib/index.d.ts +0 -1
- package/lib/models/collection.d.ts +36 -47
- package/lib/models/model.d.ts +47 -40
- package/lib/models/options.d.ts +53 -52
- package/lib/options.d.ts +50 -2
- package/lib/resources/index.d.ts +2 -3
- package/lib/resources/path/handlers.d.ts +27 -0
- package/lib/resources/path/index.d.ts +2 -0
- package/lib/resources/{path-segments.d.ts → path/segments.d.ts} +4 -16
- package/lib/resources/{builder.d.ts → query/builder.d.ts} +12 -7
- package/lib/resources/query/expressions.d.ts +63 -0
- package/lib/resources/query/handlers.d.ts +89 -0
- package/lib/resources/query/index.d.ts +3 -0
- package/lib/resources/query/options.d.ts +38 -0
- package/lib/resources/query/syntax.d.ts +175 -0
- package/lib/resources/request.d.ts +8 -6
- package/lib/resources/resource.d.ts +49 -55
- package/lib/resources/responses/metadata.d.ts +1 -1
- package/lib/resources/responses/types.d.ts +1 -1
- package/lib/resources/types/action.d.ts +55 -69
- package/lib/resources/types/batch.d.ts +13 -8
- package/lib/resources/types/count.d.ts +16 -19
- package/lib/resources/types/entity-set.d.ts +24 -62
- package/lib/resources/types/entity.d.ts +35 -43
- package/lib/resources/types/function.d.ts +63 -71
- package/lib/resources/types/media.d.ts +20 -22
- package/lib/resources/types/metadata.d.ts +5 -7
- package/lib/resources/types/navigation-property.d.ts +100 -85
- package/lib/resources/types/options.d.ts +8 -8
- package/lib/resources/types/property.d.ts +63 -73
- package/lib/resources/types/reference.d.ts +72 -16
- package/lib/resources/types/singleton.d.ts +75 -43
- package/lib/resources/types/value.d.ts +18 -9
- package/lib/schema/annotation.d.ts +18 -0
- package/lib/schema/callable.d.ts +27 -11
- package/lib/schema/element.d.ts +39 -0
- package/lib/schema/entity-container.d.ts +3 -8
- package/lib/schema/entity-set.d.ts +3 -9
- package/lib/schema/enum-type.d.ts +41 -14
- package/lib/schema/index.d.ts +1 -0
- package/lib/{parsers → schema/parsers}/callable.d.ts +2 -2
- package/lib/schema/parsers/edm.d.ts +4 -0
- package/lib/{parsers → schema/parsers}/enum-type.d.ts +13 -7
- package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
- package/lib/{parsers → schema/parsers}/structured-type.d.ts +14 -9
- package/lib/schema/schema.d.ts +6 -8
- package/lib/schema/structured-type.d.ts +97 -18
- package/lib/services/base.d.ts +12 -12
- package/lib/services/entity-set.d.ts +15 -12
- package/lib/services/entity.d.ts +4 -1
- package/lib/services/singleton.d.ts +6 -3
- package/lib/settings.d.ts +4 -4
- package/lib/types.d.ts +7 -3
- package/lib/utils/arraybuffers.d.ts +4 -0
- package/lib/{parsers/edm.d.ts → utils/durations.d.ts} +3 -3
- package/lib/utils/http.d.ts +9 -0
- package/lib/utils/index.d.ts +5 -2
- package/lib/utils/objects.d.ts +1 -1
- package/lib/utils/strings.d.ts +4 -0
- package/lib/utils/types.d.ts +2 -0
- package/package.json +21 -8
- package/bundles/angular-odata.umd.js +0 -10756
- package/bundles/angular-odata.umd.js.map +0 -1
- package/esm2015/lib/api.js +0 -251
- package/esm2015/lib/client.js +0 -197
- package/esm2015/lib/helper.js +0 -269
- package/esm2015/lib/index.js +0 -21
- package/esm2015/lib/models/collection.js +0 -660
- package/esm2015/lib/models/model.js +0 -421
- package/esm2015/lib/models/options.js +0 -889
- package/esm2015/lib/options.js +0 -31
- package/esm2015/lib/parsers/callable.js +0 -110
- package/esm2015/lib/parsers/edm.js +0 -310
- package/esm2015/lib/parsers/enum-type.js +0 -97
- package/esm2015/lib/parsers/index.js +0 -5
- package/esm2015/lib/parsers/structured-type.js +0 -394
- package/esm2015/lib/resources/builder.js +0 -537
- package/esm2015/lib/resources/index.js +0 -8
- package/esm2015/lib/resources/path-segments.js +0 -156
- package/esm2015/lib/resources/query-options.js +0 -157
- package/esm2015/lib/resources/request.js +0 -141
- package/esm2015/lib/resources/resource.js +0 -328
- package/esm2015/lib/resources/responses/annotations.js +0 -121
- package/esm2015/lib/resources/responses/metadata.js +0 -548
- package/esm2015/lib/resources/responses/response.js +0 -170
- package/esm2015/lib/resources/types/action.js +0 -146
- package/esm2015/lib/resources/types/batch.js +0 -330
- package/esm2015/lib/resources/types/count.js +0 -50
- package/esm2015/lib/resources/types/entity-set.js +0 -164
- package/esm2015/lib/resources/types/entity.js +0 -158
- package/esm2015/lib/resources/types/function.js +0 -166
- package/esm2015/lib/resources/types/media.js +0 -46
- package/esm2015/lib/resources/types/metadata.js +0 -36
- package/esm2015/lib/resources/types/navigation-property.js +0 -214
- package/esm2015/lib/resources/types/options.js +0 -2
- package/esm2015/lib/resources/types/property.js +0 -190
- package/esm2015/lib/resources/types/reference.js +0 -50
- package/esm2015/lib/resources/types/singleton.js +0 -147
- package/esm2015/lib/resources/types/value.js +0 -30
- package/esm2015/lib/schema/annotation.js +0 -7
- package/esm2015/lib/schema/callable.js +0 -50
- package/esm2015/lib/schema/entity-container.js +0 -17
- package/esm2015/lib/schema/entity-set.js +0 -23
- package/esm2015/lib/schema/enum-type.js +0 -68
- package/esm2015/lib/schema/schema.js +0 -55
- package/esm2015/lib/schema/structured-type.js +0 -107
- package/esm2015/lib/services/base.js +0 -23
- package/esm2015/lib/services/entity-set.js +0 -143
- package/esm2015/lib/services/entity.js +0 -10
- package/esm2015/lib/services/singleton.js +0 -46
- package/esm2015/lib/types.js +0 -37
- package/esm2015/lib/utils/http.js +0 -59
- package/esm2015/lib/utils/index.js +0 -7
- package/esm2015/lib/utils/objects.js +0 -140
- package/esm2015/lib/utils/odata.js +0 -21
- package/esm2015/lib/utils/types.js +0 -103
- package/fesm2015/angular-odata.js.map +0 -1
- package/lib/resources/query-options.d.ts +0 -57
|
@@ -1,660 +0,0 @@
|
|
|
1
|
-
import { __rest } from "tslib";
|
|
2
|
-
import { map, switchMap, tap } from 'rxjs/operators';
|
|
3
|
-
import { forkJoin, of, throwError } from 'rxjs';
|
|
4
|
-
import { ODataEntitySetResource, ODataNavigationPropertyResource, ODataEntitiesAnnotations, ODataPropertyResource, ODataEntityAnnotations, } from '../resources/index';
|
|
5
|
-
import { EventEmitter } from '@angular/core';
|
|
6
|
-
import { Types } from '../utils/types';
|
|
7
|
-
import { BUBBLING, ODataModelOptions, ODataModelEvent, ODataModelState, INCLUDE_ALL, } from './options';
|
|
8
|
-
import { ODataHelper } from '../helper';
|
|
9
|
-
import { DEFAULT_VERSION } from '../constants';
|
|
10
|
-
export class ODataCollection {
|
|
11
|
-
constructor(entities = [], { parent, resource, annots, model, reset = false, } = {}) {
|
|
12
|
-
this._parent = null;
|
|
13
|
-
this._entries = [];
|
|
14
|
-
//Events
|
|
15
|
-
this.events$ = new EventEmitter();
|
|
16
|
-
this._sortBy = null;
|
|
17
|
-
const Klass = this.constructor;
|
|
18
|
-
if (model === undefined && Klass.model !== null)
|
|
19
|
-
model = Klass.model;
|
|
20
|
-
if (model === undefined)
|
|
21
|
-
throw new Error('Collection need model');
|
|
22
|
-
this._model = model;
|
|
23
|
-
// Parent
|
|
24
|
-
if (parent !== undefined) {
|
|
25
|
-
this._parent = parent;
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
// Resource
|
|
29
|
-
resource = resource || this._model.meta.collectionResourceFactory();
|
|
30
|
-
if (resource === undefined)
|
|
31
|
-
throw new Error(`Can't create collection without resource`);
|
|
32
|
-
this.attach(resource);
|
|
33
|
-
}
|
|
34
|
-
// Annotations
|
|
35
|
-
this._annotations =
|
|
36
|
-
annots ||
|
|
37
|
-
new ODataEntitiesAnnotations((resource === null || resource === void 0 ? void 0 : resource.api.options.helper) || ODataHelper[DEFAULT_VERSION]);
|
|
38
|
-
entities = entities || [];
|
|
39
|
-
this.assign(entities, { reset });
|
|
40
|
-
}
|
|
41
|
-
models() {
|
|
42
|
-
return this._entries
|
|
43
|
-
.filter((e) => e.state !== ODataModelState.Removed)
|
|
44
|
-
.map((e) => e.model);
|
|
45
|
-
}
|
|
46
|
-
get length() {
|
|
47
|
-
return this.models().length;
|
|
48
|
-
}
|
|
49
|
-
isParentOf(child) {
|
|
50
|
-
return (child !== this &&
|
|
51
|
-
ODataModelOptions.chain(child).some((p) => p[0] === this));
|
|
52
|
-
}
|
|
53
|
-
resource() {
|
|
54
|
-
return ODataModelOptions.resource(this);
|
|
55
|
-
}
|
|
56
|
-
attach(resource) {
|
|
57
|
-
if (this._resource !== undefined &&
|
|
58
|
-
this._resource.type() !== resource.type() &&
|
|
59
|
-
!resource.isSubtypeOf(this._resource))
|
|
60
|
-
throw new Error(`Can't reattach ${resource.type()} to ${this._resource.type()}`);
|
|
61
|
-
this._entries.forEach(({ model }) => {
|
|
62
|
-
const mr = this._model.meta.modelResourceFactory({
|
|
63
|
-
baseResource: resource,
|
|
64
|
-
});
|
|
65
|
-
model.attach(mr);
|
|
66
|
-
});
|
|
67
|
-
const current = this._resource;
|
|
68
|
-
if (current === undefined || !current.isEqualTo(resource)) {
|
|
69
|
-
this._resource = resource;
|
|
70
|
-
this.events$.emit(new ODataModelEvent('attach', {
|
|
71
|
-
collection: this,
|
|
72
|
-
previous: current,
|
|
73
|
-
value: resource,
|
|
74
|
-
}));
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
asEntitySet(func) {
|
|
78
|
-
const parent = this._parent;
|
|
79
|
-
this._parent = null;
|
|
80
|
-
return func(this).pipe(tap(() => (this._parent = parent)));
|
|
81
|
-
}
|
|
82
|
-
annots() {
|
|
83
|
-
return this._annotations;
|
|
84
|
-
}
|
|
85
|
-
modelFactory(data, { reset = false } = {}) {
|
|
86
|
-
var _a;
|
|
87
|
-
let Model = this._model;
|
|
88
|
-
const helper = this._annotations.helper;
|
|
89
|
-
const annots = new ODataEntityAnnotations(helper, helper.annotations(data) || {});
|
|
90
|
-
if ((annots === null || annots === void 0 ? void 0 : annots.type) !== undefined && Model.meta !== null) {
|
|
91
|
-
let schema = (_a = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))) === null || _a === void 0 ? void 0 : _a.schema;
|
|
92
|
-
if (schema !== undefined && schema.model !== undefined)
|
|
93
|
-
// Change to child model
|
|
94
|
-
Model = schema.model;
|
|
95
|
-
}
|
|
96
|
-
return new Model(data, {
|
|
97
|
-
annots,
|
|
98
|
-
reset,
|
|
99
|
-
parent: [this, null],
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
toEntities({ client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
103
|
-
return this._entries
|
|
104
|
-
.filter(({ model, state }) => state !== ODataModelState.Removed && chain.every((c) => c !== model))
|
|
105
|
-
.map(({ model, state }) => {
|
|
106
|
-
var changesOnly = changes_only && state !== ODataModelState.Added;
|
|
107
|
-
return model.toEntity({
|
|
108
|
-
client_id,
|
|
109
|
-
include_navigation,
|
|
110
|
-
include_concurrency,
|
|
111
|
-
include_computed,
|
|
112
|
-
include_key,
|
|
113
|
-
include_non_field,
|
|
114
|
-
field_mapping,
|
|
115
|
-
changes_only: changesOnly,
|
|
116
|
-
chain: [this, ...chain],
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
hasChanged({ include_navigation } = {}) {
|
|
121
|
-
return (this._entries.some((e) => e.state !== ODataModelState.Unchanged) ||
|
|
122
|
-
this.models().some((m) => m.hasChanged({ include_navigation })));
|
|
123
|
-
}
|
|
124
|
-
clone() {
|
|
125
|
-
let Ctor = this.constructor;
|
|
126
|
-
return new Ctor(this.toEntities(INCLUDE_ALL), {
|
|
127
|
-
resource: this.resource(),
|
|
128
|
-
annots: this.annots(),
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
fetch(_a = {}) {
|
|
132
|
-
var { withCount } = _a, options = __rest(_a, ["withCount"]);
|
|
133
|
-
const resource = this.resource();
|
|
134
|
-
if (resource === undefined)
|
|
135
|
-
return throwError('fetch: Resource is undefined');
|
|
136
|
-
let obs$;
|
|
137
|
-
if (resource instanceof ODataEntitySetResource) {
|
|
138
|
-
obs$ = resource.get(Object.assign({ withCount }, options));
|
|
139
|
-
}
|
|
140
|
-
else if (resource instanceof ODataNavigationPropertyResource) {
|
|
141
|
-
obs$ = resource.get(Object.assign({ responseType: 'entities', withCount }, options));
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
obs$ = resource.get(Object.assign({ responseType: 'entities', withCount }, options));
|
|
145
|
-
}
|
|
146
|
-
this.events$.emit(new ODataModelEvent('request', { collection: this, value: obs$ }));
|
|
147
|
-
return obs$.pipe(map(({ entities, annots }) => {
|
|
148
|
-
this._annotations = annots;
|
|
149
|
-
this.assign(entities || [], { reset: true });
|
|
150
|
-
this.events$.emit(new ODataModelEvent('sync', { collection: this }));
|
|
151
|
-
return this;
|
|
152
|
-
}));
|
|
153
|
-
}
|
|
154
|
-
fetchAll(options) {
|
|
155
|
-
const resource = this.resource();
|
|
156
|
-
if (resource === undefined)
|
|
157
|
-
return throwError('fetchAll: Resource is undefined');
|
|
158
|
-
if (resource instanceof ODataPropertyResource)
|
|
159
|
-
return throwError('fetchAll: Resource is ODataPropertyResource');
|
|
160
|
-
const obs$ = resource.fetchAll(options);
|
|
161
|
-
this.events$.emit(new ODataModelEvent('request', {
|
|
162
|
-
collection: this,
|
|
163
|
-
options: { observable: obs$ },
|
|
164
|
-
}));
|
|
165
|
-
return obs$.pipe(map((entities) => {
|
|
166
|
-
this._annotations = new ODataEntitiesAnnotations(resource === null || resource === void 0 ? void 0 : resource.api.options.helper);
|
|
167
|
-
this.assign(entities || [], { reset: true });
|
|
168
|
-
this.events$.emit(new ODataModelEvent('sync', {
|
|
169
|
-
collection: this,
|
|
170
|
-
options: { entities },
|
|
171
|
-
}));
|
|
172
|
-
return this;
|
|
173
|
-
}));
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Save all models in the collection
|
|
177
|
-
* @param relModel The model is relationship
|
|
178
|
-
* @param method The method to use
|
|
179
|
-
* @param options HttpOptions
|
|
180
|
-
*/
|
|
181
|
-
save(_a = {}) {
|
|
182
|
-
var { relModel = false, refOnly = false, method } = _a, options = __rest(_a, ["relModel", "refOnly", "method"]);
|
|
183
|
-
const resource = this.resource();
|
|
184
|
-
if (resource === undefined)
|
|
185
|
-
return throwError('saveAll: Resource is undefined');
|
|
186
|
-
if (resource instanceof ODataPropertyResource)
|
|
187
|
-
return throwError('fetchAll: Resource is ODataPropertyResource');
|
|
188
|
-
let toDestroy = [];
|
|
189
|
-
let toCreate = [];
|
|
190
|
-
let toUpdate = [];
|
|
191
|
-
this._entries.forEach((entry) => {
|
|
192
|
-
const model = entry.model;
|
|
193
|
-
if (entry.state === ODataModelState.Removed) {
|
|
194
|
-
toDestroy.push(entry.model);
|
|
195
|
-
}
|
|
196
|
-
else if (entry.state === ODataModelState.Added) {
|
|
197
|
-
toCreate.push(entry.model);
|
|
198
|
-
}
|
|
199
|
-
else if (model.hasChanged()) {
|
|
200
|
-
toUpdate.push(entry.model);
|
|
201
|
-
}
|
|
202
|
-
});
|
|
203
|
-
if (toDestroy.length > 0 || toCreate.length > 0 || toUpdate.length > 0) {
|
|
204
|
-
const obs$ = forkJoin([
|
|
205
|
-
...toDestroy.map((m) => relModel
|
|
206
|
-
? m.asEntity((e) => e.destroy(options))
|
|
207
|
-
: this.removeReference(m, options)),
|
|
208
|
-
...toCreate.map((m) => relModel
|
|
209
|
-
? m.asEntity((e) => e.save(Object.assign({ method: 'create' }, options)))
|
|
210
|
-
: refOnly
|
|
211
|
-
? this.addReference(m, options)
|
|
212
|
-
: m
|
|
213
|
-
.asEntity((e) => e.save(Object.assign({ method: m.isNew() ? 'create' : method }, options)))
|
|
214
|
-
.pipe(switchMap((r) => this.addReference(r, options)))),
|
|
215
|
-
...toUpdate.map((m) => m.asEntity((e) => e.save(Object.assign({ method }, options)))),
|
|
216
|
-
]);
|
|
217
|
-
this.events$.emit(new ODataModelEvent('request', {
|
|
218
|
-
collection: this,
|
|
219
|
-
options: { observable: obs$ },
|
|
220
|
-
}));
|
|
221
|
-
return obs$.pipe(map(() => {
|
|
222
|
-
this._entries = this._entries
|
|
223
|
-
.filter((entry) => entry.state !== ODataModelState.Removed)
|
|
224
|
-
.map((entry) => Object.assign(entry, { state: ODataModelState.Unchanged }));
|
|
225
|
-
this.events$.emit(new ODataModelEvent('sync', { collection: this }));
|
|
226
|
-
return this;
|
|
227
|
-
}));
|
|
228
|
-
}
|
|
229
|
-
return of(this);
|
|
230
|
-
}
|
|
231
|
-
addReference(model, options) {
|
|
232
|
-
const resource = this.resource();
|
|
233
|
-
if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
|
|
234
|
-
return resource
|
|
235
|
-
.reference()
|
|
236
|
-
.add(model._meta.entityResource(model), options)
|
|
237
|
-
.pipe(map(() => model));
|
|
238
|
-
}
|
|
239
|
-
return of(model);
|
|
240
|
-
}
|
|
241
|
-
_addModel(model, { silent = false, reset = false, position = -1, } = {}) {
|
|
242
|
-
const key = model.key();
|
|
243
|
-
let entry = this._findEntry({
|
|
244
|
-
model,
|
|
245
|
-
key,
|
|
246
|
-
cid: model[this._model.meta.cid],
|
|
247
|
-
});
|
|
248
|
-
if (entry === undefined || entry.state === ODataModelState.Removed) {
|
|
249
|
-
if (entry !== undefined && entry.state === ODataModelState.Removed) {
|
|
250
|
-
const index = this._entries.indexOf(entry);
|
|
251
|
-
this._entries.splice(index, 1);
|
|
252
|
-
}
|
|
253
|
-
// Create Entry
|
|
254
|
-
entry = {
|
|
255
|
-
state: reset ? ODataModelState.Unchanged : ODataModelState.Added,
|
|
256
|
-
model,
|
|
257
|
-
key: model.key(),
|
|
258
|
-
subscription: null,
|
|
259
|
-
};
|
|
260
|
-
// Subscribe
|
|
261
|
-
this._subscribe(entry);
|
|
262
|
-
// Now add
|
|
263
|
-
if (position >= 0)
|
|
264
|
-
this._entries.splice(position, 0, entry);
|
|
265
|
-
else
|
|
266
|
-
this._entries.push(entry);
|
|
267
|
-
if (!silent) {
|
|
268
|
-
model.events$.emit(new ODataModelEvent('add', { model, collection: this }));
|
|
269
|
-
}
|
|
270
|
-
return entry.model;
|
|
271
|
-
}
|
|
272
|
-
return undefined;
|
|
273
|
-
}
|
|
274
|
-
addModel(model, { silent = false, reset = false, position = -1, } = {}) {
|
|
275
|
-
if (position < 0)
|
|
276
|
-
position = this._bisect(model);
|
|
277
|
-
const added = this._addModel(model, { silent, reset, position });
|
|
278
|
-
if (!silent && added !== undefined) {
|
|
279
|
-
this.events$.emit(new ODataModelEvent('update', {
|
|
280
|
-
collection: this,
|
|
281
|
-
options: { added: [added], removed: [], merged: [] },
|
|
282
|
-
}));
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
add(model, { silent = false, server = true, position = -1, } = {}) {
|
|
286
|
-
if (server) {
|
|
287
|
-
return this.addReference(model).pipe(map((model) => {
|
|
288
|
-
this.addModel(model, { silent, position, reset: true });
|
|
289
|
-
return this;
|
|
290
|
-
}));
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
this.addModel(model, { silent, position });
|
|
294
|
-
return of(this);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
removeReference(model, options) {
|
|
298
|
-
const resource = this.resource();
|
|
299
|
-
if (!model.isNew() && resource instanceof ODataNavigationPropertyResource) {
|
|
300
|
-
return resource
|
|
301
|
-
.reference()
|
|
302
|
-
.remove(model._meta.entityResource(model), options)
|
|
303
|
-
.pipe(map(() => model));
|
|
304
|
-
}
|
|
305
|
-
return of(model);
|
|
306
|
-
}
|
|
307
|
-
_removeModel(model, { silent = false, reset = false, } = {}) {
|
|
308
|
-
const key = model.key();
|
|
309
|
-
let entry = this._findEntry({
|
|
310
|
-
model,
|
|
311
|
-
key,
|
|
312
|
-
cid: model[this._model.meta.cid],
|
|
313
|
-
});
|
|
314
|
-
if (entry !== undefined && entry.state !== ODataModelState.Removed) {
|
|
315
|
-
// Emit Event
|
|
316
|
-
if (!silent)
|
|
317
|
-
model.events$.emit(new ODataModelEvent('remove', { model, collection: this }));
|
|
318
|
-
// Now remove
|
|
319
|
-
const index = this._entries.indexOf(entry);
|
|
320
|
-
this._entries.splice(index, 1);
|
|
321
|
-
if (!(reset || entry.state === ODataModelState.Added)) {
|
|
322
|
-
// Move to end of array and mark as removed
|
|
323
|
-
entry.state = ODataModelState.Removed;
|
|
324
|
-
this._entries.push(entry);
|
|
325
|
-
}
|
|
326
|
-
this._unsubscribe(entry);
|
|
327
|
-
return entry.model;
|
|
328
|
-
}
|
|
329
|
-
return undefined;
|
|
330
|
-
}
|
|
331
|
-
removeModel(model, { silent = false, reset = false, } = {}) {
|
|
332
|
-
const removed = this._removeModel(model, { silent, reset });
|
|
333
|
-
if (!silent && removed !== undefined) {
|
|
334
|
-
this.events$.emit(new ODataModelEvent('update', {
|
|
335
|
-
collection: this,
|
|
336
|
-
options: { added: [], removed: [removed], merged: [] },
|
|
337
|
-
}));
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
remove(model, { silent = false, server = true, } = {}) {
|
|
341
|
-
if (server) {
|
|
342
|
-
return this.removeReference(model).pipe(map((model) => {
|
|
343
|
-
this.removeModel(model, { silent, reset: true });
|
|
344
|
-
return this;
|
|
345
|
-
}));
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
this.removeModel(model, { silent });
|
|
349
|
-
return of(this);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
create(attrs = {}, { silent = false, server = true, } = {}) {
|
|
353
|
-
const model = this.modelFactory(attrs);
|
|
354
|
-
return (model.isValid() && server ? model.asEntity((m) => m.save()) : of(model)).pipe(switchMap((model) => this.add(model, { silent, server })), map(() => model));
|
|
355
|
-
}
|
|
356
|
-
set(path, value) {
|
|
357
|
-
const Model = this._model;
|
|
358
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
359
|
-
if (pathArray.length === 0)
|
|
360
|
-
return undefined;
|
|
361
|
-
if (pathArray.length > 1) {
|
|
362
|
-
const model = this._entries[Number(pathArray[0])].model;
|
|
363
|
-
return model.set(pathArray.slice(1), value);
|
|
364
|
-
}
|
|
365
|
-
if (pathArray.length === 1 && ODataModelOptions.isModel(value)) {
|
|
366
|
-
let toAdd = [];
|
|
367
|
-
let toMerge = [];
|
|
368
|
-
let toRemove = [];
|
|
369
|
-
let index = Number(pathArray[0]);
|
|
370
|
-
const model = this.models()[index];
|
|
371
|
-
const entry = this._findEntry({ model });
|
|
372
|
-
if (entry !== undefined) {
|
|
373
|
-
//TODO: Remove/Add or Merge?
|
|
374
|
-
// Merge
|
|
375
|
-
entry.model.assign(value.toEntity(Object.assign({ client_id: true }, INCLUDE_ALL)));
|
|
376
|
-
if (entry.model.hasChanged())
|
|
377
|
-
toMerge.push(model);
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
// Add
|
|
381
|
-
this._addModel(value);
|
|
382
|
-
toAdd.push(model);
|
|
383
|
-
}
|
|
384
|
-
this.events$.emit(new ODataModelEvent('update', {
|
|
385
|
-
collection: this,
|
|
386
|
-
options: { added: toAdd, removed: toRemove, merged: toMerge },
|
|
387
|
-
}));
|
|
388
|
-
return value;
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
get(path) {
|
|
392
|
-
const Model = this._model;
|
|
393
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
394
|
-
if (pathArray.length === 0)
|
|
395
|
-
return undefined;
|
|
396
|
-
const value = this.models()[Number(pathArray[0])];
|
|
397
|
-
if (pathArray.length > 1 && ODataModelOptions.isModel(value)) {
|
|
398
|
-
return value.get(pathArray.slice(1));
|
|
399
|
-
}
|
|
400
|
-
return value;
|
|
401
|
-
}
|
|
402
|
-
reset({ path, silent = false, } = {}) {
|
|
403
|
-
if (Types.isEmpty(path)) {
|
|
404
|
-
this.models().forEach((m) => m.reset({ silent }));
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
const Model = this._model;
|
|
408
|
-
const pathArray = (Types.isArray(path) ? path : `${path}`.match(/([^[.\]])+/g));
|
|
409
|
-
const value = this.models()[Number(pathArray[0])];
|
|
410
|
-
if (ODataModelOptions.isModel(value)) {
|
|
411
|
-
value.reset({ path: pathArray.slice(1), silent });
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
assign(objects, { reset = false, silent = false, } = {}) {
|
|
416
|
-
const Model = this._model;
|
|
417
|
-
let toAdd = [];
|
|
418
|
-
let toMerge = [];
|
|
419
|
-
let toRemove = [];
|
|
420
|
-
let toSort = [];
|
|
421
|
-
let modelMap = [];
|
|
422
|
-
objects.forEach((obj, index) => {
|
|
423
|
-
const isModel = ODataModelOptions.isModel(obj);
|
|
424
|
-
const key = Model !== null && Model.meta ? Model.meta.resolveKey(obj) : undefined;
|
|
425
|
-
const cid = Model.meta.cid in obj ? obj[Model.meta.cid] : undefined;
|
|
426
|
-
// Try find entry
|
|
427
|
-
const entry = isModel
|
|
428
|
-
? this._findEntry({ model: obj }) // By Model
|
|
429
|
-
: this._findEntry({ cid, key }); // By Cid or Key
|
|
430
|
-
let model;
|
|
431
|
-
if (entry !== undefined) {
|
|
432
|
-
// Merge
|
|
433
|
-
model = entry.model;
|
|
434
|
-
if (model !== obj) {
|
|
435
|
-
// Get entity from model
|
|
436
|
-
if (isModel) {
|
|
437
|
-
const entity = obj.toEntity(Object.assign({ client_id: true }, INCLUDE_ALL));
|
|
438
|
-
model.assign(entity, { reset, silent });
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
const helper = this._annotations.helper;
|
|
442
|
-
const annots = new ODataEntityAnnotations(helper, helper.annotations(obj) || {});
|
|
443
|
-
const entity = annots.attributes(obj, 'full');
|
|
444
|
-
model._annotations = annots;
|
|
445
|
-
model.assign(entity, { reset, silent });
|
|
446
|
-
}
|
|
447
|
-
// Model Change?
|
|
448
|
-
if (model.hasChanged())
|
|
449
|
-
toMerge.push(model);
|
|
450
|
-
}
|
|
451
|
-
// Has Sort or Index Change?
|
|
452
|
-
if (toSort.length > 0 || index !== this.models().indexOf(model)) {
|
|
453
|
-
toSort.push([model, index]);
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
else {
|
|
457
|
-
// Add
|
|
458
|
-
model = isModel
|
|
459
|
-
? obj
|
|
460
|
-
: this.modelFactory(obj, {
|
|
461
|
-
reset,
|
|
462
|
-
});
|
|
463
|
-
toAdd.push(model);
|
|
464
|
-
}
|
|
465
|
-
modelMap.push(model[Model.meta.cid]);
|
|
466
|
-
});
|
|
467
|
-
this._entries
|
|
468
|
-
.filter((e) => modelMap.indexOf(e.model[Model.meta.cid]) === -1)
|
|
469
|
-
.forEach((entry) => {
|
|
470
|
-
toRemove.push(entry.model);
|
|
471
|
-
});
|
|
472
|
-
toRemove.forEach((m) => this._removeModel(m, { silent: silent, reset }));
|
|
473
|
-
toAdd.forEach((m) => this._addModel(m, { silent: silent, reset }));
|
|
474
|
-
toSort.forEach((m) => {
|
|
475
|
-
this._removeModel(m[0], { silent: true, reset });
|
|
476
|
-
this._addModel(m[0], { silent: true, reset, position: m[1] });
|
|
477
|
-
});
|
|
478
|
-
if (toAdd.length > 0 ||
|
|
479
|
-
toRemove.length > 0 ||
|
|
480
|
-
toMerge.length > 0 ||
|
|
481
|
-
toSort.length > 0) {
|
|
482
|
-
this._sortBy = null;
|
|
483
|
-
if (!silent) {
|
|
484
|
-
this.events$.emit(new ODataModelEvent(reset ? 'reset' : 'update', {
|
|
485
|
-
collection: this,
|
|
486
|
-
options: {
|
|
487
|
-
added: toAdd,
|
|
488
|
-
removed: toRemove,
|
|
489
|
-
merged: toMerge,
|
|
490
|
-
sorted: toSort,
|
|
491
|
-
},
|
|
492
|
-
}));
|
|
493
|
-
}
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
query(func) {
|
|
497
|
-
const resource = this.resource();
|
|
498
|
-
if (resource === undefined)
|
|
499
|
-
throw new Error(`Can't query without ODataResource`);
|
|
500
|
-
func(resource.query);
|
|
501
|
-
this.attach(resource);
|
|
502
|
-
}
|
|
503
|
-
callFunction(name, params, responseType, _a = {}) {
|
|
504
|
-
var options = __rest(_a, []);
|
|
505
|
-
const resource = this.resource();
|
|
506
|
-
if (resource instanceof ODataEntitySetResource) {
|
|
507
|
-
const func = resource.function(name);
|
|
508
|
-
func.query.apply(options);
|
|
509
|
-
switch (responseType) {
|
|
510
|
-
case 'property':
|
|
511
|
-
return func.callProperty(params, options);
|
|
512
|
-
case 'model':
|
|
513
|
-
return func.callModel(params, options);
|
|
514
|
-
case 'collection':
|
|
515
|
-
return func.callCollection(params, options);
|
|
516
|
-
default:
|
|
517
|
-
return func.call(params, Object.assign({ responseType }, options));
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
return throwError(`Can't function without ODataEntitySetResource`);
|
|
521
|
-
}
|
|
522
|
-
callAction(name, params, responseType, _a = {}) {
|
|
523
|
-
var options = __rest(_a, []);
|
|
524
|
-
const resource = this.resource();
|
|
525
|
-
if (resource instanceof ODataEntitySetResource) {
|
|
526
|
-
const action = resource.action(name);
|
|
527
|
-
action.query.apply(options);
|
|
528
|
-
switch (responseType) {
|
|
529
|
-
case 'property':
|
|
530
|
-
return action.callProperty(params, options);
|
|
531
|
-
case 'model':
|
|
532
|
-
return action.callModel(params, options);
|
|
533
|
-
case 'collection':
|
|
534
|
-
return action.callCollection(params, options);
|
|
535
|
-
default:
|
|
536
|
-
return action.call(params, Object.assign({ responseType }, options));
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
return throwError(`Can't action without ODataEntitySetResource`);
|
|
540
|
-
}
|
|
541
|
-
_unsubscribe(entry) {
|
|
542
|
-
if (entry.subscription !== null) {
|
|
543
|
-
entry.subscription.unsubscribe();
|
|
544
|
-
entry.subscription = null;
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
_subscribe(entry) {
|
|
548
|
-
if (entry.subscription !== null) {
|
|
549
|
-
throw new Error('Subscription already exists');
|
|
550
|
-
}
|
|
551
|
-
if (!entry.model.isParentOf(this)) {
|
|
552
|
-
entry.model._parent = [this, null];
|
|
553
|
-
}
|
|
554
|
-
entry.subscription = entry.model.events$.subscribe((event) => {
|
|
555
|
-
var _a;
|
|
556
|
-
if (BUBBLING.indexOf(event.name) !== -1 &&
|
|
557
|
-
event.bubbling &&
|
|
558
|
-
!event.visited(this)) {
|
|
559
|
-
if (event.model === entry.model) {
|
|
560
|
-
if (event.name === 'destroy') {
|
|
561
|
-
this.removeModel(entry.model, { reset: true });
|
|
562
|
-
}
|
|
563
|
-
else if (event.name === 'change' && ((_a = event.options) === null || _a === void 0 ? void 0 : _a.key)) {
|
|
564
|
-
entry.key = entry.model.key();
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
const index = this.models().indexOf(entry.model);
|
|
568
|
-
event.push(this, index);
|
|
569
|
-
this.events$.emit(event);
|
|
570
|
-
}
|
|
571
|
-
});
|
|
572
|
-
}
|
|
573
|
-
_findEntry({ model, cid, key, } = {}) {
|
|
574
|
-
return this._entries.find((entry) => {
|
|
575
|
-
const byModel = model !== undefined && entry.model.equals(model);
|
|
576
|
-
const byCid = cid !== undefined && entry.model[this._model.meta.cid] === cid;
|
|
577
|
-
const byKey = key !== undefined &&
|
|
578
|
-
entry.key !== undefined &&
|
|
579
|
-
Types.isEqual(entry.key, key);
|
|
580
|
-
return byModel || byCid || byKey;
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
// Collection functions
|
|
584
|
-
get [Symbol.toStringTag]() {
|
|
585
|
-
return 'Collection';
|
|
586
|
-
}
|
|
587
|
-
[Symbol.iterator]() {
|
|
588
|
-
let pointer = 0;
|
|
589
|
-
let models = this.models();
|
|
590
|
-
return {
|
|
591
|
-
next() {
|
|
592
|
-
return {
|
|
593
|
-
done: pointer === models.length,
|
|
594
|
-
value: models[pointer++],
|
|
595
|
-
};
|
|
596
|
-
},
|
|
597
|
-
};
|
|
598
|
-
}
|
|
599
|
-
contains(model) {
|
|
600
|
-
return this.models().some((m) => m.equals(model));
|
|
601
|
-
}
|
|
602
|
-
filter(predicate) {
|
|
603
|
-
return this.models().filter(predicate);
|
|
604
|
-
}
|
|
605
|
-
//#region Sort
|
|
606
|
-
_bisect(model) {
|
|
607
|
-
let index = -1;
|
|
608
|
-
if (this._sortBy !== null) {
|
|
609
|
-
for (index = 0; index < this._entries.length; index++) {
|
|
610
|
-
if (this._compare(model, this._entries[index], this._sortBy, 0) < 0) {
|
|
611
|
-
return index;
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
return index;
|
|
616
|
-
}
|
|
617
|
-
_compare(e1, e2, by, index) {
|
|
618
|
-
let m1 = ODataModelOptions.isModel(e1)
|
|
619
|
-
? e1
|
|
620
|
-
: e1.model;
|
|
621
|
-
let m2 = ODataModelOptions.isModel(e2)
|
|
622
|
-
? e2
|
|
623
|
-
: e2.model;
|
|
624
|
-
let value1 = m1.get(by[index].field);
|
|
625
|
-
let value2 = m2.get(by[index].field);
|
|
626
|
-
let result = 0;
|
|
627
|
-
if (value1 == null && value2 != null)
|
|
628
|
-
result = -1;
|
|
629
|
-
else if (value1 != null && value2 == null)
|
|
630
|
-
result = 1;
|
|
631
|
-
else if (value1 == null && value2 == null)
|
|
632
|
-
result = 0;
|
|
633
|
-
else if (typeof value1 == 'string' || value1 instanceof String) {
|
|
634
|
-
if (value1.localeCompare && value1 != value2) {
|
|
635
|
-
return (by[index].order || 1) * value1.localeCompare(value2);
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
else {
|
|
639
|
-
result = value1 < value2 ? -1 : 1;
|
|
640
|
-
}
|
|
641
|
-
if (value1 == value2) {
|
|
642
|
-
return by.length - 1 > index ? this._compare(e1, e2, by, index + 1) : 0;
|
|
643
|
-
}
|
|
644
|
-
return (by[index].order || 1) * result;
|
|
645
|
-
}
|
|
646
|
-
isSorted() {
|
|
647
|
-
return this._sortBy !== null;
|
|
648
|
-
}
|
|
649
|
-
sort(by, { silent } = {}) {
|
|
650
|
-
this._sortBy = by;
|
|
651
|
-
this._entries = this._entries.sort((e1, e2) => this._compare(e1, e2, by, 0));
|
|
652
|
-
if (!silent) {
|
|
653
|
-
this.events$.emit(new ODataModelEvent('update', {
|
|
654
|
-
collection: this,
|
|
655
|
-
}));
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
}
|
|
659
|
-
ODataCollection.model = null;
|
|
660
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvY29sbGVjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFFBQVEsRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTVELE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsK0JBQStCLEVBQy9CLHdCQUF3QixFQUd4QixxQkFBcUIsRUFDckIsc0JBQXNCLEdBVXZCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkMsT0FBTyxFQUNMLFFBQVEsRUFHUixpQkFBaUIsRUFDakIsZUFBZSxFQUVmLGVBQWUsRUFFZixXQUFXLEdBQ1osTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRS9DLE1BQU0sT0FBTyxlQUFlO0lBMkIxQixZQUNFLFdBQXFELEVBQUUsRUFDdkQsRUFDRSxNQUFNLEVBQ04sUUFBUSxFQUNSLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxHQUFHLEtBQUssTUFPWCxFQUFFO1FBckNSLFlBQU8sR0FLSSxJQUFJLENBQUM7UUFHaEIsYUFBUSxHQUE0QixFQUFFLENBQUM7UUFhdkMsUUFBUTtRQUNSLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBc0IsQ0FBQztRQXc0QmpELFlBQU8sR0FBeUQsSUFBSSxDQUFDO1FBdjNCbkUsTUFBTSxLQUFLLEdBQUcs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QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pDLENBQUM7SUFHRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSSxDQUNGLEVBQWlELEVBQ2pELEVBQUUsTUFBTSxLQUEyQixFQUFFO1FBRXJDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQ2hDLENBQUMsRUFBeUIsRUFBRSxFQUF5QixFQUFFLEVBQUUsQ0FDdkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FDL0IsQ0FBQztRQUNGLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUU7Z0JBQzVCLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FDSCxDQUFDO1NBQ0g7SUFDSCxDQUFDOztBQXA3Qk0scUJBQUssR0FBNkIsSUFBSSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBPRGF0YUVudGl0eVNldFJlc291cmNlLFxuICBPRGF0YUVudGl0eVJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gIEh0dHBPcHRpb25zLFxuICBPRGF0YUVudGl0aWVzLFxuICBPRGF0YVByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gIFNlbGVjdCxcbiAgRXhwYW5kLFxuICBPcHRpb25IYW5kbGVyLFxuICBUcmFuc2Zvcm0sXG4gIEZpbHRlcixcbiAgT3JkZXJCeSxcbiAgRW50aXR5S2V5LFxuICBRdWVyeUFyZ3VtZW50cyxcbiAgSHR0cFF1ZXJ5T3B0aW9ucyxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzL2luZGV4JztcblxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IE9EYXRhTW9kZWwgfSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gIEJVQkJMSU5HLFxuICBPRGF0YU1vZGVsUmVzb3VyY2UsXG4gIE9EYXRhQ29sbGVjdGlvblJlc291cmNlLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbEV2ZW50LFxuICBPRGF0YU1vZGVsRmllbGQsXG4gIE9EYXRhTW9kZWxTdGF0ZSxcbiAgT0RhdGFNb2RlbEVudHJ5LFxuICBJTkNMVURFX0FMTCxcbn0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IE9EYXRhSGVscGVyIH0gZnJvbSAnLi4vaGVscGVyJztcbmltcG9ydCB7IERFRkFVTFRfVkVSU0lPTiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUNvbGxlY3Rpb248VCwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+XG4gIGltcGxlbWVudHMgSXRlcmFibGU8TT5cbntcbiAgc3RhdGljIG1vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbCB8IG51bGwgPSBudWxsO1xuICBfcGFyZW50OlxuICAgIHwgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF1cbiAgICB8IG51bGwgPSBudWxsO1xuICBfcmVzb3VyY2U/OiBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPjtcbiAgX2Fubm90YXRpb25zITogT0RhdGFFbnRpdGllc0Fubm90YXRpb25zO1xuICBfZW50cmllczogT0RhdGFNb2RlbEVudHJ5PFQsIE0+W10gPSBbXTtcbiAgX21vZGVsOiB0eXBlb2YgT0RhdGFNb2RlbDtcblxuICBtb2RlbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoKGUpID0+IGUuc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5SZW1vdmVkKVxuICAgICAgLm1hcCgoZSkgPT4gZS5tb2RlbCk7XG4gIH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWxzKCkubGVuZ3RoO1xuICB9XG5cbiAgLy9FdmVudHNcbiAgZXZlbnRzJCA9IG5ldyBFdmVudEVtaXR0ZXI8T0RhdGFNb2RlbEV2ZW50PFQ+PigpO1xuICBjb25zdHJ1Y3RvcihcbiAgICBlbnRpdGllczogUGFydGlhbDxUPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSA9IFtdLFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgICAgbW9kZWwsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtPRGF0YU1vZGVsPGFueT4sIE9EYXRhTW9kZWxGaWVsZDxhbnk+XTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFDb2xsZWN0aW9uUmVzb3VyY2U8VD47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnM7XG4gICAgICBtb2RlbD86IHR5cGVvZiBPRGF0YU1vZGVsO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCAmJiBLbGFzcy5tb2RlbCAhPT0gbnVsbCkgbW9kZWwgPSBLbGFzcy5tb2RlbDtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdDb2xsZWN0aW9uIG5lZWQgbW9kZWwnKTtcbiAgICB0aGlzLl9tb2RlbCA9IG1vZGVsO1xuXG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlc291cmNlXG4gICAgICByZXNvdXJjZSA9IHJlc291cmNlIHx8IHRoaXMuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSgpO1xuICAgICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgY3JlYXRlIGNvbGxlY3Rpb24gd2l0aG91dCByZXNvdXJjZWApO1xuICAgICAgdGhpcy5hdHRhY2gocmVzb3VyY2UpO1xuICAgIH1cblxuICAgIC8vIEFubm90YXRpb25zXG4gICAgdGhpcy5fYW5ub3RhdGlvbnMgPVxuICAgICAgYW5ub3RzIHx8XG4gICAgICBuZXcgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zKFxuICAgICAgICByZXNvdXJjZT8uYXBpLm9wdGlvbnMuaGVscGVyIHx8IE9EYXRhSGVscGVyW0RFRkFVTFRfVkVSU0lPTl1cbiAgICAgICk7XG5cbiAgICBlbnRpdGllcyA9IGVudGl0aWVzIHx8IFtdO1xuICAgIHRoaXMuYXNzaWduKGVudGl0aWVzLCB7IHJlc2V0IH0pO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZXNvdXJjZSgpOiBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzIE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+O1xuICB9XG5cbiAgYXR0YWNoKHJlc291cmNlOiBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPikge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX3Jlc291cmNlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRoaXMuX3Jlc291cmNlLnR5cGUoKSAhPT0gcmVzb3VyY2UudHlwZSgpICYmXG4gICAgICAhcmVzb3VyY2UuaXNTdWJ0eXBlT2YodGhpcy5fcmVzb3VyY2UpXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2FuJ3QgcmVhdHRhY2ggJHtyZXNvdXJjZS50eXBlKCl9IHRvICR7dGhpcy5fcmVzb3VyY2UudHlwZSgpfWBcbiAgICAgICk7XG5cbiAgICB0aGlzLl9lbnRyaWVzLmZvckVhY2goKHsgbW9kZWwgfSkgPT4ge1xuICAgICAgY29uc3QgbXIgPSB0aGlzLl9tb2RlbC5tZXRhLm1vZGVsUmVzb3VyY2VGYWN0b3J5KHtcbiAgICAgICAgYmFzZVJlc291cmNlOiByZXNvdXJjZSxcbiAgICAgIH0pIGFzIE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgICAgIG1vZGVsLmF0dGFjaChtcik7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5fcmVzb3VyY2U7XG4gICAgaWYgKGN1cnJlbnQgPT09IHVuZGVmaW5lZCB8fCAhY3VycmVudC5pc0VxdWFsVG8ocmVzb3VyY2UpKSB7XG4gICAgICB0aGlzLl9yZXNvdXJjZSA9IHJlc291cmNlO1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2F0dGFjaCcsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXNFbnRpdHlTZXQ8Uj4oZnVuYzogKGNvbGxlY3Rpb246IHRoaXMpID0+IE9ic2VydmFibGU8Uj4pOiBPYnNlcnZhYmxlPFI+IHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLl9wYXJlbnQ7XG4gICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICByZXR1cm4gZnVuYyh0aGlzKS5waXBlKHRhcCgoKSA9PiAodGhpcy5fcGFyZW50ID0gcGFyZW50KSkpO1xuICB9XG5cbiAgYW5ub3RzKCkge1xuICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgbW9kZWxGYWN0b3J5KFxuICAgIGRhdGE6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7IHJlc2V0ID0gZmFsc2UgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0ge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuX21vZGVsO1xuICAgIGNvbnN0IGhlbHBlciA9IHRoaXMuX2Fubm90YXRpb25zLmhlbHBlcjtcbiAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhcbiAgICAgIGhlbHBlcixcbiAgICAgIGhlbHBlci5hbm5vdGF0aW9ucyhkYXRhKSB8fCB7fVxuICAgICk7XG5cbiAgICBpZiAoYW5ub3RzPy50eXBlICE9PSB1bmRlZmluZWQgJiYgTW9kZWwubWV0YSAhPT0gbnVsbCkge1xuICAgICAgbGV0IHNjaGVtYSA9IE1vZGVsLm1ldGEuZmluZENoaWxkT3B0aW9ucygobykgPT5cbiAgICAgICAgby5pc1R5cGVPZihhbm5vdHMudHlwZSBhcyBzdHJpbmcpXG4gICAgICApPy5zY2hlbWE7XG4gICAgICBpZiAoc2NoZW1hICE9PSB1bmRlZmluZWQgJiYgc2NoZW1hLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IHNjaGVtYS5tb2RlbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IE1vZGVsKGRhdGEsIHtcbiAgICAgIGFubm90cyxcbiAgICAgIHJlc2V0LFxuICAgICAgcGFyZW50OiBbdGhpcywgbnVsbF0sXG4gICAgfSkgYXMgTTtcbiAgfVxuXG4gIHRvRW50aXRpZXMoe1xuICAgIGNsaWVudF9pZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgIGluY2x1ZGVfbm9uX2ZpZWxkID0gZmFsc2UsXG4gICAgY2hhbmdlc19vbmx5ID0gZmFsc2UsXG4gICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgIGNoYWluID0gW10sXG4gIH06IHtcbiAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9rZXk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gIH0gPSB7fSk6IChUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0pW10ge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoeyBtb2RlbCwgc3RhdGUgfSkgPT5cbiAgICAgICAgICBzdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQgJiYgY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKVxuICAgICAgKVxuICAgICAgLm1hcCgoeyBtb2RlbCwgc3RhdGUgfSkgPT4ge1xuICAgICAgICB2YXIgY2hhbmdlc09ubHkgPSBjaGFuZ2VzX29ubHkgJiYgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZDtcbiAgICAgICAgcmV0dXJuIG1vZGVsLnRvRW50aXR5KHtcbiAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgICAgICBpbmNsdWRlX2tleSxcbiAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc09ubHksXG4gICAgICAgICAgY2hhaW46IFt0aGlzLCAuLi5jaGFpbl0sXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBoYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5fZW50cmllcy5zb21lKChlKSA9PiBlLnN0YXRlICE9PSBPRGF0YU1vZGVsU3RhdGUuVW5jaGFuZ2VkKSB8fFxuICAgICAgdGhpcy5tb2RlbHMoKS5zb21lKChtKSA9PiBtLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIGNsb25lPEMgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248VCwgTT4+KCkge1xuICAgIGxldCBDdG9yID0gPHR5cGVvZiBPRGF0YUNvbGxlY3Rpb24+dGhpcy5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gbmV3IEN0b3IodGhpcy50b0VudGl0aWVzKElOQ0xVREVfQUxMKSwge1xuICAgICAgcmVzb3VyY2U6IHRoaXMucmVzb3VyY2UoKSBhcyBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPixcbiAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICB9KSBhcyBDO1xuICB9XG5cbiAgZmV0Y2goe1xuICAgIHdpdGhDb3VudCxcbiAgICAuLi5vcHRpb25zXG4gIH06IEh0dHBPcHRpb25zICYge1xuICAgIHdpdGhDb3VudD86IGJvb2xlYW47XG4gIH0gPSB7fSk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ2ZldGNoOiBSZXNvdXJjZSBpcyB1bmRlZmluZWQnKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXRpZXM8YW55Pj47XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkge1xuICAgICAgb2JzJCA9IHJlc291cmNlLmdldCh7IHdpdGhDb3VudCwgLi4ub3B0aW9ucyB9KTtcbiAgICB9IGVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSkge1xuICAgICAgb2JzJCA9IHJlc291cmNlLmdldCh7IHJlc3BvbnNlVHlwZTogJ2VudGl0aWVzJywgd2l0aENvdW50LCAuLi5vcHRpb25zIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZ2V0KHsgcmVzcG9uc2VUeXBlOiAnZW50aXRpZXMnLCB3aXRoQ291bnQsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVxdWVzdCcsIHsgY29sbGVjdGlvbjogdGhpcywgdmFsdWU6IG9icyQgfSlcbiAgICApO1xuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKHsgZW50aXRpZXMsIGFubm90cyB9KSA9PiB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICB0aGlzLmFzc2lnbihlbnRpdGllcyB8fCBbXSwgeyByZXNldDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQobmV3IE9EYXRhTW9kZWxFdmVudCgnc3luYycsIHsgY29sbGVjdGlvbjogdGhpcyB9KSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZmV0Y2hBbGwob3B0aW9ucz86IEh0dHBPcHRpb25zKTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCkgYXMgT0RhdGFDb2xsZWN0aW9uUmVzb3VyY2U8VD4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignZmV0Y2hBbGw6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpO1xuXG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ2ZldGNoQWxsOiBSZXNvdXJjZSBpcyBPRGF0YVByb3BlcnR5UmVzb3VyY2UnKTtcblxuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZS5mZXRjaEFsbChvcHRpb25zKTtcbiAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3JlcXVlc3QnLCB7XG4gICAgICAgIGNvbGxlY3Rpb246IHRoaXMsXG4gICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKGVudGl0aWVzKSA9PiB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gbmV3IE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyhcbiAgICAgICAgICByZXNvdXJjZT8uYXBpLm9wdGlvbnMuaGVscGVyXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuYXNzaWduKGVudGl0aWVzIHx8IFtdLCB7IHJlc2V0OiB0cnVlIH0pO1xuICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdzeW5jJywge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgZW50aXRpZXMgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGFsbCBtb2RlbHMgaW4gdGhlIGNvbGxlY3Rpb25cbiAgICogQHBhcmFtIHJlbE1vZGVsIFRoZSBtb2RlbCBpcyByZWxhdGlvbnNoaXBcbiAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIHVzZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBIdHRwT3B0aW9uc1xuICAgKi9cbiAgc2F2ZSh7XG4gICAgcmVsTW9kZWwgPSBmYWxzZSxcbiAgICByZWZPbmx5ID0gZmFsc2UsXG4gICAgbWV0aG9kLFxuICAgIC4uLm9wdGlvbnNcbiAgfTogSHR0cE9wdGlvbnMgJiB7XG4gICAgcmVsTW9kZWw/OiBib29sZWFuO1xuICAgIHJlZk9ubHk/OiBib29sZWFuO1xuICAgIG1ldGhvZD86ICd1cGRhdGUnIHwgJ3BhdGNoJztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignc2F2ZUFsbDogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJyk7XG5cbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YVByb3BlcnR5UmVzb3VyY2UpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignZmV0Y2hBbGw6IFJlc291cmNlIGlzIE9EYXRhUHJvcGVydHlSZXNvdXJjZScpO1xuXG4gICAgbGV0IHRvRGVzdHJveTogTVtdID0gW107XG4gICAgbGV0IHRvQ3JlYXRlOiBNW10gPSBbXTtcbiAgICBsZXQgdG9VcGRhdGU6IE1bXSA9IFtdO1xuXG4gICAgdGhpcy5fZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgbW9kZWwgPSBlbnRyeS5tb2RlbDtcbiAgICAgIGlmIChlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgICAgdG9EZXN0cm95LnB1c2goZW50cnkubW9kZWwpO1xuICAgICAgfSBlbHNlIGlmIChlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkKSB7XG4gICAgICAgIHRvQ3JlYXRlLnB1c2goZW50cnkubW9kZWwpO1xuICAgICAgfSBlbHNlIGlmIChtb2RlbC5oYXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgdG9VcGRhdGUucHVzaChlbnRyeS5tb2RlbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHRvRGVzdHJveS5sZW5ndGggPiAwIHx8IHRvQ3JlYXRlLmxlbmd0aCA+IDAgfHwgdG9VcGRhdGUubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb2JzJCA9IGZvcmtKb2luKFtcbiAgICAgICAgLi4udG9EZXN0cm95Lm1hcCgobSkgPT5cbiAgICAgICAgICByZWxNb2RlbFxuICAgICAgICAgICAgPyBtLmFzRW50aXR5KChlKSA9PiBlLmRlc3Ryb3kob3B0aW9ucykpXG4gICAgICAgICAgICA6IHRoaXMucmVtb3ZlUmVmZXJlbmNlKG0sIG9wdGlvbnMpXG4gICAgICAgICksXG4gICAgICAgIC4uLnRvQ3JlYXRlLm1hcCgobSkgPT5cbiAgICAgICAgICByZWxNb2RlbFxuICAgICAgICAgICAgPyBtLmFzRW50aXR5KChlKSA9PiBlLnNhdmUoeyBtZXRob2Q6ICdjcmVhdGUnLCAuLi5vcHRpb25zIH0pKVxuICAgICAgICAgICAgOiByZWZPbmx5XG4gICAgICAgICAgICA/IHRoaXMuYWRkUmVmZXJlbmNlKG0sIG9wdGlvbnMpXG4gICAgICAgICAgICA6IG1cbiAgICAgICAgICAgICAgICAuYXNFbnRpdHkoKGUpID0+XG4gICAgICAgICAgICAgICAgICBlLnNhdmUoeyBtZXRob2Q6IG0uaXNOZXcoKSA/ICdjcmVhdGUnIDogbWV0aG9kLCAuLi5vcHRpb25zIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5waXBlKHN3aXRjaE1hcCgocikgPT4gdGhpcy5hZGRSZWZlcmVuY2Uociwgb3B0aW9ucykpKVxuICAgICAgICApLFxuICAgICAgICAuLi50b1VwZGF0ZS5tYXAoKG0pID0+XG4gICAgICAgICAgbS5hc0VudGl0eSgoZSkgPT4gZS5zYXZlKHsgbWV0aG9kLCAuLi5vcHRpb25zIH0pKVxuICAgICAgICApLFxuICAgICAgXSk7XG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVxdWVzdCcsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZW50cmllcyA9IHRoaXMuX2VudHJpZXNcbiAgICAgICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpXG4gICAgICAgICAgICAubWFwKChlbnRyeSkgPT5cbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlbnRyeSwgeyBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB0aGlzLmV2ZW50cyQuZW1pdChuZXcgT0RhdGFNb2RlbEV2ZW50KCdzeW5jJywgeyBjb2xsZWN0aW9uOiB0aGlzIH0pKTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvZih0aGlzKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkUmVmZXJlbmNlKG1vZGVsOiBNLCBvcHRpb25zPzogSHR0cE9wdGlvbnMpOiBPYnNlcnZhYmxlPE0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAoIW1vZGVsLmlzTmV3KCkgJiYgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICByZXR1cm4gcmVzb3VyY2VcbiAgICAgICAgLnJlZmVyZW5jZSgpXG4gICAgICAgIC5hZGQoXG4gICAgICAgICAgbW9kZWwuX21ldGEuZW50aXR5UmVzb3VyY2UobW9kZWwpIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4sXG4gICAgICAgICAgb3B0aW9uc1xuICAgICAgICApXG4gICAgICAgIC5waXBlKG1hcCgoKSA9PiBtb2RlbCkpO1xuICAgIH1cbiAgICByZXR1cm4gb2YobW9kZWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWRkTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgICAgcG9zaXRpb24gPSAtMSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHJlc2V0PzogYm9vbGVhbjsgcG9zaXRpb24/OiBudW1iZXIgfSA9IHt9XG4gICk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGVudHJ5LnN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgICAgIHRoaXMuX2VudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIEVudHJ5XG4gICAgICBlbnRyeSA9IHtcbiAgICAgICAgc3RhdGU6IHJlc2V0ID8gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZCA6IE9EYXRhTW9kZWxTdGF0ZS5BZGRlZCxcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIGtleTogbW9kZWwua2V5KCksXG4gICAgICAgIHN1YnNjcmlwdGlvbjogbnVsbCxcbiAgICAgIH07XG4gICAgICAvLyBTdWJzY3JpYmVcbiAgICAgIHRoaXMuX3N1YnNjcmliZShlbnRyeSk7XG4gICAgICAvLyBOb3cgYWRkXG4gICAgICBpZiAocG9zaXRpb24gPj0gMCkgdGhpcy5fZW50cmllcy5zcGxpY2UocG9zaXRpb24sIDAsIGVudHJ5KTtcbiAgICAgIGVsc2UgdGhpcy5fZW50cmllcy5wdXNoKGVudHJ5KTtcblxuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgbW9kZWwuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2FkZCcsIHsgbW9kZWwsIGNvbGxlY3Rpb246IHRoaXMgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbnRyeS5tb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgcmVzZXQ/OiBib29sZWFuOyBwb3NpdGlvbj86IG51bWJlciB9ID0ge31cbiAgKSB7XG4gICAgaWYgKHBvc2l0aW9uIDwgMCkgcG9zaXRpb24gPSB0aGlzLl9iaXNlY3QobW9kZWwpO1xuICAgIGNvbnN0IGFkZGVkID0gdGhpcy5fYWRkTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldCwgcG9zaXRpb24gfSk7XG4gICAgaWYgKCFzaWxlbnQgJiYgYWRkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IFthZGRlZF0sIHJlbW92ZWQ6IFtdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFkZChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgICBwb3NpdGlvbiA9IC0xLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgc2VydmVyPzogYm9vbGVhbjsgcG9zaXRpb24/OiBudW1iZXIgfSA9IHt9XG4gICk6IE9ic2VydmFibGU8dGhpcz4ge1xuICAgIGlmIChzZXJ2ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZFJlZmVyZW5jZShtb2RlbCkucGlwZShcbiAgICAgICAgbWFwKChtb2RlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkTW9kZWwobW9kZWwsIHsgc2lsZW50LCBwb3NpdGlvbiwgcmVzZXQ6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFkZE1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcG9zaXRpb24gfSk7XG4gICAgICByZXR1cm4gb2YodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVSZWZlcmVuY2UobW9kZWw6IE0sIG9wdGlvbnM/OiBIdHRwT3B0aW9ucyk6IE9ic2VydmFibGU8TT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghbW9kZWwuaXNOZXcoKSAmJiByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgICAucmVmZXJlbmNlKClcbiAgICAgICAgLnJlbW92ZShcbiAgICAgICAgICBtb2RlbC5fbWV0YS5lbnRpdHlSZXNvdXJjZShtb2RlbCkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPixcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgIClcbiAgICAgICAgLnBpcGUobWFwKCgpID0+IG1vZGVsKSk7XG4gICAgfVxuICAgIHJldHVybiBvZihtb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZW1vdmVNb2RlbChcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyByZXNldD86IGJvb2xlYW4gfSA9IHt9XG4gICk6IE0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IG1vZGVsLmtleSgpO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7XG4gICAgICBtb2RlbCxcbiAgICAgIGtleSxcbiAgICAgIGNpZDogKDxhbnk+bW9kZWwpW3RoaXMuX21vZGVsLm1ldGEuY2lkXSxcbiAgICB9KTtcbiAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5zdGF0ZSAhPT0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQpIHtcbiAgICAgIC8vIEVtaXQgRXZlbnRcbiAgICAgIGlmICghc2lsZW50KVxuICAgICAgICBtb2RlbC5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVtb3ZlJywgeyBtb2RlbCwgY29sbGVjdGlvbjogdGhpcyB9KVxuICAgICAgICApO1xuXG4gICAgICAvLyBOb3cgcmVtb3ZlXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2VudHJpZXMuaW5kZXhPZihlbnRyeSk7XG4gICAgICB0aGlzLl9lbnRyaWVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICBpZiAoIShyZXNldCB8fCBlbnRyeS5zdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkFkZGVkKSkge1xuICAgICAgICAvLyBNb3ZlIHRvIGVuZCBvZiBhcnJheSBhbmQgbWFyayBhcyByZW1vdmVkXG4gICAgICAgIGVudHJ5LnN0YXRlID0gT0RhdGFNb2RlbFN0YXRlLlJlbW92ZWQ7XG4gICAgICAgIHRoaXMuX2VudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICB9XG4gICAgICB0aGlzLl91bnN1YnNjcmliZShlbnRyeSk7XG4gICAgICByZXR1cm4gZW50cnkubW9kZWw7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVtb3ZlTW9kZWwoXG4gICAgbW9kZWw6IE0sXG4gICAge1xuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHsgc2lsZW50PzogYm9vbGVhbjsgcmVzZXQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fcmVtb3ZlTW9kZWwobW9kZWwsIHsgc2lsZW50LCByZXNldCB9KTtcbiAgICBpZiAoIXNpbGVudCAmJiByZW1vdmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCd1cGRhdGUnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICBvcHRpb25zOiB7IGFkZGVkOiBbXSwgcmVtb3ZlZDogW3JlbW92ZWRdLCBtZXJnZWQ6IFtdIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZShcbiAgICBtb2RlbDogTSxcbiAgICB7XG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICAgIHNlcnZlciA9IHRydWUsXG4gICAgfTogeyBzaWxlbnQ/OiBib29sZWFuOyBzZXJ2ZXI/OiBib29sZWFuIH0gPSB7fVxuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBpZiAoc2VydmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVSZWZlcmVuY2UobW9kZWwpLnBpcGUoXG4gICAgICAgIG1hcCgobW9kZWwpID0+IHtcbiAgICAgICAgICB0aGlzLnJlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCwgcmVzZXQ6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZU1vZGVsKG1vZGVsLCB7IHNpbGVudCB9KTtcbiAgICAgIHJldHVybiBvZih0aGlzKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGUoXG4gICAgYXR0cnM6IFQgPSB7fSBhcyBULFxuICAgIHtcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgICAgc2VydmVyID0gdHJ1ZSxcbiAgICB9OiB7IHNpbGVudD86IGJvb2xlYW47IHNlcnZlcj86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbEZhY3RvcnkoYXR0cnMpO1xuICAgIHJldHVybiAoXG4gICAgICBtb2RlbC5pc1ZhbGlkKCkgJiYgc2VydmVyID8gbW9kZWwuYXNFbnRpdHkoKG0pID0+IG0uc2F2ZSgpKSA6IG9mKG1vZGVsKVxuICAgICkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobW9kZWwpID0+IHRoaXMuYWRkKG1vZGVsLCB7IHNpbGVudCwgc2VydmVyIH0pKSxcbiAgICAgIG1hcCgoKSA9PiBtb2RlbClcbiAgICApO1xuICB9XG5cbiAgc2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55KSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZW50cmllc1tOdW1iZXIocGF0aEFycmF5WzBdKV0ubW9kZWw7XG4gICAgICByZXR1cm4gbW9kZWwuc2V0KHBhdGhBcnJheS5zbGljZSgxKSwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSAmJiBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgbGV0IHRvQWRkOiBNW10gPSBbXTtcbiAgICAgIGxldCB0b01lcmdlOiBNW10gPSBbXTtcbiAgICAgIGxldCB0b1JlbW92ZTogTVtdID0gW107XG4gICAgICBsZXQgaW5kZXggPSBOdW1iZXIocGF0aEFycmF5WzBdKTtcbiAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5tb2RlbHMoKVtpbmRleF07XG4gICAgICBjb25zdCBlbnRyeSA9IHRoaXMuX2ZpbmRFbnRyeSh7IG1vZGVsIH0pO1xuICAgICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9UT0RPOiBSZW1vdmUvQWRkIG9yIE1lcmdlP1xuICAgICAgICAvLyBNZXJnZVxuICAgICAgICBlbnRyeS5tb2RlbC5hc3NpZ24odmFsdWUudG9FbnRpdHkoeyBjbGllbnRfaWQ6IHRydWUsIC4uLklOQ0xVREVfQUxMIH0pKTtcbiAgICAgICAgaWYgKGVudHJ5Lm1vZGVsLmhhc0NoYW5nZWQoKSkgdG9NZXJnZS5wdXNoKG1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFkZFxuICAgICAgICB0aGlzLl9hZGRNb2RlbCh2YWx1ZSk7XG4gICAgICAgIHRvQWRkLnB1c2gobW9kZWwpO1xuICAgICAgfVxuICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3VwZGF0ZScsIHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgYWRkZWQ6IHRvQWRkLCByZW1vdmVkOiB0b1JlbW92ZSwgbWVyZ2VkOiB0b01lcmdlIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldChwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSB8IG51bWJlcik6IGFueSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IGAke3BhdGh9YC5tYXRjaCgvKFteWy5cXF1dKSsvZylcbiAgICApIGFzIGFueVtdO1xuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbHMoKVtOdW1iZXIocGF0aEFycmF5WzBdKV07XG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAxICYmIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0KHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBpZiAoVHlwZXMuaXNFbXB0eShwYXRoKSkge1xuICAgICAgdGhpcy5tb2RlbHMoKS5mb3JFYWNoKChtKSA9PiBtLnJlc2V0KHsgc2lsZW50IH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcbiAgICAgIGNvbnN0IHBhdGhBcnJheSA9IChcbiAgICAgICAgVHlwZXMuaXNBcnJheShwYXRoKSA/IHBhdGggOiBgJHtwYXRofWAubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgICApIGFzIGFueVtdO1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLm1vZGVscygpW051bWJlcihwYXRoQXJyYXlbMF0pXTtcbiAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5yZXNldCh7IHBhdGg6IHBhdGhBcnJheS5zbGljZSgxKSwgc2lsZW50IH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzc2lnbihcbiAgICBvYmplY3RzOiBQYXJ0aWFsPFQ+W10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdIHwgTVtdLFxuICAgIHtcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7IHJlc2V0PzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgY29uc3QgTW9kZWwgPSB0aGlzLl9tb2RlbDtcblxuICAgIGxldCB0b0FkZDogTVtdID0gW107XG4gICAgbGV0IHRvTWVyZ2U6IE1bXSA9IFtdO1xuICAgIGxldCB0b1JlbW92ZTogTVtdID0gW107XG4gICAgbGV0IHRvU29ydDogW00sIG51bWJlcl1bXSA9IFtdO1xuICAgIGxldCBtb2RlbE1hcDogc3RyaW5nW10gPSBbXTtcbiAgICBvYmplY3RzLmZvckVhY2goKG9iaiwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGlzTW9kZWwgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG9iaik7XG4gICAgICBjb25zdCBrZXkgPVxuICAgICAgICBNb2RlbCAhPT0gbnVsbCAmJiBNb2RlbC5tZXRhID8gTW9kZWwubWV0YS5yZXNvbHZlS2V5KG9iaikgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBjaWQgPVxuICAgICAgICBNb2RlbC5tZXRhLmNpZCBpbiBvYmogPyAoPGFueT5vYmopW01vZGVsLm1ldGEuY2lkXSA6IHVuZGVmaW5lZDtcbiAgICAgIC8vIFRyeSBmaW5kIGVudHJ5XG4gICAgICBjb25zdCBlbnRyeSA9IGlzTW9kZWxcbiAgICAgICAgPyB0aGlzLl9maW5kRW50cnkoeyBtb2RlbDogb2JqIGFzIE0gfSkgLy8gQnkgTW9kZWxcbiAgICAgICAgOiB0aGlzLl9maW5kRW50cnkoeyBjaWQsIGtleSB9KTsgLy8gQnkgQ2lkIG9yIEtleVxuXG4gICAgICBsZXQgbW9kZWw6IE07XG4gICAgICBpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBNZXJnZVxuICAgICAgICBtb2RlbCA9IGVudHJ5Lm1vZGVsO1xuICAgICAgICBpZiAobW9kZWwgIT09IG9iaikge1xuICAgICAgICAgIC8vIEdldCBlbnRpdHkgZnJvbSBtb2RlbFxuICAgICAgICAgIGlmIChpc01vZGVsKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRpdHkgPSAob2JqIGFzIE0pLnRvRW50aXR5KHtcbiAgICAgICAgICAgICAgY2xpZW50X2lkOiB0cnVlLFxuICAgICAgICAgICAgICAuLi5JTkNMVURFX0FMTCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW9kZWwuYXNzaWduKGVudGl0eSwgeyByZXNldCwgc2lsZW50IH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSB0aGlzLl9hbm5vdGF0aW9ucy5oZWxwZXI7XG4gICAgICAgICAgICBjb25zdCBhbm5vdHMgPSBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhcbiAgICAgICAgICAgICAgaGVscGVyLFxuICAgICAgICAgICAgICBoZWxwZXIuYW5ub3RhdGlvbnMob2JqKSB8fCB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGVudGl0eSA9IGFubm90cy5hdHRyaWJ1dGVzPFQ+KG9iaiwgJ2Z1bGwnKTtcbiAgICAgICAgICAgIG1vZGVsLl9hbm5vdGF0aW9ucyA9IGFubm90cztcbiAgICAgICAgICAgIG1vZGVsLmFzc2lnbihlbnRpdHksIHsgcmVzZXQsIHNpbGVudCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gTW9kZWwgQ2hhbmdlP1xuICAgICAgICAgIGlmIChtb2RlbC5oYXNDaGFuZ2VkKCkpIHRvTWVyZ2UucHVzaChtb2RlbCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFzIFNvcnQgb3IgSW5kZXggQ2hhbmdlP1xuICAgICAgICBpZiAodG9Tb3J0Lmxlbmd0aCA+IDAgfHwgaW5kZXggIT09IHRoaXMubW9kZWxzKCkuaW5kZXhPZihtb2RlbCkpIHtcbiAgICAgICAgICB0b1NvcnQucHVzaChbbW9kZWwsIGluZGV4XSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEFkZFxuICAgICAgICBtb2RlbCA9IGlzTW9kZWxcbiAgICAgICAgICA/IChvYmogYXMgTSlcbiAgICAgICAgICA6IHRoaXMubW9kZWxGYWN0b3J5KG9iaiBhcyBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sIHtcbiAgICAgICAgICAgICAgcmVzZXQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdG9BZGQucHVzaChtb2RlbCk7XG4gICAgICB9XG4gICAgICBtb2RlbE1hcC5wdXNoKCg8YW55Pm1vZGVsKVtNb2RlbC5tZXRhLmNpZF0pO1xuICAgIH0pO1xuICAgIHRoaXMuX2VudHJpZXNcbiAgICAgIC5maWx0ZXIoKGUpID0+IG1vZGVsTWFwLmluZGV4T2YoKDxhbnk+ZS5tb2RlbClbTW9kZWwubWV0YS5jaWRdKSA9PT0gLTEpXG4gICAgICAuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgICAgdG9SZW1vdmUucHVzaChlbnRyeS5tb2RlbCk7XG4gICAgICB9KTtcblxuICAgIHRvUmVtb3ZlLmZvckVhY2goKG0pID0+IHRoaXMuX3JlbW92ZU1vZGVsKG0sIHsgc2lsZW50OiBzaWxlbnQsIHJlc2V0IH0pKTtcbiAgICB0b0FkZC5mb3JFYWNoKChtKSA9PiB0aGlzLl9hZGRNb2RlbChtLCB7IHNpbGVudDogc2lsZW50LCByZXNldCB9KSk7XG4gICAgdG9Tb3J0LmZvckVhY2goKG0pID0+IHtcbiAgICAgIHRoaXMuX3JlbW92ZU1vZGVsKG1bMF0sIHsgc2lsZW50OiB0cnVlLCByZXNldCB9KTtcbiAgICAgIHRoaXMuX2FkZE1vZGVsKG1bMF0sIHsgc2lsZW50OiB0cnVlLCByZXNldCwgcG9zaXRpb246IG1bMV0gfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoXG4gICAgICB0b0FkZC5sZW5ndGggPiAwIHx8XG4gICAgICB0b1JlbW92ZS5sZW5ndGggPiAwIHx8XG4gICAgICB0b01lcmdlLmxlbmd0aCA+IDAgfHxcbiAgICAgIHRvU29ydC5sZW5ndGggPiAwXG4gICAgKSB7XG4gICAgICB0aGlzLl9zb3J0QnkgPSBudWxsO1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChyZXNldCA/ICdyZXNldCcgOiAndXBkYXRlJywge1xuICAgICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgYWRkZWQ6IHRvQWRkLFxuICAgICAgICAgICAgICByZW1vdmVkOiB0b1JlbW92ZSxcbiAgICAgICAgICAgICAgbWVyZ2VkOiB0b01lcmdlLFxuICAgICAgICAgICAgICBzb3J0ZWQ6IHRvU29ydCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBmdW5jOiAocToge1xuICAgICAgc2VsZWN0KG9wdHM/OiBTZWxlY3Q8VD4pOiBPcHRpb25IYW5kbGVyPFNlbGVjdDxUPj47XG4gICAgICBleHBhbmQob3B0cz86IEV4cGFuZDxUPik6IE9wdGlvbkhhbmRsZXI8RXhwYW5kPFQ+PjtcbiAgICAgIHRyYW5zZm9ybShvcHRzPzogVHJhbnNmb3JtPFQ+KTogT3B0aW9uSGFuZGxlcjxUcmFuc2Zvcm08VD4+O1xuICAgICAgc2VhcmNoKG9wdHM/OiBzdHJpbmcpOiBPcHRpb25IYW5kbGVyPHN0cmluZz47XG4gICAgICBmaWx0ZXIob3B0cz86IEZpbHRlcik6IE9wdGlvbkhhbmRsZXI8RmlsdGVyPjtcbiAgICAgIG9yZGVyQnkob3B0cz86IE9yZGVyQnk8VD4pOiBPcHRpb25IYW5kbGVyPE9yZGVyQnk8VD4+O1xuICAgICAgZm9ybWF0KG9wdHM/OiBzdHJpbmcpOiBPcHRpb25IYW5kbGVyPHN0cmluZz47XG4gICAgICB0b3Aob3B0cz86IG51bWJlcik6IE9wdGlvbkhhbmRsZXI8bnVtYmVyPjtcbiAgICAgIHNraXAob3B0cz86IG51bWJlcik6IE9wdGlvbkhhbmRsZXI8bnVtYmVyPjtcbiAgICAgIHNraXB0b2tlbihvcHRzPzogc3RyaW5nKTogT3B0aW9uSGFuZGxlcjxzdHJpbmc+O1xuICAgICAgcGFnaW5nKHtcbiAgICAgICAgc2tpcCxcbiAgICAgICAgc2tpcHRva2VuLFxuICAgICAgICB0b3AsXG4gICAgICB9OiB7XG4gICAgICAgIHNraXA/OiBudW1iZXI7XG4gICAgICAgIHNraXB0b2tlbj86IHN0cmluZztcbiAgICAgICAgdG9wPzogbnVtYmVyO1xuICAgICAgfSk6IHZvaWQ7XG4gICAgICBjbGVhclBhZ2luZygpOiB2b2lkO1xuICAgICAgYXBwbHkocXVlcnk6IFF1ZXJ5QXJndW1lbnRzPFQ+KTogdm9pZDtcbiAgICB9KSA9PiB2b2lkXG4gICkge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpIGFzIE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW4ndCBxdWVyeSB3aXRob3V0IE9EYXRhUmVzb3VyY2VgKTtcbiAgICBmdW5jKHJlc291cmNlLnF1ZXJ5KTtcbiAgICB0aGlzLmF0dGFjaChyZXNvdXJjZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FsbEZ1bmN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgSHR0cFF1ZXJ5T3B0aW9uczxSPiA9IHt9XG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSkge1xuICAgICAgY29uc3QgZnVuYyA9IHJlc291cmNlLmZ1bmN0aW9uPFAsIFI+KG5hbWUpO1xuICAgICAgZnVuYy5xdWVyeS5hcHBseShvcHRpb25zKTtcbiAgICAgIHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG4gICAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgICByZXR1cm4gZnVuYy5jYWxsQ29sbGVjdGlvbihwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBmdW5jLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoYENhbid0IGZ1bmN0aW9uIHdpdGhvdXQgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZWApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGxBY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBIdHRwUXVlcnlPcHRpb25zPFI+ID0ge31cbiAgKTogT2JzZXJ2YWJsZTxSIHwgT0RhdGFNb2RlbDxSPiB8IE9EYXRhQ29sbGVjdGlvbjxSLCBPRGF0YU1vZGVsPFI+PiB8IG51bGw+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMucmVzb3VyY2UoKTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSB7XG4gICAgICBjb25zdCBhY3Rpb24gPSByZXNvdXJjZS5hY3Rpb248UCwgUj4obmFtZSk7XG4gICAgICBhY3Rpb24ucXVlcnkuYXBwbHkob3B0aW9ucyk7XG4gICAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICAgIHJldHVybiBhY3Rpb24uY2FsbE1vZGVsKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICAgIHJldHVybiBhY3Rpb24uY2FsbENvbGxlY3Rpb24ocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRocm93RXJyb3IoYENhbid0IGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5U2V0UmVzb3VyY2VgKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Vuc3Vic2NyaWJlKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uICE9PSBudWxsKSB7XG4gICAgICBlbnRyeS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlKGVudHJ5OiBPRGF0YU1vZGVsRW50cnk8VCwgTT4pIHtcbiAgICBpZiAoZW50cnkuc3Vic2NyaXB0aW9uICE9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBpZiAoIWVudHJ5Lm1vZGVsLmlzUGFyZW50T2YodGhpcykpIHtcbiAgICAgIGVudHJ5Lm1vZGVsLl9wYXJlbnQgPSBbdGhpcywgbnVsbF07XG4gICAgfVxuICAgIGVudHJ5LnN1YnNjcmlwdGlvbiA9IGVudHJ5Lm1vZGVsLmV2ZW50cyQuc3Vic2NyaWJlKFxuICAgICAgKGV2ZW50OiBPRGF0YU1vZGVsRXZlbnQ8VD4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEJVQkJMSU5HLmluZGV4T2YoZXZlbnQubmFtZSkgIT09IC0xICYmXG4gICAgICAgICAgZXZlbnQuYnViYmxpbmcgJiZcbiAgICAgICAgICAhZXZlbnQudmlzaXRlZCh0aGlzKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IGVudHJ5Lm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQubmFtZSA9PT0gJ2Rlc3Ryb3knKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlTW9kZWwoZW50cnkubW9kZWwsIHsgcmVzZXQ6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50Lm5hbWUgPT09ICdjaGFuZ2UnICYmIGV2ZW50Lm9wdGlvbnM/LmtleSkge1xuICAgICAgICAgICAgICBlbnRyeS5rZXkgPSBlbnRyeS5tb2RlbC5rZXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubW9kZWxzKCkuaW5kZXhPZihlbnRyeS5tb2RlbCk7XG4gICAgICAgICAgZXZlbnQucHVzaCh0aGlzLCBpbmRleCk7XG4gICAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRFbnRyeSh7XG4gICAgbW9kZWwsXG4gICAgY2lkLFxuICAgIGtleSxcbiAgfToge1xuICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICBjaWQ/OiBzdHJpbmc7XG4gICAga2V5PzogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9lbnRyaWVzLmZpbmQoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBieU1vZGVsID0gbW9kZWwgIT09IHVuZGVmaW5lZCAmJiBlbnRyeS5tb2RlbC5lcXVhbHMobW9kZWwpO1xuICAgICAgY29uc3QgYnlDaWQgPVxuICAgICAgICBjaWQgIT09IHVuZGVmaW5lZCAmJiAoPGFueT5lbnRyeS5tb2RlbClbdGhpcy5fbW9kZWwubWV0YS5jaWRdID09PSBjaWQ7XG4gICAgICBjb25zdCBieUtleSA9XG4gICAgICAgIGtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIGVudHJ5LmtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIFR5cGVzLmlzRXF1YWwoZW50cnkua2V5LCBrZXkpO1xuICAgICAgcmV0dXJuIGJ5TW9kZWwgfHwgYnlDaWQgfHwgYnlLZXk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uIGZ1bmN0aW9uc1xuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuICdDb2xsZWN0aW9uJztcbiAgfVxuXG4gIHB1YmxpYyBbU3ltYm9sLml0ZXJhdG9yXSgpIHtcbiAgICBsZXQgcG9pbnRlciA9IDA7XG4gICAgbGV0IG1vZGVscyA9IHRoaXMubW9kZWxzKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHQoKTogSXRlcmF0b3JSZXN1bHQ8TT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRvbmU6IHBvaW50ZXIgPT09IG1vZGVscy5sZW5ndGgsXG4gICAgICAgICAgdmFsdWU6IG1vZGVsc1twb2ludGVyKytdLFxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29udGFpbnMobW9kZWw6IE0pIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbHMoKS5zb21lKChtKSA9PiBtLmVxdWFscyhtb2RlbCkpO1xuICB9XG5cbiAgZmlsdGVyKHByZWRpY2F0ZTogKG06IE0pID0+IGJvb2xlYW4pOiBNW10ge1xuICAgIHJldHVybiB0aGlzLm1vZGVscygpLmZpbHRlcihwcmVkaWNhdGUpO1xuICB9XG5cbiAgLy8jcmVnaW9uIFNvcnRcbiAgcHJpdmF0ZSBfYmlzZWN0KG1vZGVsOiBNKSB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgaWYgKHRoaXMuX3NvcnRCeSAhPT0gbnVsbCkge1xuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fZW50cmllcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgaWYgKHRoaXMuX2NvbXBhcmUobW9kZWwsIHRoaXMuX2VudHJpZXNbaW5kZXhdLCB0aGlzLl9zb3J0QnksIDApIDwgMCkge1xuICAgICAgICAgIHJldHVybiBpbmRleDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cblxuICBwcml2YXRlIF9jb21wYXJlKFxuICAgIGUxOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4gfCBNLFxuICAgIGUyOiBPRGF0YU1vZGVsRW50cnk8VCwgTT4gfCBNLFxuICAgIGJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10sXG4gICAgaW5kZXg6IG51bWJlclxuICApOiBudW1iZXIge1xuICAgIGxldCBtMSA9IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoZTEpXG4gICAgICA/IChlMSBhcyBNKVxuICAgICAgOiAoZTEgYXMgT0RhdGFNb2RlbEVudHJ5PFQsIE0+KS5tb2RlbDtcbiAgICBsZXQgbTIgPSBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGUyKVxuICAgICAgPyAoZTIgYXMgTSlcbiAgICAgIDogKGUyIGFzIE9EYXRhTW9kZWxFbnRyeTxULCBNPikubW9kZWw7XG4gICAgbGV0IHZhbHVlMSA9IG0xLmdldChieVtpbmRleF0uZmllbGQgYXMgc3RyaW5nKTtcbiAgICBsZXQgdmFsdWUyID0gbTIuZ2V0KGJ5W2luZGV4XS5maWVsZCBhcyBzdHJpbmcpO1xuICAgIGxldCByZXN1bHQ6IG51bWJlciA9IDA7XG5cbiAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyICE9IG51bGwpIHJlc3VsdCA9IC0xO1xuICAgIGVsc2UgaWYgKHZhbHVlMSAhPSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAxO1xuICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKSByZXN1bHQgPSAwO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZTEgPT0gJ3N0cmluZycgfHwgdmFsdWUxIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgICBpZiAodmFsdWUxLmxvY2FsZUNvbXBhcmUgJiYgdmFsdWUxICE9IHZhbHVlMikge1xuICAgICAgICByZXR1cm4gKGJ5W2luZGV4XS5vcmRlciB8fCAxKSAqIHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHZhbHVlMSA8IHZhbHVlMiA/IC0xIDogMTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUxID09IHZhbHVlMikge1xuICAgICAgcmV0dXJuIGJ5Lmxlbmd0aCAtIDEgPiBpbmRleCA/IHRoaXMuX2NvbXBhcmUoZTEsIGUyLCBieSwgaW5kZXggKyAxKSA6IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIChieVtpbmRleF0ub3JkZXIgfHwgMSkgKiByZXN1bHQ7XG4gIH1cblxuICBfc29ydEJ5OiB7IGZpZWxkOiBzdHJpbmcgfCBrZXlvZiBUOyBvcmRlcj86IDEgfCAtMSB9W10gfCBudWxsID0gbnVsbDtcbiAgaXNTb3J0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeSAhPT0gbnVsbDtcbiAgfVxuXG4gIHNvcnQoXG4gICAgYnk6IHsgZmllbGQ6IHN0cmluZyB8IGtleW9mIFQ7IG9yZGVyPzogMSB8IC0xIH1bXSxcbiAgICB7IHNpbGVudCB9OiB7IHNpbGVudD86IGJvb2xlYW4gfSA9IHt9XG4gICkge1xuICAgIHRoaXMuX3NvcnRCeSA9IGJ5O1xuICAgIHRoaXMuX2VudHJpZXMgPSB0aGlzLl9lbnRyaWVzLnNvcnQoXG4gICAgICAoZTE6IE9EYXRhTW9kZWxFbnRyeTxULCBNPiwgZTI6IE9EYXRhTW9kZWxFbnRyeTxULCBNPikgPT5cbiAgICAgICAgdGhpcy5fY29tcGFyZShlMSwgZTIsIGJ5LCAwKVxuICAgICk7XG4gICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCd1cGRhdGUnLCB7XG4gICAgICAgICAgY29sbGVjdGlvbjogdGhpcyxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIC8vI2VuZHJlZ2lvblxufVxuIl19
|