angular-odata 0.90.0 → 0.99.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -25
- 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} +8 -3
- package/esm2020/lib/helper.mjs +268 -0
- package/esm2020/lib/index.mjs +19 -0
- package/esm2020/lib/models/collection.mjs +757 -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 +956 -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/base.mjs +20 -0
- package/esm2020/lib/resources/query/expressions/compute.mjs +38 -0
- package/esm2020/lib/resources/query/expressions/expand.mjs +57 -0
- package/esm2020/lib/resources/query/expressions/filter.mjs +154 -0
- package/esm2020/lib/resources/query/expressions/index.mjs +7 -0
- package/esm2020/lib/resources/query/expressions/orderby.mjs +54 -0
- package/esm2020/lib/resources/query/expressions/search.mjs +113 -0
- package/esm2020/lib/resources/query/expressions/select.mjs +32 -0
- package/esm2020/lib/resources/query/expressions/syntax.mjs +371 -0
- package/esm2020/lib/resources/query/handlers.mjs +188 -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/request.mjs +167 -0
- package/esm2020/lib/resources/resource.mjs +318 -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 +104 -0
- package/esm2020/lib/resources/types/batch.mjs +314 -0
- package/esm2020/lib/resources/types/count.mjs +30 -0
- package/esm2020/lib/resources/types/entity-set.mjs +97 -0
- package/esm2020/lib/resources/types/entity.mjs +109 -0
- package/esm2020/lib/resources/types/function.mjs +140 -0
- package/{esm2015/lib/resources/types/index.js → esm2020/lib/resources/types/index.mjs} +0 -0
- package/esm2020/lib/resources/types/media.mjs +44 -0
- package/esm2020/lib/resources/types/metadata.mjs +33 -0
- package/esm2020/lib/resources/types/navigation-property.mjs +229 -0
- package/esm2020/lib/resources/types/options.mjs +2 -0
- package/esm2020/lib/resources/types/property.mjs +186 -0
- package/esm2020/lib/resources/types/reference.mjs +88 -0
- package/esm2020/lib/resources/types/singleton.mjs +129 -0
- package/esm2020/lib/resources/types/value.mjs +44 -0
- package/esm2020/lib/schema/annotation.mjs +37 -0
- package/esm2020/lib/schema/callable.mjs +62 -0
- package/esm2020/lib/schema/element.mjs +61 -0
- package/esm2020/lib/schema/entity-container.mjs +9 -0
- package/esm2020/lib/schema/entity-set.mjs +9 -0
- package/esm2020/lib/schema/enum-type.mjs +71 -0
- package/{esm2015/lib/schema/index.js → esm2020/lib/schema/index.mjs} +2 -1
- package/esm2020/lib/schema/parsers/callable.mjs +113 -0
- package/esm2020/lib/schema/parsers/edm.mjs +95 -0
- package/esm2020/lib/schema/parsers/enum-type.mjs +107 -0
- package/esm2020/lib/schema/parsers/index.mjs +5 -0
- package/esm2020/lib/schema/parsers/structured-type.mjs +412 -0
- package/esm2020/lib/schema/schema.mjs +61 -0
- package/esm2020/lib/schema/structured-type.mjs +207 -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} +13 -13
- package/esm2020/lib/utils/odata.mjs +22 -0
- package/esm2020/lib/utils/strings.mjs +20 -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} +3427 -2872
- package/fesm2015/angular-odata.mjs.map +1 -0
- package/fesm2020/angular-odata.mjs +10589 -0
- package/fesm2020/angular-odata.mjs.map +1 -0
- package/lib/api.d.ts +14 -14
- 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 +5 -2
- package/lib/index.d.ts +0 -1
- package/lib/models/collection.d.ts +21 -21
- package/lib/models/model.d.ts +34 -22
- package/lib/models/options.d.ts +26 -29
- package/lib/module.d.ts +1 -1
- package/lib/options.d.ts +1 -0
- package/lib/resources/path/segments.d.ts +2 -2
- package/lib/resources/query/builder.d.ts +7 -3
- package/lib/resources/query/expressions/base.d.ts +19 -0
- package/lib/resources/query/expressions/compute.d.ts +26 -0
- package/lib/resources/query/expressions/expand.d.ts +40 -0
- package/lib/resources/query/expressions/filter.d.ts +58 -0
- package/lib/resources/query/expressions/index.d.ts +6 -0
- package/lib/resources/query/expressions/orderby.d.ts +37 -0
- package/lib/resources/query/expressions/search.d.ts +47 -0
- package/lib/resources/query/expressions/select.d.ts +21 -0
- package/lib/resources/query/{syntax.d.ts → expressions/syntax.d.ts} +74 -55
- package/lib/resources/query/handlers.d.ts +30 -19
- package/lib/resources/query/options.d.ts +3 -3
- package/lib/resources/request.d.ts +1 -1
- package/lib/resources/resource.d.ts +30 -12
- package/lib/resources/types/action.d.ts +12 -18
- package/lib/resources/types/batch.d.ts +10 -2
- package/lib/resources/types/count.d.ts +6 -4
- package/lib/resources/types/entity-set.d.ts +11 -14
- package/lib/resources/types/entity.d.ts +13 -15
- package/lib/resources/types/function.d.ts +11 -17
- package/lib/resources/types/media.d.ts +8 -6
- package/lib/resources/types/metadata.d.ts +3 -4
- package/lib/resources/types/navigation-property.d.ts +17 -22
- package/lib/resources/types/property.d.ts +13 -18
- package/lib/resources/types/reference.d.ts +41 -7
- package/lib/resources/types/singleton.d.ts +12 -15
- package/lib/resources/types/value.d.ts +9 -4
- package/lib/schema/annotation.d.ts +18 -0
- package/lib/schema/callable.d.ts +4 -20
- package/lib/schema/element.d.ts +45 -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 +3 -34
- package/lib/schema/index.d.ts +1 -0
- package/lib/{parsers → schema/parsers}/callable.d.ts +1 -1
- package/lib/{parsers → schema/parsers}/edm.d.ts +1 -1
- package/lib/{parsers → schema/parsers}/enum-type.d.ts +12 -11
- package/lib/{parsers → schema/parsers}/index.d.ts +0 -0
- package/lib/{parsers → schema/parsers}/structured-type.d.ts +12 -12
- package/lib/schema/schema.d.ts +3 -10
- package/lib/schema/structured-type.d.ts +12 -24
- 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/lib/utils/strings.d.ts +1 -0
- package/package.json +21 -8
- package/bundles/angular-odata.umd.js +0 -11694
- package/bundles/angular-odata.umd.js.map +0 -1
- package/esm2015/lib/api.js +0 -297
- package/esm2015/lib/client.js +0 -272
- package/esm2015/lib/helper.js +0 -271
- package/esm2015/lib/index.js +0 -21
- package/esm2015/lib/models/collection.js +0 -717
- package/esm2015/lib/models/model.js +0 -419
- package/esm2015/lib/models/options.js +0 -924
- package/esm2015/lib/options.js +0 -31
- package/esm2015/lib/parsers/callable.js +0 -107
- package/esm2015/lib/parsers/edm.js +0 -95
- package/esm2015/lib/parsers/enum-type.js +0 -102
- package/esm2015/lib/parsers/index.js +0 -5
- package/esm2015/lib/parsers/structured-type.js +0 -388
- package/esm2015/lib/resources/path/segments.js +0 -121
- package/esm2015/lib/resources/query/builder.js +0 -544
- 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 -349
- 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 -73
- package/esm2015/lib/resources/types/singleton.js +0 -167
- package/esm2015/lib/resources/types/value.js +0 -35
- package/esm2015/lib/schema/annotation.js +0 -7
- package/esm2015/lib/schema/callable.js +0 -82
- package/esm2015/lib/schema/entity-container.js +0 -22
- package/esm2015/lib/schema/entity-set.js +0 -33
- package/esm2015/lib/schema/enum-type.js +0 -126
- package/esm2015/lib/schema/schema.js +0 -60
- package/esm2015/lib/schema/structured-type.js +0 -217
- 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/esm2015/lib/utils/strings.js +0 -13
- package/fesm2015/angular-odata.js.map +0 -1
- package/lib/resources/query/expressions.d.ts +0 -50
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
import { __rest } from "tslib";
|
|
2
|
-
import { EventEmitter } from '@angular/core';
|
|
3
|
-
import { throwError, forkJoin, NEVER, of } from 'rxjs';
|
|
4
|
-
import { map, tap } from 'rxjs/operators';
|
|
5
|
-
import { ODataEntityResource, ODataNavigationPropertyResource, } from '../resources';
|
|
6
|
-
import { ODataCollection } from './collection';
|
|
7
|
-
import { Objects, Types, Strings } from '../utils';
|
|
8
|
-
import { ODataModelEvent, ODataModelOptions, INCLUDE_DEEP, INCLUDE_SHALLOW, } from './options';
|
|
9
|
-
// @dynamic
|
|
10
|
-
export class ODataModel {
|
|
11
|
-
constructor(data = {}, { parent, resource, annots, reset = false, } = {}) {
|
|
12
|
-
// Parent
|
|
13
|
-
this._parent = null;
|
|
14
|
-
this._attributes = {};
|
|
15
|
-
this._changes = {};
|
|
16
|
-
this._relations = {};
|
|
17
|
-
this._resetting = false;
|
|
18
|
-
this._silent = false;
|
|
19
|
-
// Events
|
|
20
|
-
this.events$ = new EventEmitter();
|
|
21
|
-
const Klass = this.constructor;
|
|
22
|
-
if (Klass.meta === undefined)
|
|
23
|
-
throw new Error(`Can't create model without metadata`);
|
|
24
|
-
this._meta = Klass.meta;
|
|
25
|
-
this._meta.bind(this, { parent, resource, annots });
|
|
26
|
-
// Client Id
|
|
27
|
-
this[this._meta.cid] =
|
|
28
|
-
data[this._meta.cid] ||
|
|
29
|
-
Strings.uniqueId(`${Klass.meta.schema.name.toLowerCase()}-`);
|
|
30
|
-
let attrs = this.annots().attributes(data, 'full');
|
|
31
|
-
let defaults = this.defaults();
|
|
32
|
-
this.assign(Objects.merge(defaults, attrs), { reset });
|
|
33
|
-
}
|
|
34
|
-
static buildMeta(options, schema) {
|
|
35
|
-
this.meta = new ODataModelOptions(options, schema);
|
|
36
|
-
}
|
|
37
|
-
get [Symbol.toStringTag]() {
|
|
38
|
-
return 'Model';
|
|
39
|
-
}
|
|
40
|
-
equals(other) {
|
|
41
|
-
const thisKey = this.key();
|
|
42
|
-
const otherKey = other.key();
|
|
43
|
-
return (this === other ||
|
|
44
|
-
(typeof this === typeof other &&
|
|
45
|
-
(this[this._meta.cid] === other[this._meta.cid] ||
|
|
46
|
-
(thisKey !== undefined &&
|
|
47
|
-
otherKey !== undefined &&
|
|
48
|
-
Types.isEqual(thisKey, otherKey)))));
|
|
49
|
-
}
|
|
50
|
-
//#region Resources
|
|
51
|
-
resource() {
|
|
52
|
-
return ODataModelOptions.resource(this);
|
|
53
|
-
}
|
|
54
|
-
navigationProperty(name) {
|
|
55
|
-
const field = this._meta.field(name);
|
|
56
|
-
if (field === undefined || !field.navigation)
|
|
57
|
-
throw Error(`Can't find navigation property ${name}`);
|
|
58
|
-
const resource = this.resource();
|
|
59
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
60
|
-
throw Error("Can't get navigation without ODataEntityResource with key");
|
|
61
|
-
return field.resourceFactory(resource);
|
|
62
|
-
}
|
|
63
|
-
property(name) {
|
|
64
|
-
const field = this._meta.field(name);
|
|
65
|
-
if (field === undefined || field.navigation)
|
|
66
|
-
throw Error(`Can't find property ${name}`);
|
|
67
|
-
const resource = this.resource();
|
|
68
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
69
|
-
throw Error("Can't get property without ODataEntityResource with key");
|
|
70
|
-
return field.resourceFactory(resource);
|
|
71
|
-
}
|
|
72
|
-
attach(resource) {
|
|
73
|
-
return this._meta.attach(this, resource);
|
|
74
|
-
}
|
|
75
|
-
//#endregion
|
|
76
|
-
schema() {
|
|
77
|
-
return this._meta.schema;
|
|
78
|
-
}
|
|
79
|
-
annots() {
|
|
80
|
-
return this._annotations;
|
|
81
|
-
}
|
|
82
|
-
key({ field_mapping = false, resolve = true, } = {}) {
|
|
83
|
-
return this._meta.resolveKey(this, { field_mapping, resolve });
|
|
84
|
-
}
|
|
85
|
-
isNew() {
|
|
86
|
-
return this.key() === undefined;
|
|
87
|
-
}
|
|
88
|
-
isParentOf(child) {
|
|
89
|
-
return (child !== this &&
|
|
90
|
-
ODataModelOptions.chain(child).some((p) => p[0] === this));
|
|
91
|
-
}
|
|
92
|
-
referential(field, { field_mapping = false, resolve = true, } = {}) {
|
|
93
|
-
return this._meta.resolveReferential(this, field, {
|
|
94
|
-
field_mapping,
|
|
95
|
-
resolve,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
referenced(field, { field_mapping = false, resolve = true, } = {}) {
|
|
99
|
-
return this._meta.resolveReferenced(this, field, {
|
|
100
|
-
field_mapping,
|
|
101
|
-
resolve,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
validate({ method, navigation = false, } = {}) {
|
|
105
|
-
return this._meta.validate(this, { method, navigation });
|
|
106
|
-
}
|
|
107
|
-
isValid({ method, navigation = false, } = {}) {
|
|
108
|
-
this._errors = this.validate({ method, navigation });
|
|
109
|
-
if (this._errors !== undefined)
|
|
110
|
-
this.events$.emit(new ODataModelEvent('invalid', {
|
|
111
|
-
model: this,
|
|
112
|
-
value: this._errors,
|
|
113
|
-
options: { method },
|
|
114
|
-
}));
|
|
115
|
-
return this._errors === undefined;
|
|
116
|
-
}
|
|
117
|
-
defaults() {
|
|
118
|
-
return this._meta.defaults() || {};
|
|
119
|
-
}
|
|
120
|
-
toEntity({ 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 = [], } = {}) {
|
|
121
|
-
return this._meta.toEntity(this, {
|
|
122
|
-
client_id,
|
|
123
|
-
include_navigation,
|
|
124
|
-
include_concurrency,
|
|
125
|
-
include_computed,
|
|
126
|
-
include_key,
|
|
127
|
-
include_non_field,
|
|
128
|
-
changes_only,
|
|
129
|
-
field_mapping,
|
|
130
|
-
chain,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
attributes({ changes_only = false, include_concurrency = false, include_computed = false, include_non_field = false, field_mapping = false, } = {}) {
|
|
134
|
-
return this._meta.attributes(this, {
|
|
135
|
-
changes_only,
|
|
136
|
-
include_concurrency,
|
|
137
|
-
include_computed,
|
|
138
|
-
include_non_field,
|
|
139
|
-
field_mapping,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
set(path, value) {
|
|
143
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
144
|
-
if (pathArray.length === 0)
|
|
145
|
-
return undefined;
|
|
146
|
-
if (pathArray.length > 1) {
|
|
147
|
-
const model = this[pathArray[0]];
|
|
148
|
-
return model.set(pathArray.slice(1), value);
|
|
149
|
-
}
|
|
150
|
-
if (pathArray.length === 1) {
|
|
151
|
-
return (this[pathArray[0]] = value);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
get(path) {
|
|
155
|
-
const pathArray = (Types.isArray(path) ? path : path.match(/([^[.\]])+/g));
|
|
156
|
-
if (pathArray.length === 0)
|
|
157
|
-
return undefined;
|
|
158
|
-
const value = this[pathArray[0]];
|
|
159
|
-
if (pathArray.length > 1 &&
|
|
160
|
-
(value instanceof ODataModel || value instanceof ODataCollection)) {
|
|
161
|
-
return value.get(pathArray.slice(1));
|
|
162
|
-
}
|
|
163
|
-
return value;
|
|
164
|
-
}
|
|
165
|
-
reset({ path, silent = false, } = {}) {
|
|
166
|
-
const pathArray = (path === undefined
|
|
167
|
-
? []
|
|
168
|
-
: Types.isArray(path)
|
|
169
|
-
? path
|
|
170
|
-
: path.match(/([^[.\]])+/g));
|
|
171
|
-
const name = pathArray[0];
|
|
172
|
-
const value = name !== undefined ? this[name] : undefined;
|
|
173
|
-
if (ODataModelOptions.isModel(value) ||
|
|
174
|
-
ODataModelOptions.isCollection(value)) {
|
|
175
|
-
value.reset({ path: pathArray.slice(1), silent });
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
this._meta.reset(this, { name: pathArray[0], silent });
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
assign(entity, { reset = false, silent = false, } = {}) {
|
|
182
|
-
return this._meta.assign(this, entity, { reset, silent });
|
|
183
|
-
}
|
|
184
|
-
clone() {
|
|
185
|
-
let Ctor = this.constructor;
|
|
186
|
-
return new Ctor(this.toEntity(INCLUDE_SHALLOW), {
|
|
187
|
-
resource: this.resource(),
|
|
188
|
-
annots: this.annots(),
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
_request(obs$) {
|
|
192
|
-
this.events$.emit(new ODataModelEvent('request', {
|
|
193
|
-
model: this,
|
|
194
|
-
options: { observable: obs$ },
|
|
195
|
-
}));
|
|
196
|
-
return obs$.pipe(map(({ entity, annots }) => {
|
|
197
|
-
this._annotations = annots;
|
|
198
|
-
this.assign(annots.attributes(entity || {}, 'full'), {
|
|
199
|
-
reset: true,
|
|
200
|
-
});
|
|
201
|
-
this.events$.emit(new ODataModelEvent('sync', {
|
|
202
|
-
model: this,
|
|
203
|
-
options: { entity, annots },
|
|
204
|
-
}));
|
|
205
|
-
return this;
|
|
206
|
-
}));
|
|
207
|
-
}
|
|
208
|
-
fetch(_a = {}) {
|
|
209
|
-
var options = __rest(_a, []);
|
|
210
|
-
let resource = this.resource();
|
|
211
|
-
if (resource === undefined)
|
|
212
|
-
return throwError('fetch: Resource is undefined');
|
|
213
|
-
let obs$;
|
|
214
|
-
if (resource instanceof ODataEntityResource) {
|
|
215
|
-
if (!resource.hasKey())
|
|
216
|
-
return throwError("fetch: Can't fetch model without key");
|
|
217
|
-
obs$ = resource.fetch(options);
|
|
218
|
-
}
|
|
219
|
-
else if (resource instanceof ODataNavigationPropertyResource) {
|
|
220
|
-
obs$ = resource.fetch(Object.assign({ responseType: 'entity' }, options));
|
|
221
|
-
}
|
|
222
|
-
else {
|
|
223
|
-
obs$ = resource.fetch(Object.assign({ responseType: 'entity' }, options));
|
|
224
|
-
}
|
|
225
|
-
return this._request(obs$);
|
|
226
|
-
}
|
|
227
|
-
save(_a = {}) {
|
|
228
|
-
var { method, navigation = false, validate = true } = _a, options = __rest(_a, ["method", "navigation", "validate"]);
|
|
229
|
-
let resource = this.resource();
|
|
230
|
-
if (resource === undefined)
|
|
231
|
-
return throwError('save: Resource is undefined');
|
|
232
|
-
if (!(resource instanceof ODataEntityResource ||
|
|
233
|
-
resource instanceof ODataNavigationPropertyResource))
|
|
234
|
-
return throwError('save: Resource type ODataEntityResource/ODataNavigationPropertyResource needed');
|
|
235
|
-
// Resolve method and resource key
|
|
236
|
-
if (method === undefined && this.schema().isCompoundKey())
|
|
237
|
-
return throwError('save: Composite key require a specific method, use create/update/modify');
|
|
238
|
-
method = method || (!resource.hasKey() ? 'create' : 'update');
|
|
239
|
-
if (resource instanceof ODataEntityResource &&
|
|
240
|
-
(method === 'update' || method === 'modify') &&
|
|
241
|
-
!resource.hasKey())
|
|
242
|
-
return throwError('save: Update/Patch require entity key');
|
|
243
|
-
if (resource instanceof ODataNavigationPropertyResource ||
|
|
244
|
-
method === 'create')
|
|
245
|
-
resource.clearKey();
|
|
246
|
-
let obs$;
|
|
247
|
-
if (!validate || this.isValid({ method, navigation })) {
|
|
248
|
-
const _entity = this.toEntity({
|
|
249
|
-
changes_only: method === 'modify',
|
|
250
|
-
field_mapping: true,
|
|
251
|
-
include_concurrency: true,
|
|
252
|
-
include_navigation: navigation,
|
|
253
|
-
});
|
|
254
|
-
obs$ = (method === 'create'
|
|
255
|
-
? resource.create(_entity, options)
|
|
256
|
-
: method === 'modify'
|
|
257
|
-
? resource.modify(_entity, Object.assign({ etag: this.annots().etag }, options))
|
|
258
|
-
: resource.update(_entity, Object.assign({ etag: this.annots().etag }, options))).pipe(map(({ entity, annots }) => ({ entity: entity || _entity, annots })));
|
|
259
|
-
}
|
|
260
|
-
else {
|
|
261
|
-
obs$ = throwError(this._errors);
|
|
262
|
-
}
|
|
263
|
-
return this._request(obs$);
|
|
264
|
-
}
|
|
265
|
-
destroy(_a = {}) {
|
|
266
|
-
var options = __rest(_a, []);
|
|
267
|
-
let resource = this.resource();
|
|
268
|
-
if (resource === undefined)
|
|
269
|
-
return throwError('destroy: Resource is undefined');
|
|
270
|
-
if (!(resource instanceof ODataEntityResource ||
|
|
271
|
-
resource instanceof ODataNavigationPropertyResource))
|
|
272
|
-
return throwError('destroy: Resource type ODataEntityResource/ODataNavigationPropertyResource needed');
|
|
273
|
-
if (!resource.hasKey())
|
|
274
|
-
return throwError("destroy: Can't destroy model without key");
|
|
275
|
-
const _entity = this.toEntity({ field_mapping: true });
|
|
276
|
-
const obs$ = resource
|
|
277
|
-
.destroy(Object.assign({ etag: this.annots().etag }, options))
|
|
278
|
-
.pipe(map(({ entity, annots }) => ({ entity: entity || _entity, annots })));
|
|
279
|
-
return this._request(obs$).pipe(tap(() => this.events$.emit(new ODataModelEvent('destroy', { model: this }))));
|
|
280
|
-
}
|
|
281
|
-
/**
|
|
282
|
-
* Create an execution context for change the internal query of a resource
|
|
283
|
-
* @param func Function to execute
|
|
284
|
-
*/
|
|
285
|
-
query(func) {
|
|
286
|
-
return this._meta.query(this, this.resource(), func);
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Perform a check on the internal state of the model and return true if the model is changed.
|
|
290
|
-
* @param include_navigation Check in navigation properties
|
|
291
|
-
* @returns true if the model has changed, false otherwise
|
|
292
|
-
*/
|
|
293
|
-
hasChanged({ include_navigation = false, } = {}) {
|
|
294
|
-
return this._meta.hasChanged(this, { include_navigation });
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Create an execution context for a given function, where the model is bound to its entity endpoint
|
|
298
|
-
* @param ctx Context function
|
|
299
|
-
* @returns The result of the context
|
|
300
|
-
*/
|
|
301
|
-
asEntity(ctx) {
|
|
302
|
-
return this._meta.asEntity(this, ctx);
|
|
303
|
-
}
|
|
304
|
-
callFunction(name, params, responseType, _a = {}) {
|
|
305
|
-
var options = __rest(_a, []);
|
|
306
|
-
const resource = this.resource();
|
|
307
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
308
|
-
return throwError("Can't call function without ODataEntityResource with key");
|
|
309
|
-
const func = resource.function(name).query((q) => q.apply(options));
|
|
310
|
-
switch (responseType) {
|
|
311
|
-
case 'property':
|
|
312
|
-
return func.callProperty(params, options);
|
|
313
|
-
case 'model':
|
|
314
|
-
return func.callModel(params, options);
|
|
315
|
-
case 'collection':
|
|
316
|
-
return func.callCollection(params, options);
|
|
317
|
-
default:
|
|
318
|
-
return func.call(params, Object.assign({ responseType }, options));
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
callAction(name, params, responseType, _a = {}) {
|
|
322
|
-
var options = __rest(_a, []);
|
|
323
|
-
const resource = this.resource();
|
|
324
|
-
if (!(resource instanceof ODataEntityResource) || !resource.hasKey())
|
|
325
|
-
return throwError("Can't call action without ODataEntityResource with key");
|
|
326
|
-
const action = resource.action(name).query((q) => q.apply(options));
|
|
327
|
-
switch (responseType) {
|
|
328
|
-
case 'property':
|
|
329
|
-
return action.callProperty(params, options);
|
|
330
|
-
case 'model':
|
|
331
|
-
return action.callModel(params, options);
|
|
332
|
-
case 'collection':
|
|
333
|
-
return action.callCollection(params, options);
|
|
334
|
-
default:
|
|
335
|
-
return action.call(params, Object.assign({ responseType }, options));
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
// Cast
|
|
339
|
-
cast(type) {
|
|
340
|
-
const resource = this.resource();
|
|
341
|
-
if (!(resource instanceof ODataEntityResource))
|
|
342
|
-
throw new Error(`Can't cast to derived model without ODataEntityResource`);
|
|
343
|
-
return resource
|
|
344
|
-
.cast(type)
|
|
345
|
-
.asModel(this.toEntity(INCLUDE_DEEP), { annots: this.annots() });
|
|
346
|
-
}
|
|
347
|
-
fetchNavigationProperty(name, responseType, _a = {}) {
|
|
348
|
-
var options = __rest(_a, []);
|
|
349
|
-
const nav = this.navigationProperty(name);
|
|
350
|
-
nav.query((q) => q.apply(options));
|
|
351
|
-
switch (responseType) {
|
|
352
|
-
case 'model':
|
|
353
|
-
return nav.fetchModel(options);
|
|
354
|
-
case 'collection':
|
|
355
|
-
return nav.fetchCollection(options);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
// Get Value
|
|
359
|
-
getValue(name, options) {
|
|
360
|
-
const field = this._meta.field(name);
|
|
361
|
-
if (field === undefined || field.navigation)
|
|
362
|
-
throw Error(`Can't find property ${name}`);
|
|
363
|
-
let value = this[name];
|
|
364
|
-
if (value === undefined) {
|
|
365
|
-
const prop = field.resourceFactory(this.resource());
|
|
366
|
-
return field.collection
|
|
367
|
-
? prop
|
|
368
|
-
.fetchCollection(options)
|
|
369
|
-
.pipe(tap((c) => this.assign({ [name]: c }, { silent: true })))
|
|
370
|
-
: field.isStructuredType()
|
|
371
|
-
? prop
|
|
372
|
-
.fetchModel(options)
|
|
373
|
-
.pipe(tap((c) => this.assign({ [name]: c }, { silent: true })))
|
|
374
|
-
: prop
|
|
375
|
-
.fetchProperty(options)
|
|
376
|
-
.pipe(tap((c) => this.assign({ [name]: c }, { silent: true })));
|
|
377
|
-
}
|
|
378
|
-
return of(value);
|
|
379
|
-
}
|
|
380
|
-
// Set Reference
|
|
381
|
-
setReference(name, model, options) {
|
|
382
|
-
const reference = this.navigationProperty(name).reference();
|
|
383
|
-
const etag = this.annots().etag;
|
|
384
|
-
let obs$ = NEVER;
|
|
385
|
-
if (model instanceof ODataModel) {
|
|
386
|
-
obs$ = reference.set(model._meta.entityResource(model), Object.assign({ etag }, options));
|
|
387
|
-
}
|
|
388
|
-
else if (model instanceof ODataCollection) {
|
|
389
|
-
obs$ = forkJoin(model
|
|
390
|
-
.models()
|
|
391
|
-
.map((m) => reference.add(m._meta.entityResource(m), options)));
|
|
392
|
-
}
|
|
393
|
-
else if (model === null) {
|
|
394
|
-
obs$ = reference.unset(Object.assign({ etag }, options));
|
|
395
|
-
}
|
|
396
|
-
this.events$.emit(new ODataModelEvent('request', {
|
|
397
|
-
model: this,
|
|
398
|
-
options: { observable: obs$ },
|
|
399
|
-
}));
|
|
400
|
-
return obs$.pipe(map((model) => {
|
|
401
|
-
this.assign({ [name]: model });
|
|
402
|
-
this.events$.emit(new ODataModelEvent('sync', { model: this }));
|
|
403
|
-
return this;
|
|
404
|
-
}));
|
|
405
|
-
}
|
|
406
|
-
getReference(name) {
|
|
407
|
-
const field = this._meta.field(name);
|
|
408
|
-
if (field === undefined || !field.navigation)
|
|
409
|
-
throw Error(`Can't find navigation property ${name}`);
|
|
410
|
-
let model = this[name];
|
|
411
|
-
if (model === undefined) {
|
|
412
|
-
const value = field.collection ? [] : this.referenced(field);
|
|
413
|
-
model = field.modelCollectionFactory({ parent: this, value });
|
|
414
|
-
this[name] = model;
|
|
415
|
-
}
|
|
416
|
-
return model;
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW9kYXRhL3NyYy9saWIvbW9kZWxzL21vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBYyxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUxQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLCtCQUErQixHQVFoQyxNQUFNLGNBQWMsQ0FBQztBQUV0QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVuRCxPQUFPLEVBRUwsZUFBZSxFQUNmLGlCQUFpQixFQUlqQixZQUFZLEVBQ1osZUFBZSxHQUNoQixNQUFNLFdBQVcsQ0FBQztBQUVuQixXQUFXO0FBQ1gsTUFBTSxPQUFPLFVBQVU7SUF3QnJCLFlBQ0UsT0FBNkMsRUFBRSxFQUMvQyxFQUNFLE1BQU0sRUFDTixRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssR0FBRyxLQUFLLE1BU1gsRUFBRTtRQWhDUixTQUFTO1FBQ1QsWUFBTyxHQUtJLElBQUksQ0FBQztRQUNoQixnQkFBVyxHQUE0QixFQUFFLENBQUM7UUFDMUMsYUFBUSxHQUE0QixFQUFFLENBQUM7UUFDdkMsZUFBVSxHQUFnRCxFQUFFLENBQUM7UUFHN0QsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixZQUFPLEdBQVksS0FBSyxDQUFDO1FBRXpCLFNBQVM7UUFDVCxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQXNCLENBQUM7UUFrQi9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFnQyxDQUFDO1FBQ3BELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXBELFlBQVk7UUFDTixJQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7WUFDbkIsSUFBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUMzQixPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUUvRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFJLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0RCxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQXBERCxNQUFNLENBQUMsU0FBUyxDQUFJLE9BQXFCLEVBQUUsTUFBOEI7UUFDdkUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLGlCQUFpQixDQUFJLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBbURELElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3RCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBb0I7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzNCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixPQUFPLENBQ0wsSUFBSSxLQUFLLEtBQUs7WUFDZCxDQUFDLE9BQU8sSUFBSSxLQUFLLE9BQU8sS0FBSztnQkFDM0IsQ0FBTyxJQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBVyxLQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7b0JBQzNELENBQUMsT0FBTyxLQUFLLFNBQVM7d0JBQ3BCLFFBQVEsS0FBSyxTQUFTO3dCQUN0QixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDMUMsQ0FBQztJQUNKLENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsUUFBUTtRQUNOLE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFJLElBQUksQ0FBMEIsQ0FBQztJQUN0RSxDQUFDO0lBRUQsa0JBQWtCLENBQUksSUFBWTtRQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUMxQyxNQUFNLEtBQUssQ0FBQyxrQ0FBa0MsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV4RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxZQUFZLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2xFLE1BQU0sS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFFM0UsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUMxQixRQUFRLENBQzZCLENBQUM7SUFDMUMsQ0FBQztJQUVELFFBQVEsQ0FBSSxJQUFZO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsVUFBVTtZQUN6QyxNQUFNLEtBQUssQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxZQUFZLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2xFLE1BQU0sS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7UUFFekUsT0FBTyxLQUFLLENBQUMsZUFBZSxDQUFPLFFBQVEsQ0FBNkIsQ0FBQztJQUMzRSxDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQStCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFDRCxZQUFZO0lBRVosTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELEdBQUcsQ0FBQyxFQUNGLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLE9BQU8sR0FBRyxJQUFJLE1BQ29DLEVBQUU7UUFJcEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsS0FBSztRQUNILE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsVUFBVSxDQUNSLEtBQThEO1FBRTlELE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtZQUNkLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQ1QsS0FBMkIsRUFDM0IsRUFDRSxhQUFhLEdBQUcsS0FBSyxFQUNyQixPQUFPLEdBQUcsSUFBSSxNQUNvQyxFQUFFO1FBRXRELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ2hELGFBQWE7WUFDYixPQUFPO1NBQ1IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVUsQ0FDUixLQUEyQixFQUMzQixFQUNFLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLE9BQU8sR0FBRyxJQUFJLE1BQ29DLEVBQUU7UUFFdEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7WUFDL0MsYUFBYTtZQUNiLE9BQU87U0FDUixDQUFDLENBQUM7SUFDTCxDQUFDO0lBSVMsUUFBUSxDQUFDLEVBQ2pCLE1BQU0sRUFDTixVQUFVLEdBQUcsS0FBSyxNQUloQixFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsT0FBTyxDQUFDLEVBQ04sTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLE1BSWhCLEVBQUU7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUztZQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUU7Z0JBQzdCLEtBQUssRUFBRSxJQUFJO2dCQUNYLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDbkIsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFO2FBQ3BCLENBQUMsQ0FDSCxDQUFDO1FBQ0osT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsQ0FBQztJQUNwQyxDQUFDO0lBRVMsUUFBUTtRQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFDRCxRQUFRLENBQUMsRUFDUCxTQUFTLEdBQUcsS0FBSyxFQUNqQixrQkFBa0IsR0FBRyxLQUFLLEVBQzFCLG1CQUFtQixHQUFHLEtBQUssRUFDM0IsZ0JBQWdCLEdBQUcsS0FBSyxFQUN4QixXQUFXLEdBQUcsSUFBSSxFQUNsQixpQkFBaUIsR0FBRyxLQUFLLEVBQ3pCLFlBQVksR0FBRyxLQUFLLEVBQ3BCLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLEtBQUssR0FBRyxFQUFFLE1BV1IsRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQy9CLFNBQVM7WUFDVCxrQkFBa0I7WUFDbEIsbUJBQW1CO1lBQ25CLGdCQUFnQjtZQUNoQixXQUFXO1lBQ1gsaUJBQWlCO1lBQ2pCLFlBQVk7WUFDWixhQUFhO1lBQ2IsS0FBSztTQUNOLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsRUFDVCxZQUFZLEdBQUcsS0FBSyxFQUNwQixtQkFBbUIsR0FBRyxLQUFLLEVBQzNCLGdCQUFnQixHQUFHLEtBQUssRUFDeEIsaUJBQWlCLEdBQUcsS0FBSyxFQUN6QixhQUFhLEdBQUcsS0FBSyxNQU9uQixFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDakMsWUFBWTtZQUNaLG1CQUFtQjtZQUNuQixnQkFBZ0I7WUFDaEIsaUJBQWlCO1lBQ2pCLGFBQWE7U0FDZCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsR0FBRyxDQUFDLElBQXVCLEVBQUUsS0FBVTtRQUNyQyxNQUFNLFNBQVMsR0FBRyxDQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQWUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQzFELENBQUM7UUFDWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLElBQUksU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQVMsSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUMxQixPQUFPLENBQU8sSUFBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUF1QjtRQUN6QixNQUFNLFNBQVMsR0FBRyxDQUNoQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFFLElBQWUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQzFELENBQUM7UUFDWCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQzdDLE1BQU0sS0FBSyxHQUFTLElBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUNFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNwQixDQUFDLEtBQUssWUFBWSxVQUFVLElBQUksS0FBSyxZQUFZLGVBQWUsQ0FBQyxFQUNqRTtZQUNBLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxLQUFLLENBQUMsRUFDSixJQUFJLEVBQ0osTUFBTSxHQUFHLEtBQUssTUFDb0MsRUFBRTtRQUNwRCxNQUFNLFNBQVMsR0FBYSxDQUMxQixJQUFJLEtBQUssU0FBUztZQUNoQixDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDckIsQ0FBQyxDQUFDLElBQUk7Z0JBQ04sQ0FBQyxDQUFFLElBQWUsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQ2pDLENBQUM7UUFDWCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQU8sSUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDakUsSUFDRSxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQ2hDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFDckM7WUFDQSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUVELE1BQU0sQ0FDSixNQUE0QyxFQUM1QyxFQUNFLEtBQUssR0FBRyxLQUFLLEVBQ2IsTUFBTSxHQUFHLEtBQUssTUFDMkIsRUFBRTtRQUU3QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxHQUFzQixJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9DLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUM5QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBMkI7WUFDbEQsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUU7U0FDdEIsQ0FBTSxDQUFDO0lBQ1YsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUFrQztRQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUU7WUFDN0IsS0FBSyxFQUFFLElBQUk7WUFDWCxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1NBQzlCLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFJLE1BQU0sSUFBSSxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUU7Z0JBQ3RELEtBQUssRUFBRSxJQUFJO2FBQ1osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsSUFBSSxlQUFlLENBQUMsTUFBTSxFQUFFO2dCQUMxQixLQUFLLEVBQUUsSUFBSTtnQkFDWCxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFO2FBQzVCLENBQUMsQ0FDSCxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxLQUlGLEVBQUU7WUFIRCxPQUFPLGNBRE4sRUFFTCxDQURXO1FBSVYsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQy9CLElBQUksUUFBUSxLQUFLLFNBQVM7WUFDeEIsT0FBTyxVQUFVLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUVwRCxJQUFJLElBQWdDLENBQUM7UUFDckMsSUFBSSxRQUFRLFlBQVksbUJBQW1CLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3BCLE9BQU8sVUFBVSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDNUQsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDaEM7YUFBTSxJQUFJLFFBQVEsWUFBWSwrQkFBK0IsRUFBRTtZQUM5RCxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssaUJBQUcsWUFBWSxFQUFFLFFBQVEsSUFBSyxPQUFPLEVBQUcsQ0FBQztTQUMvRDthQUFNO1lBQ0wsSUFBSSxHQUFJLFFBQXFDLENBQUMsS0FBSyxpQkFDakQsWUFBWSxFQUFFLFFBQVEsSUFDbkIsT0FBTyxFQUNWLENBQUM7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxDQUFDLEtBVUQsRUFBRTtZQVZELEVBQ0gsTUFBTSxFQUNOLFVBQVUsR0FBRyxLQUFLLEVBQ2xCLFFBQVEsR0FBRyxJQUFJLE9BT1gsRUFORCxPQUFPLGNBSlAsb0NBS0osQ0FEVztRQU9WLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQ3hCLE9BQU8sVUFBVSxDQUFDLDZCQUE2QixDQUFDLENBQUM7UUFDbkQsSUFDRSxDQUFDLENBQ0MsUUFBUSxZQUFZLG1CQUFtQjtZQUN2QyxRQUFRLFlBQVksK0JBQStCLENBQ3BEO1lBRUQsT0FBTyxVQUFVLENBQ2YsZ0ZBQWdGLENBQ2pGLENBQUM7UUFFSixrQ0FBa0M7UUFDbEMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxhQUFhLEVBQUU7WUFDdkQsT0FBTyxVQUFVLENBQ2YseUVBQXlFLENBQzFFLENBQUM7UUFDSixNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsSUFDRSxRQUFRLFlBQVksbUJBQW1CO1lBQ3ZDLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssUUFBUSxDQUFDO1lBQzVDLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUVsQixPQUFPLFVBQVUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQzdELElBQ0UsUUFBUSxZQUFZLCtCQUErQjtZQUNuRCxNQUFNLEtBQUssUUFBUTtZQUVuQixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFdEIsSUFBSSxJQUFrQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFO1lBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzVCLFlBQVksRUFBRSxNQUFNLEtBQUssUUFBUTtnQkFDakMsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLG1CQUFtQixFQUFFLElBQUk7Z0JBQ3pCLGtCQUFrQixFQUFFLFVBQVU7YUFDL0IsQ0FBTSxDQUFDO1lBQ1IsSUFBSSxHQUFHLENBQ0wsTUFBTSxLQUFLLFFBQVE7Z0JBQ2pCLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7Z0JBQ25DLENBQUMsQ0FBQyxNQUFNLEtBQUssUUFBUTtvQkFDckIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxrQkFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksSUFBSyxPQUFPLEVBQUc7b0JBQ3BFLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sa0JBQUksSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUssT0FBTyxFQUFHLENBQ3ZFLENBQUMsSUFBSSxDQUNKLEdBQUcsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUNyRSxDQUFDO1NBQ0g7YUFBTTtZQUNMLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pDO1FBQ0QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLENBQUMsS0FJSixFQUFFO1lBSEQsT0FBTyxjQURKLEVBRVAsQ0FEVztRQUlWLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixJQUFJLFFBQVEsS0FBSyxTQUFTO1lBQ3hCLE9BQU8sVUFBVSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDdEQsSUFDRSxDQUFDLENBQ0MsUUFBUSxZQUFZLG1CQUFtQjtZQUN2QyxRQUFRLFlBQVksK0JBQStCLENBQ3BEO1lBRUQsT0FBTyxVQUFVLENBQ2YsbUZBQW1GLENBQ3BGLENBQUM7UUFDSixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNwQixPQUFPLFVBQVUsQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1FBRWhFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQU0sQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxRQUFRO2FBQ2xCLE9BQU8saUJBQUcsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUssT0FBTyxFQUFHO2FBQ2pELElBQUksQ0FDSCxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FDckUsQ0FBQztRQUNKLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQzdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FDUCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUNuRSxDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLElBQThDO1FBQ2xELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQVMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxFQUNULGtCQUFrQixHQUFHLEtBQUssTUFDVSxFQUFFO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFJLEdBQXVCO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFUyxZQUFZLENBQ3BCLElBQVksRUFDWixNQUFnQixFQUNoQixZQUEwRCxFQUMxRCxLQUFxRCxFQUFFO1lBQWxELE9BQU8sY0FBWixFQUFjLENBQUY7UUFFWixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxZQUFZLG1CQUFtQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ2xFLE9BQU8sVUFBVSxDQUNmLDBEQUEwRCxDQUMzRCxDQUFDO1FBRUosTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMxRSxRQUFRLFlBQVksRUFBRTtZQUNwQixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM1QyxLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUN6QyxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM5QztnQkFDRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxrQkFBSSxZQUFZLElBQUssT0FBTyxFQUFHLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBRVMsVUFBVSxDQUNsQixJQUFZLEVBQ1osTUFBZ0IsRUFDaEIsWUFBMEQsRUFDMUQsS0FBcUQsRUFBRTtZQUFsRCxPQUFPLGNBQVosRUFBYyxDQUFGO1FBRVosTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLFFBQVEsWUFBWSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUNsRSxPQUFPLFVBQVUsQ0FDZix3REFBd0QsQ0FDekQsQ0FBQztRQUVKLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQU8sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUUsUUFBUSxZQUFZLEVBQUU7WUFDcEIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUMsS0FBSyxPQUFPO2dCQUNWLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDM0MsS0FBSyxZQUFZO2dCQUNmLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDaEQ7Z0JBQ0UsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sa0JBQUksWUFBWSxJQUFLLE9BQU8sRUFBRyxDQUFDO1NBQzVEO0lBQ0gsQ0FBQztJQUVELE9BQU87SUFDRyxJQUFJLENBQUksSUFBWTtRQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLENBQUMsUUFBUSxZQUFZLG1CQUFtQixDQUFDO1lBQzVDLE1BQU0sSUFBSSxLQUFLLENBQ2IseURBQXlELENBQzFELENBQUM7UUFFSixPQUFPLFFBQVE7YUFDWixJQUFJLENBQUksSUFBSSxDQUFDO2FBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRVMsdUJBQXVCLENBQy9CLElBQVksRUFDWixZQUFvQyxFQUNwQyxLQUFxRCxFQUFFO1lBQWxELE9BQU8sY0FBWixFQUFjLENBQUY7UUFFWixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQ2pDLElBQUksQ0FDaUMsQ0FBQztRQUN4QyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDbkMsUUFBUSxZQUFZLEVBQUU7WUFDcEIsS0FBSyxPQUFPO2dCQUNWLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxLQUFLLFlBQVk7Z0JBQ2YsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVELFlBQVk7SUFDRixRQUFRLENBQ2hCLElBQVksRUFDWixPQUFzQjtRQUV0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLFVBQVU7WUFDekMsTUFBTSxLQUFLLENBQUMsdUJBQXVCLElBQUksRUFBRSxDQUFDLENBQUM7UUFFN0MsSUFBSSxLQUFLLEdBQUksSUFBWSxDQUFDLElBQUksQ0FHTyxDQUFDO1FBQ3RDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsZUFBZSxDQUNoQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQ1ksQ0FBQztZQUM5QixPQUFPLEtBQUssQ0FBQyxVQUFVO2dCQUNyQixDQUFDLENBQUMsSUFBSTtxQkFDRCxlQUFlLENBQUMsT0FBTyxDQUFDO3FCQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7b0JBQzFCLENBQUMsQ0FBQyxJQUFJO3lCQUNELFVBQVUsQ0FBQyxPQUFPLENBQUM7eUJBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbkUsQ0FBQyxDQUFDLElBQUk7eUJBQ0QsYUFBYSxDQUFDLE9BQU8sQ0FBQzt5QkFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkU7UUFDRCxPQUFPLEVBQUUsQ0FBQyxLQUFVLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ04sWUFBWSxDQUNwQixJQUFZLEVBQ1osS0FBK0QsRUFDL0QsT0FBc0I7UUFFdEIsTUFBTSxTQUFTLEdBQ2IsSUFBSSxDQUFDLGtCQUFrQixDQUFJLElBQUksQ0FDaEMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUVkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDaEMsSUFBSSxJQUFJLEdBQUcsS0FBd0IsQ0FBQztRQUNwQyxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUU7WUFDL0IsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQ2xCLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBMkIsa0JBQ3pELElBQUksSUFBSyxPQUFPLEVBQ25CLENBQUM7U0FDSDthQUFNLElBQUksS0FBSyxZQUFZLGVBQWUsRUFBRTtZQUMzQyxJQUFJLEdBQUcsUUFBUSxDQUNiLEtBQUs7aUJBQ0YsTUFBTSxFQUFFO2lCQUNSLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ1QsU0FBUyxDQUFDLEdBQUcsQ0FDWCxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQTJCLEVBQ25ELE9BQU8sQ0FDUixDQUNGLENBQ0osQ0FBQztTQUNIO2FBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO1lBQ3pCLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxpQkFBRyxJQUFJLElBQUssT0FBTyxFQUFHLENBQUM7U0FDOUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDZixJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUU7WUFDN0IsS0FBSyxFQUFFLElBQUk7WUFDWCxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFO1NBQzlCLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUNkLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFUyxZQUFZLENBQ3BCLElBQVk7UUFFWixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUMxQyxNQUFNLEtBQUssQ0FBQyxrQ0FBa0MsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssR0FBSSxJQUFZLENBQUMsSUFBSSxDQUVPLENBQUM7UUFDdEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3RCxLQUFLLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLElBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUM7U0FDN0I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciwgZm9ya0pvaW4sIE5FVkVSLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7XG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG4gIE9EYXRhUHJvcGVydHlSZXNvdXJjZSxcbiAgT0RhdGFPcHRpb25zLFxuICBPRGF0YUVudGl0eUFubm90YXRpb25zLFxuICBPRGF0YUVudGl0eSxcbiAgRW50aXR5S2V5LFxuICBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9ucyxcbiAgT0RhdGFRdWVyeU9wdGlvbnNIYW5kbGVyLFxufSBmcm9tICcuLi9yZXNvdXJjZXMnO1xuXG5pbXBvcnQgeyBPRGF0YUNvbGxlY3Rpb24gfSBmcm9tICcuL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHsgT2JqZWN0cywgVHlwZXMsIFN0cmluZ3MgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBPRGF0YVN0cnVjdHVyZWRUeXBlIH0gZnJvbSAnLi4vc2NoZW1hJztcbmltcG9ydCB7XG4gIE1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbEV2ZW50LFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbiAgT0RhdGFNb2RlbFJlbGF0aW9uLFxuICBPRGF0YU1vZGVsUmVzb3VyY2UsXG4gIE9EYXRhTW9kZWxGaWVsZCxcbiAgSU5DTFVERV9ERUVQLFxuICBJTkNMVURFX1NIQUxMT1csXG59IGZyb20gJy4vb3B0aW9ucyc7XG5cbi8vIEBkeW5hbWljXG5leHBvcnQgY2xhc3MgT0RhdGFNb2RlbDxUPiB7XG4gIC8vIFByb3BlcnRpZXNcbiAgc3RhdGljIG9wdGlvbnM6IE1vZGVsT3B0aW9ucztcbiAgc3RhdGljIG1ldGE6IE9EYXRhTW9kZWxPcHRpb25zPGFueT47XG4gIHN0YXRpYyBidWlsZE1ldGE8VD4ob3B0aW9uczogTW9kZWxPcHRpb25zLCBzY2hlbWE6IE9EYXRhU3RydWN0dXJlZFR5cGU8VD4pIHtcbiAgICB0aGlzLm1ldGEgPSBuZXcgT0RhdGFNb2RlbE9wdGlvbnM8VD4ob3B0aW9ucywgc2NoZW1hKTtcbiAgfVxuICAvLyBQYXJlbnRcbiAgX3BhcmVudDpcbiAgICB8IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdXG4gICAgfCBudWxsID0gbnVsbDtcbiAgX2F0dHJpYnV0ZXM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge307XG4gIF9jaGFuZ2VzOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBfcmVsYXRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBPRGF0YU1vZGVsUmVsYXRpb248YW55PiB9ID0ge307XG4gIF9yZXNvdXJjZT86IE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgX2Fubm90YXRpb25zITogT0RhdGFFbnRpdHlBbm5vdGF0aW9ucztcbiAgX3Jlc2V0dGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICBfc2lsZW50OiBib29sZWFuID0gZmFsc2U7XG4gIF9tZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxUPjtcbiAgLy8gRXZlbnRzXG4gIGV2ZW50cyQgPSBuZXcgRXZlbnRFbWl0dGVyPE9EYXRhTW9kZWxFdmVudDxUPj4oKTtcbiAgY29uc3RydWN0b3IoXG4gICAgZGF0YTogUGFydGlhbDxUPiB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9ID0ge30sXG4gICAge1xuICAgICAgcGFyZW50LFxuICAgICAgcmVzb3VyY2UsXG4gICAgICBhbm5vdHMsXG4gICAgICByZXNldCA9IGZhbHNlLFxuICAgIH06IHtcbiAgICAgIHBhcmVudD86IFtcbiAgICAgICAgT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PixcbiAgICAgICAgT0RhdGFNb2RlbEZpZWxkPGFueT4gfCBudWxsXG4gICAgICBdO1xuICAgICAgcmVzb3VyY2U/OiBPRGF0YU1vZGVsUmVzb3VyY2U8VD47XG4gICAgICBhbm5vdHM/OiBPRGF0YUVudGl0eUFubm90YXRpb25zO1xuICAgICAgcmVzZXQ/OiBib29sZWFuO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICBjb25zdCBLbGFzcyA9IHRoaXMuY29uc3RydWN0b3IgYXMgdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgaWYgKEtsYXNzLm1ldGEgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgY3JlYXRlIG1vZGVsIHdpdGhvdXQgbWV0YWRhdGFgKTtcbiAgICB0aGlzLl9tZXRhID0gS2xhc3MubWV0YTtcbiAgICB0aGlzLl9tZXRhLmJpbmQodGhpcywgeyBwYXJlbnQsIHJlc291cmNlLCBhbm5vdHMgfSk7XG5cbiAgICAvLyBDbGllbnQgSWRcbiAgICAoPGFueT50aGlzKVt0aGlzLl9tZXRhLmNpZF0gPVxuICAgICAgKDxhbnk+ZGF0YSlbdGhpcy5fbWV0YS5jaWRdIHx8XG4gICAgICBTdHJpbmdzLnVuaXF1ZUlkKGAke0tsYXNzLm1ldGEuc2NoZW1hLm5hbWUudG9Mb3dlckNhc2UoKX0tYCk7XG5cbiAgICBsZXQgYXR0cnMgPSB0aGlzLmFubm90cygpLmF0dHJpYnV0ZXM8VD4oZGF0YSwgJ2Z1bGwnKTtcbiAgICBsZXQgZGVmYXVsdHMgPSB0aGlzLmRlZmF1bHRzKCk7XG5cbiAgICB0aGlzLmFzc2lnbihPYmplY3RzLm1lcmdlKGRlZmF1bHRzLCBhdHRycyksIHsgcmVzZXQgfSk7XG4gIH1cbiAgZ2V0IFtTeW1ib2wudG9TdHJpbmdUYWddKCkge1xuICAgIHJldHVybiAnTW9kZWwnO1xuICB9XG5cbiAgZXF1YWxzKG90aGVyOiBPRGF0YU1vZGVsPFQ+KSB7XG4gICAgY29uc3QgdGhpc0tleSA9IHRoaXMua2V5KCk7XG4gICAgY29uc3Qgb3RoZXJLZXkgPSBvdGhlci5rZXkoKTtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcyA9PT0gb3RoZXIgfHxcbiAgICAgICh0eXBlb2YgdGhpcyA9PT0gdHlwZW9mIG90aGVyICYmXG4gICAgICAgICgoPGFueT50aGlzKVt0aGlzLl9tZXRhLmNpZF0gPT09ICg8YW55Pm90aGVyKVt0aGlzLl9tZXRhLmNpZF0gfHxcbiAgICAgICAgICAodGhpc0tleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBvdGhlcktleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBUeXBlcy5pc0VxdWFsKHRoaXNLZXksIG90aGVyS2V5KSkpKVxuICAgICk7XG4gIH1cblxuICAvLyNyZWdpb24gUmVzb3VyY2VzXG4gIHJlc291cmNlKCk6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPiB7XG4gICAgcmV0dXJuIE9EYXRhTW9kZWxPcHRpb25zLnJlc291cmNlPFQ+KHRoaXMpIGFzIE9EYXRhTW9kZWxSZXNvdXJjZTxUPjtcbiAgfVxuXG4gIG5hdmlnYXRpb25Qcm9wZXJ0eTxOPihuYW1lOiBzdHJpbmcpOiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPE4+IHtcbiAgICBjb25zdCBmaWVsZCA9IHRoaXMuX21ldGEuZmllbGQobmFtZSk7XG4gICAgaWYgKGZpZWxkID09PSB1bmRlZmluZWQgfHwgIWZpZWxkLm5hdmlnYXRpb24pXG4gICAgICB0aHJvdyBFcnJvcihgQ2FuJ3QgZmluZCBuYXZpZ2F0aW9uIHByb3BlcnR5ICR7bmFtZX1gKTtcblxuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgdGhyb3cgRXJyb3IoXCJDYW4ndCBnZXQgbmF2aWdhdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIik7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KFxuICAgICAgcmVzb3VyY2VcbiAgICApIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBwcm9wZXJ0eTxOPihuYW1lOiBzdHJpbmcpOiBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoYENhbid0IGZpbmQgcHJvcGVydHkgJHtuYW1lfWApO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICB0aHJvdyBFcnJvcihcIkNhbid0IGdldCBwcm9wZXJ0eSB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIik7XG5cbiAgICByZXR1cm4gZmllbGQucmVzb3VyY2VGYWN0b3J5PFQsIE4+KHJlc291cmNlKSBhcyBPRGF0YVByb3BlcnR5UmVzb3VyY2U8Tj47XG4gIH1cblxuICBhdHRhY2gocmVzb3VyY2U6IE9EYXRhTW9kZWxSZXNvdXJjZTxUPikge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmF0dGFjaCh0aGlzLCByZXNvdXJjZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgc2NoZW1hKCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnNjaGVtYTtcbiAgfVxuXG4gIGFubm90cygpIHtcbiAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gIH1cblxuICBrZXkoe1xuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICByZXNvbHZlID0gdHJ1ZSxcbiAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9KTpcbiAgICB8IEVudGl0eUtleTxUPlxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEucmVzb2x2ZUtleSh0aGlzLCB7IGZpZWxkX21hcHBpbmcsIHJlc29sdmUgfSk7XG4gIH1cblxuICBpc05ldygpIHtcbiAgICByZXR1cm4gdGhpcy5rZXkoKSA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNQYXJlbnRPZihcbiAgICBjaGlsZDogT0RhdGFNb2RlbDxhbnk+IHwgT0RhdGFDb2xsZWN0aW9uPGFueSwgT0RhdGFNb2RlbDxhbnk+PlxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hpbGQgIT09IHRoaXMgJiZcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmNoYWluKGNoaWxkKS5zb21lKChwKSA9PiBwWzBdID09PSB0aGlzKVxuICAgICk7XG4gIH1cblxuICByZWZlcmVudGlhbChcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbnRpYWwodGhpcywgZmllbGQsIHtcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICByZXNvbHZlLFxuICAgIH0pO1xuICB9XG5cbiAgcmVmZXJlbmNlZChcbiAgICBmaWVsZDogT0RhdGFNb2RlbEZpZWxkPGFueT4sXG4gICAge1xuICAgICAgZmllbGRfbWFwcGluZyA9IGZhbHNlLFxuICAgICAgcmVzb2x2ZSA9IHRydWUsXG4gICAgfTogeyBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjsgcmVzb2x2ZT86IGJvb2xlYW4gfSA9IHt9XG4gICk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5yZXNvbHZlUmVmZXJlbmNlZCh0aGlzLCBmaWVsZCwge1xuICAgICAgZmllbGRfbWFwcGluZyxcbiAgICAgIHJlc29sdmUsXG4gICAgfSk7XG4gIH1cblxuICAvLyBWYWxpZGF0aW9uXG4gIF9lcnJvcnM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICBwcm90ZWN0ZWQgdmFsaWRhdGUoe1xuICAgIG1ldGhvZCxcbiAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gIH06IHtcbiAgICBtZXRob2Q/OiAnY3JlYXRlJyB8ICd1cGRhdGUnIHwgJ21vZGlmeSc7XG4gICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnZhbGlkYXRlKHRoaXMsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICB9XG5cbiAgaXNWYWxpZCh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgfToge1xuICAgIG1ldGhvZD86ICdjcmVhdGUnIHwgJ3VwZGF0ZScgfCAnbW9kaWZ5JztcbiAgICBuYXZpZ2F0aW9uPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogYm9vbGVhbiB7XG4gICAgdGhpcy5fZXJyb3JzID0gdGhpcy52YWxpZGF0ZSh7IG1ldGhvZCwgbmF2aWdhdGlvbiB9KTtcbiAgICBpZiAodGhpcy5fZXJyb3JzICE9PSB1bmRlZmluZWQpXG4gICAgICB0aGlzLmV2ZW50cyQuZW1pdChcbiAgICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgnaW52YWxpZCcsIHtcbiAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgICB2YWx1ZTogdGhpcy5fZXJyb3JzLFxuICAgICAgICAgIG9wdGlvbnM6IHsgbWV0aG9kIH0sXG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9lcnJvcnMgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWZhdWx0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5kZWZhdWx0cygpIHx8IHt9O1xuICB9XG4gIHRvRW50aXR5KHtcbiAgICBjbGllbnRfaWQgPSBmYWxzZSxcbiAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbmN1cnJlbmN5ID0gZmFsc2UsXG4gICAgaW5jbHVkZV9jb21wdXRlZCA9IGZhbHNlLFxuICAgIGluY2x1ZGVfa2V5ID0gdHJ1ZSxcbiAgICBpbmNsdWRlX25vbl9maWVsZCA9IGZhbHNlLFxuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGZpZWxkX21hcHBpbmcgPSBmYWxzZSxcbiAgICBjaGFpbiA9IFtdLFxuICB9OiB7XG4gICAgY2xpZW50X2lkPzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfa2V5PzogYm9vbGVhbjtcbiAgICBpbmNsdWRlX25vbl9maWVsZD86IGJvb2xlYW47XG4gICAgY2hhbmdlc19vbmx5PzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgICBjaGFpbj86IChPRGF0YU1vZGVsPGFueT4gfCBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+KVtdO1xuICB9ID0ge30pOiBUIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnRvRW50aXR5KHRoaXMsIHtcbiAgICAgIGNsaWVudF9pZCxcbiAgICAgIGluY2x1ZGVfbmF2aWdhdGlvbixcbiAgICAgIGluY2x1ZGVfY29uY3VycmVuY3ksXG4gICAgICBpbmNsdWRlX2NvbXB1dGVkLFxuICAgICAgaW5jbHVkZV9rZXksXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgIGNoYW5nZXNfb25seSxcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgICBjaGFpbixcbiAgICB9KTtcbiAgfVxuXG4gIGF0dHJpYnV0ZXMoe1xuICAgIGNoYW5nZXNfb25seSA9IGZhbHNlLFxuICAgIGluY2x1ZGVfY29uY3VycmVuY3kgPSBmYWxzZSxcbiAgICBpbmNsdWRlX2NvbXB1dGVkID0gZmFsc2UsXG4gICAgaW5jbHVkZV9ub25fZmllbGQgPSBmYWxzZSxcbiAgICBmaWVsZF9tYXBwaW5nID0gZmFsc2UsXG4gIH06IHtcbiAgICBjaGFuZ2VzX29ubHk/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29uY3VycmVuY3k/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfY29tcHV0ZWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVfbm9uX2ZpZWxkPzogYm9vbGVhbjtcbiAgICBmaWVsZF9tYXBwaW5nPzogYm9vbGVhbjtcbiAgfSA9IHt9KTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmF0dHJpYnV0ZXModGhpcywge1xuICAgICAgY2hhbmdlc19vbmx5LFxuICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeSxcbiAgICAgIGluY2x1ZGVfY29tcHV0ZWQsXG4gICAgICBpbmNsdWRlX25vbl9maWVsZCxcbiAgICAgIGZpZWxkX21hcHBpbmcsXG4gICAgfSk7XG4gIH1cblxuICBzZXQocGF0aDogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gKDxhbnk+dGhpcylbcGF0aEFycmF5WzBdXTtcbiAgICAgIHJldHVybiBtb2RlbC5zZXQocGF0aEFycmF5LnNsaWNlKDEpLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gKCg8YW55PnRoaXMpW3BhdGhBcnJheVswXV0gPSB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBwYXRoQXJyYXkgPSAoXG4gICAgICBUeXBlcy5pc0FycmF5KHBhdGgpID8gcGF0aCA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB2YWx1ZSA9ICg8YW55PnRoaXMpW3BhdGhBcnJheVswXV07XG4gICAgaWYgKFxuICAgICAgcGF0aEFycmF5Lmxlbmd0aCA+IDEgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIE9EYXRhTW9kZWwgfHwgdmFsdWUgaW5zdGFuY2VvZiBPRGF0YUNvbGxlY3Rpb24pXG4gICAgKSB7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0KHBhdGhBcnJheS5zbGljZSgxKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIHJlc2V0KHtcbiAgICBwYXRoLFxuICAgIHNpbGVudCA9IGZhbHNlLFxuICB9OiB7IHBhdGg/OiBzdHJpbmcgfCBzdHJpbmdbXTsgc2lsZW50PzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBjb25zdCBwYXRoQXJyYXk6IHN0cmluZ1tdID0gKFxuICAgICAgcGF0aCA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gW11cbiAgICAgICAgOiBUeXBlcy5pc0FycmF5KHBhdGgpXG4gICAgICAgID8gcGF0aFxuICAgICAgICA6IChwYXRoIGFzIHN0cmluZykubWF0Y2goLyhbXlsuXFxdXSkrL2cpXG4gICAgKSBhcyBhbnlbXTtcbiAgICBjb25zdCBuYW1lID0gcGF0aEFycmF5WzBdO1xuICAgIGNvbnN0IHZhbHVlID0gbmFtZSAhPT0gdW5kZWZpbmVkID8gKDxhbnk+dGhpcylbbmFtZV0gOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgT0RhdGFNb2RlbE9wdGlvbnMuaXNNb2RlbCh2YWx1ZSkgfHxcbiAgICAgIE9EYXRhTW9kZWxPcHRpb25zLmlzQ29sbGVjdGlvbih2YWx1ZSlcbiAgICApIHtcbiAgICAgIHZhbHVlLnJlc2V0KHsgcGF0aDogcGF0aEFycmF5LnNsaWNlKDEpLCBzaWxlbnQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX21ldGEucmVzZXQodGhpcywgeyBuYW1lOiBwYXRoQXJyYXlbMF0sIHNpbGVudCB9KTtcbiAgICB9XG4gIH1cblxuICBhc3NpZ24oXG4gICAgZW50aXR5OiBQYXJ0aWFsPFQ+IHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH0sXG4gICAge1xuICAgICAgcmVzZXQgPSBmYWxzZSxcbiAgICAgIHNpbGVudCA9IGZhbHNlLFxuICAgIH06IHsgcmVzZXQ/OiBib29sZWFuOyBzaWxlbnQ/OiBib29sZWFuIH0gPSB7fVxuICApIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0YS5hc3NpZ24odGhpcywgZW50aXR5LCB7IHJlc2V0LCBzaWxlbnQgfSk7XG4gIH1cblxuICBjbG9uZTxNIGV4dGVuZHMgT0RhdGFNb2RlbDxUPj4oKSB7XG4gICAgbGV0IEN0b3IgPSA8dHlwZW9mIE9EYXRhTW9kZWw+dGhpcy5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gbmV3IEN0b3IodGhpcy50b0VudGl0eShJTkNMVURFX1NIQUxMT1cpLCB7XG4gICAgICByZXNvdXJjZTogdGhpcy5yZXNvdXJjZSgpIGFzIE9EYXRhTW9kZWxSZXNvdXJjZTxUPixcbiAgICAgIGFubm90czogdGhpcy5hbm5vdHMoKSxcbiAgICB9KSBhcyBNO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdChvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PGFueT4+KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgdGhpcy5ldmVudHMkLmVtaXQoXG4gICAgICBuZXcgT0RhdGFNb2RlbEV2ZW50KCdyZXF1ZXN0Jywge1xuICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgb3B0aW9uczogeyBvYnNlcnZhYmxlOiBvYnMkIH0sXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG9icyQucGlwZShcbiAgICAgIG1hcCgoeyBlbnRpdHksIGFubm90cyB9KSA9PiB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RzO1xuICAgICAgICB0aGlzLmFzc2lnbihhbm5vdHMuYXR0cmlidXRlczxUPihlbnRpdHkgfHwge30sICdmdWxsJyksIHtcbiAgICAgICAgICByZXNldDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgICAgIG5ldyBPRGF0YU1vZGVsRXZlbnQoJ3N5bmMnLCB7XG4gICAgICAgICAgICBtb2RlbDogdGhpcyxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgZW50aXR5LCBhbm5vdHMgfSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGZldGNoKHtcbiAgICAuLi5vcHRpb25zXG4gIH06IE9EYXRhT3B0aW9ucyAmIHtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignZmV0Y2g6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpO1xuXG4gICAgbGV0IG9icyQ6IE9ic2VydmFibGU8T0RhdGFFbnRpdHk8VD4+O1xuICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhRW50aXR5UmVzb3VyY2UpIHtcbiAgICAgIGlmICghcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKFwiZmV0Y2g6IENhbid0IGZldGNoIG1vZGVsIHdpdGhvdXQga2V5XCIpO1xuICAgICAgb2JzJCA9IHJlc291cmNlLmZldGNoKG9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlKSB7XG4gICAgICBvYnMkID0gcmVzb3VyY2UuZmV0Y2goeyByZXNwb25zZVR5cGU6ICdlbnRpdHknLCAuLi5vcHRpb25zIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnMkID0gKHJlc291cmNlIGFzIE9EYXRhUHJvcGVydHlSZXNvdXJjZTxUPikuZmV0Y2goe1xuICAgICAgICByZXNwb25zZVR5cGU6ICdlbnRpdHknLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQpO1xuICB9XG5cbiAgc2F2ZSh7XG4gICAgbWV0aG9kLFxuICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB2YWxpZGF0ZSA9IHRydWUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgIG5hdmlnYXRpb24/OiBib29sZWFuO1xuICAgIHZhbGlkYXRlPzogYm9vbGVhbjtcbiAgICBvcHRpb25zPzogT0RhdGFPcHRpb25zO1xuICB9ID0ge30pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBsZXQgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKHJlc291cmNlID09PSB1bmRlZmluZWQpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcignc2F2ZTogUmVzb3VyY2UgaXMgdW5kZWZpbmVkJyk7XG4gICAgaWYgKFxuICAgICAgIShcbiAgICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlIHx8XG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZVxuICAgICAgKVxuICAgIClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFxuICAgICAgICAnc2F2ZTogUmVzb3VyY2UgdHlwZSBPRGF0YUVudGl0eVJlc291cmNlL09EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UgbmVlZGVkJ1xuICAgICAgKTtcblxuICAgIC8vIFJlc29sdmUgbWV0aG9kIGFuZCByZXNvdXJjZSBrZXlcbiAgICBpZiAobWV0aG9kID09PSB1bmRlZmluZWQgJiYgdGhpcy5zY2hlbWEoKS5pc0NvbXBvdW5kS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgJ3NhdmU6IENvbXBvc2l0ZSBrZXkgcmVxdWlyZSBhIHNwZWNpZmljIG1ldGhvZCwgdXNlIGNyZWF0ZS91cGRhdGUvbW9kaWZ5J1xuICAgICAgKTtcbiAgICBtZXRob2QgPSBtZXRob2QgfHwgKCFyZXNvdXJjZS5oYXNLZXkoKSA/ICdjcmVhdGUnIDogJ3VwZGF0ZScpO1xuICAgIGlmIChcbiAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSAmJlxuICAgICAgKG1ldGhvZCA9PT0gJ3VwZGF0ZScgfHwgbWV0aG9kID09PSAnbW9kaWZ5JykgJiZcbiAgICAgICFyZXNvdXJjZS5oYXNLZXkoKVxuICAgIClcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdzYXZlOiBVcGRhdGUvUGF0Y2ggcmVxdWlyZSBlbnRpdHkga2V5Jyk7XG4gICAgaWYgKFxuICAgICAgcmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIHx8XG4gICAgICBtZXRob2QgPT09ICdjcmVhdGUnXG4gICAgKVxuICAgICAgcmVzb3VyY2UuY2xlYXJLZXkoKTtcblxuICAgIGxldCBvYnMkOiBPYnNlcnZhYmxlPE9EYXRhRW50aXR5PGFueT4+O1xuICAgIGlmICghdmFsaWRhdGUgfHwgdGhpcy5pc1ZhbGlkKHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKSB7XG4gICAgICBjb25zdCBfZW50aXR5ID0gdGhpcy50b0VudGl0eSh7XG4gICAgICAgIGNoYW5nZXNfb25seTogbWV0aG9kID09PSAnbW9kaWZ5JyxcbiAgICAgICAgZmllbGRfbWFwcGluZzogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZV9jb25jdXJyZW5jeTogdHJ1ZSxcbiAgICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiBuYXZpZ2F0aW9uLFxuICAgICAgfSkgYXMgVDtcbiAgICAgIG9icyQgPSAoXG4gICAgICAgIG1ldGhvZCA9PT0gJ2NyZWF0ZSdcbiAgICAgICAgICA/IHJlc291cmNlLmNyZWF0ZShfZW50aXR5LCBvcHRpb25zKVxuICAgICAgICAgIDogbWV0aG9kID09PSAnbW9kaWZ5J1xuICAgICAgICAgID8gcmVzb3VyY2UubW9kaWZ5KF9lbnRpdHksIHsgZXRhZzogdGhpcy5hbm5vdHMoKS5ldGFnLCAuLi5vcHRpb25zIH0pXG4gICAgICAgICAgOiByZXNvdXJjZS51cGRhdGUoX2VudGl0eSwgeyBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsIC4uLm9wdGlvbnMgfSlcbiAgICAgICkucGlwZShcbiAgICAgICAgbWFwKCh7IGVudGl0eSwgYW5ub3RzIH0pID0+ICh7IGVudGl0eTogZW50aXR5IHx8IF9lbnRpdHksIGFubm90cyB9KSlcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9icyQgPSB0aHJvd0Vycm9yKHRoaXMuX2Vycm9ycyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0KG9icyQpO1xuICB9XG5cbiAgZGVzdHJveSh7XG4gICAgLi4ub3B0aW9uc1xuICB9OiBPRGF0YU9wdGlvbnMgJiB7XG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9ucztcbiAgfSA9IHt9KTogT2JzZXJ2YWJsZTx0aGlzPiB7XG4gICAgbGV0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmIChyZXNvdXJjZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoJ2Rlc3Ryb3k6IFJlc291cmNlIGlzIHVuZGVmaW5lZCcpO1xuICAgIGlmIChcbiAgICAgICEoXG4gICAgICAgIHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSB8fFxuICAgICAgICByZXNvdXJjZSBpbnN0YW5jZW9mIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2VcbiAgICAgIClcbiAgICApXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgJ2Rlc3Ryb3k6IFJlc291cmNlIHR5cGUgT0RhdGFFbnRpdHlSZXNvdXJjZS9PRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlIG5lZWRlZCdcbiAgICAgICk7XG4gICAgaWYgKCFyZXNvdXJjZS5oYXNLZXkoKSlcbiAgICAgIHJldHVybiB0aHJvd0Vycm9yKFwiZGVzdHJveTogQ2FuJ3QgZGVzdHJveSBtb2RlbCB3aXRob3V0IGtleVwiKTtcblxuICAgIGNvbnN0IF9lbnRpdHkgPSB0aGlzLnRvRW50aXR5KHsgZmllbGRfbWFwcGluZzogdHJ1ZSB9KSBhcyBUO1xuICAgIGNvbnN0IG9icyQgPSByZXNvdXJjZVxuICAgICAgLmRlc3Ryb3koeyBldGFnOiB0aGlzLmFubm90cygpLmV0YWcsIC4uLm9wdGlvbnMgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgZW50aXR5LCBhbm5vdHMgfSkgPT4gKHsgZW50aXR5OiBlbnRpdHkgfHwgX2VudGl0eSwgYW5ub3RzIH0pKVxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWVzdChvYnMkKS5waXBlKFxuICAgICAgdGFwKCgpID0+XG4gICAgICAgIHRoaXMuZXZlbnRzJC5lbWl0KG5ldyBPRGF0YU1vZGVsRXZlbnQoJ2Rlc3Ryb3knLCB7IG1vZGVsOiB0aGlzIH0pKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBjaGFuZ2UgdGhlIGludGVybmFsIHF1ZXJ5IG9mIGEgcmVzb3VyY2VcbiAgICogQHBhcmFtIGZ1bmMgRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICAgKi9cbiAgcXVlcnkoZnVuYzogKHE6IE9EYXRhUXVlcnlPcHRpb25zSGFuZGxlcjxUPikgPT4gdm9pZCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLnF1ZXJ5KHRoaXMsIHRoaXMucmVzb3VyY2UoKSwgZnVuYykgYXMgdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgY2hlY2sgb24gdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBtb2RlbCBhbmQgcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIGNoYW5nZWQuXG4gICAqIEBwYXJhbSBpbmNsdWRlX25hdmlnYXRpb24gQ2hlY2sgaW4gbmF2aWdhdGlvbiBwcm9wZXJ0aWVzXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG1vZGVsIGhhcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICovXG4gIGhhc0NoYW5nZWQoe1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbiA9IGZhbHNlLFxuICB9OiB7IGluY2x1ZGVfbmF2aWdhdGlvbj86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldGEuaGFzQ2hhbmdlZCh0aGlzLCB7IGluY2x1ZGVfbmF2aWdhdGlvbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gZXhlY3V0aW9uIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24sIHdoZXJlIHRoZSBtb2RlbCBpcyBib3VuZCB0byBpdHMgZW50aXR5IGVuZHBvaW50XG4gICAqIEBwYXJhbSBjdHggQ29udGV4dCBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjb250ZXh0XG4gICAqL1xuICBhc0VudGl0eTxSPihjdHg6IChtb2RlbDogdGhpcykgPT4gUik6IFIge1xuICAgIHJldHVybiB0aGlzLl9tZXRhLmFzRW50aXR5KHRoaXMsIGN0eCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FsbEZ1bmN0aW9uPFAsIFI+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM6IFAgfCBudWxsLFxuICAgIHJlc3BvbnNlVHlwZTogJ3Byb3BlcnR5JyB8ICdtb2RlbCcgfCAnY29sbGVjdGlvbicgfCAnbm9uZScsXG4gICAgeyAuLi5vcHRpb25zIH06IHt9ICYgT0RhdGFRdWVyeUFyZ3VtZW50c09wdGlvbnM8Uj4gPSB7fVxuICApOiBPYnNlcnZhYmxlPFIgfCBPRGF0YU1vZGVsPFI+IHwgT0RhdGFDb2xsZWN0aW9uPFIsIE9EYXRhTW9kZWw8Uj4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkgfHwgIXJlc291cmNlLmhhc0tleSgpKVxuICAgICAgcmV0dXJuIHRocm93RXJyb3IoXG4gICAgICAgIFwiQ2FuJ3QgY2FsbCBmdW5jdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIlxuICAgICAgKTtcblxuICAgIGNvbnN0IGZ1bmMgPSByZXNvdXJjZS5mdW5jdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbFByb3BlcnR5KHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBjYXNlICdtb2RlbCc6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxNb2RlbChwYXJhbXMsIG9wdGlvbnMpO1xuICAgICAgY2FzZSAnY29sbGVjdGlvbic6XG4gICAgICAgIHJldHVybiBmdW5jLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKHBhcmFtcywgeyByZXNwb25zZVR5cGUsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNhbGxBY3Rpb248UCwgUj4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHBhcmFtczogUCB8IG51bGwsXG4gICAgcmVzcG9uc2VUeXBlOiAncHJvcGVydHknIHwgJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyB8ICdub25lJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9uczxSPiA9IHt9XG4gICk6IE9ic2VydmFibGU8UiB8IE9EYXRhTW9kZWw8Uj4gfCBPRGF0YUNvbGxlY3Rpb248UiwgT0RhdGFNb2RlbDxSPj4gfCBudWxsPiB7XG4gICAgY29uc3QgcmVzb3VyY2UgPSB0aGlzLnJlc291cmNlKCk7XG4gICAgaWYgKCEocmVzb3VyY2UgaW5zdGFuY2VvZiBPRGF0YUVudGl0eVJlc291cmNlKSB8fCAhcmVzb3VyY2UuaGFzS2V5KCkpXG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihcbiAgICAgICAgXCJDYW4ndCBjYWxsIGFjdGlvbiB3aXRob3V0IE9EYXRhRW50aXR5UmVzb3VyY2Ugd2l0aCBrZXlcIlxuICAgICAgKTtcblxuICAgIGNvbnN0IGFjdGlvbiA9IHJlc291cmNlLmFjdGlvbjxQLCBSPihuYW1lKS5xdWVyeSgocSkgPT4gcS5hcHBseShvcHRpb25zKSk7XG4gICAgc3dpdGNoIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIGNhc2UgJ3Byb3BlcnR5JzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsUHJvcGVydHkocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ21vZGVsJzpcbiAgICAgICAgcmV0dXJuIGFjdGlvbi5jYWxsTW9kZWwocGFyYW1zLCBvcHRpb25zKTtcbiAgICAgIGNhc2UgJ2NvbGxlY3Rpb24nOlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGxDb2xsZWN0aW9uKHBhcmFtcywgb3B0aW9ucyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYWN0aW9uLmNhbGwocGFyYW1zLCB7IHJlc3BvbnNlVHlwZSwgLi4ub3B0aW9ucyB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBDYXN0XG4gIHByb3RlY3RlZCBjYXN0PFM+KHR5cGU6IHN0cmluZyk6IE9EYXRhTW9kZWw8Uz4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5yZXNvdXJjZSgpO1xuICAgIGlmICghKHJlc291cmNlIGluc3RhbmNlb2YgT0RhdGFFbnRpdHlSZXNvdXJjZSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW4ndCBjYXN0IHRvIGRlcml2ZWQgbW9kZWwgd2l0aG91dCBPRGF0YUVudGl0eVJlc291cmNlYFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXNvdXJjZVxuICAgICAgLmNhc3Q8Uz4odHlwZSlcbiAgICAgIC5hc01vZGVsKHRoaXMudG9FbnRpdHkoSU5DTFVERV9ERUVQKSwgeyBhbm5vdHM6IHRoaXMuYW5ub3RzKCkgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZmV0Y2hOYXZpZ2F0aW9uUHJvcGVydHk8Uz4oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJlc3BvbnNlVHlwZTogJ21vZGVsJyB8ICdjb2xsZWN0aW9uJyxcbiAgICB7IC4uLm9wdGlvbnMgfToge30gJiBPRGF0YVF1ZXJ5QXJndW1lbnRzT3B0aW9uczxTPiA9IHt9XG4gICk6IE9ic2VydmFibGU8T0RhdGFNb2RlbDxTPiB8IE9EYXRhQ29sbGVjdGlvbjxTLCBPRGF0YU1vZGVsPFM+PiB8IG51bGw+IHtcbiAgICBjb25zdCBuYXYgPSB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxTPihcbiAgICAgIG5hbWVcbiAgICApIGFzIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2U8Uz47XG4gICAgbmF2LnF1ZXJ5KChxKSA9PiBxLmFwcGx5KG9wdGlvbnMpKTtcbiAgICBzd2l0Y2ggKHJlc3BvbnNlVHlwZSkge1xuICAgICAgY2FzZSAnbW9kZWwnOlxuICAgICAgICByZXR1cm4gbmF2LmZldGNoTW9kZWwob3B0aW9ucyk7XG4gICAgICBjYXNlICdjb2xsZWN0aW9uJzpcbiAgICAgICAgcmV0dXJuIG5hdi5mZXRjaENvbGxlY3Rpb24ob3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8gR2V0IFZhbHVlXG4gIHByb3RlY3RlZCBnZXRWYWx1ZTxQPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPFAgfCBPRGF0YU1vZGVsPFA+IHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+IHwgbnVsbD4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCBmaWVsZC5uYXZpZ2F0aW9uKVxuICAgICAgdGhyb3cgRXJyb3IoYENhbid0IGZpbmQgcHJvcGVydHkgJHtuYW1lfWApO1xuXG4gICAgbGV0IHZhbHVlID0gKHRoaXMgYXMgYW55KVtuYW1lXSBhc1xuICAgICAgfCBQXG4gICAgICB8IE9EYXRhTW9kZWw8UD5cbiAgICAgIHwgT0RhdGFDb2xsZWN0aW9uPFAsIE9EYXRhTW9kZWw8UD4+O1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBwcm9wID0gZmllbGQucmVzb3VyY2VGYWN0b3J5KFxuICAgICAgICB0aGlzLnJlc291cmNlKClcbiAgICAgICkgYXMgT0RhdGFQcm9wZXJ0eVJlc291cmNlPFA+O1xuICAgICAgcmV0dXJuIGZpZWxkLmNvbGxlY3Rpb25cbiAgICAgICAgPyBwcm9wXG4gICAgICAgICAgICAuZmV0Y2hDb2xsZWN0aW9uKG9wdGlvbnMpXG4gICAgICAgICAgICAucGlwZSh0YXAoKGMpID0+IHRoaXMuYXNzaWduKHsgW25hbWVdOiBjIH0sIHsgc2lsZW50OiB0cnVlIH0pKSlcbiAgICAgICAgOiBmaWVsZC5pc1N0cnVjdHVyZWRUeXBlKClcbiAgICAgICAgPyBwcm9wXG4gICAgICAgICAgICAuZmV0Y2hNb2RlbChvcHRpb25zKVxuICAgICAgICAgICAgLnBpcGUodGFwKChjKSA9PiB0aGlzLmFzc2lnbih7IFtuYW1lXTogYyB9LCB7IHNpbGVudDogdHJ1ZSB9KSkpXG4gICAgICAgIDogcHJvcFxuICAgICAgICAgICAgLmZldGNoUHJvcGVydHkob3B0aW9ucylcbiAgICAgICAgICAgIC5waXBlKHRhcCgoYykgPT4gdGhpcy5hc3NpZ24oeyBbbmFtZV06IGMgfSwgeyBzaWxlbnQ6IHRydWUgfSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG9mKHZhbHVlIGFzIFApO1xuICB9XG5cbiAgLy8gU2V0IFJlZmVyZW5jZVxuICBwcm90ZWN0ZWQgc2V0UmVmZXJlbmNlPFA+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBtb2RlbDogT0RhdGFNb2RlbDxQPiB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PiB8IG51bGwsXG4gICAgb3B0aW9ucz86IE9EYXRhT3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICBjb25zdCByZWZlcmVuY2UgPSAoXG4gICAgICB0aGlzLm5hdmlnYXRpb25Qcm9wZXJ0eTxQPihuYW1lKSBhcyBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlPFA+XG4gICAgKS5yZWZlcmVuY2UoKTtcblxuICAgIGNvbnN0IGV0YWcgPSB0aGlzLmFubm90cygpLmV0YWc7XG4gICAgbGV0IG9icyQgPSBORVZFUiBhcyBPYnNlcnZhYmxlPGFueT47XG4gICAgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFNb2RlbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS5zZXQoXG4gICAgICAgIG1vZGVsLl9tZXRhLmVudGl0eVJlc291cmNlKG1vZGVsKSBhcyBPRGF0YUVudGl0eVJlc291cmNlPFA+LFxuICAgICAgICB7IGV0YWcsIC4uLm9wdGlvbnMgfVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKG1vZGVsIGluc3RhbmNlb2YgT0RhdGFDb2xsZWN0aW9uKSB7XG4gICAgICBvYnMkID0gZm9ya0pvaW4oXG4gICAgICAgIG1vZGVsXG4gICAgICAgICAgLm1vZGVscygpXG4gICAgICAgICAgLm1hcCgobSkgPT5cbiAgICAgICAgICAgIHJlZmVyZW5jZS5hZGQoXG4gICAgICAgICAgICAgIG0uX21ldGEuZW50aXR5UmVzb3VyY2UobSkgYXMgT0RhdGFFbnRpdHlSZXNvdXJjZTxQPixcbiAgICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChtb2RlbCA9PT0gbnVsbCkge1xuICAgICAgb2JzJCA9IHJlZmVyZW5jZS51bnNldCh7IGV0YWcsIC4uLm9wdGlvbnMgfSk7XG4gICAgfVxuICAgIHRoaXMuZXZlbnRzJC5lbWl0KFxuICAgICAgbmV3IE9EYXRhTW9kZWxFdmVudCgncmVxdWVzdCcsIHtcbiAgICAgICAgbW9kZWw6IHRoaXMsXG4gICAgICAgIG9wdGlvbnM6IHsgb2JzZXJ2YWJsZTogb2JzJCB9LFxuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBvYnMkLnBpcGUoXG4gICAgICBtYXAoKG1vZGVsKSA9PiB7XG4gICAgICAgIHRoaXMuYXNzaWduKHsgW25hbWVdOiBtb2RlbCB9KTtcbiAgICAgICAgdGhpcy5ldmVudHMkLmVtaXQobmV3IE9EYXRhTW9kZWxFdmVudCgnc3luYycsIHsgbW9kZWw6IHRoaXMgfSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRSZWZlcmVuY2U8UD4oXG4gICAgbmFtZTogc3RyaW5nXG4gICk6IE9EYXRhTW9kZWw8UD4gfCBPRGF0YUNvbGxlY3Rpb248UCwgT0RhdGFNb2RlbDxQPj4ge1xuICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fbWV0YS5maWVsZChuYW1lKTtcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZCB8fCAhZmllbGQubmF2aWdhdGlvbilcbiAgICAgIHRocm93IEVycm9yKGBDYW4ndCBmaW5kIG5hdmlnYXRpb24gcHJvcGVydHkgJHtuYW1lfWApO1xuXG4gICAgbGV0IG1vZGVsID0gKHRoaXMgYXMgYW55KVtuYW1lXSBhc1xuICAgICAgfCBPRGF0YU1vZGVsPFA+XG4gICAgICB8IE9EYXRhQ29sbGVjdGlvbjxQLCBPRGF0YU1vZGVsPFA+PjtcbiAgICBpZiAobW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5jb2xsZWN0aW9uID8gW10gOiB0aGlzLnJlZmVyZW5jZWQoZmllbGQpO1xuICAgICAgbW9kZWwgPSBmaWVsZC5tb2RlbENvbGxlY3Rpb25GYWN0b3J5PFQsIFA+KHsgcGFyZW50OiB0aGlzLCB2YWx1ZSB9KTtcbiAgICAgICh0aGlzIGFzIGFueSlbbmFtZV0gPSBtb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG59XG4iXX0=
|