angular-odata 0.128.0 → 0.131.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 +27 -244
- package/fesm2022/angular-odata.mjs +2320 -1118
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/api.d.ts +10 -11
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/memory.d.ts +2 -2
- package/lib/cache/storage.d.ts +2 -2
- package/lib/index.d.ts +1 -0
- package/lib/loaders.d.ts +8 -8
- package/lib/metadata/csdl/csdl-annotation.d.ts +62 -26
- package/lib/metadata/csdl/csdl-entity-container.d.ts +8 -3
- package/lib/metadata/csdl/csdl-entity-set.d.ts +7 -2
- package/lib/metadata/csdl/csdl-enum-type.d.ts +11 -3
- package/lib/metadata/csdl/csdl-function-action.d.ts +54 -11
- package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/lib/metadata/csdl/csdl-reference.d.ts +26 -3
- package/lib/metadata/csdl/csdl-schema.d.ts +5 -2
- package/lib/metadata/csdl/csdl-singleton.d.ts +5 -0
- package/lib/metadata/csdl/csdl-structural-property.d.ts +19 -3
- package/lib/metadata/csdl/csdl-structured-type.d.ts +28 -7
- package/lib/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/lib/metadata/metadata.d.ts +16 -3
- package/lib/models/collection.d.ts +2 -1
- package/lib/models/model.d.ts +6 -5
- package/lib/models/options.d.ts +11 -4
- package/lib/module.d.ts +3 -3
- package/lib/options.d.ts +3 -3
- package/lib/resources/path/segments.d.ts +3 -3
- package/lib/resources/query/builder.d.ts +3 -2
- package/lib/resources/query/expressions/apply.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +1 -1
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +5 -2
- package/lib/resources/query/expressions/filter.d.ts +2 -1
- package/lib/resources/query/expressions/orderby.d.ts +2 -1
- package/lib/resources/query/expressions/search.d.ts +2 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/expressions/syntax.d.ts +2 -2
- package/lib/resources/query/handlers.d.ts +17 -5
- package/lib/resources/query/options.d.ts +3 -3
- package/lib/resources/resource.d.ts +36 -8
- package/lib/resources/types/action.d.ts +4 -4
- package/lib/resources/types/entity-set.d.ts +15 -8
- package/lib/resources/types/entity.d.ts +5 -1
- package/lib/resources/types/function.d.ts +4 -4
- package/lib/resources/types/navigation-property.d.ts +12 -3
- package/lib/resources/types/property.d.ts +14 -3
- package/lib/resources/types/singleton.d.ts +5 -1
- package/lib/schema/annotation.d.ts +3 -3
- package/lib/schema/callable.d.ts +3 -3
- package/lib/schema/element.d.ts +3 -3
- package/lib/schema/entity-container.d.ts +2 -2
- package/lib/schema/entity-set.d.ts +2 -2
- package/lib/schema/enum-type.d.ts +10 -10
- package/lib/schema/parsers/callable.d.ts +4 -4
- package/lib/schema/parsers/enum-type.d.ts +15 -15
- package/lib/schema/parsers/structured-type.d.ts +8 -5
- package/lib/schema/schema.d.ts +3 -3
- package/lib/schema/singleton.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +7 -4
- package/lib/services/entity-set.d.ts +9 -6
- package/lib/services/entity.d.ts +1 -1
- package/lib/services/singleton.d.ts +1 -1
- package/lib/settings.d.ts +2 -2
- package/lib/types.d.ts +82 -69
- package/lib/utils/enums.d.ts +12 -12
- package/lib/utils/http.d.ts +1 -1
- package/lib/utils/objects.d.ts +1 -1
- package/lib/utils/odata.d.ts +2 -2
- package/lib/utils/strings.d.ts +2 -2
- package/package.json +3 -5
- package/schematics/apigen/angular/api-config.js +7 -1
- package/schematics/apigen/angular/api-config.js.map +1 -1
- package/schematics/apigen/angular/base.d.ts +22 -2
- package/schematics/apigen/angular/base.js +82 -42
- package/schematics/apigen/angular/base.js.map +1 -1
- package/schematics/apigen/angular/entity.js +7 -1
- package/schematics/apigen/angular/entity.js.map +1 -1
- package/schematics/apigen/angular/enum.js +1 -0
- package/schematics/apigen/angular/enum.js.map +1 -1
- package/schematics/apigen/angular/module.js.map +1 -1
- package/schematics/apigen/angular/service.js +3 -2
- package/schematics/apigen/angular/service.js.map +1 -1
- package/schematics/apigen/files/api-config/__fileName__.ts +8 -6
- package/schematics/apigen/files/entity/__fileName__.ts +2 -2
- package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/entityset-service/__fileName__.ts +1 -1
- package/schematics/apigen/files/enum/__fileName__.ts +1 -1
- package/schematics/apigen/files/metadata/metadata.json +1 -0
- package/schematics/apigen/files/singleton-service/__fileName__.ts +1 -1
- package/schematics/apigen/index.js +56 -12
- package/schematics/apigen/index.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +56 -23
- package/schematics/apigen/metadata/csdl/csdl-annotation.js +143 -13
- package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js +11 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +6 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js +17 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +37 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js +52 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +6 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +15 -3
- package/schematics/apigen/metadata/csdl/csdl-reference.js +26 -2
- package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js +37 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js +8 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +16 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js +53 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +22 -3
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js +47 -2
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -1
- package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +3 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -1
- package/schematics/apigen/metadata/metadata.d.ts +10 -0
- package/schematics/apigen/metadata/metadata.js +12 -6
- package/schematics/apigen/metadata/metadata.js.map +1 -1
- package/schematics/apigen/metadata/parser.js.map +1 -1
- package/schematics/apigen/schema.d.ts +2 -1
- package/schematics/apigen/schema.json +15 -14
- package/schematics/apigen/utils.d.ts +1 -0
- package/schematics/apigen/utils.js +25 -1
- package/schematics/apigen/utils.js.map +1 -1
- package/schematics/ng-add/index.js +1 -2
- package/schematics/ng-add/index.js.map +1 -1
- package/esm2022/angular-odata.mjs +0 -5
- package/esm2022/lib/annotations.mjs +0 -140
- package/esm2022/lib/api.mjs +0 -419
- package/esm2022/lib/cache/cache.mjs +0 -175
- package/esm2022/lib/cache/index.mjs +0 -4
- package/esm2022/lib/cache/memory.mjs +0 -30
- package/esm2022/lib/cache/storage.mjs +0 -55
- package/esm2022/lib/client.mjs +0 -212
- package/esm2022/lib/constants.mjs +0 -95
- package/esm2022/lib/helper.mjs +0 -280
- package/esm2022/lib/index.mjs +0 -21
- package/esm2022/lib/loaders.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -95
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -27
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -24
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -37
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -94
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -7
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -23
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -39
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -15
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -70
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -92
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -15
- package/esm2022/lib/metadata/index.mjs +0 -3
- package/esm2022/lib/metadata/metadata.mjs +0 -14
- package/esm2022/lib/metadata/parser.mjs +0 -563
- package/esm2022/lib/models/collection.mjs +0 -814
- package/esm2022/lib/models/index.mjs +0 -4
- package/esm2022/lib/models/model.mjs +0 -553
- package/esm2022/lib/models/options.mjs +0 -1179
- package/esm2022/lib/module.mjs +0 -55
- package/esm2022/lib/options.mjs +0 -36
- package/esm2022/lib/resources/index.mjs +0 -7
- package/esm2022/lib/resources/options.mjs +0 -56
- package/esm2022/lib/resources/path/handlers.mjs +0 -79
- package/esm2022/lib/resources/path/index.mjs +0 -3
- package/esm2022/lib/resources/path/segments.mjs +0 -148
- package/esm2022/lib/resources/query/builder.mjs +0 -636
- package/esm2022/lib/resources/query/expressions/apply.mjs +0 -236
- package/esm2022/lib/resources/query/expressions/base.mjs +0 -25
- package/esm2022/lib/resources/query/expressions/compute.mjs +0 -54
- package/esm2022/lib/resources/query/expressions/count.mjs +0 -116
- package/esm2022/lib/resources/query/expressions/expand.mjs +0 -147
- package/esm2022/lib/resources/query/expressions/filter.mjs +0 -178
- package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
- package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -79
- package/esm2022/lib/resources/query/expressions/search.mjs +0 -141
- package/esm2022/lib/resources/query/expressions/select.mjs +0 -47
- package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -751
- package/esm2022/lib/resources/query/handlers.mjs +0 -420
- package/esm2022/lib/resources/query/index.mjs +0 -5
- package/esm2022/lib/resources/query/options.mjs +0 -139
- package/esm2022/lib/resources/request.mjs +0 -196
- package/esm2022/lib/resources/resource.mjs +0 -311
- package/esm2022/lib/resources/response.mjs +0 -174
- package/esm2022/lib/resources/types/action.mjs +0 -116
- package/esm2022/lib/resources/types/batch.mjs +0 -428
- package/esm2022/lib/resources/types/count.mjs +0 -33
- package/esm2022/lib/resources/types/entity-set.mjs +0 -131
- package/esm2022/lib/resources/types/entity.mjs +0 -112
- package/esm2022/lib/resources/types/function.mjs +0 -146
- package/esm2022/lib/resources/types/index.mjs +0 -15
- package/esm2022/lib/resources/types/media.mjs +0 -44
- package/esm2022/lib/resources/types/metadata.mjs +0 -35
- package/esm2022/lib/resources/types/navigation-property.mjs +0 -256
- package/esm2022/lib/resources/types/options.mjs +0 -2
- package/esm2022/lib/resources/types/property.mjs +0 -197
- package/esm2022/lib/resources/types/reference.mjs +0 -87
- package/esm2022/lib/resources/types/singleton.mjs +0 -130
- package/esm2022/lib/resources/types/value.mjs +0 -48
- package/esm2022/lib/schema/annotation.mjs +0 -37
- package/esm2022/lib/schema/callable.mjs +0 -66
- package/esm2022/lib/schema/element.mjs +0 -67
- package/esm2022/lib/schema/entity-container.mjs +0 -11
- package/esm2022/lib/schema/entity-set.mjs +0 -9
- package/esm2022/lib/schema/enum-type.mjs +0 -68
- package/esm2022/lib/schema/index.mjs +0 -9
- package/esm2022/lib/schema/parsers/callable.mjs +0 -110
- package/esm2022/lib/schema/parsers/edm.mjs +0 -101
- package/esm2022/lib/schema/parsers/enum-type.mjs +0 -130
- package/esm2022/lib/schema/parsers/index.mjs +0 -5
- package/esm2022/lib/schema/parsers/structured-type.mjs +0 -514
- package/esm2022/lib/schema/schema.mjs +0 -45
- package/esm2022/lib/schema/singleton.mjs +0 -9
- package/esm2022/lib/schema/structured-type.mjs +0 -213
- package/esm2022/lib/services/base.mjs +0 -29
- package/esm2022/lib/services/entity-set.mjs +0 -155
- package/esm2022/lib/services/entity.mjs +0 -12
- package/esm2022/lib/services/factory.mjs +0 -44
- package/esm2022/lib/services/index.mjs +0 -5
- package/esm2022/lib/services/singleton.mjs +0 -54
- package/esm2022/lib/settings.mjs +0 -112
- package/esm2022/lib/types.mjs +0 -118
- package/esm2022/lib/utils/arraybuffers.mjs +0 -46
- package/esm2022/lib/utils/arrays.mjs +0 -10
- package/esm2022/lib/utils/dates.mjs +0 -18
- package/esm2022/lib/utils/durations.mjs +0 -40
- package/esm2022/lib/utils/enums.mjs +0 -61
- package/esm2022/lib/utils/http.mjs +0 -95
- package/esm2022/lib/utils/index.mjs +0 -10
- package/esm2022/lib/utils/objects.mjs +0 -204
- package/esm2022/lib/utils/odata.mjs +0 -22
- package/esm2022/lib/utils/strings.mjs +0 -20
- package/esm2022/lib/utils/types.mjs +0 -136
- package/esm2022/lib/utils/urls.mjs +0 -24
- package/esm2022/public-api.mjs +0 -5
|
@@ -1,1179 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import { finalize } from 'rxjs/operators';
|
|
3
|
-
import { CID_FIELD_NAME, COMPUTED, DEFAULT_VERSION, OPTIMISTIC_CONCURRENCY, EVENT_SPLITTER, } from '../constants';
|
|
4
|
-
import { ODataHelper } from '../helper';
|
|
5
|
-
import { ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPropertyResource, } from '../resources';
|
|
6
|
-
import { EdmType } from '../types';
|
|
7
|
-
import { Objects, Types } from '../utils';
|
|
8
|
-
import { ODataCollection } from './collection';
|
|
9
|
-
import { ODataModel } from './model';
|
|
10
|
-
import { EventEmitter } from '@angular/core';
|
|
11
|
-
import { ODataEntityAnnotations, } from '../annotations';
|
|
12
|
-
export var ODataModelEventType;
|
|
13
|
-
(function (ODataModelEventType) {
|
|
14
|
-
ODataModelEventType["Change"] = "change";
|
|
15
|
-
ODataModelEventType["Reset"] = "reset";
|
|
16
|
-
ODataModelEventType["Update"] = "update";
|
|
17
|
-
ODataModelEventType["Sort"] = "sort";
|
|
18
|
-
ODataModelEventType["Destroy"] = "destroy";
|
|
19
|
-
ODataModelEventType["Add"] = "add";
|
|
20
|
-
ODataModelEventType["Remove"] = "remove";
|
|
21
|
-
ODataModelEventType["Invalid"] = "invalid";
|
|
22
|
-
ODataModelEventType["Request"] = "request";
|
|
23
|
-
ODataModelEventType["Sync"] = "sync";
|
|
24
|
-
ODataModelEventType["Attach"] = "attach";
|
|
25
|
-
})(ODataModelEventType || (ODataModelEventType = {}));
|
|
26
|
-
export class ODataModelEvent {
|
|
27
|
-
constructor(type, { model, collection, previous, value, attr, options, bubbles, chain, } = {}) {
|
|
28
|
-
this.type = type;
|
|
29
|
-
this.model = model;
|
|
30
|
-
this.collection = collection;
|
|
31
|
-
this.previous = previous;
|
|
32
|
-
this.value = value;
|
|
33
|
-
this.options = options;
|
|
34
|
-
this.chain = chain ?? [
|
|
35
|
-
[
|
|
36
|
-
(this.model || this.collection),
|
|
37
|
-
attr || null,
|
|
38
|
-
],
|
|
39
|
-
];
|
|
40
|
-
this.bubbles = bubbles ?? BUBBLES.indexOf(this.type) !== -1;
|
|
41
|
-
}
|
|
42
|
-
push(model, attr) {
|
|
43
|
-
return new ODataModelEvent(this.type, {
|
|
44
|
-
model: this.model ?? (model instanceof ODataModel ? model : undefined),
|
|
45
|
-
collection: this.collection ??
|
|
46
|
-
(model instanceof ODataCollection
|
|
47
|
-
? model
|
|
48
|
-
: undefined),
|
|
49
|
-
previous: this.previous,
|
|
50
|
-
value: this.value,
|
|
51
|
-
options: {
|
|
52
|
-
...this.options,
|
|
53
|
-
index: attr instanceof ODataModelAttribute ? attr.name : attr,
|
|
54
|
-
},
|
|
55
|
-
bubbles: this.bubbles,
|
|
56
|
-
chain: [[model, attr], ...this.chain],
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
stopPropagation() {
|
|
60
|
-
this.bubbles = false;
|
|
61
|
-
}
|
|
62
|
-
visited(model) {
|
|
63
|
-
return (this.chain.some((c) => c[0] === model) &&
|
|
64
|
-
this.chain[this.chain.length - 1][0] !== model);
|
|
65
|
-
}
|
|
66
|
-
canContinueWith(self) {
|
|
67
|
-
return this.bubbles && !this.visited(self);
|
|
68
|
-
}
|
|
69
|
-
get path() {
|
|
70
|
-
return this.chain
|
|
71
|
-
.map(([, attr], index) => typeof attr === 'number'
|
|
72
|
-
? `[${attr}]`
|
|
73
|
-
: attr instanceof ODataModelAttribute
|
|
74
|
-
? index === 0
|
|
75
|
-
? attr.name
|
|
76
|
-
: `.${attr.name}`
|
|
77
|
-
: '')
|
|
78
|
-
.join('');
|
|
79
|
-
}
|
|
80
|
-
//Identifies the current model for the event
|
|
81
|
-
get currentModel() {
|
|
82
|
-
const link = this.chain.find((c) => ODataModelOptions.isModel(c[0]));
|
|
83
|
-
return link !== undefined ? link[0] : undefined;
|
|
84
|
-
}
|
|
85
|
-
//Identifies the current collection for the event
|
|
86
|
-
get currentCollection() {
|
|
87
|
-
const link = this.chain.find((c) => ODataModelOptions.isCollection(c[0]));
|
|
88
|
-
return link !== undefined
|
|
89
|
-
? link[0]
|
|
90
|
-
: undefined;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
export class ODataModelEventEmitter extends EventEmitter {
|
|
94
|
-
constructor({ model, collection, } = {}) {
|
|
95
|
-
super();
|
|
96
|
-
this.model = model;
|
|
97
|
-
this.collection = collection;
|
|
98
|
-
}
|
|
99
|
-
trigger(type, { collection, previous, value, attr, options, bubbles, } = {}) {
|
|
100
|
-
const _trigger = (name) => this.emit(new ODataModelEvent(name, {
|
|
101
|
-
model: this.model,
|
|
102
|
-
collection: collection ?? this.collection,
|
|
103
|
-
previous,
|
|
104
|
-
value,
|
|
105
|
-
attr,
|
|
106
|
-
options,
|
|
107
|
-
bubbles,
|
|
108
|
-
}));
|
|
109
|
-
if (type && EVENT_SPLITTER.test(type)) {
|
|
110
|
-
for (const name of type.split(EVENT_SPLITTER)) {
|
|
111
|
-
_trigger(name);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
_trigger(type);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
export const BUBBLES = [
|
|
120
|
-
ODataModelEventType.Change,
|
|
121
|
-
ODataModelEventType.Reset,
|
|
122
|
-
ODataModelEventType.Update,
|
|
123
|
-
ODataModelEventType.Destroy,
|
|
124
|
-
ODataModelEventType.Add,
|
|
125
|
-
ODataModelEventType.Remove,
|
|
126
|
-
];
|
|
127
|
-
export const INCLUDE_SHALLOW = {
|
|
128
|
-
include_concurrency: true,
|
|
129
|
-
include_computed: true,
|
|
130
|
-
include_key: true,
|
|
131
|
-
include_id: false,
|
|
132
|
-
};
|
|
133
|
-
export const INCLUDE_DEEP = {
|
|
134
|
-
include_navigation: true,
|
|
135
|
-
include_non_field: true,
|
|
136
|
-
...INCLUDE_SHALLOW,
|
|
137
|
-
};
|
|
138
|
-
export var ODataModelState;
|
|
139
|
-
(function (ODataModelState) {
|
|
140
|
-
ODataModelState[ODataModelState["Added"] = 0] = "Added";
|
|
141
|
-
ODataModelState[ODataModelState["Removed"] = 1] = "Removed";
|
|
142
|
-
ODataModelState[ODataModelState["Unchanged"] = 2] = "Unchanged";
|
|
143
|
-
})(ODataModelState || (ODataModelState = {}));
|
|
144
|
-
export function Model({ cid = CID_FIELD_NAME } = {}) {
|
|
145
|
-
return (constructor) => {
|
|
146
|
-
const Klass = constructor;
|
|
147
|
-
if (!Klass.hasOwnProperty('options'))
|
|
148
|
-
Klass.options = {
|
|
149
|
-
fields: new Map(),
|
|
150
|
-
};
|
|
151
|
-
Klass.options.cid = cid;
|
|
152
|
-
return constructor;
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
export function ModelField({ name, ...options } = {}) {
|
|
156
|
-
return (target, key) => {
|
|
157
|
-
const Klass = target.constructor;
|
|
158
|
-
if (!Klass.hasOwnProperty('options'))
|
|
159
|
-
Klass.options = {
|
|
160
|
-
fields: new Map(),
|
|
161
|
-
};
|
|
162
|
-
options.field = name ?? key;
|
|
163
|
-
Klass.options.fields.set(key, options);
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
export class ODataModelField {
|
|
167
|
-
constructor(options, { name, field, parser, ...opts }) {
|
|
168
|
-
this.options = options;
|
|
169
|
-
this.name = name;
|
|
170
|
-
this.field = field;
|
|
171
|
-
this.parser = parser;
|
|
172
|
-
this.default = opts.default || parser.default;
|
|
173
|
-
this.required = Boolean(opts.required || !parser.nullable);
|
|
174
|
-
this.concurrency = Boolean(opts.concurrency);
|
|
175
|
-
this.maxLength = opts.maxLength || parser.maxLength;
|
|
176
|
-
this.minLength = opts.minLength;
|
|
177
|
-
this.min = opts.min;
|
|
178
|
-
this.max = opts.max;
|
|
179
|
-
this.pattern = opts.pattern;
|
|
180
|
-
}
|
|
181
|
-
get type() {
|
|
182
|
-
return this.parser.type;
|
|
183
|
-
}
|
|
184
|
-
get navigation() {
|
|
185
|
-
return this.parser.navigation;
|
|
186
|
-
}
|
|
187
|
-
get collection() {
|
|
188
|
-
return this.parser.collection;
|
|
189
|
-
}
|
|
190
|
-
annotatedValue(term) {
|
|
191
|
-
return this.parser.annotatedValue(term);
|
|
192
|
-
}
|
|
193
|
-
configure({ optionsForType, modelForType, collectionForType, enumForType, structuredForType, concurrency, options, }) {
|
|
194
|
-
this.optionsForType = optionsForType;
|
|
195
|
-
this.modelForType = modelForType;
|
|
196
|
-
this.collectionForType = collectionForType;
|
|
197
|
-
this.enumForType = enumForType;
|
|
198
|
-
this.structuredForType = structuredForType;
|
|
199
|
-
this.parserOptions = options;
|
|
200
|
-
if (concurrency)
|
|
201
|
-
this.concurrency = concurrency;
|
|
202
|
-
if (this.default !== undefined)
|
|
203
|
-
this.default = this.deserialize(this.default, options);
|
|
204
|
-
}
|
|
205
|
-
isKey() {
|
|
206
|
-
return this.parser.isKey();
|
|
207
|
-
}
|
|
208
|
-
hasReferentials() {
|
|
209
|
-
return this.parser.hasReferentials();
|
|
210
|
-
}
|
|
211
|
-
get referentials() {
|
|
212
|
-
return this.parser.referentials;
|
|
213
|
-
}
|
|
214
|
-
isStructuredType() {
|
|
215
|
-
return this.parser.isStructuredType();
|
|
216
|
-
}
|
|
217
|
-
structuredType() {
|
|
218
|
-
const structuredType = this.structuredForType
|
|
219
|
-
? this.structuredForType(this.type)
|
|
220
|
-
: undefined;
|
|
221
|
-
//Throw error if not found
|
|
222
|
-
if (!structuredType)
|
|
223
|
-
throw new Error(`Could not find structured type for ${this.parser.type}`);
|
|
224
|
-
return structuredType;
|
|
225
|
-
}
|
|
226
|
-
isEnumType() {
|
|
227
|
-
return this.parser.isEnumType();
|
|
228
|
-
}
|
|
229
|
-
enumType() {
|
|
230
|
-
const enumType = this.enumForType ? this.enumForType(this.type) : undefined;
|
|
231
|
-
//Throw error if not found
|
|
232
|
-
if (!enumType)
|
|
233
|
-
throw new Error(`Could not find enum type for ${this.parser.type}`);
|
|
234
|
-
return enumType;
|
|
235
|
-
}
|
|
236
|
-
validate(value, { method, navigation = false, } = {}) {
|
|
237
|
-
if (ODataModelOptions.isModel(value)) {
|
|
238
|
-
return !value.isValid({ method, navigation }) ? value._errors : undefined;
|
|
239
|
-
}
|
|
240
|
-
else if (ODataModelOptions.isCollection(value)) {
|
|
241
|
-
return value
|
|
242
|
-
.models()
|
|
243
|
-
.some((m) => !m.isValid({ method, navigation }))
|
|
244
|
-
? value.models().map((m) => m._errors)
|
|
245
|
-
: undefined;
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
const computed = this.annotatedValue(COMPUTED);
|
|
249
|
-
const errors = this.parser?.validate(value, { method, navigation }) || [];
|
|
250
|
-
if (this.required &&
|
|
251
|
-
(value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
|
|
252
|
-
!(computed && method === 'create') // Not (Is Computed field and create) ?
|
|
253
|
-
) {
|
|
254
|
-
errors['push'](`required`);
|
|
255
|
-
}
|
|
256
|
-
if (this.maxLength !== undefined &&
|
|
257
|
-
typeof value === 'string' &&
|
|
258
|
-
value.length > this.maxLength) {
|
|
259
|
-
errors['push'](`maxlength`);
|
|
260
|
-
}
|
|
261
|
-
if (this.minLength !== undefined &&
|
|
262
|
-
typeof value === 'string' &&
|
|
263
|
-
value.length < this.minLength) {
|
|
264
|
-
errors['push'](`minlength`);
|
|
265
|
-
}
|
|
266
|
-
if (this.min !== undefined &&
|
|
267
|
-
typeof value === 'number' &&
|
|
268
|
-
value < this.min) {
|
|
269
|
-
errors['push'](`min`);
|
|
270
|
-
}
|
|
271
|
-
if (this.max !== undefined &&
|
|
272
|
-
typeof value === 'number' &&
|
|
273
|
-
value > this.max) {
|
|
274
|
-
errors['push'](`max`);
|
|
275
|
-
}
|
|
276
|
-
if (this.pattern !== undefined &&
|
|
277
|
-
typeof value === 'string' &&
|
|
278
|
-
!this.pattern.test(value)) {
|
|
279
|
-
errors['push'](`pattern`);
|
|
280
|
-
}
|
|
281
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
defaults() {
|
|
285
|
-
const meta = this.optionsForType
|
|
286
|
-
? this.optionsForType(this.type)
|
|
287
|
-
: undefined;
|
|
288
|
-
return this.isStructuredType() && meta !== undefined
|
|
289
|
-
? meta.defaults()
|
|
290
|
-
: this.default;
|
|
291
|
-
}
|
|
292
|
-
deserialize(value, options) {
|
|
293
|
-
const parserOptions = options ?? this.parserOptions;
|
|
294
|
-
return this.parser.deserialize(value, parserOptions);
|
|
295
|
-
}
|
|
296
|
-
serialize(value, options) {
|
|
297
|
-
const parserOptions = options ?? this.parserOptions;
|
|
298
|
-
return this.parser.serialize(value, parserOptions);
|
|
299
|
-
}
|
|
300
|
-
encode(value, options) {
|
|
301
|
-
const parserOptions = options ?? this.parserOptions;
|
|
302
|
-
return this.parser.encode(value, parserOptions);
|
|
303
|
-
}
|
|
304
|
-
resourceFactory(base) {
|
|
305
|
-
if (!(base instanceof ODataEntityResource ||
|
|
306
|
-
base instanceof ODataNavigationPropertyResource ||
|
|
307
|
-
base instanceof ODataPropertyResource))
|
|
308
|
-
throw new Error("Can't build resource for non compatible base type");
|
|
309
|
-
return this.navigation
|
|
310
|
-
? base.navigationProperty(this.parser.name)
|
|
311
|
-
: base.property(this.parser.name);
|
|
312
|
-
}
|
|
313
|
-
annotationsFactory(base) {
|
|
314
|
-
return this.parser.collection
|
|
315
|
-
? base.property(this.parser.name, 'collection')
|
|
316
|
-
: base.property(this.parser.name, 'single');
|
|
317
|
-
}
|
|
318
|
-
modelFactory({ parent, value, reset, }) {
|
|
319
|
-
// Model
|
|
320
|
-
const annots = this.annotationsFactory(parent.annots());
|
|
321
|
-
let Model = this.modelForType ? this.modelForType(this.type) : undefined;
|
|
322
|
-
if (Model === undefined)
|
|
323
|
-
throw Error(`No Model type for ${this.name}`);
|
|
324
|
-
if (value !== undefined) {
|
|
325
|
-
annots.update(value);
|
|
326
|
-
}
|
|
327
|
-
if (annots?.type !== undefined && Model.meta !== null) {
|
|
328
|
-
const meta = Model.meta.findChildOptions((o) => o.isTypeOf(annots.type))?.structuredType;
|
|
329
|
-
if (meta !== undefined && meta.model !== undefined)
|
|
330
|
-
// Change to child model
|
|
331
|
-
Model = meta.model;
|
|
332
|
-
}
|
|
333
|
-
return new Model((value || {}), {
|
|
334
|
-
annots,
|
|
335
|
-
reset,
|
|
336
|
-
parent: [parent, this],
|
|
337
|
-
});
|
|
338
|
-
}
|
|
339
|
-
collectionFactory({ parent, value, reset, }) {
|
|
340
|
-
// Collection Factory
|
|
341
|
-
const annots = this.annotationsFactory(parent.annots());
|
|
342
|
-
const Collection = this.collectionForType
|
|
343
|
-
? this.collectionForType(this.type)
|
|
344
|
-
: undefined;
|
|
345
|
-
if (Collection === undefined)
|
|
346
|
-
throw Error(`No Collection type for ${this.name}`);
|
|
347
|
-
return new Collection((value || []), {
|
|
348
|
-
annots: annots,
|
|
349
|
-
reset,
|
|
350
|
-
parent: [parent, this],
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
export class ODataModelAttribute {
|
|
355
|
-
constructor(_model, _field) {
|
|
356
|
-
this._model = _model;
|
|
357
|
-
this._field = _field;
|
|
358
|
-
this.events$ = new ODataModelEventEmitter();
|
|
359
|
-
}
|
|
360
|
-
get type() {
|
|
361
|
-
return this._field.type;
|
|
362
|
-
}
|
|
363
|
-
get navigation() {
|
|
364
|
-
return this._field.navigation;
|
|
365
|
-
}
|
|
366
|
-
get computed() {
|
|
367
|
-
return this._field.annotatedValue(COMPUTED);
|
|
368
|
-
}
|
|
369
|
-
get concurrency() {
|
|
370
|
-
return Boolean(this._field.concurrency);
|
|
371
|
-
}
|
|
372
|
-
get referentials() {
|
|
373
|
-
return this._field.referentials;
|
|
374
|
-
}
|
|
375
|
-
get options() {
|
|
376
|
-
return this._field.options;
|
|
377
|
-
}
|
|
378
|
-
get name() {
|
|
379
|
-
return this._field.name;
|
|
380
|
-
}
|
|
381
|
-
get fieldName() {
|
|
382
|
-
return this._field.field;
|
|
383
|
-
}
|
|
384
|
-
get() {
|
|
385
|
-
return this.change !== undefined ? this.change : this.value;
|
|
386
|
-
}
|
|
387
|
-
set(value, reset = false, reparent = false) {
|
|
388
|
-
const current = this.get();
|
|
389
|
-
if (ODataModelOptions.isModel(current) ||
|
|
390
|
-
ODataModelOptions.isCollection(current))
|
|
391
|
-
this.unlink(current);
|
|
392
|
-
const changed = ODataModelOptions.isModel(current) && ODataModelOptions.isModel(value)
|
|
393
|
-
? !current.equals(value)
|
|
394
|
-
: ODataModelOptions.isCollection(current) &&
|
|
395
|
-
ODataModelOptions.isCollection(value)
|
|
396
|
-
? !current.equals(value)
|
|
397
|
-
: !Types.isEqual(current, value);
|
|
398
|
-
if (reset) {
|
|
399
|
-
this.value = value;
|
|
400
|
-
this.change = undefined;
|
|
401
|
-
}
|
|
402
|
-
else if (Types.isEqual(value, this.value)) {
|
|
403
|
-
this.change = undefined;
|
|
404
|
-
}
|
|
405
|
-
else if (changed) {
|
|
406
|
-
this.change = value;
|
|
407
|
-
}
|
|
408
|
-
if (ODataModelOptions.isModel(value) ||
|
|
409
|
-
ODataModelOptions.isCollection(value)) {
|
|
410
|
-
this.link(value, reparent);
|
|
411
|
-
}
|
|
412
|
-
return changed;
|
|
413
|
-
}
|
|
414
|
-
isChanged({ include_navigation = false, } = {}) {
|
|
415
|
-
const current = this.get();
|
|
416
|
-
return (this.change !== undefined ||
|
|
417
|
-
((ODataModelOptions.isModel(current) ||
|
|
418
|
-
ODataModelOptions.isCollection(current)) &&
|
|
419
|
-
current.hasChanged({ include_navigation })));
|
|
420
|
-
}
|
|
421
|
-
reset() {
|
|
422
|
-
if (ODataModelOptions.isModel(this.change) ||
|
|
423
|
-
ODataModelOptions.isCollection(this.change))
|
|
424
|
-
this.unlink(this.change);
|
|
425
|
-
this.change = undefined;
|
|
426
|
-
if (ODataModelOptions.isModel(this.value) ||
|
|
427
|
-
ODataModelOptions.isCollection(this.value))
|
|
428
|
-
this.link(this.value);
|
|
429
|
-
}
|
|
430
|
-
link(value, reparent = false) {
|
|
431
|
-
this.subscription = value.events$.subscribe((e) => this.events$.emit(e));
|
|
432
|
-
if (reparent) {
|
|
433
|
-
value._parent = [this._model, this._field];
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
unlink(value, reparent = false) {
|
|
437
|
-
this.subscription?.unsubscribe();
|
|
438
|
-
this.subscription = undefined;
|
|
439
|
-
if (reparent) {
|
|
440
|
-
value._parent = null;
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
export class ODataModelOptions {
|
|
445
|
-
constructor({ config, structuredType, }) {
|
|
446
|
-
this._fields = [];
|
|
447
|
-
this.children = [];
|
|
448
|
-
this.events$ = new ODataModelEventEmitter();
|
|
449
|
-
this.tsToEdm = {
|
|
450
|
-
string: EdmType.String,
|
|
451
|
-
number: EdmType.Int32,
|
|
452
|
-
bigint: EdmType.Int64,
|
|
453
|
-
boolean: EdmType.Boolean,
|
|
454
|
-
};
|
|
455
|
-
this.name = structuredType.name;
|
|
456
|
-
this.base = structuredType.base;
|
|
457
|
-
this.structuredType = structuredType;
|
|
458
|
-
this.cid = config?.cid ?? CID_FIELD_NAME;
|
|
459
|
-
config.fields.forEach((value, key) => this.addField(key, value));
|
|
460
|
-
}
|
|
461
|
-
get api() {
|
|
462
|
-
return this.structuredType.api;
|
|
463
|
-
}
|
|
464
|
-
type({ alias = false } = {}) {
|
|
465
|
-
return this.structuredType.type({ alias });
|
|
466
|
-
}
|
|
467
|
-
isOpenType() {
|
|
468
|
-
return this.structuredType.isOpenType();
|
|
469
|
-
}
|
|
470
|
-
isEntityType() {
|
|
471
|
-
return this.structuredType.isEntityType();
|
|
472
|
-
}
|
|
473
|
-
isComplexType() {
|
|
474
|
-
return this.structuredType.isComplexType();
|
|
475
|
-
}
|
|
476
|
-
isTypeOf(type) {
|
|
477
|
-
return this.structuredType.type() === type;
|
|
478
|
-
}
|
|
479
|
-
isModelFor(entity) {
|
|
480
|
-
// Resolve By Type
|
|
481
|
-
const type = this.api.options.helper.type(entity);
|
|
482
|
-
if (type && this.isTypeOf(type))
|
|
483
|
-
return true;
|
|
484
|
-
// Resolve By fields
|
|
485
|
-
const keys = Object.keys(entity);
|
|
486
|
-
const names = this.fields({
|
|
487
|
-
include_navigation: true,
|
|
488
|
-
include_parents: true,
|
|
489
|
-
}).map((f) => f.name);
|
|
490
|
-
return keys.every((key) => names.includes(key));
|
|
491
|
-
}
|
|
492
|
-
findChildOptions(predicate) {
|
|
493
|
-
if (predicate(this))
|
|
494
|
-
return this;
|
|
495
|
-
let match;
|
|
496
|
-
for (const ch of this.children) {
|
|
497
|
-
match = ch.findChildOptions(predicate);
|
|
498
|
-
if (match !== undefined)
|
|
499
|
-
break;
|
|
500
|
-
}
|
|
501
|
-
return match;
|
|
502
|
-
}
|
|
503
|
-
configure({ options }) {
|
|
504
|
-
if (this.base) {
|
|
505
|
-
const parent = this.api.optionsForType(this.base);
|
|
506
|
-
parent.children.push(this);
|
|
507
|
-
this.parent = parent;
|
|
508
|
-
}
|
|
509
|
-
this.entitySet = this.api.findEntitySetForEntityType(this.type());
|
|
510
|
-
let concurrencyFields = [];
|
|
511
|
-
if (this.entitySet !== undefined) {
|
|
512
|
-
concurrencyFields =
|
|
513
|
-
this.entitySet.annotatedValue(OPTIMISTIC_CONCURRENCY) || [];
|
|
514
|
-
}
|
|
515
|
-
this._fields.forEach((field) => {
|
|
516
|
-
const concurrency = concurrencyFields.indexOf(field.field) !== -1;
|
|
517
|
-
field.configure({
|
|
518
|
-
optionsForType: (t) => this.api.optionsForType(t),
|
|
519
|
-
modelForType: (t) => this.api.modelForType(t),
|
|
520
|
-
collectionForType: (t) => this.api.collectionForType(t),
|
|
521
|
-
enumForType: (t) => this.api.findEnumType(t),
|
|
522
|
-
structuredForType: (t) => this.api.findStructuredType(t),
|
|
523
|
-
concurrency,
|
|
524
|
-
options,
|
|
525
|
-
});
|
|
526
|
-
});
|
|
527
|
-
}
|
|
528
|
-
fields({ include_navigation, include_parents, }) {
|
|
529
|
-
return [
|
|
530
|
-
...(include_parents && this.parent !== undefined
|
|
531
|
-
? this.parent.fields({ include_navigation, include_parents })
|
|
532
|
-
: []),
|
|
533
|
-
...this._fields.filter((field) => include_navigation || !field.navigation),
|
|
534
|
-
];
|
|
535
|
-
}
|
|
536
|
-
field(name) {
|
|
537
|
-
const field = this.findField(name);
|
|
538
|
-
//Throw error if not found
|
|
539
|
-
if (!field)
|
|
540
|
-
throw new Error(`No field with name ${name}`);
|
|
541
|
-
return field;
|
|
542
|
-
}
|
|
543
|
-
findField(name, { reset } = {}) {
|
|
544
|
-
return this.fields({
|
|
545
|
-
include_parents: true,
|
|
546
|
-
include_navigation: true,
|
|
547
|
-
}).find((modelField) => (reset && modelField.field === name) || modelField.name === name);
|
|
548
|
-
}
|
|
549
|
-
addField(name, options) {
|
|
550
|
-
const { field, parser, ...opts } = options;
|
|
551
|
-
if (field === undefined || name === undefined)
|
|
552
|
-
throw new Error('Model Properties need name and field');
|
|
553
|
-
const fieldParser = parser ?? this.structuredType.field(field);
|
|
554
|
-
if (fieldParser === undefined)
|
|
555
|
-
throw new Error(`No parser for ${field} with name = ${name}`);
|
|
556
|
-
const modelField = new ODataModelField(this, {
|
|
557
|
-
name,
|
|
558
|
-
field,
|
|
559
|
-
parser: fieldParser,
|
|
560
|
-
...opts,
|
|
561
|
-
});
|
|
562
|
-
this._fields.push(modelField);
|
|
563
|
-
return modelField;
|
|
564
|
-
}
|
|
565
|
-
modelFieldFactory(self, name, type) {
|
|
566
|
-
const structuredFieldParser = this.structuredType.addField(name, {
|
|
567
|
-
type,
|
|
568
|
-
});
|
|
569
|
-
structuredFieldParser.configure({
|
|
570
|
-
parserForType: (type) => this.api.parserForType(type),
|
|
571
|
-
options: this.api.options,
|
|
572
|
-
});
|
|
573
|
-
const modelField = this.addField(name, {
|
|
574
|
-
field: name,
|
|
575
|
-
parser: structuredFieldParser,
|
|
576
|
-
});
|
|
577
|
-
modelField.configure({
|
|
578
|
-
optionsForType: (t) => this.api.optionsForType(t),
|
|
579
|
-
modelForType: (t) => this.api.modelForType(t),
|
|
580
|
-
collectionForType: (t) => this.api.collectionForType(t),
|
|
581
|
-
enumForType: (t) => this.api.findEnumType(t),
|
|
582
|
-
structuredForType: (t) => this.api.findStructuredType(t),
|
|
583
|
-
options: this.api.options,
|
|
584
|
-
concurrency: false,
|
|
585
|
-
});
|
|
586
|
-
Object.defineProperty(self, modelField.name, {
|
|
587
|
-
configurable: true,
|
|
588
|
-
get: () => this.get(self, modelField),
|
|
589
|
-
set: (value) => this.set(self, modelField, value),
|
|
590
|
-
});
|
|
591
|
-
return modelField;
|
|
592
|
-
}
|
|
593
|
-
attach(self, resource) {
|
|
594
|
-
if (self._resource !== null &&
|
|
595
|
-
resource.outgoingType() !== self._resource.outgoingType() &&
|
|
596
|
-
!self._resource.isSubtypeOf(resource))
|
|
597
|
-
throw new Error(`Can't attach ${resource.outgoingType()} to ${self._resource.outgoingType()}`);
|
|
598
|
-
const current = self._resource;
|
|
599
|
-
if (current === null || !current.isEqualTo(resource)) {
|
|
600
|
-
self._resource = resource;
|
|
601
|
-
self.events$.trigger(ODataModelEventType.Attach, {
|
|
602
|
-
previous: current,
|
|
603
|
-
value: resource,
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
|
-
}
|
|
607
|
-
//# region Resource
|
|
608
|
-
static chain(child) {
|
|
609
|
-
const chain = [];
|
|
610
|
-
let tuple = [child, null];
|
|
611
|
-
while (tuple !== null) {
|
|
612
|
-
const parent = tuple;
|
|
613
|
-
if (chain.some((p) => p[0] === parent[0]))
|
|
614
|
-
break;
|
|
615
|
-
chain.splice(0, 0, parent);
|
|
616
|
-
tuple = tuple[0]._parent;
|
|
617
|
-
}
|
|
618
|
-
return chain;
|
|
619
|
-
}
|
|
620
|
-
static resource(child) {
|
|
621
|
-
let resource = null;
|
|
622
|
-
let prevField = null;
|
|
623
|
-
for (const [model, field] of ODataModelOptions.chain(child)) {
|
|
624
|
-
resource = resource || model._resource;
|
|
625
|
-
if (resource === null)
|
|
626
|
-
break;
|
|
627
|
-
if (ODataModelOptions.isModel(model) &&
|
|
628
|
-
(prevField === null || prevField.collection)) {
|
|
629
|
-
const m = model;
|
|
630
|
-
// Resolve subtype if collection not is from field
|
|
631
|
-
// FIXME
|
|
632
|
-
/*
|
|
633
|
-
if (field === null) {
|
|
634
|
-
const r = m._meta.modelResourceFactory(resource.cloneQuery<T>());
|
|
635
|
-
if (r !== null && !r.isTypeOf(resource) && r.isSubtypeOf(resource)) {
|
|
636
|
-
resource = r;
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
*/
|
|
640
|
-
// Resolve key
|
|
641
|
-
const mKey = m.key({ field_mapping: true });
|
|
642
|
-
if (mKey !== undefined) {
|
|
643
|
-
resource =
|
|
644
|
-
resource instanceof ODataEntitySetResource
|
|
645
|
-
? resource.entity(mKey)
|
|
646
|
-
: resource.key(mKey);
|
|
647
|
-
}
|
|
648
|
-
}
|
|
649
|
-
prevField = field;
|
|
650
|
-
if (field === null && model._resource !== null) {
|
|
651
|
-
// Apply the query from model to new resource
|
|
652
|
-
model._resource.query((qs) => resource?.query((qd) => qd.restore(qs.store())));
|
|
653
|
-
}
|
|
654
|
-
else if (field !== null) {
|
|
655
|
-
resource = field.resourceFactory(resource);
|
|
656
|
-
}
|
|
657
|
-
}
|
|
658
|
-
return resource;
|
|
659
|
-
}
|
|
660
|
-
collectionResourceFactory(query) {
|
|
661
|
-
if (this.entitySet === undefined)
|
|
662
|
-
return null;
|
|
663
|
-
return ODataEntitySetResource.factory(this.api, {
|
|
664
|
-
path: this.entitySet.name,
|
|
665
|
-
type: this.entitySet.entityType,
|
|
666
|
-
query,
|
|
667
|
-
});
|
|
668
|
-
}
|
|
669
|
-
modelResourceFactory(query) {
|
|
670
|
-
const resource = this.collectionResourceFactory(query);
|
|
671
|
-
if (resource instanceof ODataEntitySetResource)
|
|
672
|
-
return resource.entity();
|
|
673
|
-
return resource;
|
|
674
|
-
}
|
|
675
|
-
//#endregion
|
|
676
|
-
bind(self, { parent, resource, annots, } = {}) {
|
|
677
|
-
// Events
|
|
678
|
-
self.events$.subscribe((e) => this.events$.emit(e));
|
|
679
|
-
// Parent
|
|
680
|
-
if (parent !== undefined) {
|
|
681
|
-
self._parent = parent;
|
|
682
|
-
}
|
|
683
|
-
// Resource
|
|
684
|
-
if (self._parent === null && resource === undefined)
|
|
685
|
-
resource = this.modelResourceFactory();
|
|
686
|
-
if (resource) {
|
|
687
|
-
this.attach(self, resource);
|
|
688
|
-
}
|
|
689
|
-
// Annotations
|
|
690
|
-
self._annotations =
|
|
691
|
-
annots ?? new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
|
|
692
|
-
// Fields
|
|
693
|
-
this.fields({
|
|
694
|
-
include_navigation: true,
|
|
695
|
-
include_parents: true,
|
|
696
|
-
}).forEach((field) => {
|
|
697
|
-
Object.defineProperty(self, field.name, {
|
|
698
|
-
configurable: true,
|
|
699
|
-
get: () => this.get(self, field),
|
|
700
|
-
set: (value) => this.set(self, field, value),
|
|
701
|
-
});
|
|
702
|
-
});
|
|
703
|
-
}
|
|
704
|
-
query(self, resource, func) {
|
|
705
|
-
resource.query(func);
|
|
706
|
-
this.attach(self, resource);
|
|
707
|
-
return self;
|
|
708
|
-
}
|
|
709
|
-
resolveKey(value, { field_mapping = false, resolve = true, single = true, } = {}) {
|
|
710
|
-
const keyTypes = this.structuredType.keys({ include_parents: true });
|
|
711
|
-
const key = new Map();
|
|
712
|
-
for (const kt of keyTypes) {
|
|
713
|
-
let v = value;
|
|
714
|
-
let options = this;
|
|
715
|
-
let field;
|
|
716
|
-
for (const name of kt.name.split('/')) {
|
|
717
|
-
if (options === undefined)
|
|
718
|
-
break;
|
|
719
|
-
field = options
|
|
720
|
-
.fields({ include_navigation: false, include_parents: true })
|
|
721
|
-
.find((field) => field.field === name);
|
|
722
|
-
if (field !== undefined) {
|
|
723
|
-
v =
|
|
724
|
-
Types.isPlainObject(v) || ODataModelOptions.isModel(v)
|
|
725
|
-
? v[field.name]
|
|
726
|
-
: v;
|
|
727
|
-
options = this.api.optionsForType(field.type);
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
if (field === undefined)
|
|
731
|
-
return undefined;
|
|
732
|
-
let name = field_mapping ? field.field : field.name;
|
|
733
|
-
if (kt.alias !== undefined)
|
|
734
|
-
name = kt.alias;
|
|
735
|
-
key.set(name, v);
|
|
736
|
-
}
|
|
737
|
-
if (key.size === 0)
|
|
738
|
-
return undefined;
|
|
739
|
-
return resolve
|
|
740
|
-
? Objects.resolveKey(key, { single })
|
|
741
|
-
: Object.fromEntries(key);
|
|
742
|
-
}
|
|
743
|
-
resolveReferential(value, attr, { field_mapping = false, resolve = true, single = false, } = {}) {
|
|
744
|
-
const referential = new Map();
|
|
745
|
-
for (const ref of attr.referentials) {
|
|
746
|
-
const from = this.fields({
|
|
747
|
-
include_navigation: false,
|
|
748
|
-
include_parents: true,
|
|
749
|
-
}).find((p) => p.field === ref.referencedProperty);
|
|
750
|
-
const to = attr.options
|
|
751
|
-
.fields({ include_navigation: false, include_parents: true })
|
|
752
|
-
.find((field) => field.field === ref.property);
|
|
753
|
-
if (from !== undefined && to !== undefined) {
|
|
754
|
-
const name = field_mapping ? to.field : to.name;
|
|
755
|
-
referential.set(name, value && value[from.name]);
|
|
756
|
-
}
|
|
757
|
-
}
|
|
758
|
-
if (referential.size === 0)
|
|
759
|
-
return undefined;
|
|
760
|
-
if (referential.size === 1 && Array.from(referential.values())[0] === null)
|
|
761
|
-
return null;
|
|
762
|
-
return resolve
|
|
763
|
-
? Objects.resolveKey(referential, { single })
|
|
764
|
-
: Object.fromEntries(referential);
|
|
765
|
-
}
|
|
766
|
-
resolveReferenced(value, attr, { field_mapping = false, resolve = true, single = false, } = {}) {
|
|
767
|
-
const referenced = new Map();
|
|
768
|
-
for (const ref of attr.referentials) {
|
|
769
|
-
const from = this.fields({
|
|
770
|
-
include_navigation: false,
|
|
771
|
-
include_parents: true,
|
|
772
|
-
}).find((field) => field.field === ref.property);
|
|
773
|
-
const meta = this.api.optionsForType(attr.type);
|
|
774
|
-
const to = meta
|
|
775
|
-
?.fields({ include_navigation: false, include_parents: true })
|
|
776
|
-
.find((field) => field.field === ref.referencedProperty);
|
|
777
|
-
if (from !== undefined && to !== undefined) {
|
|
778
|
-
const name = field_mapping ? to.field : to.name;
|
|
779
|
-
referenced.set(name, value && value[from.name]);
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
if (referenced.size === 0)
|
|
783
|
-
return undefined;
|
|
784
|
-
if (referenced.size === 1 && Array.from(referenced.values())[0] === null)
|
|
785
|
-
return null;
|
|
786
|
-
return resolve
|
|
787
|
-
? Objects.resolveKey(referenced, { single })
|
|
788
|
-
: Object.fromEntries(referenced);
|
|
789
|
-
}
|
|
790
|
-
validate(self, { method, navigation = false, } = {}) {
|
|
791
|
-
const errors = this.fields({
|
|
792
|
-
include_parents: true,
|
|
793
|
-
include_navigation: navigation,
|
|
794
|
-
}).reduce((acc, field) => {
|
|
795
|
-
const value = self[field.name];
|
|
796
|
-
const errs = field.validate(value, { method });
|
|
797
|
-
return errs !== undefined
|
|
798
|
-
? Object.assign(acc, { [field.name]: errs })
|
|
799
|
-
: acc;
|
|
800
|
-
}, {});
|
|
801
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
802
|
-
}
|
|
803
|
-
defaults() {
|
|
804
|
-
const defs = this.fields({
|
|
805
|
-
include_navigation: false,
|
|
806
|
-
include_parents: true,
|
|
807
|
-
}).reduce((acc, field) => {
|
|
808
|
-
const value = field.defaults();
|
|
809
|
-
return value !== undefined
|
|
810
|
-
? Object.assign(acc, { [field.name]: value })
|
|
811
|
-
: acc;
|
|
812
|
-
}, {});
|
|
813
|
-
return !Types.isEmpty(defs) ? defs : undefined;
|
|
814
|
-
}
|
|
815
|
-
hasChanged(self, { include_navigation = false } = {}) {
|
|
816
|
-
return [...self._attributes.values()]
|
|
817
|
-
.filter((attr) => !attr.navigation || include_navigation)
|
|
818
|
-
.some((attr) => (!include_navigation || attr.navigation) &&
|
|
819
|
-
attr.isChanged({ include_navigation }));
|
|
820
|
-
}
|
|
821
|
-
hasKey(self) {
|
|
822
|
-
return this.resolveKey(self) !== undefined;
|
|
823
|
-
}
|
|
824
|
-
withResource(self, resource, ctx) {
|
|
825
|
-
// Push
|
|
826
|
-
self.pushResource(resource);
|
|
827
|
-
// Execute function
|
|
828
|
-
const result = ctx(self);
|
|
829
|
-
if (result instanceof Observable) {
|
|
830
|
-
return result.pipe(finalize(() => {
|
|
831
|
-
// Pop
|
|
832
|
-
self.popResource();
|
|
833
|
-
}));
|
|
834
|
-
}
|
|
835
|
-
else {
|
|
836
|
-
// Pop
|
|
837
|
-
self.popResource();
|
|
838
|
-
return result;
|
|
839
|
-
}
|
|
840
|
-
}
|
|
841
|
-
asEntity(self, ctx) {
|
|
842
|
-
// Clone query from him or parent
|
|
843
|
-
let query = self._resource?.cloneQuery();
|
|
844
|
-
if (query === undefined &&
|
|
845
|
-
self._parent &&
|
|
846
|
-
self._parent[0] instanceof ODataCollection)
|
|
847
|
-
query = self._parent[0]._resource?.cloneQuery();
|
|
848
|
-
// Build new resource
|
|
849
|
-
const resource = this.modelResourceFactory(query);
|
|
850
|
-
return this.withResource(self, resource, ctx);
|
|
851
|
-
}
|
|
852
|
-
toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_id = false, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
853
|
-
let entity = [...self._attributes.values()]
|
|
854
|
-
.filter(
|
|
855
|
-
// Chain
|
|
856
|
-
(attr) => chain.every((c) => c !== attr.get()))
|
|
857
|
-
.filter(
|
|
858
|
-
// Changes only
|
|
859
|
-
(attr) => !changes_only ||
|
|
860
|
-
(changes_only && attr.isChanged({ include_navigation })))
|
|
861
|
-
.filter((attr) =>
|
|
862
|
-
// Navigation
|
|
863
|
-
(include_navigation && attr.navigation && attr.get() !== null) ||
|
|
864
|
-
!attr.navigation)
|
|
865
|
-
.reduce((acc, attr) => {
|
|
866
|
-
const name = field_mapping ? attr.fieldName : attr.name;
|
|
867
|
-
let value = attr.get();
|
|
868
|
-
const computed = attr.computed;
|
|
869
|
-
const navigation = attr.navigation;
|
|
870
|
-
const concurrency = attr.concurrency;
|
|
871
|
-
if (ODataModelOptions.isModel(value)) {
|
|
872
|
-
value = value.toEntity({
|
|
873
|
-
client_id,
|
|
874
|
-
include_navigation,
|
|
875
|
-
include_concurrency,
|
|
876
|
-
include_computed,
|
|
877
|
-
include_non_field,
|
|
878
|
-
field_mapping,
|
|
879
|
-
changes_only: changes_only && !!navigation,
|
|
880
|
-
include_key: include_key && !!navigation,
|
|
881
|
-
include_id: include_id && !!navigation,
|
|
882
|
-
chain: [self, ...chain],
|
|
883
|
-
});
|
|
884
|
-
}
|
|
885
|
-
else if (ODataModelOptions.isCollection(value)) {
|
|
886
|
-
value = value.toEntities({
|
|
887
|
-
client_id,
|
|
888
|
-
include_navigation,
|
|
889
|
-
include_concurrency,
|
|
890
|
-
include_computed,
|
|
891
|
-
include_non_field,
|
|
892
|
-
field_mapping,
|
|
893
|
-
changes_only: changes_only && !!navigation,
|
|
894
|
-
include_key: include_key && !!navigation,
|
|
895
|
-
include_id: include_id && !!navigation,
|
|
896
|
-
chain: [self, ...chain],
|
|
897
|
-
});
|
|
898
|
-
}
|
|
899
|
-
if (include_concurrency && concurrency) {
|
|
900
|
-
return Object.assign(acc, { [name]: value });
|
|
901
|
-
}
|
|
902
|
-
else if (include_computed && computed) {
|
|
903
|
-
return Object.assign(acc, { [name]: value });
|
|
904
|
-
}
|
|
905
|
-
else if (changes_only && attr.isChanged()) {
|
|
906
|
-
return Object.assign(acc, { [name]: value });
|
|
907
|
-
}
|
|
908
|
-
else if (!changes_only && !concurrency && !computed) {
|
|
909
|
-
return Object.assign(acc, { [name]: value });
|
|
910
|
-
}
|
|
911
|
-
return acc;
|
|
912
|
-
}, {});
|
|
913
|
-
if (include_non_field) {
|
|
914
|
-
const names = Object.keys(entity);
|
|
915
|
-
// Attributes from object (attributes for object)
|
|
916
|
-
const nonFieldAttrs = Object.entries(self)
|
|
917
|
-
.filter(([k]) => names.indexOf(k) === -1 && !k.startsWith('_') && !k.endsWith('$'))
|
|
918
|
-
.reduce((acc, [k, v]) => Object.assign(acc, { [k]: v }), {});
|
|
919
|
-
entity = { ...entity, ...nonFieldAttrs };
|
|
920
|
-
}
|
|
921
|
-
// Add client_id
|
|
922
|
-
if (client_id) {
|
|
923
|
-
entity[this.cid] = self[this.cid];
|
|
924
|
-
}
|
|
925
|
-
// Add key
|
|
926
|
-
if (include_key) {
|
|
927
|
-
entity = {
|
|
928
|
-
...entity,
|
|
929
|
-
...this.resolveKey(self, { field_mapping, resolve: false }),
|
|
930
|
-
};
|
|
931
|
-
}
|
|
932
|
-
// Add id
|
|
933
|
-
if (include_id) {
|
|
934
|
-
self.asEntity((e) => {
|
|
935
|
-
const resource = e.resource();
|
|
936
|
-
if (resource)
|
|
937
|
-
entity[this.api.options.helper.ODATA_ID] = `${resource.clearQuery()}`;
|
|
938
|
-
});
|
|
939
|
-
}
|
|
940
|
-
// Add type
|
|
941
|
-
if (self._parent !== null &&
|
|
942
|
-
((ODataModelOptions.isModel(self._parent[0]) &&
|
|
943
|
-
self._parent[1] !== null &&
|
|
944
|
-
this.api.optionsForType(self._parent[1].type) !== self._meta) ||
|
|
945
|
-
(ODataModelOptions.isCollection(self._parent[0]) &&
|
|
946
|
-
self._parent[0]._model
|
|
947
|
-
.meta !== self._meta))) {
|
|
948
|
-
entity[this.api.options.helper.ODATA_TYPE] =
|
|
949
|
-
`#${this.structuredType.type()}`;
|
|
950
|
-
}
|
|
951
|
-
return entity;
|
|
952
|
-
}
|
|
953
|
-
reset(self, { name, silent = false } = {}) {
|
|
954
|
-
let changes = [];
|
|
955
|
-
if (name !== undefined) {
|
|
956
|
-
// Reset value
|
|
957
|
-
const attribute = self._attributes.get(name);
|
|
958
|
-
if (attribute !== undefined &&
|
|
959
|
-
attribute.isChanged({ include_navigation: true })) {
|
|
960
|
-
attribute.reset();
|
|
961
|
-
changes = [name];
|
|
962
|
-
}
|
|
963
|
-
else if (attribute?.isChanged()) {
|
|
964
|
-
attribute.reset();
|
|
965
|
-
changes = [name];
|
|
966
|
-
}
|
|
967
|
-
}
|
|
968
|
-
else {
|
|
969
|
-
// reset all
|
|
970
|
-
changes = [...self._attributes.keys()];
|
|
971
|
-
//self._changes.clear();
|
|
972
|
-
self._attributes.forEach((attr, key) => {
|
|
973
|
-
if (attr.isChanged({ include_navigation: true })) {
|
|
974
|
-
attr.reset();
|
|
975
|
-
changes.push(key);
|
|
976
|
-
}
|
|
977
|
-
});
|
|
978
|
-
}
|
|
979
|
-
if (!silent && changes.length > 0) {
|
|
980
|
-
self.events$.trigger(ODataModelEventType.Reset, { options: { changes } });
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
assign(self, entity, { add = true, merge = true, remove = true, reset = false, reparent = false, silent = false, } = {}) {
|
|
984
|
-
const changes = [];
|
|
985
|
-
// Update annotations
|
|
986
|
-
self.annots().update(entity);
|
|
987
|
-
// Update attributes
|
|
988
|
-
const attrs = self.annots().attributes(entity, 'full');
|
|
989
|
-
Object.entries(attrs)
|
|
990
|
-
.filter(([, value]) => value !== undefined) // Filter undefined
|
|
991
|
-
.forEach(([key, value]) => {
|
|
992
|
-
const field = this.findField(key, { reset });
|
|
993
|
-
if (field !== undefined || this.isOpenType()) {
|
|
994
|
-
// Delegated to private setter
|
|
995
|
-
if (this.set(self, field ?? key, value, {
|
|
996
|
-
add,
|
|
997
|
-
merge,
|
|
998
|
-
remove,
|
|
999
|
-
reset,
|
|
1000
|
-
reparent,
|
|
1001
|
-
silent,
|
|
1002
|
-
})) {
|
|
1003
|
-
changes.push(field?.name ?? key);
|
|
1004
|
-
}
|
|
1005
|
-
}
|
|
1006
|
-
else {
|
|
1007
|
-
// Basic assignment
|
|
1008
|
-
const current = self[key];
|
|
1009
|
-
self[key] = value;
|
|
1010
|
-
if (current !== value)
|
|
1011
|
-
changes.push(key);
|
|
1012
|
-
}
|
|
1013
|
-
});
|
|
1014
|
-
if (!silent && changes.length > 0) {
|
|
1015
|
-
self.events$.trigger(reset ? ODataModelEventType.Reset : ODataModelEventType.Update, { options: { changes } });
|
|
1016
|
-
}
|
|
1017
|
-
return self;
|
|
1018
|
-
}
|
|
1019
|
-
static isModel(obj) {
|
|
1020
|
-
return Types.rawType(obj) === 'Model';
|
|
1021
|
-
}
|
|
1022
|
-
static isCollection(obj) {
|
|
1023
|
-
return Types.rawType(obj) === 'Collection';
|
|
1024
|
-
}
|
|
1025
|
-
get(self, field) {
|
|
1026
|
-
const attr = self._attributes.get(field instanceof ODataModelField ? field.name : field);
|
|
1027
|
-
if (attr !== undefined) {
|
|
1028
|
-
const value = attr.get();
|
|
1029
|
-
if ((attr.navigation && value === null) ||
|
|
1030
|
-
ODataModelOptions.isModel(value)) {
|
|
1031
|
-
// Check for reference
|
|
1032
|
-
const referenced = this.resolveReferenced(self, attr);
|
|
1033
|
-
if (value !== null && referenced !== null && referenced !== undefined) {
|
|
1034
|
-
value.assign(referenced, {
|
|
1035
|
-
silent: true,
|
|
1036
|
-
});
|
|
1037
|
-
}
|
|
1038
|
-
else if (value !== null && referenced === null) {
|
|
1039
|
-
// New value is null
|
|
1040
|
-
attr.set(null);
|
|
1041
|
-
}
|
|
1042
|
-
else if (value === null && referenced !== null) {
|
|
1043
|
-
// New value is undefined
|
|
1044
|
-
attr.set(undefined);
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
return value;
|
|
1048
|
-
}
|
|
1049
|
-
else if (typeof field === 'string' &&
|
|
1050
|
-
!field.startsWith('_') &&
|
|
1051
|
-
!field.endsWith('$')) {
|
|
1052
|
-
return self[field];
|
|
1053
|
-
}
|
|
1054
|
-
return undefined;
|
|
1055
|
-
}
|
|
1056
|
-
set(self, field, value, { add, merge, remove, reset, reparent, silent, type, } = {}) {
|
|
1057
|
-
let modelField = field instanceof ODataModelField ? field : this.findField(field);
|
|
1058
|
-
if (modelField === undefined &&
|
|
1059
|
-
this.isOpenType() &&
|
|
1060
|
-
typeof field === 'string') {
|
|
1061
|
-
type = type ?? this.tsToEdm[typeof value] ?? EdmType.String;
|
|
1062
|
-
modelField = this.modelFieldFactory(self, field, type);
|
|
1063
|
-
}
|
|
1064
|
-
if (modelField === undefined)
|
|
1065
|
-
throw new Error(`No field with name ${field}`);
|
|
1066
|
-
let changed = false;
|
|
1067
|
-
let attr = self._attributes.get(modelField.name);
|
|
1068
|
-
// Ensures that the attribute exists
|
|
1069
|
-
if (attr === undefined) {
|
|
1070
|
-
attr = new ODataModelAttribute(self, modelField);
|
|
1071
|
-
this._link(self, attr);
|
|
1072
|
-
self._attributes.set(modelField.name, attr);
|
|
1073
|
-
}
|
|
1074
|
-
const current = attr.get();
|
|
1075
|
-
if (modelField.isStructuredType()) {
|
|
1076
|
-
if (value === null) {
|
|
1077
|
-
// New value is null
|
|
1078
|
-
changed = attr.set(value, reset, reparent);
|
|
1079
|
-
}
|
|
1080
|
-
else if (ODataModelOptions.isCollection(current)) {
|
|
1081
|
-
// Current is collection
|
|
1082
|
-
const currentCollection = current;
|
|
1083
|
-
if (ODataModelOptions.isCollection(value)) {
|
|
1084
|
-
// New value is collection
|
|
1085
|
-
changed = attr.set(value, reset, reparent);
|
|
1086
|
-
}
|
|
1087
|
-
else if (Types.isArray(value)) {
|
|
1088
|
-
// New value is array
|
|
1089
|
-
currentCollection._annotations = modelField.annotationsFactory(self.annots());
|
|
1090
|
-
currentCollection.assign(value, {
|
|
1091
|
-
add,
|
|
1092
|
-
merge,
|
|
1093
|
-
remove,
|
|
1094
|
-
reset,
|
|
1095
|
-
reparent,
|
|
1096
|
-
silent,
|
|
1097
|
-
});
|
|
1098
|
-
changed = currentCollection.hasChanged();
|
|
1099
|
-
}
|
|
1100
|
-
}
|
|
1101
|
-
else if (ODataModelOptions.isModel(current)) {
|
|
1102
|
-
// Current is model
|
|
1103
|
-
const currentModel = current;
|
|
1104
|
-
if (ODataModelOptions.isModel(value)) {
|
|
1105
|
-
// New value is model
|
|
1106
|
-
changed = attr.set(value, reset, reparent);
|
|
1107
|
-
}
|
|
1108
|
-
else if (Types.isPlainObject(value)) {
|
|
1109
|
-
currentModel._annotations = modelField.annotationsFactory(self.annots());
|
|
1110
|
-
currentModel.assign(value, {
|
|
1111
|
-
add,
|
|
1112
|
-
merge,
|
|
1113
|
-
remove,
|
|
1114
|
-
reset,
|
|
1115
|
-
reparent,
|
|
1116
|
-
silent,
|
|
1117
|
-
});
|
|
1118
|
-
changed = currentModel.hasChanged();
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1121
|
-
else {
|
|
1122
|
-
// Current is null or undefined
|
|
1123
|
-
// create new model/collection for given value
|
|
1124
|
-
changed = attr.set(ODataModelOptions.isCollection(value) ||
|
|
1125
|
-
ODataModelOptions.isModel(value)
|
|
1126
|
-
? value
|
|
1127
|
-
: modelField.collection
|
|
1128
|
-
? modelField.collectionFactory({
|
|
1129
|
-
parent: self,
|
|
1130
|
-
value: value,
|
|
1131
|
-
reset: reset,
|
|
1132
|
-
})
|
|
1133
|
-
: modelField.modelFactory({
|
|
1134
|
-
parent: self,
|
|
1135
|
-
value: value,
|
|
1136
|
-
reset: reset,
|
|
1137
|
-
}), reset, reparent);
|
|
1138
|
-
}
|
|
1139
|
-
// Resolve referentials
|
|
1140
|
-
if (!ODataModelOptions.isCollection(attr.get())) {
|
|
1141
|
-
const meta = this.api.optionsForType(modelField.type);
|
|
1142
|
-
const ref = meta?.resolveReferential(attr.get(), attr);
|
|
1143
|
-
if (ref !== null && ref !== undefined) {
|
|
1144
|
-
Object.assign(self, ref);
|
|
1145
|
-
}
|
|
1146
|
-
}
|
|
1147
|
-
}
|
|
1148
|
-
else {
|
|
1149
|
-
changed = attr.set(value, reset, reparent);
|
|
1150
|
-
}
|
|
1151
|
-
if (!silent && changed) {
|
|
1152
|
-
self.events$.trigger(ODataModelEventType.Change, {
|
|
1153
|
-
attr,
|
|
1154
|
-
value,
|
|
1155
|
-
previous: current,
|
|
1156
|
-
options: { key: modelField.isKey() },
|
|
1157
|
-
});
|
|
1158
|
-
}
|
|
1159
|
-
return changed;
|
|
1160
|
-
}
|
|
1161
|
-
_link(self, attr) {
|
|
1162
|
-
attr.events$.subscribe((event) => {
|
|
1163
|
-
if (event.canContinueWith(self)) {
|
|
1164
|
-
if (event.model === attr.get()) {
|
|
1165
|
-
if (event.type === ODataModelEventType.Change &&
|
|
1166
|
-
attr.navigation &&
|
|
1167
|
-
event.options?.key) {
|
|
1168
|
-
const ref = attr.get().referential(attr);
|
|
1169
|
-
if (ref !== null && ref !== undefined) {
|
|
1170
|
-
Object.assign(self, ref);
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
self.events$.emit(event.push(self, attr));
|
|
1175
|
-
}
|
|
1176
|
-
});
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixjQUFjLEdBQ2YsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVF4QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QiwrQkFBK0IsRUFDL0IscUJBQXFCLEdBQ3RCLE1BQU0sY0FBYyxDQUFDO0FBT3RCLE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sVUFBVSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFFTCxzQkFBc0IsR0FDdkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixNQUFNLENBQU4sSUFBWSxtQkFZWDtBQVpELFdBQVksbUJBQW1CO0lBQzdCLHdDQUFpQixDQUFBO0lBQ2pCLHNDQUFlLENBQUE7SUFDZix3Q0FBaUIsQ0FBQTtJQUNqQixvQ0FBYSxDQUFBO0lBQ2IsMENBQW1CLENBQUE7SUFDbkIsa0NBQVcsQ0FBQTtJQUNYLHdDQUFpQixDQUFBO0lBQ2pCLDBDQUFtQixDQUFBO0lBQ25CLDBDQUFtQixD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YnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQ0lEX0ZJRUxEX05BTUUsXG4gIENPTVBVVEVELFxuICBERUZBVUxUX1ZFUlNJT04sXG4gIE9QVElNSVNUSUNfQ09OQ1VSUkVOQ1ksXG4gIEVWRU5UX1NQTElUVEVSLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHtcbiAgRW50aXR5S2V5LFxuICBPRGF0YVF1ZXJ5T3B0aW9ucyxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxuICBPRGF0YVJlc291cmNlLFxuICBPRGF0YVNpbmdsZXRvblJlc291cmNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHtcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFQcm9wZXJ0eVJlc291cmNlLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHtcbiAgT0RhdGFFbnRpdHlTZXQsXG4gIE9EYXRhRW51bVR5cGUsXG4gIE9EYXRhU3RydWN0dXJlZFR5cGUsXG4gIE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcixcbn0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7IEVkbVR5cGUsIFBhcnNlck9wdGlvbnMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBPYmplY3RzLCBUeXBlcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IE9EYXRhQ29sbGVjdGlvbiB9IGZyb20gJy4vY29sbGVjdGlvbic7XG5pbXBvcnQgeyBPRGF0YU1vZGVsIH0gZnJvbSAnLi9tb2RlbCc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbn0gZnJvbSAnLi4vYW5ub3RhdGlvbnMnO1xuXG5leHBvcnQgZW51bSBPRGF0YU1vZGVsRXZlbnRUeXBlIHtcbiAgQ2hhbmdlID0gJ2NoYW5nZScsXG4gIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgVXBkYXRlID0gJ3VwZGF0ZScsXG4gIFNvcnQgPSAnc29ydCcsXG4gIERlc3Ryb3kgPSAnZGVzdHJveScsXG4gIEFkZCA9ICdhZGQnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbiAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgUmVxdWVzdCA9ICdyZXF1ZXN0JyxcbiAgU3luYyA9ICdzeW5jJyxcbiAgQXR0YWNoID0gJ2F0dGFjaCcsXG59XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsRXZlbnQ8VD4ge1xuICB0eXBlOiBPRGF0YU1vZGVsRXZlbnRUeXBlIHwgc3RyaW5nO1xuICB2YWx1ZT86IGFueTtcbiAgcHJldmlvdXM/OiBhbnk7XG4gIG9wdGlvbnM/OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdHlwZTogT0RhdGFNb2RlbEV2ZW50VHlwZSB8IHN0cmluZyxcbiAgICB7XG4gICAgICBtb2RlbCxcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBwcmV2aW91cyxcbiAgICAgIHZhbHVlLFxuICAgICAgYXR0cixcbiAgICAgIG9wdGlvbnMsXG4gICAgICBidWJibGVzLFxuICAgICAgY2hhaW4sXG4gICAgfToge1xuICAgICAgbW9kZWw/OiBPRGF0YU1vZGVsPFQ+O1xuICAgICAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcbiAgICAgIGF0dHI/OiBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBudW1iZXI7XG4gICAgICBwcmV2aW91cz86IGFueTtcbiAgICAgIHZhbHVlPzogYW55O1xuICAgICAgb3B0aW9ucz86IGFueTtcbiAgICAgIGJ1YmJsZXM/OiBib29sZWFuO1xuICAgICAgY2hhaW4/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IG51bWJlciB8IG51bGwsXG4gICAgICBdW107XG4gICAgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgIHRoaXMucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmNoYWluID0gY2hhaW4gPz8gW1xuICAgICAgW1xuICAgICAgICAodGhpcy5tb2RlbCB8fCB0aGlzLmNvbGxlY3Rpb24pIGFzXG4gICAgICAgICAgfCBPRGF0YU1vZGVsPGFueT5cbiAgICAgICAgICB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIGF0dHIgfHwgbnVsbCxcbiAgICAgIF0sXG4gICAgXTtcbiAgICB0aGlzLmJ1YmJsZXMgPSBidWJibGVzID8/IEJVQkJMRVMuaW5kZXhPZih0aGlzLnR5cGUpICE9PSAtMTtcbiAgfVxuXG4gIGNoYWluOiBbXG4gICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBudW1iZXIgfCBudWxsLFxuICBdW107XG5cbiAgcHVzaChcbiAgICBtb2RlbDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICBhdHRyOiBPRGF0YU1vZGVsQXR0cmlidXRlPGFueT4gfCBudW1iZXIsXG4gICkge1xuICAgIHJldHVybiBuZXcgT0RhdGFNb2RlbEV2ZW50PGFueT4odGhpcy50eXBlLCB7XG4gICAgICBtb2RlbDogdGhpcy5tb2RlbCA/PyAobW9kZWwgaW5zdGFuY2VvZiBPRGF0YU1vZGVsID8gbW9kZWwgOiB1bmRlZmluZWQpLFxuICAgICAgY29sbGVjdGlvbjpcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uID8/XG4gICAgICAgIChtb2RlbCBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvblxuICAgICAgICAgID8gKG1vZGVsIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pXG4gICAgICAgICAgOiB1bmRlZmluZWQpLFxuICAgICAgcHJldmlvdXM6IHRoaXMucHJldmlvdXMsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgICBpbmRleDogYXR0ciBpbnN0YW5jZW9mIE9EYXRhTW9kZWxBdHRyaWJ1dGUgPyBhdHRyLm5hbWUgOiBhdHRyLFxuICAgICAgfSxcbiAgICAgIGJ1YmJsZXM6IHRoaXMuYnViYmxlcyxcbiAgICAgIGNoYWluOiBbW21vZGVsLCBhdHRyXSwgLi4udGhpcy5jaGFpbl0sXG4gICAgfSk7XG4gIH1cblxuICBidWJibGVzOiBib29sZWFuO1xuICBzdG9wUHJvcGFnYXRpb24oKSB7XG4gICAgdGhpcy5idWJibGVzID0gZmFsc2U7XG4gIH1cblxuICB2aXNpdGVkKG1vZGVsOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2hhaW4uc29tZSgoYykgPT4gY1swXSA9PT0gbW9kZWwpICYmXG4gICAgICB0aGlzLmNoYWluW3RoaXMuY2hhaW4ubGVuZ3RoIC0gMV1bMF0gIT09IG1vZGVsXG4gICAgKTtcbiAgfVxuXG4gIGNhbkNvbnRpbnVlV2l0aChzZWxmOiBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KSB7XG4gICAgcmV0dXJuIHRoaXMuYnViYmxlcyAmJiAhdGhpcy52aXNpdGVkKHNlbGYpO1xuICB9XG5cbiAgZ2V0IHBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2hhaW5cbiAgICAgIC5tYXAoKFssIGF0dHJdLCBpbmRleCkgPT5cbiAgICAgICAgdHlwZW9mIGF0dHIgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBgWyR7YXR0cn1dYFxuICAgICAgICAgIDogYXR0ciBpbnN0YW5jZW9mIE9EYXRhTW9kZWxBdHRyaWJ1dGVcbiAgICAgICAgICAgID8gaW5kZXggPT09IDBcbiAgICAgICAgICAgICAgPyBhdHRyLm5hbWVcbiAgICAgICAgICAgICAgOiBgLiR7YXR0ci5uYW1lfWBcbiAgICAgICAgICAgIDogJycsXG4gICAgICApXG4gICAgICAuam9pbignJyk7XG4gIH1cblxuICAvL1JlZmVyZW5jZSB0byB0aGUgbW9kZWwgd2hpY2ggdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkXG4gIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgLy9JZGVudGlmaWVzIHRoZSBjdXJyZW50IG1vZGVsIGZvciB0aGUgZXZlbnRcbiAgZ2V0IGN1cnJlbnRNb2RlbCgpOiBPRGF0YU1vZGVsPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNoYWluLmZpbmQoKGMpID0+IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoY1swXSkpO1xuICAgIHJldHVybiBsaW5rICE9PSB1bmRlZmluZWQgPyAobGlua1swXSBhcyBPRGF0YU1vZGVsPGFueT4pIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy9SZWZlcmVuY2UgdG8gdGhlIGNvbGxlY3Rpb24gd2hpY2ggdGhlIGV2ZW50IHdhcyBkaXNwYXRjaGVkXG4gIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gIC8vSWRlbnRpZmllcyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIGZvciB0aGUgZXZlbnRcbiAgZ2V0IGN1cnJlbnRDb2xsZWN0aW9uKCk6IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbmsgPSB0aGlzLmNoYWluLmZpbmQoKGMpID0+IE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjWzBdKSk7XG4gICAgcmV0dXJuIGxpbmsgIT09IHVuZGVmaW5lZFxuICAgICAgPyAobGlua1swXSBhcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD4gZXh0ZW5kcyBFdmVudEVtaXR0ZXI8XG4gIE9EYXRhTW9kZWxFdmVudDxUPlxuPiB7XG4gIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgbW9kZWwsXG4gICAgY29sbGVjdGlvbixcbiAgfToge1xuICAgIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICB9ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICB9XG5cbiAgdHJpZ2dlcihcbiAgICB0eXBlOiBPRGF0YU1vZGVsRXZlbnRUeXBlIHwgc3RyaW5nLFxuICAgIHtcbiAgICAgIGNvbGxlY3Rpb24sXG4gICAgICBwcmV2aW91cyxcbiAgICAgIHZhbHVlLFxuICAgICAgYXR0cixcbiAgICAgIG9wdGlvbnMsXG4gICAgICBidWJibGVzLFxuICAgIH06IHtcbiAgICAgIGNvbGxlY3Rpb24/OiBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj47XG4gICAgICBhdHRyPzogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgbnVtYmVyO1xuICAgICAgcHJldmlvdXM/OiBhbnk7XG4gICAgICB2YWx1ZT86IGFueTtcbiAgICAgIG9wdGlvbnM/OiBhbnk7XG4gICAgICBidWJibGVzPzogYm9vbGVhbjtcbiAgICB9ID0ge30sXG4gICkge1xuICAgIGNvbnN0IF90cmlnZ2VyID0gKG5hbWU6IHN0cmluZykgPT5cbiAgICAgIHRoaXMuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChuYW1lLCB7XG4gICAgICAgICAgbW9kZWw6IHRoaXMubW9kZWwsXG4gICAgICAgICAgY29sbGVjdGlvbjogY29sbGVjdGlvbiA/PyB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICAgICAgcHJldmlvdXMsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgYXR0cixcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgIGJ1YmJsZXMsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICBpZiAodHlwZSAmJiBFVkVOVF9TUExJVFRFUi50ZXN0KHR5cGUpKSB7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdHlwZS5zcGxpdChFVkVOVF9TUExJVFRFUikpIHtcbiAgICAgICAgX3RyaWdnZXIobmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF90cmlnZ2VyKHR5cGUpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQlVCQkxFUzogKE9EYXRhTW9kZWxFdmVudFR5cGUgfCBzdHJpbmcpW10gPSBbXG4gIE9EYXRhTW9kZWxFdmVudFR5cGUuQ2hhbmdlLFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLlJlc2V0LFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSxcbiAgT0RhdGFNb2RlbEV2ZW50VHlwZS5EZXN0cm95LFxuICBPRGF0YU1vZGVsRXZlbnRUeXBlLkFkZCxcbiAgT0RhdGFNb2RlbEV2ZW50VHlwZS5SZW1vdmUsXG5dO1xuXG5leHBvcnQgY29uc3QgSU5DTFVERV9TSEFMTE9XID0ge1xuICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICBpbmNsdWRlX2NvbXB1dGVkOiB0cnVlLFxuICBpbmNsdWRlX2tleTogdHJ1ZSxcbiAgaW5jbHVkZV9pZDogZmFsc2UsXG59O1xuXG5leHBvcnQgY29uc3QgSU5DTFVERV9ERUVQID0ge1xuICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gIGluY2x1ZGVfbm9uX2ZpZWxkOiB0cnVlLFxuICAuLi5JTkNMVURFX1NIQUxMT1csXG59O1xuXG5leHBvcnQgZW51bSBPRGF0YU1vZGVsU3RhdGUge1xuICBBZGRlZCxcbiAgUmVtb3ZlZCxcbiAgVW5jaGFuZ2VkLFxufVxuXG5leHBvcnQgdHlwZSBNb2RlbE9wdGlvbnMgPSB7XG4gIGNpZD86IHN0cmluZztcbiAgZmllbGRzOiBNYXA8c3RyaW5nLCBNb2RlbEZpZWxkT3B0aW9ucz47XG59O1xuXG5leHBvcnQgdHlwZSBNb2RlbEZpZWxkT3B0aW9ucyA9IHtcbiAgZmllbGQ/OiBzdHJpbmc7XG4gIHBhcnNlcj86IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+O1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGNvbmN1cnJlbmN5PzogYm9vbGVhbjtcbiAgbWF4TGVuZ3RoPzogbnVtYmVyO1xuICBtaW5MZW5ndGg/OiBudW1iZXI7XG4gIG1pbj86IG51bWJlcjtcbiAgbWF4PzogbnVtYmVyO1xuICBwYXR0ZXJuPzogUmVnRXhwO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIE1vZGVsKHsgY2lkID0gQ0lEX0ZJRUxEX05BTUUgfTogeyBjaWQ/OiBzdHJpbmcgfSA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IHt9IH0+KGNvbnN0cnVjdG9yOiBUKSA9PiB7XG4gICAgY29uc3QgS2xhc3MgPSA8YW55PmNvbnN0cnVjdG9yO1xuICAgIGlmICghS2xhc3MuaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKSlcbiAgICAgIEtsYXNzLm9wdGlvbnMgPSB7XG4gICAgICAgIGZpZWxkczogbmV3IE1hcDxzdHJpbmcsIE1vZGVsRmllbGRPcHRpb25zPigpLFxuICAgICAgfSBhcyBNb2RlbE9wdGlvbnM7XG4gICAgS2xhc3Mub3B0aW9ucy5jaWQgPSBjaWQ7XG4gICAgcmV0dXJuIGNvbnN0cnVjdG9yO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gTW9kZWxGaWVsZCh7XG4gIG5hbWUsXG4gIC4uLm9wdGlvbnNcbn06IHsgbmFtZT86IHN0cmluZyB9ICYgTW9kZWxGaWVsZE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBrZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IEtsYXNzID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICAgIGlmICghS2xhc3MuaGFzT3duUHJvcGVydHkoJ29wdGlvbnMnKSlcbiAgICAgIEtsYXNzLm9wdGlvbnMgPSB7XG4gICAgICAgIGZpZWxkczogbmV3IE1hcDxzdHJpbmcsIE1vZGVsRmllbGRPcHRpb25zPigpLFxuICAgICAgfSBhcyBNb2RlbE9wdGlvbnM7XG4gICAgb3B0aW9ucy5maWVsZCA9IG5hbWUgPz8ga2V5O1xuICAgIEtsYXNzLm9wdGlvbnMuZmllbGRzLnNldChrZXksIG9wdGlvbnMpO1xuICB9O1xufVxuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsRmllbGRPcHRpb25zPEY+ID0gTW9kZWxGaWVsZE9wdGlvbnMgJiB7XG4gIG5hbWU6IHN0cmluZztcbiAgZmllbGQ6IHN0cmluZztcbiAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj47XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbEZpZWxkPEY+IHtcbiAgbmFtZTogc3RyaW5nO1xuICBmaWVsZDogc3RyaW5nO1xuICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPjtcbiAgb3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgb3B0aW9uc0ZvclR5cGU/OiAodHlwZTogc3RyaW5nKSA9PiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICBtb2RlbEZvclR5cGU/OiAodDogc3RyaW5nKSA9PiB0eXBlb2YgT0RhdGFNb2RlbDxhbnk+IHwgdW5kZWZpbmVkO1xuICBjb2xsZWN0aW9uRm9yVHlwZT86IChcbiAgICB0OiBzdHJpbmcsXG4gICkgPT4gdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4gfCB1bmRlZmluZWQ7XG4gIGVudW1Gb3JUeXBlPzogKHQ6IHN0cmluZykgPT4gT0RhdGFFbnVtVHlwZTxGPiB8IHVuZGVmaW5lZDtcbiAgc3RydWN0dXJlZEZvclR5cGU/OiAodDogc3RyaW5nKSA9PiBPRGF0YVN0cnVjdHVyZWRUeXBlPEY+IHwgdW5kZWZpbmVkO1xuICBkZWZhdWx0PzogYW55O1xuICByZXF1aXJlZDogYm9vbGVhbjtcbiAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbiAgcGFyc2VyT3B0aW9ucz86IFBhcnNlck9wdGlvbnM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PixcbiAgICB7IG5hbWUsIGZpZWxkLCBwYXJzZXIsIC4uLm9wdHMgfTogT0RhdGFNb2RlbEZpZWxkT3B0aW9uczxGPixcbiAgKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZmllbGQgPSBmaWVsZDtcbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB0aGlzLmRlZmF1bHQgPSBvcHRzLmRlZmF1bHQgfHwgcGFyc2VyLmRlZmF1bHQ7XG4gICAgdGhpcy5yZXF1aXJlZCA9IEJvb2xlYW4ob3B0cy5yZXF1aXJlZCB8fCAhcGFyc2VyLm51bGxhYmxlKTtcbiAgICB0aGlzLmNvbmN1cnJlbmN5ID0gQm9vbGVhbihvcHRzLmNvbmN1cnJlbmN5KTtcbiAgICB0aGlzLm1heExlbmd0aCA9IG9wdHMubWF4TGVuZ3RoIHx8IHBhcnNlci5tYXhMZW5ndGg7XG4gICAgdGhpcy5taW5MZW5ndGggPSBvcHRzLm1pbkxlbmd0aDtcbiAgICB0aGlzLm1pbiA9IG9wdHMubWluO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXg7XG4gICAgdGhpcy5wYXR0ZXJuID0gb3B0cy5wYXR0ZXJuO1xuICB9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnR5cGU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIubmF2aWdhdGlvbjtcbiAgfVxuXG4gIGdldCBjb2xsZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5jb2xsZWN0aW9uO1xuICB9XG5cbiAgYW5ub3RhdGVkVmFsdWU8VD4odGVybTogc3RyaW5nIHwgUmVnRXhwKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmFubm90YXRlZFZhbHVlPFQ+KHRlcm0pO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBvcHRpb25zRm9yVHlwZSxcbiAgICBtb2RlbEZvclR5cGUsXG4gICAgY29sbGVjdGlvbkZvclR5cGUsXG4gICAgZW51bUZvclR5cGUsXG4gICAgc3RydWN0dXJlZEZvclR5cGUsXG4gICAgY29uY3VycmVuY3ksXG4gICAgb3B0aW9ucyxcbiAgfToge1xuICAgIG9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIG1vZGVsRm9yVHlwZTogKHQ6IHN0cmluZykgPT4gdHlwZW9mIE9EYXRhTW9kZWw8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb2xsZWN0aW9uRm9yVHlwZTogKFxuICAgICAgdDogc3RyaW5nLFxuICAgICkgPT4gdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZW51bUZvclR5cGU6ICh0OiBzdHJpbmcpID0+IE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBzdHJ1Y3R1cmVkRm9yVHlwZTogKHQ6IHN0cmluZykgPT4gT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbmN1cnJlbmN5OiBib29sZWFuO1xuICAgIG9wdGlvbnM6IFBhcnNlck9wdGlvbnM7XG4gIH0pIHtcbiAgICB0aGlzLm9wdGlvbnNGb3JUeXBlID0gb3B0aW9uc0ZvclR5cGU7XG4gICAgdGhpcy5tb2RlbEZvclR5cGUgPSBtb2RlbEZvclR5cGU7XG4gICAgdGhpcy5jb2xsZWN0aW9uRm9yVHlwZSA9IGNvbGxlY3Rpb25Gb3JUeXBlO1xuICAgIHRoaXMuZW51bUZvclR5cGUgPSBlbnVtRm9yVHlwZTtcbiAgICB0aGlzLnN0cnVjdHVyZWRGb3JUeXBlID0gc3RydWN0dXJlZEZvclR5cGU7XG4gICAgdGhpcy5wYXJzZXJPcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAoY29uY3VycmVuY3kpIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgICBpZiAodGhpcy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlc2VyaWFsaXplKHRoaXMuZGVmYXVsdCwgb3B0aW9ucyk7XG4gIH1cblxuICBpc0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNLZXkoKTtcbiAgfVxuXG4gIGhhc1JlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaGFzUmVmZXJlbnRpYWxzKCk7XG4gIH1cblxuICBnZXQgcmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5yZWZlcmVudGlhbHM7XG4gIH1cblxuICBpc1N0cnVjdHVyZWRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc1N0cnVjdHVyZWRUeXBlKCk7XG4gIH1cblxuICBzdHJ1Y3R1cmVkVHlwZSgpIHtcbiAgICBjb25zdCBzdHJ1Y3R1cmVkVHlwZSA9IHRoaXMuc3RydWN0dXJlZEZvclR5cGVcbiAgICAgID8gdGhpcy5zdHJ1Y3R1cmVkRm9yVHlwZSh0aGlzLnR5cGUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmICghc3RydWN0dXJlZFR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIHN0cnVjdHVyZWQgdHlwZSBmb3IgJHt0aGlzLnBhcnNlci50eXBlfWApO1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkVHlwZTtcbiAgfVxuXG4gIGlzRW51bVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmlzRW51bVR5cGUoKTtcbiAgfVxuXG4gIGVudW1UeXBlKCkge1xuICAgIGNvbnN0IGVudW1UeXBlID0gdGhpcy5lbnVtRm9yVHlwZSA/IHRoaXMuZW51bUZvclR5cGUodGhpcy50eXBlKSA6IHVuZGVmaW5lZDtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmICghZW51bVR5cGUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGVudW0gdHlwZSBmb3IgJHt0aGlzLnBhcnNlci50eXBlfWApO1xuICAgIHJldHVybiBlbnVtVHlwZTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHZhbHVlOiBhbnksXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICByZXR1cm4gIXZhbHVlLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgPyB2YWx1ZS5fZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgICAgIC5tb2RlbHMoKVxuICAgICAgICAuc29tZSgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiAhbS5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKVxuICAgICAgICA/IHZhbHVlLm1vZGVscygpLm1hcCgobTogT0RhdGFNb2RlbDxhbnk+KSA9PiBtLl9lcnJvcnMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjb21wdXRlZCA9IHRoaXMuYW5ub3RhdGVkVmFsdWU8Ym9vbGVhbj4oQ09NUFVURUQpO1xuICAgICAgY29uc3QgZXJyb3JzID0gdGhpcy5wYXJzZXI/LnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZXF1aXJlZCAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpICYmIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICAgICEoY29tcHV0ZWQgJiYgbWV0aG9kID09PSAnY3JlYXRlJykgLy8gTm90IChJcyBDb21wdXRlZCBmaWVsZCBhbmQgY3JlYXRlKSA/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzWydwdXNoJ10oYG1pbmxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPCB0aGlzLm1pblxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBtaW5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gdGhpcy5tYXhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnNbJ3B1c2gnXShgbWF4YCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGF0dGVybiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgIXRoaXMucGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9yc1sncHVzaCddKGBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0cygpOiBhbnkge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLm9wdGlvbnNGb3JUeXBlXG4gICAgICA/IHRoaXMub3B0aW9uc0ZvclR5cGUodGhpcy50eXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmIG1ldGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyBtZXRhLmRlZmF1bHRzKClcbiAgICAgIDogdGhpcy5kZWZhdWx0O1xuICB9XG5cbiAgZGVzZXJpYWxpemUodmFsdWU6IGFueSwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBGIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0gb3B0aW9ucyA/PyB0aGlzLnBhcnNlck9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSh2YWx1ZTogRiwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSBvcHRpb25zID8/IHRoaXMucGFyc2VyT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIGVuY29kZSh2YWx1ZTogRiwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSBvcHRpb25zID8/IHRoaXMucGFyc2VyT3B0aW9ucztcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuZW5jb2RlKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIHJlc291cmNlRmFjdG9yeTxULCBGPihcbiAgICBiYXNlOiBPRGF0YVJlc291cmNlPFQ+LFxuICApOiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPEY+IHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPEY+IHtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yIG5vbiBjb21wYXRpYmxlIGJhc2UgdHlwZVwiKTtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uXG4gICAgICA/IChiYXNlIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pLm5hdmlnYXRpb25Qcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKVxuICAgICAgOiAoYmFzZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5wcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKTtcbiAgfVxuXG4gIGFubm90YXRpb25zRmFjdG9yeTxULCBGPihcbiAgICBiYXNlOiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+LFxuICApOiBPRGF0YUVudGl0eUFubm90YXRpb25zPEY+IHwgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPEY+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuY29sbGVjdGlvblxuICAgICAgPyBiYXNlLnByb3BlcnR5KHRoaXMucGFyc2VyLm5hbWUgYXMga2V5b2YgVCwgJ2NvbGxlY3Rpb24nKVxuICAgICAgOiBiYXNlLnByb3BlcnR5KHRoaXMucGFyc2VyLm5hbWUgYXMga2V5b2YgVCwgJ3NpbmdsZScpO1xuICB9XG5cbiAgbW9kZWxGYWN0b3J5PEY+KHtcbiAgICBwYXJlbnQsXG4gICAgdmFsdWUsXG4gICAgcmVzZXQsXG4gIH06IHtcbiAgICBwYXJlbnQ6IE9EYXRhTW9kZWw8YW55PjtcbiAgICB2YWx1ZT86IFBhcnRpYWw8Rj4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsPEY+IHtcbiAgICAvLyBNb2RlbFxuICAgIGNvbnN0IGFubm90cyA9IHRoaXMuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgcGFyZW50LmFubm90cygpLFxuICAgICkgYXMgT0RhdGFFbnRpdHlBbm5vdGF0aW9uczxGPjtcbiAgICBsZXQgTW9kZWwgPSB0aGlzLm1vZGVsRm9yVHlwZSA/IHRoaXMubW9kZWxGb3JUeXBlKHRoaXMudHlwZSkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQpIHRocm93IEVycm9yKGBObyBNb2RlbCB0eXBlIGZvciAke3RoaXMubmFtZX1gKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYW5ub3RzLnVwZGF0ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGFubm90cz8udHlwZSAhPT0gdW5kZWZpbmVkICYmIE1vZGVsLm1ldGEgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBNb2RlbC5tZXRhLmZpbmRDaGlsZE9wdGlvbnMoKG8pID0+XG4gICAgICAgIG8uaXNUeXBlT2YoYW5ub3RzLnR5cGUgYXMgc3RyaW5nKSxcbiAgICAgICk/LnN0cnVjdHVyZWRUeXBlO1xuICAgICAgaWYgKG1ldGEgIT09IHVuZGVmaW5lZCAmJiBtZXRhLm1vZGVsICE9PSB1bmRlZmluZWQpXG4gICAgICAgIC8vIENoYW5nZSB0byBjaGlsZCBtb2RlbFxuICAgICAgICBNb2RlbCA9IG1ldGEubW9kZWw7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBNb2RlbCgodmFsdWUgfHwge30pIGFzIFBhcnRpYWw8Rj4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgYW5ub3RzLFxuICAgICAgcmVzZXQsXG4gICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgIH0pO1xuICB9XG5cbiAgY29sbGVjdGlvbkZhY3Rvcnk8Rj4oe1xuICAgIHBhcmVudCxcbiAgICB2YWx1ZSxcbiAgICByZXNldCxcbiAgfToge1xuICAgIHBhcmVudDogT0RhdGFNb2RlbDxhbnk+O1xuICAgIHZhbHVlPzogUGFydGlhbDxGPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4ge1xuICAgIC8vIENvbGxlY3Rpb24gRmFjdG9yeVxuICAgIGNvbnN0IGFubm90cyA9IHRoaXMuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgcGFyZW50LmFubm90cygpLFxuICAgICkgYXMgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPEY+O1xuICAgIGNvbnN0IENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25Gb3JUeXBlXG4gICAgICA/IHRoaXMuY29sbGVjdGlvbkZvclR5cGUodGhpcy50eXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKENvbGxlY3Rpb24gPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IEVycm9yKGBObyBDb2xsZWN0aW9uIHR5cGUgZm9yICR7dGhpcy5uYW1lfWApO1xuICAgIHJldHVybiBuZXcgQ29sbGVjdGlvbihcbiAgICAgICh2YWx1ZSB8fCBbXSkgYXMgUGFydGlhbDxGPltdIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXSxcbiAgICAgIHtcbiAgICAgICAgYW5ub3RzOiBhbm5vdHMsXG4gICAgICAgIHJlc2V0LFxuICAgICAgICBwYXJlbnQ6IFtwYXJlbnQsIHRoaXNdLFxuICAgICAgfSxcbiAgICApIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbEF0dHJpYnV0ZTxUPiB7XG4gIHByaXZhdGUgdmFsdWU/OiBUIHwgT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PiB8IG51bGw7XG4gIHByaXZhdGUgY2hhbmdlPzogVCB8IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4gfCBudWxsO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgZXZlbnRzJCA9IG5ldyBPRGF0YU1vZGVsRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbW9kZWw6IE9EYXRhTW9kZWw8YW55PixcbiAgICBwcml2YXRlIF9maWVsZDogT0RhdGFNb2RlbEZpZWxkPFQ+LFxuICApIHt9XG5cbiAgZ2V0IHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkLnR5cGU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQubmF2aWdhdGlvbjtcbiAgfVxuXG4gIGdldCBjb21wdXRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGQuYW5ub3RhdGVkVmFsdWU8Ym9vbGVhbj4oQ09NUFVURUQpO1xuICB9XG5cbiAgZ2V0IGNvbmN1cnJlbmN5KCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2ZpZWxkLmNvbmN1cnJlbmN5KTtcbiAgfVxuXG4gIGdldCByZWZlcmVudGlhbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkLnJlZmVyZW50aWFscztcbiAgfVxuXG4gIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLl9maWVsZC5vcHRpb25zO1xuICB9XG5cbiAgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkLm5hbWU7XG4gIH1cblxuICBnZXQgZmllbGROYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9maWVsZC5maWVsZDtcbiAgfVxuXG4gIGdldCgpOlxuICAgIHwgVFxuICAgIHwgT0RhdGFNb2RlbDxUPlxuICAgIHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+XG4gICAgfCBudWxsXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmNoYW5nZSAhPT0gdW5kZWZpbmVkID8gdGhpcy5jaGFuZ2UgOiB0aGlzLnZhbHVlO1xuICB9XG5cbiAgc2V0KFxuICAgIHZhbHVlOlxuICAgICAgfCBUXG4gICAgICB8IE9EYXRhTW9kZWw8VD5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+XG4gICAgICB8IG51bGxcbiAgICAgIHwgdW5kZWZpbmVkLFxuICAgIHJlc2V0OiBib29sZWFuID0gZmFsc2UsXG4gICAgcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuZ2V0KCk7XG5cbiAgICBpZiAoXG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oY3VycmVudClcbiAgICApXG4gICAgICB0aGlzLnVubGluayhcbiAgICAgICAgY3VycmVudCBhcyBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+LFxuICAgICAgICAvL3RoaXMudmFsdWUgIT09IGN1cnJlbnRcbiAgICAgICk7XG5cbiAgICBjb25zdCBjaGFuZ2VkID1cbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoY3VycmVudCkgJiYgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSlcbiAgICAgICAgPyAhKGN1cnJlbnQgYXMgT0RhdGFNb2RlbDxUPikuZXF1YWxzKHZhbHVlIGFzIE9EYXRhTW9kZWw8VD4pXG4gICAgICAgIDogT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKGN1cnJlbnQpICYmXG4gICAgICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpXG4gICAgICAgICAgPyAhKGN1cnJlbnQgYXMgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+KS5lcXVhbHMoXG4gICAgICAgICAgICAgIHZhbHVlIGFzIE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PixcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6ICFUeXBlcy5pc0VxdWFsKGN1cnJlbnQsIHZhbHVlKTtcbiAgICBpZiAocmVzZXQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuY2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNFcXVhbCh2YWx1ZSwgdGhpcy52YWx1ZSkpIHtcbiAgICAgIHRoaXMuY2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlZCkge1xuICAgICAgdGhpcy5jaGFuZ2UgPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMubGluayhcbiAgICAgICAgdmFsdWUgYXMgT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PixcbiAgICAgICAgcmVwYXJlbnQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIGlzQ2hhbmdlZCh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30pOiBib29sZWFuIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5nZXQoKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jaGFuZ2UgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgKChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpIHx8XG4gICAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihjdXJyZW50KSkgJiZcbiAgICAgICAgKFxuICAgICAgICAgIGN1cnJlbnQgYXMgT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PlxuICAgICAgICApLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpXG4gICAgKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodGhpcy5jaGFuZ2UpIHx8XG4gICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odGhpcy5jaGFuZ2UpXG4gICAgKVxuICAgICAgdGhpcy51bmxpbmsoXG4gICAgICAgIHRoaXMuY2hhbmdlIGFzIE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgICApO1xuICAgIHRoaXMuY2hhbmdlID0gdW5kZWZpbmVkO1xuICAgIGlmIChcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodGhpcy52YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih0aGlzLnZhbHVlKVxuICAgIClcbiAgICAgIHRoaXMubGluayhcbiAgICAgICAgdGhpcy52YWx1ZSBhcyBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+LFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbGluayhcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PixcbiAgICByZXBhcmVudDogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHZhbHVlLmV2ZW50cyQuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmV2ZW50cyQuZW1pdChlKSk7XG4gICAgaWYgKHJlcGFyZW50KSB7XG4gICAgICB2YWx1ZS5fcGFyZW50ID0gW3RoaXMuX21vZGVsLCB0aGlzLl9maWVsZF07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bmxpbmsoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4sXG4gICAgcmVwYXJlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgaWYgKHJlcGFyZW50KSB7XG4gICAgICB2YWx1ZS5fcGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEVudHJ5PFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PiA9IHtcbiAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZTtcbiAgbW9kZWw6IE07XG4gIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbE9wdGlvbnM8VD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNpZDogc3RyaW5nO1xuICBiYXNlPzogc3RyaW5nO1xuICBwcml2YXRlIF9maWVsZHM6IE9EYXRhTW9kZWxGaWVsZDxhbnk+W10gPSBbXTtcbiAgc3RydWN0dXJlZFR5cGU6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIGVudGl0eVNldD86IE9EYXRhRW50aXR5U2V0O1xuICAvLyBIaWVyYXJjaHlcbiAgcGFyZW50PzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgY2hpbGRyZW46IE9EYXRhTW9kZWxPcHRpb25zPGFueT5bXSA9IFtdO1xuICBldmVudHMkID0gbmV3IE9EYXRhTW9kZWxFdmVudEVtaXR0ZXI8VD4oKTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgY29uZmlnLFxuICAgIHN0cnVjdHVyZWRUeXBlLFxuICB9OiB7XG4gICAgY29uZmlnOiBNb2RlbE9wdGlvbnM7XG4gICAgc3RydWN0dXJlZFR5cGU6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIH0pIHtcbiAgICB0aGlzLm5hbWUgPSBzdHJ1Y3R1cmVkVHlwZS5uYW1lO1xuICAgIHRoaXMuYmFzZSA9IHN0cnVjdHVyZWRUeXBlLmJhc2U7XG4gICAgdGhpcy5zdHJ1Y3R1cmVkVHlwZSA9IHN0cnVjdHVyZWRUeXBlO1xuICAgIHRoaXMuY2lkID0gY29uZmlnPy5jaWQgPz8gQ0lEX0ZJRUxEX05BTUU7XG4gICAgY29uZmlnLmZpZWxkcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB0aGlzLmFkZEZpZWxkPGFueT4oa2V5LCB2YWx1ZSkpO1xuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVkVHlwZS5hcGk7XG4gIH1cblxuICB0eXBlKHsgYWxpYXMgPSBmYWxzZSB9OiB7IGFsaWFzPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVkVHlwZS50eXBlKHsgYWxpYXMgfSk7XG4gIH1cblxuICBpc09wZW5UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnN0cnVjdHVyZWRUeXBlLmlzT3BlblR5cGUoKTtcbiAgfVxuXG4gIGlzRW50aXR5VHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJ1Y3R1cmVkVHlwZS5pc0VudGl0eVR5cGUoKTtcbiAgfVxuXG4gIGlzQ29tcGxleFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlZFR5cGUuaXNDb21wbGV4VHlwZSgpO1xuICB9XG5cbiAgaXNUeXBlT2YodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlZFR5cGUudHlwZSgpID09PSB0eXBlO1xuICB9XG5cbiAgaXNNb2RlbEZvcihlbnRpdHk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSkge1xuICAgIC8vIFJlc29sdmUgQnkgVHlwZVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmFwaS5vcHRpb25zLmhlbHBlci50eXBlKFxuICAgICAgZW50aXR5IGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgICk7XG4gICAgaWYgKHR5cGUgJiYgdGhpcy5pc1R5cGVPZih0eXBlKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gUmVzb2x2ZSBCeSBmaWVsZHNcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZW50aXR5IGFzIHsgW25hbWU6IHN0cmluZ106IGFueSB9KTtcbiAgICBjb25zdCBuYW1lcyA9IHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5tYXAoKGYpID0+IGYubmFtZSk7XG4gICAgcmV0dXJuIGtleXMuZXZlcnkoKGtleSkgPT4gbmFtZXMuaW5jbHVkZXMoa2V5KSk7XG4gIH1cblxuICBmaW5kQ2hpbGRPcHRpb25zKFxuICAgIHByZWRpY2F0ZTogKG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4pID0+IGJvb2xlYW4sXG4gICk6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcmVkaWNhdGUodGhpcykpIHJldHVybiB0aGlzO1xuICAgIGxldCBtYXRjaDogT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIG1hdGNoID0gY2guZmluZENoaWxkT3B0aW9ucyhwcmVkaWNhdGUpO1xuICAgICAgaWYgKG1hdGNoICE9PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH1cblxuICBjb25maWd1cmUoeyBvcHRpb25zIH06IHsgb3B0aW9uczogUGFyc2VyT3B0aW9ucyB9KSB7XG4gICAgaWYgKHRoaXMuYmFzZSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5hcGkub3B0aW9uc0ZvclR5cGUoXG4gICAgICAgIHRoaXMuYmFzZSxcbiAgICAgICkgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuICAgIHRoaXMuZW50aXR5U2V0ID0gdGhpcy5hcGkuZmluZEVudGl0eVNldEZvckVudGl0eVR5cGUodGhpcy50eXBlKCkpO1xuICAgIGxldCBjb25jdXJyZW5jeUZpZWxkczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAodGhpcy5lbnRpdHlTZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uY3VycmVuY3lGaWVsZHMgPVxuICAgICAgICB0aGlzLmVudGl0eVNldC5hbm5vdGF0ZWRWYWx1ZTxzdHJpbmdbXT4oT1BUSU1JU1RJQ19DT05DVVJSRU5DWSkgfHwgW107XG4gICAgfVxuICAgIHRoaXMuX2ZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeUZpZWxkcy5pbmRleE9mKGZpZWxkLmZpZWxkKSAhPT0gLTE7XG4gICAgICBmaWVsZC5jb25maWd1cmUoe1xuICAgICAgICBvcHRpb25zRm9yVHlwZTogKHQ6IHN0cmluZykgPT4gdGhpcy5hcGkub3B0aW9uc0ZvclR5cGUodCksXG4gICAgICAgIG1vZGVsRm9yVHlwZTogKHQ6IHN0cmluZykgPT4gdGhpcy5hcGkubW9kZWxGb3JUeXBlKHQpLFxuICAgICAgICBjb2xsZWN0aW9uRm9yVHlwZTogKHQ6IHN0cmluZykgPT4gdGhpcy5hcGkuY29sbGVjdGlvbkZvclR5cGUodCksXG4gICAgICAgIGVudW1Gb3JUeXBlOiAodDogc3RyaW5nKSA9PiB0aGlzLmFwaS5maW5kRW51bVR5cGUodCksXG4gICAgICAgIHN0cnVjdHVyZWRGb3JUeXBlOiAodDogc3RyaW5nKSA9PiB0aGlzLmFwaS5maW5kU3RydWN0dXJlZFR5cGUodCksXG4gICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmaWVsZHMoe1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICBpbmNsdWRlX3BhcmVudHMsXG4gIH06IHtcbiAgICBpbmNsdWRlX3BhcmVudHM6IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBib29sZWFuO1xuICB9KTogT0RhdGFNb2RlbEZpZWxkPGFueT5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihpbmNsdWRlX3BhcmVudHMgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucGFyZW50LmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbiwgaW5jbHVkZV9wYXJlbnRzIH0pXG4gICAgICAgIDogW10pLFxuICAgICAgLi4udGhpcy5fZmllbGRzLmZpbHRlcihcbiAgICAgICAgKGZpZWxkKSA9PiBpbmNsdWRlX25hdmlnYXRpb24gfHwgIWZpZWxkLm5hdmlnYXRpb24sXG4gICAgICApLFxuICAgIF07XG4gIH1cblxuICBmaWVsZDxGPihuYW1lOiBrZXlvZiBUIHwgc3RyaW5nKSB7XG4gICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZDxGPihuYW1lKTtcbiAgICAvL1Rocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIGlmICghZmllbGQpIHRocm93IG5ldyBFcnJvcihgTm8gZmllbGQgd2l0aCBuYW1lICR7bmFtZSBhcyBzdHJpbmd9YCk7XG4gICAgcmV0dXJuIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxGPjtcbiAgfVxuXG4gIGZpbmRGaWVsZDxGPihcbiAgICBuYW1lOiBrZXlvZiBUIHwgc3RyaW5nLFxuICAgIHsgcmVzZXQgfTogeyByZXNldD86IGJvb2xlYW4gfSA9IHt9LFxuICApOiBPRGF0YU1vZGVsRmllbGQ8Rj4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZChcbiAgICAgIChtb2RlbEZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4pID0+XG4gICAgICAgIChyZXNldCAmJiBtb2RlbEZpZWxkLmZpZWxkID09PSBuYW1lKSB8fCBtb2RlbEZpZWxkLm5hbWUgPT09IG5hbWUsXG4gICAgKSBhcyBPRGF0YU1vZGVsRmllbGQ8Rj4gfCB1bmRlZmluZWQ7XG4gIH1cblxuICBhZGRGaWVsZDxGPihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IE1vZGVsRmllbGRPcHRpb25zKSB7XG4gICAgY29uc3QgeyBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH0gPSBvcHRpb25zO1xuICAgIGlmIChmaWVsZCA9PT0gdW5kZWZpbmVkIHx8IG5hbWUgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgUHJvcGVydGllcyBuZWVkIG5hbWUgYW5kIGZpZWxkJyk7XG4gICAgY29uc3QgZmllbGRQYXJzZXIgPVxuICAgICAgcGFyc2VyID8/IHRoaXMuc3RydWN0dXJlZFR5cGUuZmllbGQ8Rj4oZmllbGQgYXMga2V5b2YgVCk7XG4gICAgaWYgKGZpZWxkUGFyc2VyID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBhcnNlciBmb3IgJHtmaWVsZH0gd2l0aCBuYW1lID0gJHtuYW1lfWApO1xuICAgIGNvbnN0IG1vZGVsRmllbGQgPSBuZXcgT0RhdGFNb2RlbEZpZWxkPEY+KHRoaXMsIHtcbiAgICAgIG5hbWUsXG4gICAgICBmaWVsZCxcbiAgICAgIHBhcnNlcjogZmllbGRQYXJzZXIsXG4gICAgICAuLi5vcHRzLFxuICAgIH0pO1xuICAgIHRoaXMuX2ZpZWxkcy5wdXNoKG1vZGVsRmllbGQpO1xuICAgIHJldHVybiBtb2RlbEZpZWxkO1xuICB9XG5cbiAgdHNUb0VkbTogUmVjb3JkPHN0cmluZywgRWRtVHlwZT4gPSB7XG4gICAgc3RyaW5nOiBFZG1UeXBlLlN0cmluZyxcbiAgICBudW1iZXI6IEVkbVR5cGUuSW50MzIsXG4gICAgYmlnaW50OiBFZG1UeXBlLkludDY0LFxuICAgIGJvb2xlYW46IEVkbVR5cGUuQm9vbGVhbixcbiAgfTtcbiAgcHJpdmF0ZSBtb2RlbEZpZWxkRmFjdG9yeTxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB0eXBlOiBFZG1UeXBlIHwgc3RyaW5nLFxuICApIHtcbiAgICBjb25zdCBzdHJ1Y3R1cmVkRmllbGRQYXJzZXIgPSB0aGlzLnN0cnVjdHVyZWRUeXBlLmFkZEZpZWxkPEY+KG5hbWUsIHtcbiAgICAgIHR5cGUsXG4gICAgfSk7XG4gICAgc3RydWN0dXJlZEZpZWxkUGFyc2VyLmNvbmZpZ3VyZSh7XG4gICAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogRWRtVHlwZSB8IHN0cmluZykgPT4gdGhpcy5hcGkucGFyc2VyRm9yVHlwZSh0eXBlKSxcbiAgICAgIG9wdGlvbnM6IHRoaXMuYXBpLm9wdGlvbnMsXG4gICAgfSk7XG4gICAgY29uc3QgbW9kZWxGaWVsZCA9IHRoaXMuYWRkRmllbGQ8Rj4obmFtZSwge1xuICAgICAgZmllbGQ6IG5hbWUsXG4gICAgICBwYXJzZXI6IHN0cnVjdHVyZWRGaWVsZFBhcnNlcixcbiAgICB9KTtcbiAgICBtb2RlbEZpZWxkLmNvbmZpZ3VyZSh7XG4gICAgICBvcHRpb25zRm9yVHlwZTogKHQ6IHN0cmluZykgPT4gdGhpcy5hcGkub3B0aW9uc0ZvclR5cGUodCksXG4gICAgICBtb2RlbEZvclR5cGU6ICh0OiBzdHJpbmcpID0+IHRoaXMuYXBpLm1vZGVsRm9yVHlwZSh0KSxcbiAgICAgIGNvbGxlY3Rpb25Gb3JUeXBlOiAodDogc3RyaW5nKSA9PiB0aGlzLmFwaS5jb2xsZWN0aW9uRm9yVHlwZSh0KSxcbiAgICAgIGVudW1Gb3JUeXBlOiAodDogc3RyaW5nKSA9PiB0aGlzLmFwaS5maW5kRW51bVR5cGUodCksXG4gICAgICBzdHJ1Y3R1cmVkRm9yVHlwZTogKHQ6IHN0cmluZykgPT4gdGhpcy5hcGkuZmluZFN0cnVjdHVyZWRUeXBlKHQpLFxuICAgICAgb3B0aW9uczogdGhpcy5hcGkub3B0aW9ucyxcbiAgICAgIGNvbmN1cnJlbmN5OiBmYWxzZSxcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2VsZiwgbW9kZWxGaWVsZC5uYW1lLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6ICgpID0+IHRoaXMuZ2V0KHNlbGYsIG1vZGVsRmllbGQgYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4pLFxuICAgICAgc2V0OiAodmFsdWU6IGFueSkgPT5cbiAgICAgICAgdGhpcy5zZXQoc2VsZiwgbW9kZWxGaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiwgdmFsdWUpLFxuICAgIH0pO1xuICAgIHJldHVybiBtb2RlbEZpZWxkO1xuICB9XG5cbiAgYXR0YWNoKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPixcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgc2VsZi5fcmVzb3VyY2UgIT09IG51bGwgJiZcbiAgICAgIHJlc291cmNlLm91dGdvaW5nVHlwZSgpICE9PSBzZWxmLl9yZXNvdXJjZS5vdXRnb2luZ1R5cGUoKSAmJlxuICAgICAgIXNlbGYuX3Jlc291cmNlLmlzU3VidHlwZU9mKHJlc291cmNlKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbid0IGF0dGFjaCAke3Jlc291cmNlLm91dGdvaW5nVHlwZSgpfSB0byAke3NlbGYuX3Jlc291cmNlLm91dGdvaW5nVHlwZSgpfWAsXG4gICAgICApO1xuXG4gICAgY29uc3QgY3VycmVudCA9IHNlbGYuX3Jlc291cmNlO1xuICAgIGlmIChjdXJyZW50ID09PSBudWxsIHx8ICFjdXJyZW50LmlzRXF1YWxUbyhyZXNvdXJjZSkpIHtcbiAgICAgIHNlbGYuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICBzZWxmLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkF0dGFjaCwge1xuICAgICAgICBwcmV2aW91czogY3VycmVudCxcbiAgICAgICAgdmFsdWU6IHJlc291cmNlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8jIHJlZ2lvbiBSZXNvdXJjZVxuICBzdGF0aWMgY2hhaW4oXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICk6IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbCxcbiAgXVtdIHtcbiAgICBjb25zdCBjaGFpbiA9IFtdIGFzIGFueVtdO1xuICAgIGxldCB0dXBsZTpcbiAgICAgIHwgW1xuICAgICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgICBdXG4gICAgICB8IG51bGwgPSBbY2hpbGQsIG51bGxdO1xuICAgIHdoaWxlICh0dXBsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyZW50ID0gdHVwbGUgYXMgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGwsXG4gICAgICBdO1xuICAgICAgaWYgKGNoYWluLnNvbWUoKHApID0+IHBbMF0gPT09IHBhcmVudFswXSkpIGJyZWFrO1xuICAgICAgY2hhaW4uc3BsaWNlKDAsIDAsIHBhcmVudCk7XG4gICAgICB0dXBsZSA9IHR1cGxlWzBdLl9wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBjaGFpbjtcbiAgfVxuXG4gIHN0YXRpYyByZXNvdXJjZTxUPihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxUPiB8IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PixcbiAgKTogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGwge1xuICAgIGxldCByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHByZXZGaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IFttb2RlbCwgZmllbGRdIG9mIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKSkge1xuICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZSB8fCAobW9kZWwuX3Jlc291cmNlIGFzIE9EYXRhUmVzb3VyY2U8VD4pO1xuICAgICAgaWYgKHJlc291cmNlID09PSBudWxsKSBicmVhaztcbiAgICAgIGlmIChcbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChtb2RlbCkgJiZcbiAgICAgICAgKHByZXZGaWVsZCA9PT0gbnVsbCB8fCBwcmV2RmllbGQuY29sbGVjdGlvbilcbiAgICAgICkge1xuICAgICAgICBjb25zdCBtID0gbW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+O1xuICAgICAgICAvLyBSZXNvbHZlIHN1YnR5cGUgaWYgY29sbGVjdGlvbiBub3QgaXMgZnJvbSBmaWVsZFxuICAgICAgICAvLyBGSVhNRVxuICAgICAgICAvKlxuICAgICAgICBpZiAoZmllbGQgPT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCByID0gbS5fbWV0YS5tb2RlbFJlc291cmNlRmFjdG9yeShyZXNvdXJjZS5jbG9uZVF1ZXJ5PFQ+KCkpO1xuICAgICAgICAgIGlmIChyICE9PSBudWxsICYmICFyLmlzVHlwZU9mKHJlc291cmNlKSAmJiByLmlzU3VidHlwZU9mKHJlc291cmNlKSkge1xuICAgICAgICAgICAgcmVzb3VyY2UgPSByO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAqL1xuICAgICAgICAvLyBSZXNvbHZlIGtleVxuICAgICAgICBjb25zdCBtS2V5ID0gbS5rZXkoeyBmaWVsZF9tYXBwaW5nOiB0cnVlIH0pIGFzIEVudGl0eUtleTxhbnk+O1xuICAgICAgICBpZiAobUtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzb3VyY2UgPVxuICAgICAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlXG4gICAgICAgICAgICAgID8gcmVzb3VyY2UuZW50aXR5KG1LZXkpXG4gICAgICAgICAgICAgIDogKHJlc291cmNlIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pLmtleShtS2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcHJldkZpZWxkID0gZmllbGQ7XG4gICAgICBpZiAoZmllbGQgPT09IG51bGwgJiYgbW9kZWwuX3Jlc291cmNlICE9PSBudWxsKSB7XG4gICAgICAgIC8vIEFwcGx5IHRoZSBxdWVyeSBmcm9tIG1vZGVsIHRvIG5ldyByZXNvdXJjZVxuICAgICAgICBtb2RlbC5fcmVzb3VyY2UucXVlcnkoKHFzKSA9PlxuICAgICAgICAgIHJlc291cmNlPy5xdWVyeSgocWQpID0+IHFkLnJlc3RvcmUocXMuc3RvcmUoKSkpLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZCAhPT0gbnVsbCkge1xuICAgICAgICByZXNvdXJjZSA9IGZpZWxkLnJlc291cmNlRmFjdG9yeTxhbnksIGFueT4ocmVzb3VyY2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KFxuICAgIHF1ZXJ5PzogT0RhdGFRdWVyeU9wdGlvbnM8VD4sXG4gICk6XG4gICAgfCBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+XG4gICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IG51bGwge1xuICAgIGlmICh0aGlzLmVudGl0eVNldCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gT0RhdGFFbnRpdHlTZXRSZXNvdXJjZS5mYWN0b3J5PFQ+KHRoaXMuYXBpLCB7XG4gICAgICBwYXRoOiB0aGlzLmVudGl0eVNldC5uYW1lLFxuICAgICAgdHlwZTogdGhpcy5lbnRpdHlTZXQuZW50aXR5VHlwZSxcbiAgICAgIHF1ZXJ5LFxuICAgIH0pO1xuICB9XG5cbiAgbW9kZWxSZXNvdXJjZUZhY3RvcnkoXG4gICAgcXVlcnk/OiBPRGF0YVF1ZXJ5T3B0aW9uczxUPixcbiAgKTpcbiAgICB8IE9EYXRhRW50aXR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxUPlxuICAgIHwgbnVsbCB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkocXVlcnkpO1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UpIHJldHVybiByZXNvdXJjZS5lbnRpdHkoKTtcbiAgICByZXR1cm4gcmVzb3VyY2UgYXNcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICB8IG51bGw7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgYmluZChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIHBhcmVudCxcbiAgICAgIHJlc291cmNlLFxuICAgICAgYW5ub3RzLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsLFxuICAgICAgXTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPiB8IG51bGw7XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zPFQ+O1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgLy8gRXZlbnRzXG4gICAgc2VsZi5ldmVudHMkLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5ldmVudHMkLmVtaXQoZSkpO1xuXG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfVxuXG4gICAgLy8gUmVzb3VyY2VcbiAgICBpZiAoc2VsZi5fcGFyZW50ID09PSBudWxsICYmIHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3RvcnkoKTtcbiAgICBpZiAocmVzb3VyY2UpIHtcbiAgICAgIHRoaXMuYXR0YWNoKFxuICAgICAgICBzZWxmLFxuICAgICAgICByZXNvdXJjZSBhc1xuICAgICAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgICAgIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbm5vdGF0aW9uc1xuICAgIHNlbGYuX2Fubm90YXRpb25zID1cbiAgICAgIGFubm90cyA/PyBuZXcgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyhPRGF0YUhlbHBlcltERUZBVUxUX1ZFUlNJT05dKTtcblxuICAgIC8vIEZpZWxkc1xuICAgIHRoaXMuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIGZpZWxkLm5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuZ2V0KHNlbGYsIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+KSxcbiAgICAgICAgc2V0OiAodmFsdWU6IGFueSkgPT5cbiAgICAgICAgICB0aGlzLnNldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiwgdmFsdWUpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBxdWVyeShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlc291cmNlOlxuICAgICAgfCBPRGF0YUVudGl0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gICAgICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD4sXG4gICAgZnVuYzogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPiwgcz86IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pID0+IHZvaWQsXG4gICkge1xuICAgIHJlc291cmNlLnF1ZXJ5KGZ1bmMpO1xuICAgIHRoaXMuYXR0YWNoKHNlbGYsIHJlc291cmNlKTtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuXG4gIHJlc29sdmVLZXkoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgICBzaW5nbGUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuOyBzaW5nbGU/OiBib29sZWFuIH0gPSB7fSxcbiAgKTogRW50aXR5S2V5PFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleVR5cGVzID0gdGhpcy5zdHJ1Y3R1cmVkVHlwZS5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGtleSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgZm9yIChjb25zdCBrdCBvZiBrZXlUeXBlcykge1xuICAgICAgbGV0IHYgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICBsZXQgb3B0aW9ucyA9IHRoaXMgYXMgT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2Yga3QubmFtZS5zcGxpdCgnLycpKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICBmaWVsZCA9IG9wdGlvbnNcbiAgICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSwgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHYgPVxuICAgICAgICAgICAgVHlwZXMuaXNQbGFpbk9iamVjdCh2KSB8fCBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHYpXG4gICAgICAgICAgICAgID8gdltmaWVsZC5uYW1lXVxuICAgICAgICAgICAgICA6IHY7XG4gICAgICAgICAgb3B0aW9ucyA9IHRoaXMuYXBpLm9wdGlvbnNGb3JUeXBlKGZpZWxkLnR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGZpZWxkLmZpZWxkIDogZmllbGQubmFtZTtcbiAgICAgIGlmIChrdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSBuYW1lID0ga3QuYWxpYXM7XG4gICAgICBrZXkuc2V0KG5hbWUsIHYpO1xuICAgIH1cbiAgICBpZiAoa2V5LnNpemUgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlc29sdmVcbiAgICAgID8gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSwgeyBzaW5nbGUgfSlcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKGtleSk7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbnRpYWwoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsLFxuICAgIGF0dHI6IE9EYXRhTW9kZWxBdHRyaWJ1dGU8YW55PiB8IE9EYXRhTW9kZWxGaWVsZDxhbnk+LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgICAgc2luZ2xlID0gZmFsc2UsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW47IHNpbmdsZT86IGJvb2xlYW4gfSA9IHt9LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZmVyZW50aWFsID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiBhdHRyLnJlZmVyZW50aWFscykge1xuICAgICAgY29uc3QgZnJvbSA9IHRoaXMuZmllbGRzKHtcbiAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgfSkuZmluZCgocDogYW55KSA9PiBwLmZpZWxkID09PSByZWYucmVmZXJlbmNlZFByb3BlcnR5KTtcbiAgICAgIGNvbnN0IHRvID0gYXR0ci5vcHRpb25zXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLCBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IHJlZi5wcm9wZXJ0eSk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IGZpZWxkX21hcHBpbmcgPyB0by5maWVsZCA6IHRvLm5hbWU7XG4gICAgICAgIHJlZmVyZW50aWFsLnNldChuYW1lLCB2YWx1ZSAmJiAodmFsdWUgYXMgYW55KVtmcm9tLm5hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlZmVyZW50aWFsLnNpemUgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHJlZmVyZW50aWFsLnNpemUgPT09IDEgJiYgQXJyYXkuZnJvbShyZWZlcmVudGlhbC52YWx1ZXMoKSlbMF0gPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbnRpYWwsIHsgc2luZ2xlIH0pXG4gICAgICA6IE9iamVjdC5mcm9tRW50cmllcyhyZWZlcmVudGlhbCk7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbmNlZChcbiAgICB2YWx1ZTogT0RhdGFNb2RlbDxUPiB8IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IG51bGwsXG4gICAgYXR0cjogT0RhdGFNb2RlbEF0dHJpYnV0ZTxhbnk+IHwgT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgICBzaW5nbGUgPSBmYWxzZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbjsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVmZXJlbmNlZCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgZm9yIChjb25zdCByZWYgb2YgYXR0ci5yZWZlcmVudGlhbHMpIHtcbiAgICAgIGNvbnN0IGZyb20gPSB0aGlzLmZpZWxkcyh7XG4gICAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogZmFsc2UsXG4gICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgIH0pLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IHJlZi5wcm9wZXJ0eSk7XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5hcGkub3B0aW9uc0ZvclR5cGU8YW55PihhdHRyLnR5cGUpO1xuICAgICAgY29uc3QgdG8gPSBtZXRhXG4gICAgICAgID8uZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSwgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5maW5kKFxuICAgICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+XG4gICAgICAgICAgICBmaWVsZC5maWVsZCA9PT0gcmVmLnJlZmVyZW5jZWRQcm9wZXJ0eSxcbiAgICAgICAgKTtcbiAgICAgIGlmIChmcm9tICE9PSB1bmRlZmluZWQgJiYgdG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbmNlZC5zZXQobmFtZSwgdmFsdWUgJiYgKHZhbHVlIGFzIGFueSlbZnJvbS5uYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VkLnNpemUgPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHJlZmVyZW5jZWQuc2l6ZSA9PT0gMSAmJiBBcnJheS5mcm9tKHJlZmVyZW5jZWQudmFsdWVzKCkpWzBdID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIHJlc29sdmVcbiAgICAgID8gT2JqZWN0cy5yZXNvbHZlS2V5KHJlZmVyZW5jZWQsIHsgc2luZ2xlIH0pXG4gICAgICA6IE9iamVjdC5mcm9tRW50cmllcyhyZWZlcmVuY2VkKTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKTogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nW10gfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBuYXZpZ2F0aW9uLFxuICAgIH0pLnJlZHVjZSgoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSAoc2VsZiBhcyBhbnkpW2ZpZWxkLm5hbWVdO1xuICAgICAgY29uc3QgZXJycyA9IGZpZWxkLnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCB9KTtcbiAgICAgIHJldHVybiBlcnJzICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IGVycnMgfSlcbiAgICAgICAgOiBhY2M7XG4gICAgfSwge30pO1xuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWZzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KS5yZWR1Y2UoKGFjYywgZmllbGQpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuZGVmYXVsdHMoKTtcbiAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2ZpZWxkLm5hbWVdOiB2YWx1ZSB9KVxuICAgICAgICA6IGFjYztcbiAgICB9LCB7fSk7XG4gICAgcmV0dXJuICFUeXBlcy5pc0VtcHR5KGRlZnMpID8gZGVmcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGhhc0NoYW5nZWQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7IGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlIH06IHsgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBbLi4uc2VsZi5fYXR0cmlidXRlcy52YWx1ZXMoKV1cbiAgICAgIC5maWx0ZXIoKGF0dHIpID0+ICFhdHRyLm5hdmlnYXRpb24gfHwgaW5jbHVkZV9uYXZpZ2F0aW9uKVxuICAgICAgLnNvbWUoXG4gICAgICAgIChhdHRyKSA9PlxuICAgICAgICAgICghaW5jbHVkZV9uYXZpZ2F0aW9uIHx8IGF0dHIubmF2aWdhdGlvbikgJiZcbiAgICAgICAgICBhdHRyLmlzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSxcbiAgICAgICk7XG4gIH1cblxuICBoYXNLZXkoc2VsZjogT0RhdGFNb2RlbDxUPikge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVLZXkoc2VsZikgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHdpdGhSZXNvdXJjZTxSLCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4oXG4gICAgc2VsZjogTSxcbiAgICByZXNvdXJjZTpcbiAgICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVByb3BlcnR5UmVzb3VyY2U8VD5cbiAgICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxUPlxuICAgICAgfCBPRGF0YVNpbmdsZXRvblJlc291cmNlPFQ+XG4gICAgICB8IG51bGwsXG4gICAgY3R4OiAobW9kZWw6IE0pID0+IFIsXG4gICk6IFIge1xuICAgIC8vIFB1c2hcbiAgICBzZWxmLnB1c2hSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgLy8gRXhlY3V0ZSBmdW5jdGlvblxuICAgIGNvbnN0IHJlc3VsdCA9IGN0eChzZWxmKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gUG9wXG4gICAgICAgICAgc2VsZi5wb3BSZXNvdXJjZSgpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBvcFxuICAgICAgc2VsZi5wb3BSZXNvdXJjZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbiAgYXNFbnRpdHk8UiwgTSBleHRlbmRzIE9EYXRhTW9kZWw8VD4+KHNlbGY6IE0sIGN0eDogKG1vZGVsOiBNKSA9PiBSKTogUiB7XG4gICAgLy8gQ2xvbmUgcXVlcnkgZnJvbSBoaW0gb3IgcGFyZW50XG4gICAgbGV0IHF1ZXJ5ID0gc2VsZi5fcmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKTtcbiAgICBpZiAoXG4gICAgICBxdWVyeSA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBzZWxmLl9wYXJlbnQgJiZcbiAgICAgIHNlbGYuX3BhcmVudFswXSBpbnN0YW5jZW9mIE9EYXRhQ29sbGVjdGlvblxuICAgIClcbiAgICAgIHF1ZXJ5ID0gc2VsZi5fcGFyZW50WzBdLl9yZXNvdXJjZT8uY2xvbmVRdWVyeTxUPigpO1xuICAgIC8vIEJ1aWxkIG5ldyByZXNvdXJjZVxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5tb2RlbFJlc291cmNlRmFjdG9yeShxdWVyeSk7XG4gICAgcmV0dXJuIHRoaXMud2l0aFJlc291cmNlKHNlbGYsIHJlc291cmNlLCBjdHgpO1xuICB9XG5cbiAgdG9FbnRpdHkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgICAgaW5jbHVkZV9pZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgY2hhaW4gPSBbXSxcbiAgICB9OiB7XG4gICAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2lkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICAgIGNoYW5nZXNfb25seT86IGJvb2xlYW47XG4gICAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICAgIGNoYWluPzogKE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pW107XG4gICAgfSA9IHt9LFxuICApOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGxldCBlbnRpdHk6IGFueSA9IFsuLi5zZWxmLl9hdHRyaWJ1dGVzLnZhbHVlcygpXVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgLy8gQ2hhaW5cbiAgICAgICAgKGF0dHIpID0+IGNoYWluLmV2ZXJ5KChjKSA9PiBjICE9PSBhdHRyLmdldCgpKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIC8vIENoYW5nZXMgb25seVxuICAgICAgICAoYXR0cikgPT5cbiAgICAgICAgICAhY2hhbmdlc19vbmx5IHx8XG4gICAgICAgICAgKGNoYW5nZXNfb25seSAmJiBhdHRyLmlzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KSksXG4gICAgICApXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoYXR0cikgPT5cbiAgICAgICAgICAvLyBOYXZpZ2F0aW9uXG4gICAgICAgICAgKGluY2x1ZGVfbmF2aWdhdGlvbiAmJiBhdHRyLm5hdmlnYXRpb24gJiYgYXR0ci5nZXQoKSAhPT0gbnVsbCkgfHxcbiAgICAgICAgICAhYXR0ci5uYXZpZ2F0aW9uLFxuICAgICAgKVxuICAgICAgLnJlZHVjZSgoYWNjLCBhdHRyKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gYXR0ci5maWVsZE5hbWUgOiBhdHRyLm5hbWU7XG4gICAgICAgIGxldCB2YWx1ZTogYW55ID0gYXR0ci5nZXQoKTtcbiAgICAgICAgY29uc3QgY29tcHV0ZWQgPSBhdHRyLmNvbXB1dGVkO1xuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uID0gYXR0ci5uYXZpZ2F0aW9uO1xuICAgICAgICBjb25zdCBjb25jdXJyZW5jeSA9IGF0dHIuY29uY3VycmVuY3k7XG4gICAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gKHZhbHVlIGFzIE9EYXRhTW9kZWw8YW55PikudG9FbnRpdHkoe1xuICAgICAgICAgICAgY2xpZW50X2lkLFxuICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgICAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICAgICAgICBjaGFuZ2VzX29ubHk6IGNoYW5nZXNfb25seSAmJiAhIW5hdmlnYXRpb24sXG4gICAgICAgICAgICBpbmNsdWRlX2tleTogaW5jbHVkZV9rZXkgJiYgISFuYXZpZ2F0aW9uLFxuICAgICAgICAgICAgaW5jbHVkZV9pZDogaW5jbHVkZV9pZCAmJiAhIW5hdmlnYXRpb24sXG4gICAgICAgICAgICBjaGFpbjogW3NlbGYsIC4uLmNoYWluXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUgPSAodmFsdWUgYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PikudG9FbnRpdGllcyh7XG4gICAgICAgICAgICBjbGllbnRfaWQsXG4gICAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgICAgaW5jbHVkZV9jb21wdXRlZCxcbiAgICAgICAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkLFxuICAgICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICAgIGNoYW5nZXNfb25seTogY2hhbmdlc19vbmx5ICYmICEhbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGluY2x1ZGVfa2V5OiBpbmNsdWRlX2tleSAmJiAhIW5hdmlnYXRpb24sXG4gICAgICAgICAgICBpbmNsdWRlX2lkOiBpbmNsdWRlX2lkICYmICEhbmF2aWdhdGlvbixcbiAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlX2NvbmN1cnJlbmN5ICYmIGNvbmN1cnJlbmN5KSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5jbHVkZV9jb21wdXRlZCAmJiBjb21wdXRlZCkge1xuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZXNfb25seSAmJiBhdHRyLmlzQ2hhbmdlZCgpKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWNoYW5nZXNfb25seSAmJiAhY29uY3VycmVuY3kgJiYgIWNvbXB1dGVkKSB7XG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sIHt9KTtcblxuICAgIGlmIChpbmNsdWRlX25vbl9maWVsZCkge1xuICAgICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhlbnRpdHkpO1xuICAgICAgLy8gQXR0cmlidXRlcyBmcm9tIG9iamVjdCAoYXR0cmlidXRlcyBmb3Igb2JqZWN0KVxuICAgICAgY29uc3Qgbm9uRmllbGRBdHRycyA9IE9iamVjdC5lbnRyaWVzKHNlbGYpXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKFtrXSkgPT5cbiAgICAgICAgICAgIG5hbWVzLmluZGV4T2YoaykgPT09IC0xICYmICFrLnN0YXJ0c1dpdGgoJ18nKSAmJiAhay5lbmRzV2l0aCgnJCcpLFxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgW2ssIHZdKSA9PiBPYmplY3QuYXNzaWduKGFjYywgeyBba106IHYgfSksIHt9KTtcbiAgICAgIGVudGl0eSA9IHsgLi4uZW50aXR5LCAuLi5ub25GaWVsZEF0dHJzIH07XG4gICAgfVxuXG4gICAgLy8gQWRkIGNsaWVudF9pZFxuICAgIGlmIChjbGllbnRfaWQpIHtcbiAgICAgICg8YW55PmVudGl0eSlbdGhpcy5jaWRdID0gKDxhbnk+c2VsZilbdGhpcy5jaWRdO1xuICAgIH1cblxuICAgIC8vIEFkZCBrZXlcbiAgICBpZiAoaW5jbHVkZV9rZXkpIHtcbiAgICAgIGVudGl0eSA9IHtcbiAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAuLi4odGhpcy5yZXNvbHZlS2V5KHNlbGYsIHsgZmllbGRfbWFwcGluZywgcmVzb2x2ZTogZmFsc2UgfSkgYXMge30pLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgaWRcbiAgICBpZiAoaW5jbHVkZV9pZCkge1xuICAgICAgc2VsZi5hc0VudGl0eSgoZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNvdXJjZSA9IGUucmVzb3VyY2UoKTtcbiAgICAgICAgaWYgKHJlc291cmNlKVxuICAgICAgICAgIGVudGl0eVt0aGlzLmFwaS5vcHRpb25zLmhlbHBlci5PREFUQV9JRF0gPSBgJHtyZXNvdXJjZS5jbGVhclF1ZXJ5KCl9YDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB0eXBlXG4gICAgaWYgKFxuICAgICAgc2VsZi5fcGFyZW50ICE9PSBudWxsICYmXG4gICAgICAoKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoc2VsZi5fcGFyZW50WzBdKSAmJlxuICAgICAgICBzZWxmLl9wYXJlbnRbMV0gIT09IG51bGwgJiZcbiAgICAgICAgdGhpcy5hcGkub3B0aW9uc0ZvclR5cGUoc2VsZi5fcGFyZW50WzFdLnR5cGUpICE9PSBzZWxmLl9tZXRhKSB8fFxuICAgICAgICAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHNlbGYuX3BhcmVudFswXSkgJiZcbiAgICAgICAgICAoc2VsZi5fcGFyZW50WzBdIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4pLl9tb2RlbFxuICAgICAgICAgICAgLm1ldGEgIT09IHNlbGYuX21ldGEpKVxuICAgICkge1xuICAgICAgZW50aXR5W3RoaXMuYXBpLm9wdGlvbnMuaGVscGVyLk9EQVRBX1RZUEVdID1cbiAgICAgICAgYCMke3RoaXMuc3RydWN0dXJlZFR5cGUudHlwZSgpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudGl0eSBhcyBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH1cblxuICByZXNldChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHsgbmFtZSwgc2lsZW50ID0gZmFsc2UgfTogeyBuYW1lPzogc3RyaW5nOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fSxcbiAgKSB7XG4gICAgbGV0IGNoYW5nZXM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gUmVzZXQgdmFsdWVcbiAgICAgIGNvbnN0IGF0dHJpYnV0ZSA9IHNlbGYuX2F0dHJpYnV0ZXMuZ2V0KG5hbWUpO1xuICAgICAgaWYgKFxuICAgICAgICBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBhdHRyaWJ1dGUuaXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlIH0pXG4gICAgICApIHtcbiAgICAgICAgYXR0cmlidXRlLnJlc2V0KCk7XG4gICAgICAgIGNoYW5nZXMgPSBbbmFtZV07XG4gICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZT8uaXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgYXR0cmlidXRlLnJlc2V0KCk7XG4gICAgICAgIGNoYW5nZXMgPSBbbmFtZV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHJlc2V0IGFsbFxuICAgICAgY2hhbmdlcyA9IFsuLi5zZWxmLl9hdHRyaWJ1dGVzLmtleXMoKV07XG4gICAgICAvL3NlbGYuX2NoYW5nZXMuY2xlYXIoKTtcbiAgICAgIHNlbGYuX2F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0ciwga2V5KSA9PiB7XG4gICAgICAgIGlmIChhdHRyLmlzQ2hhbmdlZCh7IGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSB9KSkge1xuICAgICAgICAgIGF0dHIucmVzZXQoKTtcbiAgICAgICAgICBjaGFuZ2VzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghc2lsZW50ICYmIGNoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgc2VsZi5ldmVudHMkLnRyaWdnZXIoT0RhdGFNb2RlbEV2ZW50VHlwZS5SZXNldCwgeyBvcHRpb25zOiB7IGNoYW5nZXMgfSB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBlbnRpdHk6IFBhcnRpYWw8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSxcbiAgICB7XG4gICAgICBhZGQgPSB0cnVlLFxuICAgICAgbWVyZ2UgPSB0cnVlLFxuICAgICAgcmVtb3ZlID0gdHJ1ZSxcbiAgICAgIHJlc2V0ID0gZmFsc2UsXG4gICAgICByZXBhcmVudCA9IGZhbHNlLFxuICAgICAgc2lsZW50ID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgYWRkPzogYm9vbGVhbjtcbiAgICAgIG1lcmdlPzogYm9vbGVhbjtcbiAgICAgIHJlbW92ZT86IGJvb2xlYW47XG4gICAgICByZXNldD86IGJvb2xlYW47XG4gICAgICByZXBhcmVudD86IGJvb2xlYW47XG4gICAgICBzaWxlbnQ/OiBib29sZWFuO1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIFVwZGF0ZSBhbm5vdGF0aW9uc1xuICAgIHNlbGYuYW5ub3RzKCkudXBkYXRlKGVudGl0eSk7XG4gICAgLy8gVXBkYXRlIGF0dHJpYnV0ZXNcbiAgICBjb25zdCBhdHRycyA9IHNlbGYuYW5ub3RzKCkuYXR0cmlidXRlcyhlbnRpdHksICdmdWxsJyk7XG4gICAgT2JqZWN0LmVudHJpZXMoYXR0cnMpXG4gICAgICAuZmlsdGVyKChbLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQpIC8vIEZpbHRlciB1bmRlZmluZWRcbiAgICAgIC5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmZpbmRGaWVsZChrZXksIHsgcmVzZXQgfSk7XG5cbiAgICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQgfHwgdGhpcy5pc09wZW5UeXBlKCkpIHtcbiAgICAgICAgICAvLyBEZWxlZ2F0ZWQgdG8gcHJpdmF0ZSBzZXR0ZXJcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNldChzZWxmLCBmaWVsZCA/PyBrZXksIHZhbHVlLCB7XG4gICAgICAgICAgICAgIGFkZCxcbiAgICAgICAgICAgICAgbWVyZ2UsXG4gICAgICAgICAgICAgIHJlbW92ZSxcbiAgICAgICAgICAgICAgcmVzZXQsXG4gICAgICAgICAgICAgIHJlcGFyZW50LFxuICAgICAgICAgICAgICBzaWxlbnQsXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY2hhbmdlcy5wdXNoKGZpZWxkPy5uYW1lID8/IGtleSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEJhc2ljIGFzc2lnbm1lbnRcbiAgICAgICAgICBjb25zdCBjdXJyZW50ID0gKDxhbnk+c2VsZilba2V5XTtcbiAgICAgICAgICAoPGFueT5zZWxmKVtrZXldID0gdmFsdWU7XG4gICAgICAgICAgaWYgKGN1cnJlbnQgIT09IHZhbHVlKSBjaGFuZ2VzLnB1c2goa2V5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAoIXNpbGVudCAmJiBjaGFuZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNlbGYuZXZlbnRzJC50cmlnZ2VyKFxuICAgICAgICByZXNldCA/IE9EYXRhTW9kZWxFdmVudFR5cGUuUmVzZXQgOiBPRGF0YU1vZGVsRXZlbnRUeXBlLlVwZGF0ZSxcbiAgICAgICAgeyBvcHRpb25zOiB7IGNoYW5nZXMgfSB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICBzdGF0aWMgaXNNb2RlbChvYmo6IGFueSkge1xuICAgIHJldHVybiBUeXBlcy5yYXdUeXBlKG9iaikgPT09ICdNb2RlbCc7XG4gIH1cblxuICBzdGF0aWMgaXNDb2xsZWN0aW9uKG9iajogYW55KSB7XG4gICAgcmV0dXJuIFR5cGVzLnJhd1R5cGUob2JqKSA9PT0gJ0NvbGxlY3Rpb24nO1xuICB9XG5cbiAgZ2V0PEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPiB8IHN0cmluZyxcbiAgKTogRiB8IE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBhdHRyID0gc2VsZi5fYXR0cmlidXRlcy5nZXQoXG4gICAgICBmaWVsZCBpbnN0YW5jZW9mIE9EYXRhTW9kZWxGaWVsZCA/IGZpZWxkLm5hbWUgOiBmaWVsZCxcbiAgICApO1xuICAgIGlmIChhdHRyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXR0ci5nZXQoKTtcbiAgICAgIGlmIChcbiAgICAgICAgKGF0dHIubmF2aWdhdGlvbiAmJiB2YWx1ZSA9PT0gbnVsbCkgfHxcbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSlcbiAgICAgICkge1xuICAgICAgICAvLyBDaGVjayBmb3IgcmVmZXJlbmNlXG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZWQgPSB0aGlzLnJlc29sdmVSZWZlcmVuY2VkKHNlbGYsIGF0dHIpO1xuICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgcmVmZXJlbmNlZCAhPT0gbnVsbCAmJiByZWZlcmVuY2VkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAodmFsdWUgYXMgT0RhdGFNb2RlbDxGPikuYXNzaWduKHJlZmVyZW5jZWQgYXMgUGFydGlhbDxGPiwge1xuICAgICAgICAgICAgc2lsZW50OiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHJlZmVyZW5jZWQgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBOZXcgdmFsdWUgaXMgbnVsbFxuICAgICAgICAgIChhdHRyIGFzIE9EYXRhTW9kZWxBdHRyaWJ1dGU8Rj4pLnNldChudWxsKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gbnVsbCAmJiByZWZlcmVuY2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIHVuZGVmaW5lZFxuICAgICAgICAgIChhdHRyIGFzIE9EYXRhTW9kZWxBdHRyaWJ1dGU8Rj4pLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHR5cGVvZiBmaWVsZCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICFmaWVsZC5zdGFydHNXaXRoKCdfJykgJiZcbiAgICAgICFmaWVsZC5lbmRzV2l0aCgnJCcpXG4gICAgKSB7XG4gICAgICByZXR1cm4gKHNlbGYgYXMgYW55KVtmaWVsZF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBzZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+IHwgc3RyaW5nLFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGwsXG4gICAge1xuICAgICAgYWRkLFxuICAgICAgbWVyZ2UsXG4gICAgICByZW1vdmUsXG4gICAgICByZXNldCxcbiAgICAgIHJlcGFyZW50LFxuICAgICAgc2lsZW50LFxuICAgICAgdHlwZSxcbiAgICB9OiB7XG4gICAgICBhZGQ/OiBib29sZWFuO1xuICAgICAgbWVyZ2U/OiBib29sZWFuO1xuICAgICAgcmVtb3ZlPzogYm9vbGVhbjtcbiAgICAgIHJlc2V0PzogYm9vbGVhbjtcbiAgICAgIHJlcGFyZW50PzogYm9vbGVhbjtcbiAgICAgIHNpbGVudD86IGJvb2xlYW47XG4gICAgICB0eXBlPzogRWRtVHlwZSB8IHN0cmluZztcbiAgICB9ID0ge30sXG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBtb2RlbEZpZWxkID1cbiAgICAgIGZpZWxkIGluc3RhbmNlb2YgT0RhdGFNb2RlbEZpZWxkID8gZmllbGQgOiB0aGlzLmZpbmRGaWVsZDxGPihmaWVsZCk7XG4gICAgaWYgKFxuICAgICAgbW9kZWxGaWVsZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICB0aGlzLmlzT3BlblR5cGUoKSAmJlxuICAgICAgdHlwZW9mIGZpZWxkID09PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgdHlwZSA9IHR5cGUgPz8gdGhpcy50c1RvRWRtW3R5cGVvZiB2YWx1ZV0gPz8gRWRtVHlwZS5TdHJpbmc7XG4gICAgICBtb2RlbEZpZWxkID0gdGhpcy5tb2RlbEZpZWxkRmFjdG9yeTxGPihzZWxmLCBmaWVsZCwgdHlwZSk7XG4gICAgfVxuICAgIGlmIChtb2RlbEZpZWxkID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGZpZWxkIHdpdGggbmFtZSAke2ZpZWxkIGFzIHN0cmluZ31gKTtcblxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgbGV0IGF0dHIgPSBzZWxmLl9hdHRyaWJ1dGVzLmdldChtb2RlbEZpZWxkLm5hbWUpO1xuXG4gICAgLy8gRW5zdXJlcyB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzXG4gICAgaWYgKGF0dHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXR0ciA9IG5ldyBPRGF0YU1vZGVsQXR0cmlidXRlKHNlbGYsIG1vZGVsRmllbGQpO1xuICAgICAgdGhpcy5fbGluayhzZWxmLCBhdHRyKTtcbiAgICAgIHNlbGYuX2F0dHJpYnV0ZXMuc2V0KG1vZGVsRmllbGQubmFtZSwgYXR0cik7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudCA9IGF0dHIuZ2V0KCk7XG5cbiAgICBpZiAobW9kZWxGaWVsZC5pc1N0cnVjdHVyZWRUeXBlKCkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBOZXcgdmFsdWUgaXMgbnVsbFxuICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQodmFsdWUgYXMgbnVsbCwgcmVzZXQsIHJlcGFyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKGN1cnJlbnQpKSB7XG4gICAgICAgIC8vIEN1cnJlbnQgaXMgY29sbGVjdGlvblxuICAgICAgICBjb25zdCBjdXJyZW50Q29sbGVjdGlvbiA9IGN1cnJlbnQgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+O1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSkge1xuICAgICAgICAgIC8vIE5ldyB2YWx1ZSBpcyBjb2xsZWN0aW9uXG4gICAgICAgICAgY2hhbmdlZCA9IGF0dHIuc2V0KFxuICAgICAgICAgICAgdmFsdWUgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgICAgICAgICAgcmVzZXQsXG4gICAgICAgICAgICByZXBhcmVudCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFR5cGVzLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgLy8gTmV3IHZhbHVlIGlzIGFycmF5XG4gICAgICAgICAgY3VycmVudENvbGxlY3Rpb24uX2Fubm90YXRpb25zID0gbW9kZWxGaWVsZC5hbm5vdGF0aW9uc0ZhY3RvcnkoXG4gICAgICAgICAgICBzZWxmLmFubm90cygpLFxuICAgICAgICAgICkgYXMgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zPEY+O1xuICAgICAgICAgIGN1cnJlbnRDb2xsZWN0aW9uLmFzc2lnbihcbiAgICAgICAgICAgIHZhbHVlIGFzIFBhcnRpYWw8VD5bXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGFkZCxcbiAgICAgICAgICAgICAgbWVyZ2UsXG4gICAgICAgICAgICAgIHJlbW92ZSxcbiAgICAgICAgICAgICAgcmVzZXQsXG4gICAgICAgICAgICAgIHJlcGFyZW50LFxuICAgICAgICAgICAgICBzaWxlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY2hhbmdlZCA9IGN1cnJlbnRDb2xsZWN0aW9uLmhhc0NoYW5nZWQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKGN1cnJlbnQpKSB7XG4gICAgICAgIC8vIEN1cnJlbnQgaXMgbW9kZWxcbiAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gY3VycmVudCBhcyBPRGF0YU1vZGVsPEY+O1xuICAgICAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgICAgICAvLyBOZXcgdmFsdWUgaXMgbW9kZWxcbiAgICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQodmFsdWUgYXMgT0RhdGFNb2RlbDxGPiwgcmVzZXQsIHJlcGFyZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgIGN1cnJlbnRNb2RlbC5fYW5ub3RhdGlvbnMgPSBtb2RlbEZpZWxkLmFubm90YXRpb25zRmFjdG9yeShcbiAgICAgICAgICAgIHNlbGYuYW5ub3RzKCksXG4gICAgICAgICAgKSBhcyBPRGF0YUVudGl0eUFubm90YXRpb25zPEY+O1xuICAgICAgICAgIGN1cnJlbnRNb2RlbC5hc3NpZ24odmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LCB7XG4gICAgICAgICAgICBhZGQsXG4gICAgICAgICAgICBtZXJnZSxcbiAgICAgICAgICAgIHJlbW92ZSxcbiAgICAgICAgICAgIHJlc2V0LFxuICAgICAgICAgICAgcmVwYXJlbnQsXG4gICAgICAgICAgICBzaWxlbnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY2hhbmdlZCA9IGN1cnJlbnRNb2RlbC5oYXNDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEN1cnJlbnQgaXMgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgLy8gY3JlYXRlIG5ldyBtb2RlbC9jb2xsZWN0aW9uIGZvciBnaXZlbiB2YWx1ZVxuICAgICAgICBjaGFuZ2VkID0gYXR0ci5zZXQoXG4gICAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSB8fFxuICAgICAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSlcbiAgICAgICAgICAgID8gKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4pXG4gICAgICAgICAgICA6IG1vZGVsRmllbGQuY29sbGVjdGlvblxuICAgICAgICAgICAgICA/IG1vZGVsRmllbGQuY29sbGVjdGlvbkZhY3Rvcnk8Rj4oe1xuICAgICAgICAgICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlIGFzIEZbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sXG4gICAgICAgICAgICAgICAgICByZXNldDogcmVzZXQsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgOiBtb2RlbEZpZWxkLm1vZGVsRmFjdG9yeTxGPih7XG4gICAgICAgICAgICAgICAgICBwYXJlbnQ6IHNlbGYsXG4gICAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICByZXNldDogcmVzZXQsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgcmVzZXQsXG4gICAgICAgICAgcmVwYXJlbnQsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgcmVmZXJlbnRpYWxzXG4gICAgICBpZiAoIU9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbihhdHRyLmdldCgpKSkge1xuICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5hcGkub3B0aW9uc0ZvclR5cGU8Rj4obW9kZWxGaWVsZC50eXBlKTtcbiAgICAgICAgY29uc3QgcmVmID0gbWV0YT8ucmVzb2x2ZVJlZmVyZW50aWFsKGF0dHIuZ2V0KCksIGF0dHIpO1xuICAgICAgICBpZiAocmVmICE9PSBudWxsICYmIHJlZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxmLCByZWYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoYW5nZWQgPSBhdHRyLnNldCh2YWx1ZSwgcmVzZXQsIHJlcGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXNpbGVudCAmJiBjaGFuZ2VkKSB7XG4gICAgICBzZWxmLmV2ZW50cyQudHJpZ2dlcihPRGF0YU1vZGVsRXZlbnRUeXBlLkNoYW5nZSwge1xuICAgICAgICBhdHRyLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcHJldmlvdXM6IGN1cnJlbnQsXG4gICAgICAgIG9wdGlvbnM6IHsga2V5OiBtb2RlbEZpZWxkLmlzS2V5KCkgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGluazxGPihzZWxmOiBPRGF0YU1vZGVsPFQ+LCBhdHRyOiBPRGF0YU1vZGVsQXR0cmlidXRlPEY+KSB7XG4gICAgYXR0ci5ldmVudHMkLnN1YnNjcmliZSgoZXZlbnQ6IE9EYXRhTW9kZWxFdmVudDxhbnk+KSA9PiB7XG4gICAgICBpZiAoZXZlbnQuY2FuQ29udGludWVXaXRoKHNlbGYpKSB7XG4gICAgICAgIGlmIChldmVudC5tb2RlbCA9PT0gYXR0ci5nZXQoKSkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGV2ZW50LnR5cGUgPT09IE9EYXRhTW9kZWxFdmVudFR5cGUuQ2hhbmdlICYmXG4gICAgICAgICAgICBhdHRyLm5hdmlnYXRpb24gJiZcbiAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnM/LmtleVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgcmVmID0gKGF0dHIuZ2V0KCkgYXMgT0RhdGFNb2RlbDxhbnk+KS5yZWZlcmVudGlhbChhdHRyKTtcbiAgICAgICAgICAgIGlmIChyZWYgIT09IG51bGwgJiYgcmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxmLCByZWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KGV2ZW50LnB1c2goc2VsZiwgYXR0cikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=
|