angular-odata 0.92.0 → 0.95.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{esm2015/angular-odata.js → esm2020/angular-odata.mjs} +0 -0
- package/esm2020/lib/api.mjs +303 -0
- package/{esm2015/lib/cache/cache.js → esm2020/lib/cache/cache.mjs} +3 -3
- package/{esm2015/lib/cache/index.js → esm2020/lib/cache/index.mjs} +0 -0
- package/{esm2015/lib/cache/memory.js → esm2020/lib/cache/memory.mjs} +1 -1
- package/{esm2015/lib/cache/storage.js → esm2020/lib/cache/storage.mjs} +2 -2
- package/esm2020/lib/client.mjs +271 -0
- package/{esm2015/lib/constants.js → esm2020/lib/constants.mjs} +3 -1
- package/esm2020/lib/helper.mjs +268 -0
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
- package/esm2020/lib/models/collection.mjs +741 -0
- package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
- package/esm2020/lib/models/model.mjs +453 -0
- package/esm2020/lib/models/options.mjs +945 -0
- package/{esm2015/lib/module.js → esm2020/lib/module.mjs} +7 -7
- package/esm2020/lib/options.mjs +32 -0
- package/{esm2015/lib/resources/index.js → esm2020/lib/resources/index.mjs} +0 -0
- package/{esm2015/lib/resources/path/handlers.js → esm2020/lib/resources/path/handlers.mjs} +1 -1
- package/{esm2015/lib/resources/path/index.js → esm2020/lib/resources/path/index.mjs} +0 -0
- package/esm2020/lib/resources/path/segments.mjs +124 -0
- package/esm2020/lib/resources/query/builder.mjs +590 -0
- package/esm2020/lib/resources/query/expressions.mjs +207 -0
- package/esm2020/lib/resources/query/handlers.mjs +186 -0
- package/{esm2015/lib/resources/query/index.js → esm2020/lib/resources/query/index.mjs} +0 -0
- package/esm2020/lib/resources/query/options.mjs +103 -0
- package/esm2020/lib/resources/query/syntax.mjs +406 -0
- package/esm2020/lib/resources/request.mjs +167 -0
- package/esm2020/lib/resources/resource.mjs +326 -0
- package/esm2020/lib/resources/responses/annotations.mjs +119 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-annotation.js → esm2020/lib/resources/responses/csdl/csdl-annotation.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-container.js → esm2020/lib/resources/responses/csdl/csdl-entity-container.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-entity-set.js → esm2020/lib/resources/responses/csdl/csdl-entity-set.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-enum-type.js → esm2020/lib/resources/responses/csdl/csdl-enum-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-function-action.js → esm2020/lib/resources/responses/csdl/csdl-function-action.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-navigation-property-binding.js → esm2020/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-reference.js → esm2020/lib/resources/responses/csdl/csdl-reference.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-schema.js → esm2020/lib/resources/responses/csdl/csdl-schema.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-singleton.js → esm2020/lib/resources/responses/csdl/csdl-singleton.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structural-property.js → esm2020/lib/resources/responses/csdl/csdl-structural-property.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-structured-type.js → esm2020/lib/resources/responses/csdl/csdl-structured-type.mjs} +0 -0
- package/{esm2015/lib/resources/responses/csdl/csdl-type-definition.js → esm2020/lib/resources/responses/csdl/csdl-type-definition.mjs} +0 -0
- package/{esm2015/lib/resources/responses/index.js → esm2020/lib/resources/responses/index.mjs} +0 -0
- package/esm2020/lib/resources/responses/metadata.mjs +547 -0
- package/{esm2015/lib/resources/responses/options.js → esm2020/lib/resources/responses/options.mjs} +0 -0
- package/{esm2015/lib/resources/responses/response.js → esm2020/lib/resources/responses/response.mjs} +0 -0
- package/{esm2015/lib/resources/responses/types.js → esm2020/lib/resources/responses/types.mjs} +0 -0
- package/esm2020/lib/resources/types/action.mjs +101 -0
- package/esm2020/lib/resources/types/batch.mjs +288 -0
- package/esm2020/lib/resources/types/count.mjs +27 -0
- package/esm2020/lib/resources/types/entity-set.mjs +94 -0
- package/esm2020/lib/resources/types/entity.mjs +106 -0
- package/esm2020/lib/resources/types/function.mjs +137 -0
- package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
- package/esm2020/lib/resources/types/media.mjs +41 -0
- package/esm2020/lib/resources/types/metadata.mjs +30 -0
- package/esm2020/lib/resources/types/navigation-property.mjs +226 -0
- package/esm2020/lib/resources/types/options.mjs +2 -0
- package/esm2020/lib/resources/types/property.mjs +183 -0
- package/esm2020/lib/resources/types/reference.mjs +85 -0
- package/esm2020/lib/resources/types/singleton.mjs +126 -0
- package/esm2020/lib/resources/types/value.mjs +41 -0
- package/esm2020/lib/schema/annotation.mjs +37 -0
- package/esm2020/lib/schema/callable.mjs +62 -0
- package/esm2020/lib/schema/element.mjs +51 -0
- package/esm2020/lib/schema/entity-container.mjs +9 -0
- package/esm2020/lib/schema/entity-set.mjs +9 -0
- package/esm2020/lib/schema/enum-type.mjs +71 -0
- package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +0 -0
- package/esm2020/lib/schema/parsers/callable.mjs +113 -0
- package/{esm2015/lib/schema/parsers/edm.js → esm2020/lib/schema/parsers/edm.mjs} +2 -2
- package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
- package/{esm2015/lib/schema/parsers/index.js → esm2020/lib/schema/parsers/index.mjs} +0 -0
- package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
- package/esm2020/lib/schema/schema.mjs +61 -0
- package/esm2020/lib/schema/structured-type.mjs +198 -0
- package/esm2020/lib/services/base.mjs +29 -0
- package/esm2020/lib/services/entity-set.mjs +143 -0
- package/esm2020/lib/services/entity.mjs +12 -0
- package/{esm2015/lib/services/factory.js → esm2020/lib/services/factory.mjs} +3 -3
- package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
- package/{esm2015/lib/services/singleton.js → esm2020/lib/services/singleton.mjs} +1 -1
- package/{esm2015/lib/settings.js → esm2020/lib/settings.mjs} +1 -1
- package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
- package/esm2020/lib/types.mjs +37 -0
- package/{esm2015/lib/utils/arraybuffers.js → esm2020/lib/utils/arraybuffers.mjs} +0 -0
- package/{esm2015/lib/utils/dates.js → esm2020/lib/utils/dates.mjs} +0 -0
- package/{esm2015/lib/utils/durations.js → esm2020/lib/utils/durations.mjs} +0 -0
- package/{esm2015/lib/utils/enums.js → esm2020/lib/utils/enums.mjs} +0 -0
- package/{esm2015/lib/utils/http.js → esm2020/lib/utils/http.mjs} +0 -0
- package/{esm2015/lib/utils/index.js → esm2020/lib/utils/index.mjs} +0 -0
- package/{esm2015/lib/utils/objects.js → esm2020/lib/utils/objects.mjs} +0 -0
- package/esm2020/lib/utils/odata.mjs +22 -0
- package/{esm2015/lib/utils/strings.js → esm2020/lib/utils/strings.mjs} +0 -0
- package/{esm2015/lib/utils/types.js → esm2020/lib/utils/types.mjs} +0 -0
- package/{esm2015/lib/utils/urls.js → esm2020/lib/utils/urls.mjs} +0 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/{angular-odata.js → angular-odata.mjs} +849 -750
- package/fesm2015/angular-odata.mjs.map +1 -0
- package/fesm2020/angular-odata.mjs +10274 -0
- package/fesm2020/angular-odata.mjs.map +1 -0
- package/lib/api.d.ts +10 -10
- package/lib/cache/cache.d.ts +2 -2
- package/lib/cache/storage.d.ts +1 -1
- package/lib/client.d.ts +3 -3
- package/lib/constants.d.ts +1 -0
- package/lib/models/collection.d.ts +11 -19
- package/lib/models/model.d.ts +22 -18
- package/lib/models/options.d.ts +16 -21
- package/lib/module.d.ts +1 -1
- package/lib/options.d.ts +1 -0
- package/lib/resources/path/segments.d.ts +1 -1
- package/lib/resources/query/expressions.d.ts +37 -27
- package/lib/resources/query/handlers.d.ts +7 -11
- package/lib/resources/query/options.d.ts +2 -2
- package/lib/resources/query/syntax.d.ts +52 -54
- package/lib/resources/request.d.ts +1 -1
- package/lib/resources/resource.d.ts +25 -8
- package/lib/resources/types/action.d.ts +12 -19
- package/lib/resources/types/batch.d.ts +1 -3
- package/lib/resources/types/count.d.ts +5 -4
- package/lib/resources/types/entity-set.d.ts +11 -15
- package/lib/resources/types/entity.d.ts +12 -15
- package/lib/resources/types/function.d.ts +11 -18
- package/lib/resources/types/media.d.ts +6 -5
- package/lib/resources/types/metadata.d.ts +3 -5
- package/lib/resources/types/navigation-property.d.ts +15 -21
- package/lib/resources/types/property.d.ts +13 -19
- package/lib/resources/types/reference.d.ts +39 -6
- package/lib/resources/types/singleton.d.ts +12 -16
- package/lib/resources/types/value.d.ts +9 -5
- package/lib/schema/{base.d.ts → annotation.d.ts} +0 -0
- package/lib/schema/callable.d.ts +2 -18
- package/lib/schema/element.d.ts +39 -0
- package/lib/schema/entity-container.d.ts +2 -12
- package/lib/schema/entity-set.d.ts +2 -18
- package/lib/schema/enum-type.d.ts +2 -26
- package/lib/schema/parsers/enum-type.d.ts +4 -4
- package/lib/schema/parsers/structured-type.d.ts +4 -4
- package/lib/schema/schema.d.ts +2 -2
- package/lib/schema/structured-type.d.ts +8 -26
- package/lib/services/base.d.ts +2 -2
- package/lib/services/entity-set.d.ts +2 -2
- package/lib/services/entity.d.ts +1 -1
- package/lib/services/singleton.d.ts +2 -2
- package/lib/settings.d.ts +5 -5
- package/lib/types.d.ts +1 -0
- package/package.json +21 -8
- package/bundles/angular-odata.umd.js +0 -11861
- package/bundles/angular-odata.umd.js.map +0 -1
- package/esm2015/lib/api.js +0 -296
- package/esm2015/lib/client.js +0 -272
- package/esm2015/lib/helper.js +0 -268
- package/esm2015/lib/models/collection.js +0 -734
- package/esm2015/lib/models/model.js +0 -438
- package/esm2015/lib/models/options.js +0 -942
- package/esm2015/lib/options.js +0 -31
- package/esm2015/lib/resources/path/segments.js +0 -124
- package/esm2015/lib/resources/query/builder.js +0 -591
- package/esm2015/lib/resources/query/expressions.js +0 -194
- package/esm2015/lib/resources/query/handlers.js +0 -192
- package/esm2015/lib/resources/query/options.js +0 -103
- package/esm2015/lib/resources/query/syntax.js +0 -367
- package/esm2015/lib/resources/request.js +0 -168
- package/esm2015/lib/resources/resource.js +0 -243
- package/esm2015/lib/resources/responses/annotations.js +0 -121
- package/esm2015/lib/resources/responses/metadata.js +0 -548
- package/esm2015/lib/resources/types/action.js +0 -105
- package/esm2015/lib/resources/types/batch.js +0 -294
- package/esm2015/lib/resources/types/count.js +0 -33
- package/esm2015/lib/resources/types/entity-set.js +0 -101
- package/esm2015/lib/resources/types/entity.js +0 -137
- package/esm2015/lib/resources/types/function.js +0 -130
- package/esm2015/lib/resources/types/media.js +0 -47
- package/esm2015/lib/resources/types/metadata.js +0 -36
- package/esm2015/lib/resources/types/navigation-property.js +0 -205
- package/esm2015/lib/resources/types/options.js +0 -2
- package/esm2015/lib/resources/types/property.js +0 -151
- package/esm2015/lib/resources/types/reference.js +0 -74
- package/esm2015/lib/resources/types/singleton.js +0 -167
- package/esm2015/lib/resources/types/value.js +0 -35
- package/esm2015/lib/schema/base.js +0 -37
- package/esm2015/lib/schema/callable.js +0 -82
- package/esm2015/lib/schema/entity-container.js +0 -24
- package/esm2015/lib/schema/entity-set.js +0 -35
- package/esm2015/lib/schema/enum-type.js +0 -102
- package/esm2015/lib/schema/parsers/callable.js +0 -107
- package/esm2015/lib/schema/parsers/enum-type.js +0 -107
- package/esm2015/lib/schema/parsers/structured-type.js +0 -392
- package/esm2015/lib/schema/schema.js +0 -52
- package/esm2015/lib/schema/structured-type.js +0 -220
- package/esm2015/lib/services/base.js +0 -23
- package/esm2015/lib/services/entity-set.js +0 -146
- package/esm2015/lib/services/entity.js +0 -12
- package/esm2015/lib/types.js +0 -37
- package/esm2015/lib/utils/odata.js +0 -21
- package/fesm2015/angular-odata.js.map +0 -1
|
@@ -1,942 +0,0 @@
|
|
|
1
|
-
import { __rest } from "tslib";
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
3
|
-
import { finalize } from 'rxjs/operators';
|
|
4
|
-
import { COMPUTED, DEFAULT_VERSION, OPTIMISTIC_CONCURRENCY, } from '../constants';
|
|
5
|
-
import { ODataHelper } from '../helper';
|
|
6
|
-
import { ODataParserOptions } from '../options';
|
|
7
|
-
import { ODataEntitiesAnnotations, ODataEntityAnnotations, ODataEntityResource, ODataEntitySetResource, ODataNavigationPropertyResource, ODataPathSegments, ODataPropertyResource, ODataQueryOptions, } from '../resources';
|
|
8
|
-
import { Objects, Types } from '../utils';
|
|
9
|
-
export const CID = '_cid';
|
|
10
|
-
export class ODataModelEvent {
|
|
11
|
-
constructor(name, { model, collection, previous, value, track, options, } = {}) {
|
|
12
|
-
this.bubbling = true;
|
|
13
|
-
this.name = name;
|
|
14
|
-
this.model = model;
|
|
15
|
-
this.collection = collection;
|
|
16
|
-
this.previous = previous;
|
|
17
|
-
this.value = value;
|
|
18
|
-
this.options = options;
|
|
19
|
-
this.chain = [
|
|
20
|
-
[
|
|
21
|
-
(this.collection || this.model),
|
|
22
|
-
track || null,
|
|
23
|
-
],
|
|
24
|
-
];
|
|
25
|
-
}
|
|
26
|
-
stopPropagation() {
|
|
27
|
-
this.bubbling = false;
|
|
28
|
-
}
|
|
29
|
-
push(model, track) {
|
|
30
|
-
this.chain.splice(0, 0, [model, track]);
|
|
31
|
-
}
|
|
32
|
-
visited(model) {
|
|
33
|
-
return (this.chain.some((c) => c[0] === model) &&
|
|
34
|
-
this.chain[this.chain.length - 1][0] !== model);
|
|
35
|
-
}
|
|
36
|
-
get path() {
|
|
37
|
-
return this.chain
|
|
38
|
-
.map(([, track], index) => typeof track === 'number'
|
|
39
|
-
? `[${track}]`
|
|
40
|
-
: typeof track === 'string'
|
|
41
|
-
? index === 0
|
|
42
|
-
? track
|
|
43
|
-
: `.${track}`
|
|
44
|
-
: '')
|
|
45
|
-
.join('');
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
export const BUBBLING = [
|
|
49
|
-
'change',
|
|
50
|
-
'reset',
|
|
51
|
-
'update',
|
|
52
|
-
'destroy',
|
|
53
|
-
'add',
|
|
54
|
-
'remove',
|
|
55
|
-
];
|
|
56
|
-
export const INCLUDE_SHALLOW = {
|
|
57
|
-
include_concurrency: true,
|
|
58
|
-
include_computed: true,
|
|
59
|
-
include_key: true,
|
|
60
|
-
};
|
|
61
|
-
export const INCLUDE_DEEP = Object.assign({ include_navigation: true, include_non_field: true }, INCLUDE_SHALLOW);
|
|
62
|
-
export var ODataModelState;
|
|
63
|
-
(function (ODataModelState) {
|
|
64
|
-
ODataModelState[ODataModelState["Added"] = 0] = "Added";
|
|
65
|
-
ODataModelState[ODataModelState["Removed"] = 1] = "Removed";
|
|
66
|
-
ODataModelState[ODataModelState["Changed"] = 2] = "Changed";
|
|
67
|
-
ODataModelState[ODataModelState["Unchanged"] = 3] = "Unchanged";
|
|
68
|
-
})(ODataModelState || (ODataModelState = {}));
|
|
69
|
-
export function Model({ cid = CID } = {}) {
|
|
70
|
-
return (constructor) => {
|
|
71
|
-
const Klass = constructor;
|
|
72
|
-
if (!Klass.hasOwnProperty('options'))
|
|
73
|
-
Klass.options = { fields: {} };
|
|
74
|
-
Klass.options.cid = cid;
|
|
75
|
-
return constructor;
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
export function ModelField(_a = {}) {
|
|
79
|
-
var { name } = _a, options = __rest(_a, ["name"]);
|
|
80
|
-
return (target, key) => {
|
|
81
|
-
const Klass = target.constructor;
|
|
82
|
-
if (!Klass.hasOwnProperty('options'))
|
|
83
|
-
Klass.options = { fields: {} };
|
|
84
|
-
options.field = name || key;
|
|
85
|
-
Klass.options.fields[key] = options;
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
export class ODataModelField {
|
|
89
|
-
constructor(options, _a) {
|
|
90
|
-
var { name, field, parser } = _a, opts = __rest(_a, ["name", "field", "parser"]);
|
|
91
|
-
this.options = options;
|
|
92
|
-
this.name = name;
|
|
93
|
-
this.field = field;
|
|
94
|
-
this.parser = parser;
|
|
95
|
-
this.default = opts.default || parser.default;
|
|
96
|
-
this.required = Boolean(opts.required || !parser.nullable);
|
|
97
|
-
this.concurrency = Boolean(opts.concurrency);
|
|
98
|
-
this.maxLength = opts.maxLength || parser.maxLength;
|
|
99
|
-
this.minLength = opts.minLength;
|
|
100
|
-
this.min = opts.min;
|
|
101
|
-
this.max = opts.max;
|
|
102
|
-
this.pattern = opts.pattern;
|
|
103
|
-
}
|
|
104
|
-
get api() {
|
|
105
|
-
return this.options.api;
|
|
106
|
-
}
|
|
107
|
-
get type() {
|
|
108
|
-
return this.parser.type;
|
|
109
|
-
}
|
|
110
|
-
get navigation() {
|
|
111
|
-
return Boolean(this.parser.navigation);
|
|
112
|
-
}
|
|
113
|
-
get collection() {
|
|
114
|
-
return Boolean(this.parser.collection);
|
|
115
|
-
}
|
|
116
|
-
annotatedValue(term) {
|
|
117
|
-
return this.parser.annotatedValue(term);
|
|
118
|
-
}
|
|
119
|
-
configure({ findOptionsForType, concurrency, options, }) {
|
|
120
|
-
this.meta = findOptionsForType(this.parser.type);
|
|
121
|
-
if (concurrency)
|
|
122
|
-
this.concurrency = concurrency;
|
|
123
|
-
if (this.default !== undefined)
|
|
124
|
-
this.default = this.deserialize(this.default, options);
|
|
125
|
-
}
|
|
126
|
-
isKey() {
|
|
127
|
-
return this.parser.isKey();
|
|
128
|
-
}
|
|
129
|
-
hasReferentials() {
|
|
130
|
-
return this.parser.hasReferentials();
|
|
131
|
-
}
|
|
132
|
-
get referentials() {
|
|
133
|
-
return this.parser.referentials;
|
|
134
|
-
}
|
|
135
|
-
isStructuredType() {
|
|
136
|
-
return this.parser.isStructuredType();
|
|
137
|
-
}
|
|
138
|
-
structured() {
|
|
139
|
-
//TODO: Throw error if not found
|
|
140
|
-
return this.api.findStructuredTypeForType(this.parser.type);
|
|
141
|
-
}
|
|
142
|
-
isEnumType() {
|
|
143
|
-
return this.parser.isEnumType();
|
|
144
|
-
}
|
|
145
|
-
enum() {
|
|
146
|
-
//TODO: Throw error if not found
|
|
147
|
-
return this.api.findEnumTypeForType(this.parser.type);
|
|
148
|
-
}
|
|
149
|
-
validate(value, { method, navigation = false, } = {}) {
|
|
150
|
-
var _a;
|
|
151
|
-
/*
|
|
152
|
-
if ('isValid' in value && typeof value.isValid === 'function') {
|
|
153
|
-
return !value.isValid({ method, navigation }) ? value._errors : undefined;
|
|
154
|
-
} else if ('models' in value && typeof value.models === 'function') {
|
|
155
|
-
*/
|
|
156
|
-
if (ODataModelOptions.isModel(value)) {
|
|
157
|
-
return !value.isValid({ method, navigation }) ? value._errors : undefined;
|
|
158
|
-
}
|
|
159
|
-
else if (ODataModelOptions.isCollection(value)) {
|
|
160
|
-
return value
|
|
161
|
-
.models()
|
|
162
|
-
.some((m) => !m.isValid({ method, navigation }))
|
|
163
|
-
? value.models().map((m) => m._errors)
|
|
164
|
-
: undefined;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
const computed = this.annotatedValue(COMPUTED);
|
|
168
|
-
let errors = ((_a = this.parser) === null || _a === void 0 ? void 0 : _a.validate(value, { method, navigation })) || [];
|
|
169
|
-
if (this.required &&
|
|
170
|
-
(value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
|
|
171
|
-
!(computed && method === 'create') // Not (Is Computed field and create) ?
|
|
172
|
-
) {
|
|
173
|
-
errors.push(`required`);
|
|
174
|
-
}
|
|
175
|
-
if (this.maxLength !== undefined &&
|
|
176
|
-
typeof value === 'string' &&
|
|
177
|
-
value.length > this.maxLength) {
|
|
178
|
-
errors.push(`maxlength`);
|
|
179
|
-
}
|
|
180
|
-
if (this.minLength !== undefined &&
|
|
181
|
-
typeof value === 'string' &&
|
|
182
|
-
value.length < this.minLength) {
|
|
183
|
-
errors.push(`minlength`);
|
|
184
|
-
}
|
|
185
|
-
if (this.min !== undefined &&
|
|
186
|
-
typeof value === 'number' &&
|
|
187
|
-
value < this.min) {
|
|
188
|
-
errors.push(`min`);
|
|
189
|
-
}
|
|
190
|
-
if (this.max !== undefined &&
|
|
191
|
-
typeof value === 'number' &&
|
|
192
|
-
value > this.max) {
|
|
193
|
-
errors.push(`max`);
|
|
194
|
-
}
|
|
195
|
-
if (this.pattern !== undefined &&
|
|
196
|
-
typeof value === 'string' &&
|
|
197
|
-
!this.pattern.test(value)) {
|
|
198
|
-
errors.push(`pattern`);
|
|
199
|
-
}
|
|
200
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
defaults() {
|
|
204
|
-
return this.isStructuredType() && this.meta !== undefined
|
|
205
|
-
? this.meta.defaults()
|
|
206
|
-
: this.default;
|
|
207
|
-
}
|
|
208
|
-
deserialize(value, options) {
|
|
209
|
-
const parserOptions = options !== undefined
|
|
210
|
-
? new ODataParserOptions(options)
|
|
211
|
-
: this.api.options;
|
|
212
|
-
return this.parser.deserialize(value, parserOptions);
|
|
213
|
-
}
|
|
214
|
-
serialize(value, options) {
|
|
215
|
-
const parserOptions = options !== undefined
|
|
216
|
-
? new ODataParserOptions(options)
|
|
217
|
-
: this.api.options;
|
|
218
|
-
return this.parser.serialize(value, parserOptions);
|
|
219
|
-
}
|
|
220
|
-
encode(value, options) {
|
|
221
|
-
const parserOptions = options !== undefined
|
|
222
|
-
? new ODataParserOptions(options)
|
|
223
|
-
: this.api.options;
|
|
224
|
-
return this.parser.encode(value, parserOptions);
|
|
225
|
-
}
|
|
226
|
-
resourceFactory(base) {
|
|
227
|
-
if (!(base instanceof ODataEntityResource ||
|
|
228
|
-
base instanceof ODataNavigationPropertyResource ||
|
|
229
|
-
base instanceof ODataPropertyResource))
|
|
230
|
-
throw new Error("Can't build resource for non compatible base type");
|
|
231
|
-
return this.navigation
|
|
232
|
-
? base.navigationProperty(this.parser.name)
|
|
233
|
-
: base.property(this.parser.name);
|
|
234
|
-
}
|
|
235
|
-
annotationsFactory(base) {
|
|
236
|
-
return this.parser.collection
|
|
237
|
-
? new ODataEntitiesAnnotations(base.helper, base.property(this.parser.name) || {})
|
|
238
|
-
: new ODataEntityAnnotations(base.helper, base.property(this.parser.name) || {});
|
|
239
|
-
}
|
|
240
|
-
schemaFactory(base) {
|
|
241
|
-
return this.api.findStructuredTypeForType(this.parser.type);
|
|
242
|
-
}
|
|
243
|
-
modelCollectionFactory({ parent, value, reset, }) {
|
|
244
|
-
const schema = this.schemaFactory(parent.schema());
|
|
245
|
-
const annots = this.annotationsFactory(parent.annots());
|
|
246
|
-
const Model = schema === null || schema === void 0 ? void 0 : schema.model;
|
|
247
|
-
const Collection = schema === null || schema === void 0 ? void 0 : schema.collection;
|
|
248
|
-
if (Model === undefined || Collection === undefined)
|
|
249
|
-
throw Error(`No model for ${this.name}`);
|
|
250
|
-
return this.parser.collection
|
|
251
|
-
? new Collection((value || []), {
|
|
252
|
-
annots: annots,
|
|
253
|
-
parent: [parent, this],
|
|
254
|
-
reset,
|
|
255
|
-
})
|
|
256
|
-
: new Model((value || {}), {
|
|
257
|
-
annots: annots,
|
|
258
|
-
parent: [parent, this],
|
|
259
|
-
reset,
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
export class ODataModelOptions {
|
|
264
|
-
constructor(options, schema) {
|
|
265
|
-
this.children = [];
|
|
266
|
-
this.name = schema.name;
|
|
267
|
-
this.base = schema.base;
|
|
268
|
-
this.open = schema.open;
|
|
269
|
-
this.schema = schema;
|
|
270
|
-
this.cid = options.cid || CID;
|
|
271
|
-
const schemaFields = this.schema.fields({
|
|
272
|
-
include_navigation: true,
|
|
273
|
-
include_parents: true,
|
|
274
|
-
});
|
|
275
|
-
this._fields = Object.entries(options.fields).map(([name, options]) => {
|
|
276
|
-
const { field } = options, opts = __rest(options, ["field"]);
|
|
277
|
-
if (field === undefined || name === undefined)
|
|
278
|
-
throw new Error('Model Properties need name and field');
|
|
279
|
-
const parser = schemaFields.find((f) => f.name === field);
|
|
280
|
-
if (parser === undefined)
|
|
281
|
-
throw new Error(`No parser for ${field} with name = ${name}`);
|
|
282
|
-
return new ODataModelField(this, Object.assign({ name, field, parser }, opts));
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
get api() {
|
|
286
|
-
return this.schema.api;
|
|
287
|
-
}
|
|
288
|
-
type() {
|
|
289
|
-
return this.schema.type();
|
|
290
|
-
}
|
|
291
|
-
isTypeOf(type) {
|
|
292
|
-
return this.schema.isTypeOf(type);
|
|
293
|
-
}
|
|
294
|
-
findChildOptions(predicate) {
|
|
295
|
-
if (predicate(this))
|
|
296
|
-
return this;
|
|
297
|
-
let match;
|
|
298
|
-
for (let ch of this.children) {
|
|
299
|
-
match = ch.findChildOptions(predicate);
|
|
300
|
-
if (match !== undefined)
|
|
301
|
-
break;
|
|
302
|
-
}
|
|
303
|
-
return match;
|
|
304
|
-
}
|
|
305
|
-
configure({ findOptionsForType, options, }) {
|
|
306
|
-
if (this.base) {
|
|
307
|
-
const parent = findOptionsForType(this.base);
|
|
308
|
-
parent.children.push(this);
|
|
309
|
-
this.parent = parent;
|
|
310
|
-
}
|
|
311
|
-
this.entitySet = this.api.findEntitySetForEntityType(this.type());
|
|
312
|
-
let concurrencyFields = [];
|
|
313
|
-
if (this.entitySet !== undefined) {
|
|
314
|
-
concurrencyFields =
|
|
315
|
-
this.entitySet.annotatedValue(OPTIMISTIC_CONCURRENCY) || [];
|
|
316
|
-
}
|
|
317
|
-
this._fields.forEach((field) => {
|
|
318
|
-
let concurrency = concurrencyFields.indexOf(field.field) !== -1;
|
|
319
|
-
field.configure({
|
|
320
|
-
findOptionsForType,
|
|
321
|
-
concurrency,
|
|
322
|
-
options,
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
fields({ include_navigation = false, include_parents = true, } = {}) {
|
|
327
|
-
return [
|
|
328
|
-
...(include_parents && this.parent !== undefined
|
|
329
|
-
? this.parent.fields({ include_navigation, include_parents })
|
|
330
|
-
: []),
|
|
331
|
-
...this._fields.filter((field) => include_navigation || !field.navigation),
|
|
332
|
-
];
|
|
333
|
-
}
|
|
334
|
-
field(name) {
|
|
335
|
-
//TODO: Throw error if not found
|
|
336
|
-
return this.fields({
|
|
337
|
-
include_parents: true,
|
|
338
|
-
include_navigation: true,
|
|
339
|
-
}).find((modelField) => modelField.name === name || modelField.field === name);
|
|
340
|
-
}
|
|
341
|
-
attach(self, resource) {
|
|
342
|
-
if (self._resource !== undefined &&
|
|
343
|
-
resource.type() !== self._resource.type() &&
|
|
344
|
-
!resource.isSubtypeOf(self._resource))
|
|
345
|
-
throw new Error(`Can't reattach ${resource.type()} to ${self._resource.type()}`);
|
|
346
|
-
const current = self._resource;
|
|
347
|
-
if (current === undefined || !current.isEqualTo(resource)) {
|
|
348
|
-
self._resource = resource;
|
|
349
|
-
self.events$.emit(new ODataModelEvent('attach', {
|
|
350
|
-
model: self,
|
|
351
|
-
previous: current,
|
|
352
|
-
value: resource,
|
|
353
|
-
}));
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
//# region Resource
|
|
357
|
-
static chain(child) {
|
|
358
|
-
const chain = [];
|
|
359
|
-
let tuple = [child, null];
|
|
360
|
-
while (tuple !== null) {
|
|
361
|
-
const parent = tuple;
|
|
362
|
-
if (chain.some((p) => p[0] === parent[0]))
|
|
363
|
-
break;
|
|
364
|
-
chain.splice(0, 0, parent);
|
|
365
|
-
tuple = tuple[0]._parent;
|
|
366
|
-
}
|
|
367
|
-
return chain;
|
|
368
|
-
}
|
|
369
|
-
static resource(child) {
|
|
370
|
-
var _a;
|
|
371
|
-
let resource = undefined;
|
|
372
|
-
for (let [model, field] of ODataModelOptions.chain(child)) {
|
|
373
|
-
resource =
|
|
374
|
-
resource ||
|
|
375
|
-
model._resource ||
|
|
376
|
-
(ODataModelOptions.isModel(model)
|
|
377
|
-
? model._meta.modelResourceFactory()
|
|
378
|
-
: model._model.meta.collectionResourceFactory());
|
|
379
|
-
if (resource === undefined)
|
|
380
|
-
break;
|
|
381
|
-
if (ODataModelOptions.isModel(model)) {
|
|
382
|
-
let key = model.key({
|
|
383
|
-
field_mapping: true,
|
|
384
|
-
});
|
|
385
|
-
if (key !== undefined)
|
|
386
|
-
resource =
|
|
387
|
-
resource instanceof ODataEntitySetResource
|
|
388
|
-
? resource.entity(key)
|
|
389
|
-
: resource.key(key);
|
|
390
|
-
}
|
|
391
|
-
if (field === null) {
|
|
392
|
-
const query = (_a = model._resource) === null || _a === void 0 ? void 0 : _a.cloneQuery().toQueryArguments();
|
|
393
|
-
if (query !== undefined)
|
|
394
|
-
resource.query((q) => q.apply(query));
|
|
395
|
-
continue;
|
|
396
|
-
}
|
|
397
|
-
resource = field.resourceFactory(resource);
|
|
398
|
-
}
|
|
399
|
-
if (resource === undefined)
|
|
400
|
-
throw new Error(`resource: Can't build resource for ${child}`);
|
|
401
|
-
return resource;
|
|
402
|
-
}
|
|
403
|
-
collectionResourceFactory({ baseResource, } = {}) {
|
|
404
|
-
if (this.entitySet !== undefined)
|
|
405
|
-
return ODataEntitySetResource.factory(this.api, this.entitySet.name, this.type(), new ODataPathSegments(), (baseResource === null || baseResource === void 0 ? void 0 : baseResource.cloneQuery()) || new ODataQueryOptions());
|
|
406
|
-
if (baseResource === undefined)
|
|
407
|
-
throw new Error("collectionResourceFactory: Can't build resource");
|
|
408
|
-
return baseResource.clone();
|
|
409
|
-
}
|
|
410
|
-
modelResourceFactory({ baseResource, } = {}) {
|
|
411
|
-
const resource = this.collectionResourceFactory({ baseResource });
|
|
412
|
-
if (resource instanceof ODataEntitySetResource)
|
|
413
|
-
return resource.entity();
|
|
414
|
-
return resource;
|
|
415
|
-
}
|
|
416
|
-
entityResource(self) {
|
|
417
|
-
let resource = this.modelResourceFactory({
|
|
418
|
-
baseResource: self._resource,
|
|
419
|
-
fromSet: true,
|
|
420
|
-
});
|
|
421
|
-
const key = self.key({ field_mapping: true });
|
|
422
|
-
if (key !== undefined)
|
|
423
|
-
return resource.key(key);
|
|
424
|
-
return resource;
|
|
425
|
-
}
|
|
426
|
-
//#endregion
|
|
427
|
-
bind(self, { parent, resource, annots, } = {}) {
|
|
428
|
-
// Parent
|
|
429
|
-
if (parent !== undefined) {
|
|
430
|
-
self._parent = parent;
|
|
431
|
-
}
|
|
432
|
-
else if (resource !== undefined) {
|
|
433
|
-
// Resource
|
|
434
|
-
this.attach(self, resource);
|
|
435
|
-
}
|
|
436
|
-
// Annotations
|
|
437
|
-
self._annotations =
|
|
438
|
-
annots || new ODataEntityAnnotations(ODataHelper[DEFAULT_VERSION]);
|
|
439
|
-
const fields = this.fields({
|
|
440
|
-
include_navigation: true,
|
|
441
|
-
include_parents: true,
|
|
442
|
-
});
|
|
443
|
-
for (let field of fields) {
|
|
444
|
-
Object.defineProperty(self, field.name, {
|
|
445
|
-
configurable: true,
|
|
446
|
-
get: () => this._get(self, field),
|
|
447
|
-
set: (value) => this._set(self, field, value),
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
query(self, resource, func) {
|
|
452
|
-
resource.query(func);
|
|
453
|
-
this.attach(self, resource);
|
|
454
|
-
return self;
|
|
455
|
-
}
|
|
456
|
-
resolveKey(value, { field_mapping = false, resolve = true, } = {}) {
|
|
457
|
-
const keyTypes = this.schema.keys({ include_parents: true });
|
|
458
|
-
const key = {};
|
|
459
|
-
for (var kt of keyTypes) {
|
|
460
|
-
let v = value;
|
|
461
|
-
let options = this;
|
|
462
|
-
let field;
|
|
463
|
-
for (let name of kt.name.split('/')) {
|
|
464
|
-
if (options === undefined)
|
|
465
|
-
break;
|
|
466
|
-
field = options
|
|
467
|
-
.fields({ include_parents: true })
|
|
468
|
-
.find((field) => field.field === name);
|
|
469
|
-
if (field !== undefined) {
|
|
470
|
-
v =
|
|
471
|
-
Types.isPlainObject(v) || ODataModelOptions.isModel(v)
|
|
472
|
-
? v[field.name]
|
|
473
|
-
: v;
|
|
474
|
-
options = field.meta;
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
if (field === undefined)
|
|
478
|
-
return undefined;
|
|
479
|
-
let name = field_mapping ? field.field : field.name;
|
|
480
|
-
if (kt.alias !== undefined)
|
|
481
|
-
name = kt.alias;
|
|
482
|
-
key[name] = v;
|
|
483
|
-
}
|
|
484
|
-
if (Types.isEmpty(key))
|
|
485
|
-
return undefined;
|
|
486
|
-
return resolve ? Objects.resolveKey(key) : key;
|
|
487
|
-
}
|
|
488
|
-
resolveReferential(value, field, { field_mapping = false, resolve = true, } = {}) {
|
|
489
|
-
const referential = {};
|
|
490
|
-
for (var ref of field.referentials) {
|
|
491
|
-
let from = this.fields({ include_parents: true }).find((p) => p.field === ref.referencedProperty);
|
|
492
|
-
let to = field.options
|
|
493
|
-
.fields({ include_parents: true })
|
|
494
|
-
.find((field) => field.field === ref.property);
|
|
495
|
-
if (from !== undefined && to !== undefined) {
|
|
496
|
-
let name = field_mapping ? to.field : to.name;
|
|
497
|
-
referential[name] = value && value[from.name];
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
if (Types.isEmpty(referential))
|
|
501
|
-
return undefined;
|
|
502
|
-
return resolve
|
|
503
|
-
? Objects.resolveKey(referential, { single: false })
|
|
504
|
-
: referential;
|
|
505
|
-
}
|
|
506
|
-
resolveReferenced(value, field, { field_mapping = false, resolve = true, } = {}) {
|
|
507
|
-
const referenced = {};
|
|
508
|
-
for (var ref of field.referentials) {
|
|
509
|
-
let from = this.fields({ include_parents: true }).find((field) => field.field === ref.property);
|
|
510
|
-
let to = field.meta
|
|
511
|
-
.fields({ include_parents: true })
|
|
512
|
-
.find((field) => field.field === ref.referencedProperty);
|
|
513
|
-
if (from !== undefined && to !== undefined) {
|
|
514
|
-
let name = field_mapping ? to.field : to.name;
|
|
515
|
-
referenced[name] = value && value[from.name];
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
if (Types.isEmpty(referenced))
|
|
519
|
-
return undefined;
|
|
520
|
-
return resolve
|
|
521
|
-
? Objects.resolveKey(referenced, { single: false })
|
|
522
|
-
: referenced;
|
|
523
|
-
}
|
|
524
|
-
validate(self, { method, navigation = false, } = {}) {
|
|
525
|
-
const errors = this.fields({
|
|
526
|
-
include_parents: true,
|
|
527
|
-
include_navigation: navigation,
|
|
528
|
-
}).reduce((acc, field) => {
|
|
529
|
-
let value = self[field.name];
|
|
530
|
-
let errs = field.validate(value, { method });
|
|
531
|
-
return errs !== undefined
|
|
532
|
-
? Object.assign(acc, { [field.name]: errs })
|
|
533
|
-
: acc;
|
|
534
|
-
}, {});
|
|
535
|
-
return !Types.isEmpty(errors) ? errors : undefined;
|
|
536
|
-
}
|
|
537
|
-
defaults() {
|
|
538
|
-
const defs = this.fields().reduce((acc, field) => {
|
|
539
|
-
let value = field.defaults();
|
|
540
|
-
return value !== undefined
|
|
541
|
-
? Object.assign(acc, { [field.name]: value })
|
|
542
|
-
: acc;
|
|
543
|
-
}, {});
|
|
544
|
-
return !Types.isEmpty(defs) ? defs : undefined;
|
|
545
|
-
}
|
|
546
|
-
hasChanged(self, { include_navigation = false } = {}) {
|
|
547
|
-
return (!Types.isEmpty(self._changes) ||
|
|
548
|
-
Object.values(self._relations)
|
|
549
|
-
.filter(({ field }) => !field.navigation || include_navigation)
|
|
550
|
-
.some(({ field, state, model }) => (!include_navigation || field.navigation) &&
|
|
551
|
-
(state === ODataModelState.Changed ||
|
|
552
|
-
(model != undefined && model.hasChanged({ include_navigation })))));
|
|
553
|
-
}
|
|
554
|
-
asEntity(self, func) {
|
|
555
|
-
const parent = self._parent;
|
|
556
|
-
self._parent = null;
|
|
557
|
-
const result = func(self);
|
|
558
|
-
if (result instanceof Observable) {
|
|
559
|
-
return result.pipe(finalize(() => (self._parent = parent)));
|
|
560
|
-
}
|
|
561
|
-
else {
|
|
562
|
-
self._parent = parent;
|
|
563
|
-
return result;
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
toEntity(self, { client_id = false, include_navigation = false, include_concurrency = false, include_computed = false, include_key = true, include_non_field = false, changes_only = false, field_mapping = false, chain = [], } = {}) {
|
|
567
|
-
let attrs = self.attributes({
|
|
568
|
-
changes_only,
|
|
569
|
-
field_mapping,
|
|
570
|
-
include_concurrency,
|
|
571
|
-
include_computed,
|
|
572
|
-
include_non_field,
|
|
573
|
-
});
|
|
574
|
-
let relations = Object.entries(self._relations)
|
|
575
|
-
.filter(
|
|
576
|
-
// Chain
|
|
577
|
-
([, { model }]) => chain.every((c) => c !== model))
|
|
578
|
-
.filter(
|
|
579
|
-
// Changes only
|
|
580
|
-
([, { model, state }]) => !changes_only ||
|
|
581
|
-
(changes_only &&
|
|
582
|
-
(state === ODataModelState.Changed ||
|
|
583
|
-
(model != undefined && model.hasChanged({ include_navigation })))))
|
|
584
|
-
.filter(([, { field, model }]) =>
|
|
585
|
-
// Navigation
|
|
586
|
-
(include_navigation && field.navigation && model !== null) ||
|
|
587
|
-
!field.navigation)
|
|
588
|
-
.map(([k, { model, field, state }]) => {
|
|
589
|
-
let changesOnly = changes_only &&
|
|
590
|
-
state !== ODataModelState.Changed &&
|
|
591
|
-
!!field.navigation;
|
|
592
|
-
let includeKey = include_key && !!field.navigation;
|
|
593
|
-
if (ODataModelOptions.isModel(model)) {
|
|
594
|
-
return [
|
|
595
|
-
k,
|
|
596
|
-
model.toEntity({
|
|
597
|
-
client_id,
|
|
598
|
-
include_navigation,
|
|
599
|
-
include_concurrency,
|
|
600
|
-
include_non_field,
|
|
601
|
-
field_mapping,
|
|
602
|
-
changes_only: changesOnly,
|
|
603
|
-
include_key: includeKey,
|
|
604
|
-
chain: [self, ...chain],
|
|
605
|
-
}),
|
|
606
|
-
];
|
|
607
|
-
}
|
|
608
|
-
else if (ODataModelOptions.isCollection(model)) {
|
|
609
|
-
return [
|
|
610
|
-
k,
|
|
611
|
-
model.toEntities({
|
|
612
|
-
client_id,
|
|
613
|
-
include_navigation,
|
|
614
|
-
include_concurrency,
|
|
615
|
-
include_non_field,
|
|
616
|
-
field_mapping,
|
|
617
|
-
changes_only: changesOnly,
|
|
618
|
-
include_key: includeKey,
|
|
619
|
-
chain: [self, ...chain],
|
|
620
|
-
}),
|
|
621
|
-
];
|
|
622
|
-
}
|
|
623
|
-
return [k, model];
|
|
624
|
-
})
|
|
625
|
-
.reduce((acc, [k, v]) => {
|
|
626
|
-
var _a;
|
|
627
|
-
const name = field_mapping
|
|
628
|
-
? ((_a = this.fields().find((field) => field.name === k)) === null || _a === void 0 ? void 0 : _a.field) || k
|
|
629
|
-
: k;
|
|
630
|
-
return Object.assign(acc, { [name]: v });
|
|
631
|
-
}, {});
|
|
632
|
-
// Create entity
|
|
633
|
-
let entity = Object.assign(Object.assign({}, attrs), relations);
|
|
634
|
-
// Add client_id
|
|
635
|
-
if (client_id) {
|
|
636
|
-
entity[this.cid] = self[this.cid];
|
|
637
|
-
}
|
|
638
|
-
// Add key
|
|
639
|
-
if (include_key) {
|
|
640
|
-
entity = Object.assign(Object.assign({}, entity), this.resolveKey(self, { field_mapping, resolve: false }));
|
|
641
|
-
}
|
|
642
|
-
// Add type
|
|
643
|
-
if (self._parent !== null &&
|
|
644
|
-
((ODataModelOptions.isModel(self._parent[0]) &&
|
|
645
|
-
self._parent[1].meta !== self._meta) ||
|
|
646
|
-
(ODataModelOptions.isCollection(self._parent[0]) &&
|
|
647
|
-
self._parent[0]._model
|
|
648
|
-
.meta !== self._meta))) {
|
|
649
|
-
this.api.options.helper.type(entity, this.schema.type());
|
|
650
|
-
}
|
|
651
|
-
return entity;
|
|
652
|
-
}
|
|
653
|
-
attributes(self, { changes_only = false, include_concurrency = false, include_computed = false, include_non_field = false, field_mapping = false, } = {}) {
|
|
654
|
-
// Attributes by fields (attributes for the model type)
|
|
655
|
-
const fieldAttrs = this.fields().reduce((acc, f) => {
|
|
656
|
-
const isChanged = f.name in self._changes;
|
|
657
|
-
const name = field_mapping ? f.field : f.name;
|
|
658
|
-
const computed = f.annotatedValue(COMPUTED);
|
|
659
|
-
const value = isChanged
|
|
660
|
-
? self._changes[f.name]
|
|
661
|
-
: self._attributes[f.name];
|
|
662
|
-
if (f.concurrency && include_concurrency) {
|
|
663
|
-
return Object.assign(acc, { [name]: value });
|
|
664
|
-
}
|
|
665
|
-
else if (computed && include_computed) {
|
|
666
|
-
return Object.assign(acc, { [name]: value });
|
|
667
|
-
}
|
|
668
|
-
else if (changes_only && isChanged) {
|
|
669
|
-
return Object.assign(acc, { [name]: value });
|
|
670
|
-
}
|
|
671
|
-
else if (!changes_only && !f.concurrency && !computed) {
|
|
672
|
-
return Object.assign(acc, { [name]: value });
|
|
673
|
-
}
|
|
674
|
-
else {
|
|
675
|
-
return acc;
|
|
676
|
-
}
|
|
677
|
-
}, {});
|
|
678
|
-
if (!include_non_field)
|
|
679
|
-
return fieldAttrs;
|
|
680
|
-
const names = Object.keys(fieldAttrs);
|
|
681
|
-
// Attributes from object (attributes for object)
|
|
682
|
-
const nonFieldAttrs = Object.entries(self)
|
|
683
|
-
.filter(([k]) => names.indexOf(k) === -1 && !k.startsWith('_') && !k.endsWith('$'))
|
|
684
|
-
.reduce((acc, [k, v]) => Object.assign(acc, { [k]: v }), {});
|
|
685
|
-
return Object.assign(Object.assign({}, fieldAttrs), nonFieldAttrs);
|
|
686
|
-
}
|
|
687
|
-
reset(self, { name, silent = false } = {}) {
|
|
688
|
-
if (!Types.isEmpty(name) && name in self._changes) {
|
|
689
|
-
const value = self._attributes[name];
|
|
690
|
-
const previous = self._changes[name];
|
|
691
|
-
delete self._changes[name];
|
|
692
|
-
if (!silent) {
|
|
693
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
694
|
-
model: self,
|
|
695
|
-
track: name,
|
|
696
|
-
value,
|
|
697
|
-
previous,
|
|
698
|
-
}));
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
else if (Types.isEmpty(name)) {
|
|
702
|
-
const entries = Object.entries(self._changes);
|
|
703
|
-
self._changes = {};
|
|
704
|
-
if (!silent) {
|
|
705
|
-
entries.forEach((entry) => {
|
|
706
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
707
|
-
track: entry[0],
|
|
708
|
-
model: self,
|
|
709
|
-
value: self._attributes[entry[0]],
|
|
710
|
-
previous: entry[1],
|
|
711
|
-
}));
|
|
712
|
-
});
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
assign(self, entity, { reset = false, reparent = false, silent = false, } = {}) {
|
|
717
|
-
self._reset = reset;
|
|
718
|
-
self._reparent = reparent;
|
|
719
|
-
self._silent = silent;
|
|
720
|
-
const changes = [];
|
|
721
|
-
// Apply entity
|
|
722
|
-
const model = self;
|
|
723
|
-
Object.entries(entity)
|
|
724
|
-
.filter(([, value]) => value !== undefined) // Filter undefined
|
|
725
|
-
.forEach(([key, value]) => {
|
|
726
|
-
const field = this.fields({
|
|
727
|
-
include_parents: true,
|
|
728
|
-
include_navigation: true,
|
|
729
|
-
}).find((field) => (self._reset && field.field === key) || field.name === key);
|
|
730
|
-
if (field !== undefined) {
|
|
731
|
-
// Delegated to private setter
|
|
732
|
-
if (this._set(self, field, value)) {
|
|
733
|
-
changes.push(field.name);
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
else {
|
|
737
|
-
// Basic assignment
|
|
738
|
-
const current = model[key];
|
|
739
|
-
model[key] = value;
|
|
740
|
-
if (current !== value)
|
|
741
|
-
changes.push(key);
|
|
742
|
-
}
|
|
743
|
-
});
|
|
744
|
-
if (!self._silent && changes.length > 0) {
|
|
745
|
-
self.events$.emit(new ODataModelEvent(self._reset ? 'reset' : 'update', {
|
|
746
|
-
model: self,
|
|
747
|
-
options: { changes },
|
|
748
|
-
}));
|
|
749
|
-
}
|
|
750
|
-
self._reset = false;
|
|
751
|
-
self._reparent = false;
|
|
752
|
-
self._silent = false;
|
|
753
|
-
}
|
|
754
|
-
static isModel(obj) {
|
|
755
|
-
return Types.rawType(obj) === 'Model';
|
|
756
|
-
}
|
|
757
|
-
static isCollection(obj) {
|
|
758
|
-
return Types.rawType(obj) === 'Collection';
|
|
759
|
-
}
|
|
760
|
-
updateCollection(self, field, collection, value) {
|
|
761
|
-
collection._annotations = field.annotationsFactory(self.annots());
|
|
762
|
-
collection.assign(value, {
|
|
763
|
-
reset: self._reset,
|
|
764
|
-
reparent: self._reparent,
|
|
765
|
-
silent: self._silent,
|
|
766
|
-
});
|
|
767
|
-
return collection.hasChanged();
|
|
768
|
-
}
|
|
769
|
-
updateModel(self, field, model, value) {
|
|
770
|
-
model._annotations = field.annotationsFactory(self.annots());
|
|
771
|
-
model.assign(value, {
|
|
772
|
-
reset: self._reset,
|
|
773
|
-
reparent: self._reparent,
|
|
774
|
-
silent: self._silent,
|
|
775
|
-
});
|
|
776
|
-
return model.hasChanged();
|
|
777
|
-
}
|
|
778
|
-
_get(self, field) {
|
|
779
|
-
var _a;
|
|
780
|
-
if (field.isStructuredType()) {
|
|
781
|
-
return (_a = self._relations[field.name]) === null || _a === void 0 ? void 0 : _a.model;
|
|
782
|
-
}
|
|
783
|
-
else {
|
|
784
|
-
return this.attributes(self, {
|
|
785
|
-
include_concurrency: true,
|
|
786
|
-
include_computed: true,
|
|
787
|
-
})[field.name];
|
|
788
|
-
}
|
|
789
|
-
}
|
|
790
|
-
_setStructured(self, field, value) {
|
|
791
|
-
var _a;
|
|
792
|
-
let changed = false;
|
|
793
|
-
// Ensures that the relation exists
|
|
794
|
-
if (!(field.name in self._relations)) {
|
|
795
|
-
self._relations[field.name] = {
|
|
796
|
-
state: ODataModelState.Unchanged,
|
|
797
|
-
field: field,
|
|
798
|
-
};
|
|
799
|
-
}
|
|
800
|
-
const relation = self._relations[field.name];
|
|
801
|
-
const currentModel = relation.model;
|
|
802
|
-
if (value === null) {
|
|
803
|
-
relation.model = value;
|
|
804
|
-
changed = currentModel !== value;
|
|
805
|
-
this._unsubscribe(self, relation);
|
|
806
|
-
}
|
|
807
|
-
else if (ODataModelOptions.isCollection(currentModel)) {
|
|
808
|
-
if (ODataModelOptions.isCollection(value)) {
|
|
809
|
-
if (currentModel.equals(value)) {
|
|
810
|
-
changed = false;
|
|
811
|
-
}
|
|
812
|
-
this._unsubscribe(self, relation);
|
|
813
|
-
relation.model = value;
|
|
814
|
-
this._subscribe(self, relation);
|
|
815
|
-
if (self._reparent)
|
|
816
|
-
relation.model._parent = [self, field];
|
|
817
|
-
changed = true;
|
|
818
|
-
}
|
|
819
|
-
else if (Types.isArray(value)) {
|
|
820
|
-
changed = this.updateCollection(self, field, currentModel, value);
|
|
821
|
-
}
|
|
822
|
-
}
|
|
823
|
-
else if (ODataModelOptions.isModel(currentModel)) {
|
|
824
|
-
if (ODataModelOptions.isModel(value)) {
|
|
825
|
-
if (currentModel.equals(value)) {
|
|
826
|
-
changed = false;
|
|
827
|
-
}
|
|
828
|
-
this._unsubscribe(self, relation);
|
|
829
|
-
relation.model = value;
|
|
830
|
-
this._subscribe(self, relation);
|
|
831
|
-
if (self._reparent)
|
|
832
|
-
relation.model._parent = [self, field];
|
|
833
|
-
changed = true;
|
|
834
|
-
}
|
|
835
|
-
else if (Types.isPlainObject(value)) {
|
|
836
|
-
changed = this.updateModel(self, field, currentModel, value);
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
else {
|
|
840
|
-
relation.model =
|
|
841
|
-
ODataModelOptions.isCollection(value) ||
|
|
842
|
-
ODataModelOptions.isModel(value)
|
|
843
|
-
? value
|
|
844
|
-
: field.modelCollectionFactory({
|
|
845
|
-
parent: self,
|
|
846
|
-
value: value,
|
|
847
|
-
reset: self._reset,
|
|
848
|
-
});
|
|
849
|
-
changed = true;
|
|
850
|
-
this._subscribe(self, relation);
|
|
851
|
-
if (self._reparent)
|
|
852
|
-
relation.model._parent = [self, field];
|
|
853
|
-
}
|
|
854
|
-
if (!ODataModelOptions.isCollection(relation.model)) {
|
|
855
|
-
var ref = (_a = field.meta) === null || _a === void 0 ? void 0 : _a.resolveReferential(relation.model, field);
|
|
856
|
-
if (ref !== undefined) {
|
|
857
|
-
Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
|
|
858
|
-
}
|
|
859
|
-
}
|
|
860
|
-
relation.state =
|
|
861
|
-
self._reset || !changed
|
|
862
|
-
? ODataModelState.Unchanged
|
|
863
|
-
: ODataModelState.Changed;
|
|
864
|
-
if (!self._silent && changed) {
|
|
865
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
866
|
-
track: field.name,
|
|
867
|
-
model: self,
|
|
868
|
-
value: relation.model,
|
|
869
|
-
previous: currentModel,
|
|
870
|
-
}));
|
|
871
|
-
}
|
|
872
|
-
return changed;
|
|
873
|
-
}
|
|
874
|
-
_setValue(self, field, value, key) {
|
|
875
|
-
let changed = false;
|
|
876
|
-
const attrs = this.attributes(self, {
|
|
877
|
-
include_concurrency: true,
|
|
878
|
-
include_computed: true,
|
|
879
|
-
});
|
|
880
|
-
const currentValue = attrs[field];
|
|
881
|
-
changed = !Types.isEqual(currentValue, value);
|
|
882
|
-
if (self._reset) {
|
|
883
|
-
delete self._changes[field];
|
|
884
|
-
self._attributes[field] = value;
|
|
885
|
-
}
|
|
886
|
-
else if (Types.isEqual(value, self._attributes[field])) {
|
|
887
|
-
delete self._changes[field];
|
|
888
|
-
}
|
|
889
|
-
else if (changed) {
|
|
890
|
-
self._changes[field] = value;
|
|
891
|
-
}
|
|
892
|
-
if (!self._silent && changed) {
|
|
893
|
-
self.events$.emit(new ODataModelEvent('change', {
|
|
894
|
-
track: field,
|
|
895
|
-
model: self,
|
|
896
|
-
value,
|
|
897
|
-
previous: currentValue,
|
|
898
|
-
options: { key },
|
|
899
|
-
}));
|
|
900
|
-
}
|
|
901
|
-
return changed;
|
|
902
|
-
}
|
|
903
|
-
_set(self, field, value) {
|
|
904
|
-
return field.isStructuredType()
|
|
905
|
-
? this._setStructured(self, field, value)
|
|
906
|
-
: this._setValue(self, field.name, value, field.isKey());
|
|
907
|
-
}
|
|
908
|
-
_unsubscribe(self, relation) {
|
|
909
|
-
if (relation.subscription) {
|
|
910
|
-
relation.subscription.unsubscribe();
|
|
911
|
-
delete relation.subscription;
|
|
912
|
-
}
|
|
913
|
-
}
|
|
914
|
-
_subscribe(self, relation) {
|
|
915
|
-
if (relation.subscription) {
|
|
916
|
-
throw new Error('Subscription already exists');
|
|
917
|
-
}
|
|
918
|
-
if (relation.model == null) {
|
|
919
|
-
throw new Error('Subscription model is null');
|
|
920
|
-
}
|
|
921
|
-
relation.subscription = relation.model.events$.subscribe((event) => {
|
|
922
|
-
var _a;
|
|
923
|
-
if (BUBBLING.indexOf(event.name) !== -1 &&
|
|
924
|
-
event.bubbling &&
|
|
925
|
-
!event.visited(self)) {
|
|
926
|
-
if (event.model === relation.model) {
|
|
927
|
-
if (event.name === 'change' &&
|
|
928
|
-
relation.field.navigation &&
|
|
929
|
-
((_a = event.options) === null || _a === void 0 ? void 0 : _a.key)) {
|
|
930
|
-
var ref = relation.model.referential(relation.field);
|
|
931
|
-
if (ref !== undefined) {
|
|
932
|
-
Object.entries(ref).forEach(([k, v]) => this._setValue(self, k, v, false));
|
|
933
|
-
}
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
event.push(self, relation.field.name);
|
|
937
|
-
self.events$.emit(event);
|
|
938
|
-
}
|
|
939
|
-
});
|
|
940
|
-
}
|
|
941
|
-
}
|
|
942
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItb2RhdGEvc3JjL2xpYi9tb2RlbHMvb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFDTCxRQUFRLEVBQ1IsZUFBZSxFQUNmLHNCQUFzQixHQUN2QixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUNoRCxPQUFPLEVBRUwsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsc0JBQXNCLEVBQ3RCLCtCQUErQixFQUMvQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLGlCQUFpQixHQUlsQixNQUFNLGNBQWMsQ0FBQztBQU90QixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUkxQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBc0IxQixNQUFNLE9BQU8sZUFBZTtJQVkxQixZQUNFLElBQXlCLEVBQ3pCLEVBQ0UsS0FBSyxFQUNMLFVBQVUsRUFDVixRQUFRLEVBQ1IsS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLE1BUUwsRUFBRTtRQTFCUixhQUFRLEdBQVksSUFBSSxDQUFDO1FBNEJ2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6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S0FBSyxDQUFDLFVBQVU7eUJBQ3pCLE1BQUEsS0FBSyxDQUFDLE9BQU8sMENBQUUsR0FBRyxDQUFBLEVBQ2xCO3dCQUNBLElBQUksR0FBRyxHQUFJLFFBQVEsQ0FBQyxLQUF5QixDQUFDLFdBQVcsQ0FDdkQsUUFBUSxDQUFDLEtBQUssQ0FDZixDQUFDO3dCQUNGLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTs0QkFDckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQ2xDLENBQUM7eUJBQ0g7cUJBQ0Y7aUJBQ0Y7Z0JBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmluYWxpemUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBDT01QVVRFRCxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBPUFRJTUlTVElDX0NPTkNVUlJFTkNZLFxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFIZWxwZXIgfSBmcm9tICcuLi9oZWxwZXInO1xuaW1wb3J0IHsgT0RhdGFQYXJzZXJPcHRpb25zIH0gZnJvbSAnLi4vb3B0aW9ucyc7XG5pbXBvcnQge1xuICBFbnRpdHlLZXksXG4gIE9EYXRhRW50aXRpZXNBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlBbm5vdGF0aW9ucyxcbiAgT0RhdGFFbnRpdHlSZXNvdXJjZSxcbiAgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZSxcbiAgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFQYXRoU2VnbWVudHMsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFRdWVyeU9wdGlvbnMsXG4gIE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcixcbiAgT0RhdGFSZXNvdXJjZSxcbiAgT0RhdGFTaW5nbGV0b25SZXNvdXJjZSxcbn0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7XG4gIE9EYXRhRW50aXR5U2V0LFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlLFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXIsXG59IGZyb20gJy4uL3NjaGVtYSc7XG5pbXBvcnQgeyBPcHRpb25zLCBPcHRpb25zSGVscGVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgT2JqZWN0cywgVHlwZXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IE9EYXRhQ29sbGVjdGlvbiB9IGZyb20gJy4vY29sbGVjdGlvbic7XG5pbXBvcnQgdHlwZSB7IE9EYXRhTW9kZWwgfSBmcm9tICcuL21vZGVsJztcblxuZXhwb3J0IGNvbnN0IENJRCA9ICdfY2lkJztcbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxSZXNvdXJjZTxUPiA9XG4gIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxUPlxuICB8IE9EYXRhU2luZ2xldG9uUmVzb3VyY2U8VD5cbiAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+O1xuZXhwb3J0IHR5cGUgT0RhdGFDb2xsZWN0aW9uUmVzb3VyY2U8VD4gPVxuICB8IE9EYXRhRW50aXR5U2V0UmVzb3VyY2U8VD5cbiAgfCBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFQ+XG4gIHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFQ+O1xuXG5leHBvcnQgdHlwZSBPRGF0YU1vZGVsRXZlbnRUeXBlID1cbiAgfCAnY2hhbmdlJ1xuICB8ICdyZXNldCdcbiAgfCAndXBkYXRlJ1xuICB8ICdkZXN0cm95J1xuICB8ICdhZGQnXG4gIHwgJ3JlbW92ZSdcbiAgfCAnaW52YWxpZCdcbiAgfCAncmVxdWVzdCdcbiAgfCAnc3luYydcbiAgfCAnYXR0YWNoJztcbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsRXZlbnQ8VD4ge1xuICBuYW1lOiBPRGF0YU1vZGVsRXZlbnRUeXBlO1xuICBidWJibGluZzogYm9vbGVhbiA9IHRydWU7XG4gIG1vZGVsPzogT0RhdGFNb2RlbDxUPjtcbiAgY29sbGVjdGlvbj86IE9EYXRhQ29sbGVjdGlvbjxULCBPRGF0YU1vZGVsPFQ+PjtcbiAgY2hhaW46IFtcbiAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgIHN0cmluZyB8IG51bWJlciB8IG51bGxcbiAgXVtdO1xuICB2YWx1ZT86IGFueTtcbiAgcHJldmlvdXM/OiBhbnk7XG4gIG9wdGlvbnM/OiBhbnk7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG5hbWU6IE9EYXRhTW9kZWxFdmVudFR5cGUsXG4gICAge1xuICAgICAgbW9kZWwsXG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcHJldmlvdXMsXG4gICAgICB2YWx1ZSxcbiAgICAgIHRyYWNrLFxuICAgICAgb3B0aW9ucyxcbiAgICB9OiB7XG4gICAgICBtb2RlbD86IE9EYXRhTW9kZWw8VD47XG4gICAgICBjb2xsZWN0aW9uPzogT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+O1xuICAgICAgdHJhY2s/OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBwcmV2aW91cz86IGFueTtcbiAgICAgIHZhbHVlPzogYW55O1xuICAgICAgb3B0aW9ucz86IGFueTtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcbiAgICB0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5jaGFpbiA9IFtcbiAgICAgIFtcbiAgICAgICAgKHRoaXMuY29sbGVjdGlvbiB8fCB0aGlzLm1vZGVsKSBhc1xuICAgICAgICAgIHwgT0RhdGFNb2RlbDxhbnk+XG4gICAgICAgICAgfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICB0cmFjayB8fCBudWxsLFxuICAgICAgXSxcbiAgICBdO1xuICB9XG5cbiAgc3RvcFByb3BhZ2F0aW9uKCkge1xuICAgIHRoaXMuYnViYmxpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIHB1c2goXG4gICAgbW9kZWw6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgdHJhY2s6IHN0cmluZyB8IG51bWJlclxuICApIHtcbiAgICB0aGlzLmNoYWluLnNwbGljZSgwLCAwLCBbbW9kZWwsIHRyYWNrXSk7XG4gIH1cblxuICB2aXNpdGVkKG1vZGVsOiBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuY2hhaW4uc29tZSgoYykgPT4gY1swXSA9PT0gbW9kZWwpICYmXG4gICAgICB0aGlzLmNoYWluW3RoaXMuY2hhaW4ubGVuZ3RoIC0gMV1bMF0gIT09IG1vZGVsXG4gICAgKTtcbiAgfVxuXG4gIGdldCBwYXRoKCkge1xuICAgIHJldHVybiB0aGlzLmNoYWluXG4gICAgICAubWFwKChbLCB0cmFja10sIGluZGV4KSA9PlxuICAgICAgICB0eXBlb2YgdHJhY2sgPT09ICdudW1iZXInXG4gICAgICAgICAgPyBgWyR7dHJhY2t9XWBcbiAgICAgICAgICA6IHR5cGVvZiB0cmFjayA9PT0gJ3N0cmluZydcbiAgICAgICAgICA/IGluZGV4ID09PSAwXG4gICAgICAgICAgICA/IHRyYWNrXG4gICAgICAgICAgICA6IGAuJHt0cmFja31gXG4gICAgICAgICAgOiAnJ1xuICAgICAgKVxuICAgICAgLmpvaW4oJycpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBCVUJCTElORyA9IFtcbiAgJ2NoYW5nZScsXG4gICdyZXNldCcsXG4gICd1cGRhdGUnLFxuICAnZGVzdHJveScsXG4gICdhZGQnLFxuICAncmVtb3ZlJyxcbl07XG5cbmV4cG9ydCBjb25zdCBJTkNMVURFX1NIQUxMT1cgPSB7XG4gIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gIGluY2x1ZGVfa2V5OiB0cnVlLFxufTtcblxuZXhwb3J0IGNvbnN0IElOQ0xVREVfREVFUCA9IHtcbiAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICBpbmNsdWRlX25vbl9maWVsZDogdHJ1ZSxcbiAgLi4uSU5DTFVERV9TSEFMTE9XLFxufTtcblxuZXhwb3J0IGVudW0gT0RhdGFNb2RlbFN0YXRlIHtcbiAgQWRkZWQsXG4gIFJlbW92ZWQsXG4gIENoYW5nZWQsXG4gIFVuY2hhbmdlZCxcbn1cblxuZXhwb3J0IHR5cGUgTW9kZWxPcHRpb25zID0ge1xuICBjaWQ/OiBzdHJpbmc7XG4gIGZpZWxkczogeyBbbmFtZTogc3RyaW5nXTogTW9kZWxGaWVsZE9wdGlvbnMgfTtcbn07XG5cbmV4cG9ydCB0eXBlIE1vZGVsRmllbGRPcHRpb25zID0ge1xuICBmaWVsZD86IHN0cmluZztcbiAgZGVmYXVsdD86IGFueTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBjb25jdXJyZW5jeT86IGJvb2xlYW47XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgbWluTGVuZ3RoPzogbnVtYmVyO1xuICBtaW4/OiBudW1iZXI7XG4gIG1heD86IG51bWJlcjtcbiAgcGF0dGVybj86IFJlZ0V4cDtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbCh7IGNpZCA9IENJRCB9OiB7IGNpZD86IHN0cmluZyB9ID0ge30pIHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKToge30gfT4oY29uc3RydWN0b3I6IFQpID0+IHtcbiAgICBjb25zdCBLbGFzcyA9IDxhbnk+Y29uc3RydWN0b3I7XG4gICAgaWYgKCFLbGFzcy5oYXNPd25Qcm9wZXJ0eSgnb3B0aW9ucycpKVxuICAgICAgS2xhc3Mub3B0aW9ucyA9IHsgZmllbGRzOiB7fSB9IGFzIE1vZGVsT3B0aW9ucztcbiAgICBLbGFzcy5vcHRpb25zLmNpZCA9IGNpZDtcbiAgICByZXR1cm4gY29uc3RydWN0b3I7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2RlbEZpZWxkKHtcbiAgbmFtZSxcbiAgLi4ub3B0aW9uc1xufTogeyBuYW1lPzogc3RyaW5nIH0gJiBNb2RlbEZpZWxkT3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgY29uc3QgS2xhc3MgPSB0YXJnZXQuY29uc3RydWN0b3I7XG4gICAgaWYgKCFLbGFzcy5oYXNPd25Qcm9wZXJ0eSgnb3B0aW9ucycpKVxuICAgICAgS2xhc3Mub3B0aW9ucyA9IHsgZmllbGRzOiB7fSB9IGFzIE1vZGVsT3B0aW9ucztcbiAgICBvcHRpb25zLmZpZWxkID0gbmFtZSB8fCBrZXk7XG4gICAgS2xhc3Mub3B0aW9ucy5maWVsZHNba2V5XSA9IG9wdGlvbnM7XG4gIH07XG59XG5cbmV4cG9ydCB0eXBlIE9EYXRhTW9kZWxGaWVsZE9wdGlvbnM8Rj4gPSBNb2RlbEZpZWxkT3B0aW9ucyAmIHtcbiAgbmFtZTogc3RyaW5nO1xuICBmaWVsZDogc3RyaW5nO1xuICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YU1vZGVsRmllbGQ8Rj4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHBhcnNlcjogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+O1xuICBvcHRpb25zOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICBtZXRhPzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgZGVmYXVsdD86IGFueTtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGNvbmN1cnJlbmN5OiBib29sZWFuO1xuICBtYXhMZW5ndGg/OiBudW1iZXI7XG4gIG1pbkxlbmd0aD86IG51bWJlcjtcbiAgbWluPzogbnVtYmVyO1xuICBtYXg/OiBudW1iZXI7XG4gIHBhdHRlcm4/OiBSZWdFeHA7XG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4sXG4gICAgeyBuYW1lLCBmaWVsZCwgcGFyc2VyLCAuLi5vcHRzIH06IE9EYXRhTW9kZWxGaWVsZE9wdGlvbnM8Rj5cbiAgKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMuZmllbGQgPSBmaWVsZDtcbiAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjtcbiAgICB0aGlzLmRlZmF1bHQgPSBvcHRzLmRlZmF1bHQgfHwgcGFyc2VyLmRlZmF1bHQ7XG4gICAgdGhpcy5yZXF1aXJlZCA9IEJvb2xlYW4ob3B0cy5yZXF1aXJlZCB8fCAhcGFyc2VyLm51bGxhYmxlKTtcbiAgICB0aGlzLmNvbmN1cnJlbmN5ID0gQm9vbGVhbihvcHRzLmNvbmN1cnJlbmN5KTtcbiAgICB0aGlzLm1heExlbmd0aCA9IG9wdHMubWF4TGVuZ3RoIHx8IHBhcnNlci5tYXhMZW5ndGg7XG4gICAgdGhpcy5taW5MZW5ndGggPSBvcHRzLm1pbkxlbmd0aDtcbiAgICB0aGlzLm1pbiA9IG9wdHMubWluO1xuICAgIHRoaXMubWF4ID0gb3B0cy5tYXg7XG4gICAgdGhpcy5wYXR0ZXJuID0gb3B0cy5wYXR0ZXJuO1xuICB9XG5cbiAgZ2V0IGFwaSgpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmFwaTtcbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci50eXBlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb24oKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy5wYXJzZXIubmF2aWdhdGlvbik7XG4gIH1cblxuICBnZXQgY29sbGVjdGlvbigpIHtcbiAgICByZXR1cm4gQm9vbGVhbih0aGlzLnBhcnNlci5jb2xsZWN0aW9uKTtcbiAgfVxuXG4gIGFubm90YXRlZFZhbHVlPFQ+KHRlcm06IHN0cmluZyB8IFJlZ0V4cCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5hbm5vdGF0ZWRWYWx1ZTxUPih0ZXJtKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICAgIGNvbmN1cnJlbmN5LFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uY3VycmVuY3k6IGJvb2xlYW47XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIHRoaXMubWV0YSA9IGZpbmRPcHRpb25zRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgICBpZiAoY29uY3VycmVuY3kpIHRoaXMuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgICBpZiAodGhpcy5kZWZhdWx0ICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlc2VyaWFsaXplKHRoaXMuZGVmYXVsdCwgb3B0aW9ucyk7XG4gIH1cblxuICBpc0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaXNLZXkoKTtcbiAgfVxuXG4gIGhhc1JlZmVyZW50aWFscygpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuaGFzUmVmZXJlbnRpYWxzKCk7XG4gIH1cblxuICBnZXQgcmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5yZWZlcmVudGlhbHM7XG4gIH1cblxuICBpc1N0cnVjdHVyZWRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc1N0cnVjdHVyZWRUeXBlKCk7XG4gIH1cblxuICBzdHJ1Y3R1cmVkKCkge1xuICAgIC8vVE9ETzogVGhyb3cgZXJyb3IgaWYgbm90IGZvdW5kXG4gICAgcmV0dXJuIHRoaXMuYXBpLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8Rj4odGhpcy5wYXJzZXIudHlwZSk7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5pc0VudW1UeXBlKCk7XG4gIH1cblxuICBlbnVtKCkge1xuICAgIC8vVE9ETzogVGhyb3cgZXJyb3IgaWYgbm90IGZvdW5kXG4gICAgcmV0dXJuIHRoaXMuYXBpLmZpbmRFbnVtVHlwZUZvclR5cGU8Rj4odGhpcy5wYXJzZXIudHlwZSk7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICB2YWx1ZTogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgLypcbiAgICBpZiAoJ2lzVmFsaWQnIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pc1ZhbGlkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gIXZhbHVlLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkgPyB2YWx1ZS5fZXJyb3JzIDogdW5kZWZpbmVkO1xuICAgIH0gZWxzZSBpZiAoJ21vZGVscycgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLm1vZGVscyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKi9cbiAgICBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiAhdmFsdWUuaXNWYWxpZCh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSA/IHZhbHVlLl9lcnJvcnMgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgLm1vZGVscygpXG4gICAgICAgIC5zb21lKChtOiBPRGF0YU1vZGVsPGFueT4pID0+ICFtLmlzVmFsaWQoeyBtZXRob2QsIG5hdmlnYXRpb24gfSkpXG4gICAgICAgID8gdmFsdWUubW9kZWxzKCkubWFwKChtOiBPRGF0YU1vZGVsPGFueT4pID0+IG0uX2Vycm9ycylcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gICAgICBsZXQgZXJyb3JzID0gdGhpcy5wYXJzZXI/LnZhbGlkYXRlKHZhbHVlLCB7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KSB8fCBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5yZXF1aXJlZCAmJlxuICAgICAgICAodmFsdWUgPT09IG51bGwgfHwgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbWV0aG9kICE9PSAnbW9kaWZ5JykpICYmIC8vIElzIG51bGwgb3IgdW5kZWZpbmVkIHdpdGhvdXQgcGF0Y2g/XG4gICAgICAgICEoY29tcHV0ZWQgJiYgbWV0aG9kID09PSAnY3JlYXRlJykgLy8gTm90IChJcyBDb21wdXRlZCBmaWVsZCBhbmQgY3JlYXRlKSA/XG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYHJlcXVpcmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubWF4TGVuZ3RoICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICB2YWx1ZS5sZW5ndGggPiB0aGlzLm1heExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtYXhsZW5ndGhgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5taW5MZW5ndGggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIHZhbHVlLmxlbmd0aCA8IHRoaXMubWluTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgZXJyb3JzLnB1c2goYG1pbmxlbmd0aGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1pbiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdmFsdWUgPCB0aGlzLm1pblxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBtaW5gKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5tYXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmXG4gICAgICAgIHZhbHVlID4gdGhpcy5tYXhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgbWF4YCk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMucGF0dGVybiAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgIXRoaXMucGF0dGVybi50ZXN0KHZhbHVlKVxuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBkZWZhdWx0cygpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmlzU3RydWN0dXJlZFR5cGUoKSAmJiB0aGlzLm1ldGEgIT09IHVuZGVmaW5lZFxuICAgICAgPyB0aGlzLm1ldGEuZGVmYXVsdHMoKVxuICAgICAgOiB0aGlzLmRlZmF1bHQ7XG4gIH1cblxuICBkZXNlcmlhbGl6ZSh2YWx1ZTogYW55LCBvcHRpb25zPzogT3B0aW9ucyk6IEYge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSh2YWx1ZTogRiwgb3B0aW9ucz86IE9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPVxuICAgICAgb3B0aW9ucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbmV3IE9EYXRhUGFyc2VyT3B0aW9ucyhvcHRpb25zKVxuICAgICAgICA6IHRoaXMuYXBpLm9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwgcGFyc2VyT3B0aW9ucyk7XG4gIH1cblxuICBlbmNvZGUodmFsdWU6IEYsIG9wdGlvbnM/OiBPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG5ldyBPRGF0YVBhcnNlck9wdGlvbnMob3B0aW9ucylcbiAgICAgICAgOiB0aGlzLmFwaS5vcHRpb25zO1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5lbmNvZGUodmFsdWUsIHBhcnNlck9wdGlvbnMpO1xuICB9XG5cbiAgcmVzb3VyY2VGYWN0b3J5PFQsIEY+KFxuICAgIGJhc2U6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPlxuICApOiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPEY+IHwgT0RhdGFQcm9wZXJ0eVJlc291cmNlPEY+IHtcbiAgICBpZiAoXG4gICAgICAhKFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZSB8fFxuICAgICAgICBiYXNlIGluc3RhbmNlb2YgT0RhdGFQcm9wZXJ0eVJlc291cmNlXG4gICAgICApXG4gICAgKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgYnVpbGQgcmVzb3VyY2UgZm9yIG5vbiBjb21wYXRpYmxlIGJhc2UgdHlwZVwiKTtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uXG4gICAgICA/IChiYXNlIGFzIE9EYXRhRW50aXR5UmVzb3VyY2U8VD4pLm5hdmlnYXRpb25Qcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKVxuICAgICAgOiAoYmFzZSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFQ+KS5wcm9wZXJ0eTxGPih0aGlzLnBhcnNlci5uYW1lKTtcbiAgfVxuXG4gIGFubm90YXRpb25zRmFjdG9yeShcbiAgICBiYXNlOiBPRGF0YUVudGl0eUFubm90YXRpb25zXG4gICk6IE9EYXRhRW50aXR5QW5ub3RhdGlvbnMgfCBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnBhcnNlci5jb2xsZWN0aW9uXG4gICAgICA/IG5ldyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMoXG4gICAgICAgICAgYmFzZS5oZWxwZXIsXG4gICAgICAgICAgYmFzZS5wcm9wZXJ0eSh0aGlzLnBhcnNlci5uYW1lKSB8fCB7fVxuICAgICAgICApXG4gICAgICA6IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKFxuICAgICAgICAgIGJhc2UuaGVscGVyLFxuICAgICAgICAgIGJhc2UucHJvcGVydHkodGhpcy5wYXJzZXIubmFtZSkgfHwge31cbiAgICAgICAgKTtcbiAgfVxuXG4gIHNjaGVtYUZhY3Rvcnk8VCwgRj4oXG4gICAgYmFzZTogT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlPEY+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5hcGkuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZSh0aGlzLnBhcnNlci50eXBlKTtcbiAgfVxuXG4gIG1vZGVsQ29sbGVjdGlvbkZhY3Rvcnk8VCwgRj4oe1xuICAgIHBhcmVudCxcbiAgICB2YWx1ZSxcbiAgICByZXNldCxcbiAgfToge1xuICAgIHBhcmVudDogT0RhdGFNb2RlbDxhbnk+O1xuICAgIHZhbHVlPzogRiB8IEZbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXTtcbiAgICByZXNldD86IGJvb2xlYW47XG4gIH0pOiBPRGF0YU1vZGVsPEY+IHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB0aGlzLnNjaGVtYUZhY3Rvcnk8VCwgRj4ocGFyZW50LnNjaGVtYSgpKTtcbiAgICBjb25zdCBhbm5vdHMgPSB0aGlzLmFubm90YXRpb25zRmFjdG9yeShwYXJlbnQuYW5ub3RzKCkpO1xuXG4gICAgY29uc3QgTW9kZWwgPSBzY2hlbWE/Lm1vZGVsO1xuICAgIGNvbnN0IENvbGxlY3Rpb24gPSBzY2hlbWE/LmNvbGxlY3Rpb247XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQgfHwgQ29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgRXJyb3IoYE5vIG1vZGVsIGZvciAke3RoaXMubmFtZX1gKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIuY29sbGVjdGlvblxuICAgICAgPyAobmV3IENvbGxlY3Rpb24oKHZhbHVlIHx8IFtdKSBhcyBGW10sIHtcbiAgICAgICAgICBhbm5vdHM6IGFubm90cyBhcyBPRGF0YUVudGl0aWVzQW5ub3RhdGlvbnMsXG4gICAgICAgICAgcGFyZW50OiBbcGFyZW50LCB0aGlzXSxcbiAgICAgICAgICByZXNldCxcbiAgICAgICAgfSkgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+KVxuICAgICAgOiAobmV3IE1vZGVsKCh2YWx1ZSB8fCB7fSkgYXMgRiwge1xuICAgICAgICAgIGFubm90czogYW5ub3RzIGFzIE9EYXRhRW50aXR5QW5ub3RhdGlvbnMsXG4gICAgICAgICAgcGFyZW50OiBbcGFyZW50LCB0aGlzXSxcbiAgICAgICAgICByZXNldCxcbiAgICAgICAgfSkgYXMgT0RhdGFNb2RlbDxGPik7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbFJlbGF0aW9uPFQ+ID0ge1xuICBzdGF0ZTogT0RhdGFNb2RlbFN0YXRlO1xuICBtb2RlbD86IE9EYXRhTW9kZWw8VD4gfCBPRGF0YUNvbGxlY3Rpb248VCwgT0RhdGFNb2RlbDxUPj4gfCBudWxsO1xuICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPFQ+O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuZXhwb3J0IHR5cGUgT0RhdGFNb2RlbEVudHJ5PFQsIE0gZXh0ZW5kcyBPRGF0YU1vZGVsPFQ+PiA9IHtcbiAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZTtcbiAgbW9kZWw6IE07XG4gIGtleT86IEVudGl0eUtleTxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9O1xuICBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG59O1xuXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbE9wdGlvbnM8VD4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNpZDogc3RyaW5nO1xuICBiYXNlPzogc3RyaW5nO1xuICBvcGVuPzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZmllbGRzOiBPRGF0YU1vZGVsRmllbGQ8YW55PltdO1xuICBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD47XG4gIGVudGl0eVNldD86IE9EYXRhRW50aXR5U2V0O1xuICAvLyBIaWVyYXJjaHlcbiAgcGFyZW50PzogT0RhdGFNb2RlbE9wdGlvbnM8YW55PjtcbiAgY2hpbGRyZW46IE9EYXRhTW9kZWxPcHRpb25zPGFueT5bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE1vZGVsT3B0aW9ucywgc2NoZW1hOiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+KSB7XG4gICAgdGhpcy5uYW1lID0gc2NoZW1hLm5hbWU7XG4gICAgdGhpcy5iYXNlID0gc2NoZW1hLmJhc2U7XG4gICAgdGhpcy5vcGVuID0gc2NoZW1hLm9wZW47XG4gICAgdGhpcy5zY2hlbWEgPSBzY2hlbWE7XG4gICAgdGhpcy5jaWQgPSBvcHRpb25zLmNpZCB8fCBDSUQ7XG4gICAgY29uc3Qgc2NoZW1hRmllbGRzID0gdGhpcy5zY2hlbWEuZmllbGRzKHtcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogdHJ1ZSxcbiAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLl9maWVsZHMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zLmZpZWxkcykubWFwKChbbmFtZSwgb3B0aW9uc10pID0+IHtcbiAgICAgIGNvbnN0IHsgZmllbGQsIC4uLm9wdHMgfSA9IG9wdGlvbnM7XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBuYW1lID09PSB1bmRlZmluZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgUHJvcGVydGllcyBuZWVkIG5hbWUgYW5kIGZpZWxkJyk7XG4gICAgICBjb25zdCBwYXJzZXIgPSBzY2hlbWFGaWVsZHMuZmluZCgoZjogYW55KSA9PiBmLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwYXJzZXIgZm9yICR7ZmllbGR9IHdpdGggbmFtZSA9ICR7bmFtZX1gKTtcbiAgICAgIHJldHVybiBuZXcgT0RhdGFNb2RlbEZpZWxkPFQ+KHRoaXMsIHsgbmFtZSwgZmllbGQsIHBhcnNlciwgLi4ub3B0cyB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBhcGkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLmFwaTtcbiAgfVxuXG4gIHR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2NoZW1hLnR5cGUoKTtcbiAgfVxuXG4gIGlzVHlwZU9mKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNjaGVtYS5pc1R5cGVPZih0eXBlKTtcbiAgfVxuXG4gIGZpbmRDaGlsZE9wdGlvbnMoXG4gICAgcHJlZGljYXRlOiAob3B0aW9uczogT0RhdGFNb2RlbE9wdGlvbnM8YW55PikgPT4gYm9vbGVhblxuICApOiBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAocHJlZGljYXRlKHRoaXMpKSByZXR1cm4gdGhpcztcbiAgICBsZXQgbWF0Y2g6IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgY2ggb2YgdGhpcy5jaGlsZHJlbikge1xuICAgICAgbWF0Y2ggPSBjaC5maW5kQ2hpbGRPcHRpb25zKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgZmluZE9wdGlvbnNGb3JUeXBlLFxuICAgIG9wdGlvbnMsXG4gIH06IHtcbiAgICBmaW5kT3B0aW9uc0ZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgb3B0aW9uczogT3B0aW9uc0hlbHBlcjtcbiAgfSkge1xuICAgIGlmICh0aGlzLmJhc2UpIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGZpbmRPcHRpb25zRm9yVHlwZSh0aGlzLmJhc2UpIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICBwYXJlbnQuY2hpbGRyZW4ucHVzaCh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIH1cbiAgICB0aGlzLmVudGl0eVNldCA9IHRoaXMuYXBpLmZpbmRFbnRpdHlTZXRGb3JFbnRpdHlUeXBlKHRoaXMudHlwZSgpKTtcbiAgICBsZXQgY29uY3VycmVuY3lGaWVsZHM6IHN0cmluZ1tdID0gW107XG4gICAgaWYgKHRoaXMuZW50aXR5U2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmN1cnJlbmN5RmllbGRzID1cbiAgICAgICAgdGhpcy5lbnRpdHlTZXQuYW5ub3RhdGVkVmFsdWU8c3RyaW5nW10+KE9QVElNSVNUSUNfQ09OQ1VSUkVOQ1kpIHx8IFtdO1xuICAgIH1cbiAgICB0aGlzLl9maWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGxldCBjb25jdXJyZW5jeSA9IGNvbmN1cnJlbmN5RmllbGRzLmluZGV4T2YoZmllbGQuZmllbGQpICE9PSAtMTtcbiAgICAgIGZpZWxkLmNvbmZpZ3VyZSh7XG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZSxcbiAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpZWxkcyh7XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgaW5jbHVkZV9wYXJlbnRzID0gdHJ1ZSxcbiAgfToge1xuICAgIGluY2x1ZGVfcGFyZW50cz86IGJvb2xlYW47XG4gICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogT0RhdGFNb2RlbEZpZWxkPGFueT5bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLihpbmNsdWRlX3BhcmVudHMgJiYgdGhpcy5wYXJlbnQgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMucGFyZW50LmZpZWxkcyh7IGluY2x1ZGVfbmF2aWdhdGlvbiwgaW5jbHVkZV9wYXJlbnRzIH0pXG4gICAgICAgIDogW10pLFxuICAgICAgLi4udGhpcy5fZmllbGRzLmZpbHRlcihcbiAgICAgICAgKGZpZWxkKSA9PiBpbmNsdWRlX25hdmlnYXRpb24gfHwgIWZpZWxkLm5hdmlnYXRpb25cbiAgICAgICksXG4gICAgXTtcbiAgfVxuXG4gIGZpZWxkPEY+KG5hbWU6IGtleW9mIFQgfCBzdHJpbmcpIHtcbiAgICAvL1RPRE86IFRocm93IGVycm9yIGlmIG5vdCBmb3VuZFxuICAgIHJldHVybiB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZChcbiAgICAgIChtb2RlbEZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4pID0+XG4gICAgICAgIG1vZGVsRmllbGQubmFtZSA9PT0gbmFtZSB8fCBtb2RlbEZpZWxkLmZpZWxkID09PSBuYW1lXG4gICAgKTtcbiAgfVxuXG4gIGF0dGFjaChzZWxmOiBPRGF0YU1vZGVsPFQ+LCByZXNvdXJjZTogT0RhdGFNb2RlbFJlc291cmNlPFQ+KSB7XG4gICAgaWYgKFxuICAgICAgc2VsZi5fcmVzb3VyY2UgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcmVzb3VyY2UudHlwZSgpICE9PSBzZWxmLl9yZXNvdXJjZS50eXBlKCkgJiZcbiAgICAgICFyZXNvdXJjZS5pc1N1YnR5cGVPZihzZWxmLl9yZXNvdXJjZSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW4ndCByZWF0dGFjaCAke3Jlc291cmNlLnR5cGUoKX0gdG8gJHtzZWxmLl9yZXNvdXJjZS50eXBlKCl9YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSBzZWxmLl9yZXNvdXJjZTtcbiAgICBpZiAoY3VycmVudCA9PT0gdW5kZWZpbmVkIHx8ICFjdXJyZW50LmlzRXF1YWxUbyhyZXNvdXJjZSkpIHtcbiAgICAgIHNlbGYuX3Jlc291cmNlID0gcmVzb3VyY2U7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnYXR0YWNoJywge1xuICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50LFxuICAgICAgICAgIHZhbHVlOiByZXNvdXJjZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8jIHJlZ2lvbiBSZXNvdXJjZVxuICBzdGF0aWMgY2hhaW4oXG4gICAgY2hpbGQ6IE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgKTogW1xuICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gIF1bXSB7XG4gICAgY29uc3QgY2hhaW4gPSBbXSBhcyBhbnlbXTtcbiAgICBsZXQgdHVwbGU6XG4gICAgICB8IFtcbiAgICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgICBdXG4gICAgICB8IG51bGwgPSBbY2hpbGQsIG51bGxdO1xuICAgIHdoaWxlICh0dXBsZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgcGFyZW50ID0gdHVwbGUgYXMgW1xuICAgICAgICBPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+LFxuICAgICAgICBPRGF0YU1vZGVsRmllbGQ8YW55PiB8IG51bGxcbiAgICAgIF07XG4gICAgICBpZiAoY2hhaW4uc29tZSgocCkgPT4gcFswXSA9PT0gcGFyZW50WzBdKSkgYnJlYWs7XG4gICAgICBjaGFpbi5zcGxpY2UoMCwgMCwgcGFyZW50KTtcbiAgICAgIHR1cGxlID0gdHVwbGVbMF0uX3BhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIGNoYWluO1xuICB9XG5cbiAgc3RhdGljIHJlc291cmNlPFQ+KFxuICAgIGNoaWxkOiBPRGF0YU1vZGVsPFQ+IHwgT0RhdGFDb2xsZWN0aW9uPFQsIE9EYXRhTW9kZWw8VD4+XG4gICk6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPiB8IE9EYXRhQ29sbGVjdGlvblJlc291cmNlPFQ+IHtcbiAgICBsZXQgcmVzb3VyY2U6XG4gICAgICB8IE9EYXRhTW9kZWxSZXNvdXJjZTxhbnk+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvblJlc291cmNlPGFueT5cbiAgICAgIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IFttb2RlbCwgZmllbGRdIG9mIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKSkge1xuICAgICAgcmVzb3VyY2UgPVxuICAgICAgICByZXNvdXJjZSB8fFxuICAgICAgICBtb2RlbC5fcmVzb3VyY2UgfHxcbiAgICAgICAgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpXG4gICAgICAgICAgPyAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS5fbWV0YS5tb2RlbFJlc291cmNlRmFjdG9yeSgpXG4gICAgICAgICAgOiAoXG4gICAgICAgICAgICAgIG1vZGVsIGFzIE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj5cbiAgICAgICAgICAgICkuX21vZGVsLm1ldGEuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSgpKTtcbiAgICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKG1vZGVsKSkge1xuICAgICAgICBsZXQga2V5ID0gKG1vZGVsIGFzIE9EYXRhTW9kZWw8YW55Pikua2V5KHtcbiAgICAgICAgICBmaWVsZF9tYXBwaW5nOiB0cnVlLFxuICAgICAgICB9KSBhcyBFbnRpdHlLZXk8YW55PjtcbiAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgIHJlc291cmNlID1cbiAgICAgICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZVxuICAgICAgICAgICAgICA/IHJlc291cmNlLmVudGl0eShrZXkpXG4gICAgICAgICAgICAgIDogcmVzb3VyY2Uua2V5KGtleSk7XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSBtb2RlbC5fcmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKS50b1F1ZXJ5QXJndW1lbnRzKCk7XG4gICAgICAgIGlmIChxdWVyeSAhPT0gdW5kZWZpbmVkKSByZXNvdXJjZS5xdWVyeSgocSkgPT4gcS5hcHBseShxdWVyeSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc291cmNlID0gKGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+KS5yZXNvdXJjZUZhY3Rvcnk8YW55LCBhbnk+KFxuICAgICAgICByZXNvdXJjZSBhcyBPRGF0YU1vZGVsUmVzb3VyY2U8YW55PlxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlc291cmNlOiBDYW4ndCBidWlsZCByZXNvdXJjZSBmb3IgJHtjaGlsZH1gKTtcbiAgICByZXR1cm4gcmVzb3VyY2U7XG4gIH1cblxuICBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5KHtcbiAgICBiYXNlUmVzb3VyY2UsXG4gIH06IHsgYmFzZVJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPiB9ID0ge30pOiBPRGF0YUNvbGxlY3Rpb25SZXNvdXJjZTxUPiB7XG4gICAgaWYgKHRoaXMuZW50aXR5U2V0ICE9PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gT0RhdGFFbnRpdHlTZXRSZXNvdXJjZS5mYWN0b3J5PFQ+KFxuICAgICAgICB0aGlzLmFwaSxcbiAgICAgICAgdGhpcy5lbnRpdHlTZXQubmFtZSxcbiAgICAgICAgdGhpcy50eXBlKCksXG4gICAgICAgIG5ldyBPRGF0YVBhdGhTZWdtZW50cygpLFxuICAgICAgICBiYXNlUmVzb3VyY2U/LmNsb25lUXVlcnk8VD4oKSB8fCBuZXcgT0RhdGFRdWVyeU9wdGlvbnM8VD4oKVxuICAgICAgKTtcbiAgICBpZiAoYmFzZVJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDYW4ndCBidWlsZCByZXNvdXJjZVwiKTtcbiAgICByZXR1cm4gYmFzZVJlc291cmNlLmNsb25lKCkgYXMgT0RhdGFDb2xsZWN0aW9uUmVzb3VyY2U8VD47XG4gIH1cblxuICBtb2RlbFJlc291cmNlRmFjdG9yeSh7XG4gICAgYmFzZVJlc291cmNlLFxuICB9OiB7XG4gICAgZnJvbVNldD86IGJvb2xlYW47XG4gICAgYmFzZVJlc291cmNlPzogT0RhdGFSZXNvdXJjZTxUPjtcbiAgfSA9IHt9KTogT0RhdGFNb2RlbFJlc291cmNlPFQ+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSh7IGJhc2VSZXNvdXJjZSB9KTtcbiAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVNldFJlc291cmNlKSByZXR1cm4gcmVzb3VyY2UuZW50aXR5KCk7XG4gICAgcmV0dXJuIHJlc291cmNlIGFzIE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgfVxuXG4gIGVudGl0eVJlc291cmNlKHNlbGY6IE9EYXRhTW9kZWw8VD4pOiBPRGF0YU1vZGVsUmVzb3VyY2U8VD4ge1xuICAgIGxldCByZXNvdXJjZSA9IHRoaXMubW9kZWxSZXNvdXJjZUZhY3Rvcnkoe1xuICAgICAgYmFzZVJlc291cmNlOiBzZWxmLl9yZXNvdXJjZSxcbiAgICAgIGZyb21TZXQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3Qga2V5ID0gc2VsZi5rZXkoeyBmaWVsZF9tYXBwaW5nOiB0cnVlIH0pIGFzIEVudGl0eUtleTxUPjtcbiAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHJldHVybiByZXNvdXJjZS5rZXkoa2V5KTtcbiAgICByZXR1cm4gcmVzb3VyY2UgYXMgT0RhdGFNb2RlbFJlc291cmNlPFQ+O1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGJpbmQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBwYXJlbnQsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFubm90cyxcbiAgICB9OiB7XG4gICAgICBwYXJlbnQ/OiBbXG4gICAgICAgIE9EYXRhTW9kZWw8YW55PiB8IE9EYXRhQ29sbGVjdGlvbjxhbnksIE9EYXRhTW9kZWw8YW55Pj4sXG4gICAgICAgIE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgbnVsbFxuICAgICAgXTtcbiAgICAgIHJlc291cmNlPzogT0RhdGFNb2RlbFJlc291cmNlPFQ+O1xuICAgICAgYW5ub3RzPzogT0RhdGFFbnRpdHlBbm5vdGF0aW9ucztcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgLy8gUGFyZW50XG4gICAgaWYgKHBhcmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgfSBlbHNlIGlmIChyZXNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBSZXNvdXJjZVxuICAgICAgdGhpcy5hdHRhY2goc2VsZiwgcmVzb3VyY2UpO1xuICAgIH1cblxuICAgIC8vIEFubm90YXRpb25zXG4gICAgc2VsZi5fYW5ub3RhdGlvbnMgPVxuICAgICAgYW5ub3RzIHx8IG5ldyBPRGF0YUVudGl0eUFubm90YXRpb25zKE9EYXRhSGVscGVyW0RFRkFVTFRfVkVSU0lPTl0pO1xuXG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pO1xuICAgIGZvciAobGV0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIGZpZWxkLm5hbWUsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHRoaXMuX2dldChzZWxmLCBmaWVsZCBhcyBPRGF0YU1vZGVsRmllbGQ8YW55PiksXG4gICAgICAgIHNldDogKHZhbHVlOiBhbnkpID0+XG4gICAgICAgICAgdGhpcy5fc2V0KHNlbGYsIGZpZWxkIGFzIE9EYXRhTW9kZWxGaWVsZDxhbnk+LCB2YWx1ZSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBxdWVyeShcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHJlc291cmNlOiBPRGF0YU1vZGVsUmVzb3VyY2U8VD4sXG4gICAgZnVuYzogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPikgPT4gdm9pZFxuICApIHtcbiAgICByZXNvdXJjZS5xdWVyeShmdW5jKTtcbiAgICB0aGlzLmF0dGFjaChzZWxmLCByZXNvdXJjZSk7XG4gICAgcmV0dXJuIHNlbGY7XG4gIH1cblxuICByZXNvbHZlS2V5KFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICAgIHJlc29sdmUgPSB0cnVlLFxuICAgIH06IHsgZmllbGRfbWFwcGluZz86IGJvb2xlYW47IHJlc29sdmU/OiBib29sZWFuIH0gPSB7fVxuICApOiBFbnRpdHlLZXk8VD4gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5VHlwZXMgPSB0aGlzLnNjaGVtYS5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGtleTogYW55ID0ge307XG4gICAgZm9yICh2YXIga3Qgb2Yga2V5VHlwZXMpIHtcbiAgICAgIGxldCB2ID0gdmFsdWUgYXMgYW55O1xuICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzIGFzIE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gICAgICBsZXQgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgZm9yIChsZXQgbmFtZSBvZiBrdC5uYW1lLnNwbGl0KCcvJykpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgICAgIGZpZWxkID0gb3B0aW9uc1xuICAgICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgICAuZmluZCgoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5maWVsZCA9PT0gbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdiA9XG4gICAgICAgICAgICBUeXBlcy5pc1BsYWluT2JqZWN0KHYpIHx8IE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodilcbiAgICAgICAgICAgICAgPyB2W2ZpZWxkLm5hbWVdXG4gICAgICAgICAgICAgIDogdjtcbiAgICAgICAgICBvcHRpb25zID0gZmllbGQubWV0YSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IGZpZWxkLmZpZWxkIDogZmllbGQubmFtZTtcbiAgICAgIGlmIChrdC5hbGlhcyAhPT0gdW5kZWZpbmVkKSBuYW1lID0ga3QuYWxpYXM7XG4gICAgICBrZXlbbmFtZV0gPSB2O1xuICAgIH1cbiAgICBpZiAoVHlwZXMuaXNFbXB0eShrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlID8gT2JqZWN0cy5yZXNvbHZlS2V5KGtleSkgOiBrZXk7XG4gIH1cblxuICByZXNvbHZlUmVmZXJlbnRpYWwoXG4gICAgdmFsdWU6IE9EYXRhTW9kZWw8VD4gfCBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCBudWxsLFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PixcbiAgICB7XG4gICAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICB9OiB7IGZpZWxkX21hcHBpbmc/OiBib29sZWFuOyByZXNvbHZlPzogYm9vbGVhbiB9ID0ge31cbiAgKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlZmVyZW50aWFsOiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pLmZpbmQoXG4gICAgICAgIChwOiBhbnkpID0+IHAuZmllbGQgPT09IHJlZi5yZWZlcmVuY2VkUHJvcGVydHlcbiAgICAgICk7XG4gICAgICBsZXQgdG8gPSBmaWVsZC5vcHRpb25zXG4gICAgICAgIC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSlcbiAgICAgICAgLmZpbmQoKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT4gZmllbGQuZmllbGQgPT09IHJlZi5wcm9wZXJ0eSk7XG4gICAgICBpZiAoZnJvbSAhPT0gdW5kZWZpbmVkICYmIHRvICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gdG8uZmllbGQgOiB0by5uYW1lO1xuICAgICAgICByZWZlcmVudGlhbFtuYW1lXSA9IHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KHJlZmVyZW50aWFsKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZVxuICAgICAgPyBPYmplY3RzLnJlc29sdmVLZXkocmVmZXJlbnRpYWwsIHsgc2luZ2xlOiBmYWxzZSB9KVxuICAgICAgOiByZWZlcmVudGlhbDtcbiAgfVxuXG4gIHJlc29sdmVSZWZlcmVuY2VkKFxuICAgIHZhbHVlOiBPRGF0YU1vZGVsPFQ+IHwgVCB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgbnVsbCxcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWZlcmVuY2VkOiBhbnkgPSB7fTtcbiAgICBmb3IgKHZhciByZWYgb2YgZmllbGQucmVmZXJlbnRpYWxzKSB7XG4gICAgICBsZXQgZnJvbSA9IHRoaXMuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pLmZpbmQoXG4gICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+IGZpZWxkLmZpZWxkID09PSByZWYucHJvcGVydHlcbiAgICAgICk7XG4gICAgICBsZXQgdG8gPSAoZmllbGQubWV0YSBhcyBPRGF0YU1vZGVsT3B0aW9uczxhbnk+KVxuICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgIC5maW5kKFxuICAgICAgICAgIChmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4pID0+XG4gICAgICAgICAgICBmaWVsZC5maWVsZCA9PT0gcmVmLnJlZmVyZW5jZWRQcm9wZXJ0eVxuICAgICAgICApO1xuICAgICAgaWYgKGZyb20gIT09IHVuZGVmaW5lZCAmJiB0byAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBuYW1lID0gZmllbGRfbWFwcGluZyA/IHRvLmZpZWxkIDogdG8ubmFtZTtcbiAgICAgICAgcmVmZXJlbmNlZFtuYW1lXSA9IHZhbHVlICYmICh2YWx1ZSBhcyBhbnkpW2Zyb20ubmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChUeXBlcy5pc0VtcHR5KHJlZmVyZW5jZWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShyZWZlcmVuY2VkLCB7IHNpbmdsZTogZmFsc2UgfSlcbiAgICAgIDogcmVmZXJlbmNlZDtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAge1xuICAgICAgbWV0aG9kLFxuICAgICAgbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IG5hdmlnYXRpb24sXG4gICAgfSkucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSAoc2VsZiBhcyBhbnkpW2ZpZWxkLm5hbWVdO1xuICAgICAgbGV0IGVycnMgPSBmaWVsZC52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QgfSk7XG4gICAgICByZXR1cm4gZXJycyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2ZpZWxkLm5hbWVdOiBlcnJzIH0pXG4gICAgICAgIDogYWNjO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZXJyb3JzKSA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGRlZmF1bHRzKCk6IFQgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGVmcyA9IHRoaXMuZmllbGRzKCkucmVkdWNlKChhY2MsIGZpZWxkKSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBmaWVsZC5kZWZhdWx0cygpO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGFjYywgeyBbZmllbGQubmFtZV06IHZhbHVlIH0pXG4gICAgICAgIDogYWNjO1xuICAgIH0sIHt9KTtcbiAgICByZXR1cm4gIVR5cGVzLmlzRW1wdHkoZGVmcykgPyBkZWZzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaGFzQ2hhbmdlZChcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHsgaW5jbHVkZV9uYXZpZ2F0aW9uID0gZmFsc2UgfTogeyBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuIH0gPSB7fVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIVR5cGVzLmlzRW1wdHkoc2VsZi5fY2hhbmdlcykgfHxcbiAgICAgIE9iamVjdC52YWx1ZXMoc2VsZi5fcmVsYXRpb25zKVxuICAgICAgICAuZmlsdGVyKCh7IGZpZWxkIH0pID0+ICFmaWVsZC5uYXZpZ2F0aW9uIHx8IGluY2x1ZGVfbmF2aWdhdGlvbilcbiAgICAgICAgLnNvbWUoXG4gICAgICAgICAgKHsgZmllbGQsIHN0YXRlLCBtb2RlbCB9KSA9PlxuICAgICAgICAgICAgKCFpbmNsdWRlX25hdmlnYXRpb24gfHwgZmllbGQubmF2aWdhdGlvbikgJiZcbiAgICAgICAgICAgIChzdGF0ZSA9PT0gT0RhdGFNb2RlbFN0YXRlLkNoYW5nZWQgfHxcbiAgICAgICAgICAgICAgKG1vZGVsICE9IHVuZGVmaW5lZCAmJiBtb2RlbC5oYXNDaGFuZ2VkKHsgaW5jbHVkZV9uYXZpZ2F0aW9uIH0pKSlcbiAgICAgICAgKVxuICAgICk7XG4gIH1cblxuICBhc0VudGl0eTxSLCBNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4oc2VsZjogTSwgZnVuYzogKG1vZGVsOiBNKSA9PiBSKTogUiB7XG4gICAgY29uc3QgcGFyZW50ID0gc2VsZi5fcGFyZW50O1xuICAgIHNlbGYuX3BhcmVudCA9IG51bGw7XG4gICAgY29uc3QgcmVzdWx0ID0gZnVuYyhzZWxmKTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkge1xuICAgICAgcmV0dXJuIChyZXN1bHQgYXMgYW55KS5waXBlKGZpbmFsaXplKCgpID0+IChzZWxmLl9wYXJlbnQgPSBwYXJlbnQpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgdG9FbnRpdHkoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7XG4gICAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9rZXkgPSB0cnVlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgY2hhaW4gPSBbXSxcbiAgICB9OiB7XG4gICAgICBjbGllbnRfaWQ/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb21wdXRlZD86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2tleT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgZmllbGRfbWFwcGluZz86IGJvb2xlYW47XG4gICAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICAgIH0gPSB7fVxuICApOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGxldCBhdHRycyA9IHNlbGYuYXR0cmlidXRlcyh7XG4gICAgICBjaGFuZ2VzX29ubHksXG4gICAgICBmaWVsZF9tYXBwaW5nLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICB9KTtcblxuICAgIGxldCByZWxhdGlvbnMgPSBPYmplY3QuZW50cmllcyhzZWxmLl9yZWxhdGlvbnMpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAvLyBDaGFpblxuICAgICAgICAoWywgeyBtb2RlbCB9XSkgPT4gY2hhaW4uZXZlcnkoKGMpID0+IGMgIT09IG1vZGVsKVxuICAgICAgKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgLy8gQ2hhbmdlcyBvbmx5XG4gICAgICAgIChbLCB7IG1vZGVsLCBzdGF0ZSB9XSkgPT5cbiAgICAgICAgICAhY2hhbmdlc19vbmx5IHx8XG4gICAgICAgICAgKGNoYW5nZXNfb25seSAmJlxuICAgICAgICAgICAgKHN0YXRlID09PSBPRGF0YU1vZGVsU3RhdGUuQ2hhbmdlZCB8fFxuICAgICAgICAgICAgICAobW9kZWwgIT0gdW5kZWZpbmVkICYmIG1vZGVsLmhhc0NoYW5nZWQoeyBpbmNsdWRlX25hdmlnYXRpb24gfSkpKSlcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChbLCB7IGZpZWxkLCBtb2RlbCB9XSkgPT5cbiAgICAgICAgICAvLyBOYXZpZ2F0aW9uXG4gICAgICAgICAgKGluY2x1ZGVfbmF2aWdhdGlvbiAmJiBmaWVsZC5uYXZpZ2F0aW9uICYmIG1vZGVsICE9PSBudWxsKSB8fFxuICAgICAgICAgICFmaWVsZC5uYXZpZ2F0aW9uXG4gICAgICApXG4gICAgICAubWFwKChbaywgeyBtb2RlbCwgZmllbGQsIHN0YXRlIH1dKSA9PiB7XG4gICAgICAgIGxldCBjaGFuZ2VzT25seSA9XG4gICAgICAgICAgY2hhbmdlc19vbmx5ICYmXG4gICAgICAgICAgc3RhdGUgIT09IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkICYmXG4gICAgICAgICAgISFmaWVsZC5uYXZpZ2F0aW9uO1xuICAgICAgICBsZXQgaW5jbHVkZUtleSA9IGluY2x1ZGVfa2V5ICYmICEhZmllbGQubmF2aWdhdGlvbjtcbiAgICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwobW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGssXG4gICAgICAgICAgICAobW9kZWwgYXMgT0RhdGFNb2RlbDxhbnk+KS50b0VudGl0eSh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVLZXksXG4gICAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24obW9kZWwpKSB7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGssXG4gICAgICAgICAgICAobW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PikudG9FbnRpdGllcyh7XG4gICAgICAgICAgICAgIGNsaWVudF9pZCxcbiAgICAgICAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uLFxuICAgICAgICAgICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgICAgICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgICAgICAgICAgY2hhbmdlc19vbmx5OiBjaGFuZ2VzT25seSxcbiAgICAgICAgICAgICAgaW5jbHVkZV9rZXk6IGluY2x1ZGVLZXksXG4gICAgICAgICAgICAgIGNoYWluOiBbc2VsZiwgLi4uY2hhaW5dLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2ssIG1vZGVsXTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKChhY2MsIFtrLCB2XSkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gZmllbGRfbWFwcGluZ1xuICAgICAgICAgID8gdGhpcy5maWVsZHMoKS5maW5kKFxuICAgICAgICAgICAgICAoZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxhbnk+KSA9PiBmaWVsZC5uYW1lID09PSBrXG4gICAgICAgICAgICApPy5maWVsZCB8fCBrXG4gICAgICAgICAgOiBrO1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW25hbWVdOiB2IH0pO1xuICAgICAgfSwge30pO1xuXG4gICAgLy8gQ3JlYXRlIGVudGl0eVxuICAgIGxldCBlbnRpdHkgPSB7IC4uLmF0dHJzLCAuLi5yZWxhdGlvbnMgfTtcblxuICAgIC8vIEFkZCBjbGllbnRfaWRcbiAgICBpZiAoY2xpZW50X2lkKSB7XG4gICAgICAoPGFueT5lbnRpdHkpW3RoaXMuY2lkXSA9ICg8YW55PnNlbGYpW3RoaXMuY2lkXTtcbiAgICB9XG5cbiAgICAvLyBBZGQga2V5XG4gICAgaWYgKGluY2x1ZGVfa2V5KSB7XG4gICAgICBlbnRpdHkgPSB7XG4gICAgICAgIC4uLmVudGl0eSxcbiAgICAgICAgLi4uKHRoaXMucmVzb2x2ZUtleShzZWxmLCB7IGZpZWxkX21hcHBpbmcsIHJlc29sdmU6IGZhbHNlIH0pIGFzIHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQWRkIHR5cGVcbiAgICBpZiAoXG4gICAgICBzZWxmLl9wYXJlbnQgIT09IG51bGwgJiZcbiAgICAgICgoT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbChzZWxmLl9wYXJlbnRbMF0pICYmXG4gICAgICAgIChzZWxmLl9wYXJlbnRbMV0gYXMgT0RhdGFNb2RlbEZpZWxkPGFueT4pLm1ldGEgIT09IHNlbGYuX21ldGEpIHx8XG4gICAgICAgIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24oc2VsZi5fcGFyZW50WzBdKSAmJlxuICAgICAgICAgIChzZWxmLl9wYXJlbnRbMF0gYXMgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PikuX21vZGVsXG4gICAgICAgICAgICAubWV0YSAhPT0gc2VsZi5fbWV0YSkpXG4gICAgKSB7XG4gICAgICB0aGlzLmFwaS5vcHRpb25zLmhlbHBlci50eXBlKGVudGl0eSwgdGhpcy5zY2hlbWEudHlwZSgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW50aXR5O1xuICB9XG5cbiAgYXR0cmlidXRlcyhcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIHtcbiAgICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeT86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX2NvbXB1dGVkPzogYm9vbGVhbjtcbiAgICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICAgIGZpZWxkX21hcHBpbmc/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgLy8gQXR0cmlidXRlcyBieSBmaWVsZHMgKGF0dHJpYnV0ZXMgZm9yIHRoZSBtb2RlbCB0eXBlKVxuICAgIGNvbnN0IGZpZWxkQXR0cnMgPSB0aGlzLmZpZWxkcygpLnJlZHVjZSgoYWNjLCBmKSA9PiB7XG4gICAgICBjb25zdCBpc0NoYW5nZWQgPSBmLm5hbWUgaW4gc2VsZi5fY2hhbmdlcztcbiAgICAgIGNvbnN0IG5hbWUgPSBmaWVsZF9tYXBwaW5nID8gZi5maWVsZCA6IGYubmFtZTtcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gZi5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGlzQ2hhbmdlZFxuICAgICAgICA/IHNlbGYuX2NoYW5nZXNbZi5uYW1lXVxuICAgICAgICA6IHNlbGYuX2F0dHJpYnV0ZXNbZi5uYW1lXTtcbiAgICAgIGlmIChmLmNvbmN1cnJlbmN5ICYmIGluY2x1ZGVfY29uY3VycmVuY3kpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbXB1dGVkICYmIGluY2x1ZGVfY29tcHV0ZWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXNfb25seSAmJiBpc0NoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWNjLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFjaGFuZ2VzX29ubHkgJiYgIWYuY29uY3VycmVuY3kgJiYgIWNvbXB1dGVkKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKGFjYywgeyBbbmFtZV06IHZhbHVlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cbiAgICB9LCB7fSk7XG4gICAgaWYgKCFpbmNsdWRlX25vbl9maWVsZCkgcmV0dXJuIGZpZWxkQXR0cnM7XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhmaWVsZEF0dHJzKTtcbiAgICAvLyBBdHRyaWJ1dGVzIGZyb20gb2JqZWN0IChhdHRyaWJ1dGVzIGZvciBvYmplY3QpXG4gICAgY29uc3Qgbm9uRmllbGRBdHRycyA9IE9iamVjdC5lbnRyaWVzKHNlbGYpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAoW2tdKSA9PlxuICAgICAgICAgIG5hbWVzLmluZGV4T2YoaykgPT09IC0xICYmICFrLnN0YXJ0c1dpdGgoJ18nKSAmJiAhay5lbmRzV2l0aCgnJCcpXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2MsIFtrLCB2XSkgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2tdOiB2IH0pLCB7fSk7XG4gICAgcmV0dXJuIHsgLi4uZmllbGRBdHRycywgLi4ubm9uRmllbGRBdHRycyB9O1xuICB9XG5cbiAgcmVzZXQoXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICB7IG5hbWUsIHNpbGVudCA9IGZhbHNlIH06IHsgbmFtZT86IHN0cmluZzsgc2lsZW50PzogYm9vbGVhbiB9ID0ge31cbiAgKSB7XG4gICAgaWYgKCFUeXBlcy5pc0VtcHR5KG5hbWUpICYmIChuYW1lIGFzIHN0cmluZykgaW4gc2VsZi5fY2hhbmdlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBzZWxmLl9hdHRyaWJ1dGVzW25hbWUgYXMgc3RyaW5nXTtcbiAgICAgIGNvbnN0IHByZXZpb3VzID0gc2VsZi5fY2hhbmdlc1tuYW1lIGFzIHN0cmluZ107XG4gICAgICBkZWxldGUgc2VsZi5fY2hhbmdlc1tuYW1lIGFzIHN0cmluZ107XG4gICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgICAgICBtb2RlbDogc2VsZixcbiAgICAgICAgICAgIHRyYWNrOiBuYW1lLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBwcmV2aW91cyxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoVHlwZXMuaXNFbXB0eShuYW1lKSkge1xuICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHNlbGYuX2NoYW5nZXMpO1xuICAgICAgc2VsZi5fY2hhbmdlcyA9IHt9O1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnY2hhbmdlJywge1xuICAgICAgICAgICAgICB0cmFjazogZW50cnlbMF0sXG4gICAgICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgICAgICB2YWx1ZTogc2VsZi5fYXR0cmlidXRlc1tlbnRyeVswXV0sXG4gICAgICAgICAgICAgIHByZXZpb3VzOiBlbnRyeVsxXSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXNzaWduKFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHJlcGFyZW50ID0gZmFsc2UsXG4gICAgICBzaWxlbnQgPSBmYWxzZSxcbiAgICB9OiB7IHJlc2V0PzogYm9vbGVhbjsgcmVwYXJlbnQ/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICBzZWxmLl9yZXNldCA9IHJlc2V0O1xuICAgIHNlbGYuX3JlcGFyZW50ID0gcmVwYXJlbnQ7XG4gICAgc2VsZi5fc2lsZW50ID0gc2lsZW50O1xuXG4gICAgY29uc3QgY2hhbmdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFwcGx5IGVudGl0eVxuICAgIGNvbnN0IG1vZGVsID0gc2VsZiBhcyBhbnk7XG4gICAgT2JqZWN0LmVudHJpZXMoZW50aXR5KVxuICAgICAgLmZpbHRlcigoWywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSAvLyBGaWx0ZXIgdW5kZWZpbmVkXG4gICAgICAuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5maWVsZHMoe1xuICAgICAgICAgIGluY2x1ZGVfcGFyZW50czogdHJ1ZSxcbiAgICAgICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICAgIH0pLmZpbmQoXG4gICAgICAgICAgKGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8YW55PikgPT5cbiAgICAgICAgICAgIChzZWxmLl9yZXNldCAmJiBmaWVsZC5maWVsZCA9PT0ga2V5KSB8fCBmaWVsZC5uYW1lID09PSBrZXlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIERlbGVnYXRlZCB0byBwcml2YXRlIHNldHRlclxuICAgICAgICAgIGlmICh0aGlzLl9zZXQoc2VsZiwgZmllbGQsIHZhbHVlKSkge1xuICAgICAgICAgICAgY2hhbmdlcy5wdXNoKGZpZWxkLm5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBCYXNpYyBhc3NpZ25tZW50XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IG1vZGVsW2tleV07XG4gICAgICAgICAgbW9kZWxba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSB2YWx1ZSkgY2hhbmdlcy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBzZWxmLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudChzZWxmLl9yZXNldCA/ICdyZXNldCcgOiAndXBkYXRlJywge1xuICAgICAgICAgIG1vZGVsOiBzZWxmLFxuICAgICAgICAgIG9wdGlvbnM6IHsgY2hhbmdlcyB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgc2VsZi5fcmVzZXQgPSBmYWxzZTtcbiAgICBzZWxmLl9yZXBhcmVudCA9IGZhbHNlO1xuICAgIHNlbGYuX3NpbGVudCA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGlzTW9kZWwob2JqOiBhbnkpIHtcbiAgICByZXR1cm4gVHlwZXMucmF3VHlwZShvYmopID09PSAnTW9kZWwnO1xuICB9XG5cbiAgc3RhdGljIGlzQ29sbGVjdGlvbihvYmo6IGFueSkge1xuICAgIHJldHVybiBUeXBlcy5yYXdUeXBlKG9iaikgPT09ICdDb2xsZWN0aW9uJztcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sbGVjdGlvbjxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj4sXG4gICAgY29sbGVjdGlvbjogT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgIHZhbHVlOiBUW10gfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICkge1xuICAgIGNvbGxlY3Rpb24uX2Fubm90YXRpb25zID0gZmllbGQuYW5ub3RhdGlvbnNGYWN0b3J5KFxuICAgICAgc2VsZi5hbm5vdHMoKVxuICAgICkgYXMgT0RhdGFFbnRpdGllc0Fubm90YXRpb25zO1xuICAgIGNvbGxlY3Rpb24uYXNzaWduKHZhbHVlIGFzIFRbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W10sIHtcbiAgICAgIHJlc2V0OiBzZWxmLl9yZXNldCxcbiAgICAgIHJlcGFyZW50OiBzZWxmLl9yZXBhcmVudCxcbiAgICAgIHNpbGVudDogc2VsZi5fc2lsZW50LFxuICAgIH0pO1xuICAgIHJldHVybiBjb2xsZWN0aW9uLmhhc0NoYW5nZWQoKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZU1vZGVsPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICBtb2RlbDogT0RhdGFNb2RlbDxGPixcbiAgICB2YWx1ZTogRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICkge1xuICAgIG1vZGVsLl9hbm5vdGF0aW9ucyA9IGZpZWxkLmFubm90YXRpb25zRmFjdG9yeShcbiAgICAgIHNlbGYuYW5ub3RzKClcbiAgICApIGFzIE9EYXRhRW50aXR5QW5ub3RhdGlvbnM7XG4gICAgbW9kZWwuYXNzaWduKHZhbHVlIGFzIEYgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSwge1xuICAgICAgcmVzZXQ6IHNlbGYuX3Jlc2V0LFxuICAgICAgcmVwYXJlbnQ6IHNlbGYuX3JlcGFyZW50LFxuICAgICAgc2lsZW50OiBzZWxmLl9zaWxlbnQsXG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGVsLmhhc0NoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldDxGPihcbiAgICBzZWxmOiBPRGF0YU1vZGVsPFQ+LFxuICAgIGZpZWxkOiBPRGF0YU1vZGVsRmllbGQ8Rj5cbiAgKTogRiB8IE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4gfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmllbGQuaXNTdHJ1Y3R1cmVkVHlwZSgpKSB7XG4gICAgICByZXR1cm4gc2VsZi5fcmVsYXRpb25zW2ZpZWxkLm5hbWVdPy5tb2RlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuYXR0cmlidXRlcyhzZWxmLCB7XG4gICAgICAgIGluY2x1ZGVfY29uY3VycmVuY3k6IHRydWUsXG4gICAgICAgIGluY2x1ZGVfY29tcHV0ZWQ6IHRydWUsXG4gICAgICB9KVtmaWVsZC5uYW1lXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9zZXRTdHJ1Y3R1cmVkPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IE9EYXRhTW9kZWxGaWVsZDxGPixcbiAgICB2YWx1ZTpcbiAgICAgIHwgRlxuICAgICAgfCBGW11cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgICAgfCBPRGF0YU1vZGVsPEY+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PlxuICAgICAgfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgLy8gRW5zdXJlcyB0aGF0IHRoZSByZWxhdGlvbiBleGlzdHNcbiAgICBpZiAoIShmaWVsZC5uYW1lIGluIHNlbGYuX3JlbGF0aW9ucykpIHtcbiAgICAgIHNlbGYuX3JlbGF0aW9uc1tmaWVsZC5uYW1lXSA9IHtcbiAgICAgICAgc3RhdGU6IE9EYXRhTW9kZWxTdGF0ZS5VbmNoYW5nZWQsXG4gICAgICAgIGZpZWxkOiBmaWVsZCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRpb24gPSBzZWxmLl9yZWxhdGlvbnNbZmllbGQubmFtZV07XG4gICAgY29uc3QgY3VycmVudE1vZGVsID0gcmVsYXRpb24ubW9kZWw7XG5cbiAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJlbGF0aW9uLm1vZGVsID0gdmFsdWUgYXMgbnVsbDtcbiAgICAgIGNoYW5nZWQgPSBjdXJyZW50TW9kZWwgIT09IHZhbHVlO1xuICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoc2VsZiwgcmVsYXRpb24pO1xuICAgIH0gZWxzZSBpZiAoT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKGN1cnJlbnRNb2RlbCkpIHtcbiAgICAgIGlmIChPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24odmFsdWUpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAoY3VycmVudE1vZGVsIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PikuZXF1YWxzKFxuICAgICAgICAgICAgdmFsdWUgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoc2VsZiwgcmVsYXRpb24pO1xuICAgICAgICByZWxhdGlvbi5tb2RlbCA9IHZhbHVlIGFzIE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PjtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKHNlbGYsIHJlbGF0aW9uKTtcbiAgICAgICAgaWYgKHNlbGYuX3JlcGFyZW50KSByZWxhdGlvbi5tb2RlbC5fcGFyZW50ID0gW3NlbGYsIGZpZWxkXTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFR5cGVzLmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0aGlzLnVwZGF0ZUNvbGxlY3Rpb248Rj4oXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBjdXJyZW50TW9kZWwgYXMgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+LFxuICAgICAgICAgIHZhbHVlIGFzIFRbXSB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwoY3VycmVudE1vZGVsKSkge1xuICAgICAgaWYgKE9EYXRhTW9kZWxPcHRpb25zLmlzTW9kZWwodmFsdWUpKSB7XG4gICAgICAgIGlmICgoY3VycmVudE1vZGVsIGFzIE9EYXRhTW9kZWw8Rj4pLmVxdWFscyh2YWx1ZSBhcyBPRGF0YU1vZGVsPEY+KSkge1xuICAgICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl91bnN1YnNjcmliZShzZWxmLCByZWxhdGlvbik7XG4gICAgICAgIHJlbGF0aW9uLm1vZGVsID0gdmFsdWUgYXMgT0RhdGFNb2RlbDxGPjtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKHNlbGYsIHJlbGF0aW9uKTtcbiAgICAgICAgaWYgKHNlbGYuX3JlcGFyZW50KSByZWxhdGlvbi5tb2RlbC5fcGFyZW50ID0gW3NlbGYsIGZpZWxkXTtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKFR5cGVzLmlzUGxhaW5PYmplY3QodmFsdWUpKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0aGlzLnVwZGF0ZU1vZGVsPEY+KFxuICAgICAgICAgIHNlbGYsXG4gICAgICAgICAgZmllbGQsXG4gICAgICAgICAgY3VycmVudE1vZGVsIGFzIE9EYXRhTW9kZWw8Rj4sXG4gICAgICAgICAgdmFsdWUgYXMgRiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbGF0aW9uLm1vZGVsID1cbiAgICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNDb2xsZWN0aW9uKHZhbHVlKSB8fFxuICAgICAgICBPRGF0YU1vZGVsT3B0aW9ucy5pc01vZGVsKHZhbHVlKVxuICAgICAgICAgID8gKHZhbHVlIGFzIE9EYXRhTW9kZWw8Rj4gfCBPRGF0YUNvbGxlY3Rpb248RiwgT0RhdGFNb2RlbDxGPj4pXG4gICAgICAgICAgOiBmaWVsZC5tb2RlbENvbGxlY3Rpb25GYWN0b3J5PFQsIEY+KHtcbiAgICAgICAgICAgICAgcGFyZW50OiBzZWxmLFxuICAgICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgIHJlc2V0OiBzZWxmLl9yZXNldCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB0aGlzLl9zdWJzY3JpYmUoc2VsZiwgcmVsYXRpb24pO1xuICAgICAgaWYgKHNlbGYuX3JlcGFyZW50KSByZWxhdGlvbi5tb2RlbC5fcGFyZW50ID0gW3NlbGYsIGZpZWxkXTtcbiAgICB9XG4gICAgaWYgKCFPRGF0YU1vZGVsT3B0aW9ucy5pc0NvbGxlY3Rpb24ocmVsYXRpb24ubW9kZWwpKSB7XG4gICAgICB2YXIgcmVmID0gZmllbGQubWV0YT8ucmVzb2x2ZVJlZmVyZW50aWFsKHJlbGF0aW9uLm1vZGVsLCBmaWVsZCk7XG4gICAgICBpZiAocmVmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVmKS5mb3JFYWNoKChbaywgdl0pID0+XG4gICAgICAgICAgdGhpcy5fc2V0VmFsdWUoc2VsZiwgaywgdiwgZmFsc2UpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlbGF0aW9uLnN0YXRlID1cbiAgICAgIHNlbGYuX3Jlc2V0IHx8ICFjaGFuZ2VkXG4gICAgICAgID8gT0RhdGFNb2RlbFN0YXRlLlVuY2hhbmdlZFxuICAgICAgICA6IE9EYXRhTW9kZWxTdGF0ZS5DaGFuZ2VkO1xuICAgIGlmICghc2VsZi5fc2lsZW50ICYmIGNoYW5nZWQpIHtcbiAgICAgIHNlbGYuZXZlbnRzJC5lbWl0KFxuICAgICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdjaGFuZ2UnLCB7XG4gICAgICAgICAgdHJhY2s6IGZpZWxkLm5hbWUsXG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgdmFsdWU6IHJlbGF0aW9uLm1vZGVsLFxuICAgICAgICAgIHByZXZpb3VzOiBjdXJyZW50TW9kZWwsXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldFZhbHVlPEY+KFxuICAgIHNlbGY6IE9EYXRhTW9kZWw8VD4sXG4gICAgZmllbGQ6IHN0cmluZyxcbiAgICB2YWx1ZTpcbiAgICAgIHwgRlxuICAgICAgfCBGW11cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1bXVxuICAgICAgfCBPRGF0YU1vZGVsPEY+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxGLCBPRGF0YU1vZGVsPEY+PlxuICAgICAgfCBudWxsLFxuICAgIGtleT86IGJvb2xlYW5cbiAgKTogYm9vbGVhbiB7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCBhdHRycyA9IHRoaXMuYXR0cmlidXRlcyhzZWxmLCB7XG4gICAgICBpbmNsdWRlX2NvbmN1cnJlbmN5OiB0cnVlLFxuICAgICAgaW5jbHVkZV9jb21wdXRlZDogdHJ1ZSxcbiAgICB9KTtcbiAgICBjb25zdCBjdXJyZW50VmFsdWUgPSBhdHRyc1tmaWVsZF07XG4gICAgY2hhbmdlZCA9ICFUeXBlcy5pc0VxdWFsKGN1cnJlbnRWYWx1ZSwgdmFsdWUpO1xuICAgIGlmIChzZWxmLl9yZXNldCkge1xuICAgICAgZGVsZXRlIHNlbGYuX2NoYW5nZXNbZmllbGRdO1xuICAgICAgc2VsZi5fYXR0cmlidXRlc1tmaWVsZF0gPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKFR5cGVzLmlzRXF1YWwodmFsdWUsIHNlbGYuX2F0dHJpYnV0ZXNbZmllbGRdKSkge1xuICAgICAgZGVsZXRlIHNlbGYuX2NoYW5nZXNbZmllbGRdO1xuICAgIH0gZWxzZSBpZiAoY2hhbmdlZCkge1xuICAgICAgc2VsZi5fY2hhbmdlc1tmaWVsZF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKCFzZWxmLl9zaWxlbnQgJiYgY2hhbmdlZCkge1xuICAgICAgc2VsZi5ldmVudHMkLmVtaXQoXG4gICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2NoYW5nZScsIHtcbiAgICAgICAgICB0cmFjazogZmllbGQsXG4gICAgICAgICAgbW9kZWw6IHNlbGYsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcHJldmlvdXM6IGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICBvcHRpb25zOiB7IGtleSB9LFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cblxuICBwcml2YXRlIF9zZXQ8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPEY+LFxuICAgIHZhbHVlOlxuICAgICAgfCBGXG4gICAgICB8IEZbXVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVxuICAgICAgfCB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfVtdXG4gICAgICB8IE9EYXRhTW9kZWw8Rj5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPEYsIE9EYXRhTW9kZWw8Rj4+XG4gICAgICB8IG51bGxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZpZWxkLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgPyB0aGlzLl9zZXRTdHJ1Y3R1cmVkKHNlbGYsIGZpZWxkLCB2YWx1ZSlcbiAgICAgIDogdGhpcy5fc2V0VmFsdWUoc2VsZiwgZmllbGQubmFtZSwgdmFsdWUsIGZpZWxkLmlzS2V5KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmU8Rj4oXG4gICAgc2VsZjogT0RhdGFNb2RlbDxUPixcbiAgICByZWxhdGlvbjogT0RhdGFNb2RlbFJlbGF0aW9uPEY+XG4gICkge1xuICAgIGlmIChyZWxhdGlvbi5zdWJzY3JpcHRpb24pIHtcbiAgICAgIHJlbGF0aW9uLnN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgZGVsZXRlIHJlbGF0aW9uLnN1YnNjcmlwdGlvbjtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfc3Vic2NyaWJlPEY+KHNlbGY6IE9EYXRhTW9kZWw8VD4sIHJlbGF0aW9uOiBPRGF0YU1vZGVsUmVsYXRpb248Rj4pIHtcbiAgICBpZiAocmVsYXRpb24uc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1YnNjcmlwdGlvbiBhbHJlYWR5IGV4aXN0cycpO1xuICAgIH1cbiAgICBpZiAocmVsYXRpb24ubW9kZWwgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdWJzY3JpcHRpb24gbW9kZWwgaXMgbnVsbCcpO1xuICAgIH1cbiAgICByZWxhdGlvbi5zdWJzY3JpcHRpb24gPSByZWxhdGlvbi5tb2RlbC5ldmVudHMkLnN1YnNjcmliZShcbiAgICAgIChldmVudDogT0RhdGFNb2RlbEV2ZW50PGFueT4pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIEJVQkJMSU5HLmluZGV4T2YoZXZlbnQubmFtZSkgIT09IC0xICYmXG4gICAgICAgICAgZXZlbnQuYnViYmxpbmcgJiZcbiAgICAgICAgICAhZXZlbnQudmlzaXRlZChzZWxmKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoZXZlbnQubW9kZWwgPT09IHJlbGF0aW9uLm1vZGVsKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGV2ZW50Lm5hbWUgPT09ICdjaGFuZ2UnICYmXG4gICAgICAgICAgICAgIHJlbGF0aW9uLmZpZWxkLm5hdmlnYXRpb24gJiZcbiAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucz8ua2V5XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdmFyIHJlZiA9IChyZWxhdGlvbi5tb2RlbCBhcyBPRGF0YU1vZGVsPGFueT4pLnJlZmVyZW50aWFsKFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uLmZpZWxkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChyZWYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJlZikuZm9yRWFjaCgoW2ssIHZdKSA9PlxuICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0VmFsdWUoc2VsZiwgaywgdiwgZmFsc2UpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGV2ZW50LnB1c2goc2VsZiwgcmVsYXRpb24uZmllbGQubmFtZSk7XG4gICAgICAgICAgc2VsZi5ldmVudHMkLmVtaXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxufVxuIl19
|