angular-odata 0.127.0 → 0.130.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -244
- package/esm2022/lib/annotations.mjs +146 -0
- package/esm2022/lib/api.mjs +238 -173
- package/esm2022/lib/cache/cache.mjs +3 -1
- package/esm2022/lib/cache/memory.mjs +1 -1
- package/esm2022/lib/cache/storage.mjs +3 -1
- package/esm2022/lib/client.mjs +10 -47
- package/esm2022/lib/constants.mjs +4 -1
- package/esm2022/lib/helper.mjs +9 -1
- package/esm2022/lib/index.mjs +4 -1
- package/esm2022/lib/loaders.mjs +27 -17
- package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +273 -0
- package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +59 -0
- package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +50 -0
- package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +74 -0
- package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +204 -0
- package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +15 -0
- package/esm2022/lib/metadata/csdl/csdl-reference.mjs +76 -0
- package/esm2022/lib/metadata/csdl/csdl-schema.mjs +87 -0
- package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +37 -0
- package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +145 -0
- package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +159 -0
- package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +46 -0
- package/esm2022/lib/metadata/index.mjs +3 -0
- package/esm2022/lib/metadata/metadata.mjs +41 -0
- package/esm2022/lib/metadata/parser.mjs +564 -0
- package/esm2022/lib/models/collection.mjs +115 -155
- package/esm2022/lib/models/model.mjs +71 -54
- package/esm2022/lib/models/options.mjs +194 -136
- package/esm2022/lib/module.mjs +7 -7
- package/esm2022/lib/options.mjs +57 -2
- package/esm2022/lib/resources/index.mjs +2 -2
- package/esm2022/lib/resources/options.mjs +66 -0
- package/esm2022/lib/resources/path/handlers.mjs +16 -4
- package/esm2022/lib/resources/path/segments.mjs +7 -4
- package/esm2022/lib/resources/query/builder.mjs +17 -8
- package/esm2022/lib/resources/query/expressions/apply.mjs +83 -14
- package/esm2022/lib/resources/query/expressions/base.mjs +2 -1
- package/esm2022/lib/resources/query/expressions/compute.mjs +3 -2
- package/esm2022/lib/resources/query/expressions/count.mjs +3 -1
- package/esm2022/lib/resources/query/expressions/expand.mjs +8 -1
- package/esm2022/lib/resources/query/expressions/filter.mjs +3 -1
- package/esm2022/lib/resources/query/expressions/orderby.mjs +4 -2
- package/esm2022/lib/resources/query/expressions/search.mjs +4 -1
- package/esm2022/lib/resources/query/expressions/select.mjs +8 -2
- package/esm2022/lib/resources/query/expressions/syntax.mjs +37 -7
- package/esm2022/lib/resources/query/handlers.mjs +4 -1
- package/esm2022/lib/resources/query/options.mjs +2 -1
- package/esm2022/lib/resources/request.mjs +19 -5
- package/esm2022/lib/resources/resource.mjs +115 -85
- package/esm2022/lib/resources/response.mjs +180 -0
- package/esm2022/lib/resources/types/action.mjs +31 -26
- package/esm2022/lib/resources/types/batch.mjs +7 -7
- package/esm2022/lib/resources/types/count.mjs +7 -7
- package/esm2022/lib/resources/types/entity-set.mjs +37 -24
- package/esm2022/lib/resources/types/entity.mjs +14 -11
- package/esm2022/lib/resources/types/function.mjs +28 -28
- package/esm2022/lib/resources/types/metadata.mjs +9 -5
- package/esm2022/lib/resources/types/navigation-property.mjs +36 -40
- package/esm2022/lib/resources/types/property.mjs +31 -59
- package/esm2022/lib/resources/types/reference.mjs +3 -4
- package/esm2022/lib/resources/types/singleton.mjs +11 -12
- package/esm2022/lib/resources/types/value.mjs +16 -12
- package/esm2022/lib/schema/annotation.mjs +8 -1
- package/esm2022/lib/schema/callable.mjs +13 -10
- package/esm2022/lib/schema/element.mjs +18 -9
- package/esm2022/lib/schema/entity-container.mjs +6 -2
- package/esm2022/lib/schema/entity-set.mjs +3 -1
- package/esm2022/lib/schema/enum-type.mjs +11 -11
- package/esm2022/lib/schema/index.mjs +2 -1
- package/esm2022/lib/schema/parsers/callable.mjs +23 -7
- package/esm2022/lib/schema/parsers/edm.mjs +6 -4
- package/esm2022/lib/schema/parsers/enum-type.mjs +48 -30
- package/esm2022/lib/schema/parsers/structured-type.mjs +61 -27
- package/esm2022/lib/schema/schema.mjs +25 -34
- package/esm2022/lib/schema/singleton.mjs +11 -0
- package/esm2022/lib/schema/structured-type.mjs +27 -25
- package/esm2022/lib/services/base.mjs +4 -1
- package/esm2022/lib/services/entity-set.mjs +18 -2
- package/esm2022/lib/services/entity.mjs +2 -2
- package/esm2022/lib/services/factory.mjs +16 -10
- package/esm2022/lib/services/singleton.mjs +9 -2
- package/esm2022/lib/settings.mjs +8 -99
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/lib/utils/arraybuffers.mjs +1 -1
- package/esm2022/lib/utils/dates.mjs +1 -1
- package/esm2022/lib/utils/durations.mjs +1 -1
- package/esm2022/lib/utils/enums.mjs +1 -1
- package/esm2022/lib/utils/http.mjs +1 -1
- package/esm2022/lib/utils/objects.mjs +1 -1
- package/esm2022/lib/utils/odata.mjs +1 -1
- package/esm2022/lib/utils/types.mjs +1 -1
- package/fesm2022/angular-odata.mjs +3476 -2075
- package/fesm2022/angular-odata.mjs.map +1 -1
- package/lib/{resources/responses/annotations.d.ts → annotations.d.ts} +2 -2
- package/lib/api.d.ts +29 -26
- package/lib/cache/memory.d.ts +1 -1
- package/lib/client.d.ts +0 -20
- package/lib/constants.d.ts +3 -0
- package/lib/index.d.ts +2 -0
- package/lib/loaders.d.ts +7 -1
- package/lib/metadata/csdl/csdl-annotation.d.ts +159 -0
- package/lib/metadata/csdl/csdl-entity-container.d.ts +31 -0
- package/lib/metadata/csdl/csdl-entity-set.d.ts +25 -0
- package/lib/metadata/csdl/csdl-enum-type.d.ts +37 -0
- package/lib/metadata/csdl/csdl-function-action.d.ts +148 -0
- package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +12 -0
- package/lib/metadata/csdl/csdl-reference.d.ts +53 -0
- package/lib/metadata/csdl/csdl-schema.d.ts +37 -0
- package/lib/metadata/csdl/csdl-singleton.d.ts +21 -0
- package/lib/metadata/csdl/csdl-structural-property.d.ts +86 -0
- package/lib/metadata/csdl/csdl-structured-type.d.ts +94 -0
- package/lib/metadata/csdl/csdl-type-definition.d.ts +25 -0
- package/lib/metadata/index.d.ts +2 -0
- package/lib/metadata/metadata.d.ts +23 -0
- package/lib/{resources/responses/metadata.d.ts → metadata/parser.d.ts} +19 -7
- package/lib/models/collection.d.ts +6 -4
- package/lib/models/model.d.ts +20 -27
- package/lib/models/options.d.ts +46 -25
- package/lib/resources/index.d.ts +1 -1
- package/lib/resources/{responses/options.d.ts → options.d.ts} +2 -2
- package/lib/resources/path/handlers.d.ts +4 -2
- package/lib/resources/path/segments.d.ts +6 -4
- package/lib/resources/query/builder.d.ts +3 -2
- package/lib/resources/query/expressions/apply.d.ts +37 -15
- package/lib/resources/query/expressions/base.d.ts +1 -1
- package/lib/resources/query/expressions/compute.d.ts +2 -2
- package/lib/resources/query/expressions/count.d.ts +1 -1
- package/lib/resources/query/expressions/expand.d.ts +3 -1
- package/lib/resources/query/expressions/filter.d.ts +1 -1
- package/lib/resources/query/expressions/orderby.d.ts +5 -4
- package/lib/resources/query/expressions/search.d.ts +1 -1
- package/lib/resources/query/expressions/select.d.ts +2 -1
- package/lib/resources/query/expressions/syntax.d.ts +8 -5
- package/lib/resources/query/options.d.ts +3 -3
- package/lib/resources/resource.d.ts +56 -16
- package/lib/resources/{responses/response.d.ts → response.d.ts} +17 -5
- package/lib/resources/types/action.d.ts +12 -10
- package/lib/resources/types/batch.d.ts +3 -2
- package/lib/resources/types/count.d.ts +1 -5
- package/lib/resources/types/entity-set.d.ts +25 -11
- package/lib/resources/types/entity.d.ts +8 -5
- package/lib/resources/types/function.d.ts +12 -12
- package/lib/resources/types/metadata.d.ts +1 -1
- package/lib/resources/types/navigation-property.d.ts +23 -8
- package/lib/resources/types/property.d.ts +27 -9
- package/lib/resources/types/reference.d.ts +2 -4
- package/lib/resources/types/singleton.d.ts +9 -7
- package/lib/resources/types/value.d.ts +2 -6
- package/lib/schema/callable.d.ts +5 -7
- package/lib/schema/element.d.ts +11 -4
- package/lib/schema/entity-container.d.ts +2 -0
- package/lib/schema/enum-type.d.ts +13 -16
- package/lib/schema/index.d.ts +1 -0
- package/lib/schema/parsers/callable.d.ts +7 -8
- package/lib/schema/parsers/enum-type.d.ts +16 -18
- package/lib/schema/parsers/structured-type.d.ts +11 -10
- package/lib/schema/schema.d.ts +6 -9
- package/lib/schema/singleton.d.ts +10 -0
- package/lib/schema/structured-type.d.ts +10 -10
- package/lib/services/entity-set.d.ts +11 -4
- package/lib/services/factory.d.ts +14 -2
- package/lib/services/singleton.d.ts +4 -2
- package/lib/settings.d.ts +0 -10
- package/lib/types.d.ts +32 -12
- package/lib/utils/enums.d.ts +12 -12
- package/lib/utils/http.d.ts +1 -1
- package/lib/utils/objects.d.ts +1 -1
- package/lib/utils/strings.d.ts +2 -2
- package/package.json +5 -1
- package/schematics/apigen/angular/api-config.d.ts +15 -0
- package/schematics/apigen/angular/api-config.js +40 -0
- package/schematics/apigen/angular/api-config.js.map +1 -0
- package/schematics/apigen/angular/base.d.ts +71 -0
- package/schematics/apigen/angular/base.js +240 -0
- package/schematics/apigen/angular/base.js.map +1 -0
- package/schematics/apigen/angular/entity.d.ts +24 -0
- package/schematics/apigen/angular/entity.js +77 -0
- package/schematics/apigen/angular/entity.js.map +1 -0
- package/schematics/apigen/angular/enum.d.ts +25 -0
- package/schematics/apigen/angular/enum.js +57 -0
- package/schematics/apigen/angular/enum.js.map +1 -0
- package/schematics/apigen/angular/import.d.ts +6 -0
- package/schematics/apigen/angular/import.js +18 -0
- package/schematics/apigen/angular/import.js.map +1 -0
- package/schematics/apigen/angular/module.d.ts +18 -0
- package/schematics/apigen/angular/module.js +41 -0
- package/schematics/apigen/angular/module.js.map +1 -0
- package/schematics/apigen/angular/service.d.ts +20 -0
- package/schematics/apigen/angular/service.js +77 -0
- package/schematics/apigen/angular/service.js.map +1 -0
- package/schematics/apigen/files/api-config/__fileName__.ts +11 -0
- package/schematics/apigen/files/entity/__fileName__.ts +7 -0
- package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +18 -0
- package/schematics/apigen/files/entityset-service/__fileName__.ts +27 -0
- package/schematics/apigen/files/enum/__fileName__.ts +4 -0
- package/schematics/apigen/files/index/__fileName__.ts +2 -0
- package/schematics/apigen/files/metadata/metadata.json +1 -0
- package/schematics/apigen/files/module/__fileName__.ts +9 -0
- package/schematics/apigen/files/singleton-service/__fileName__.ts +18 -0
- package/schematics/apigen/index.d.ts +3 -0
- package/schematics/apigen/index.js +150 -0
- package/schematics/apigen/index.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +153 -0
- package/schematics/apigen/metadata/csdl/csdl-annotation.js +228 -0
- package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +29 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js +49 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +23 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js +37 -0
- package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +34 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js +50 -0
- package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +140 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js +136 -0
- package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +12 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +17 -0
- package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +42 -0
- package/schematics/apigen/metadata/csdl/csdl-reference.js +53 -0
- package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +35 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js +63 -0
- package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +21 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js +33 -0
- package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +79 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js +103 -0
- package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +83 -0
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js +116 -0
- package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +25 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js +38 -0
- package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -0
- package/schematics/apigen/metadata/index.d.ts +1 -0
- package/schematics/apigen/metadata/index.js +18 -0
- package/schematics/apigen/metadata/index.js.map +1 -0
- package/schematics/apigen/metadata/metadata.d.ts +21 -0
- package/schematics/apigen/metadata/metadata.js +36 -0
- package/schematics/apigen/metadata/metadata.js.map +1 -0
- package/schematics/apigen/metadata/parser.d.ts +110 -0
- package/schematics/apigen/metadata/parser.js +568 -0
- package/schematics/apigen/metadata/parser.js.map +1 -0
- package/schematics/apigen/schema.d.ts +9 -0
- package/schematics/apigen/schema.js +3 -0
- package/schematics/apigen/schema.js.map +1 -0
- package/schematics/apigen/schema.json +37 -0
- package/schematics/apigen/utils.d.ts +2 -0
- package/schematics/apigen/utils.js +99 -0
- package/schematics/apigen/utils.js.map +1 -0
- package/schematics/collection.json +14 -0
- package/schematics/ng-add/index.d.ts +2 -0
- package/schematics/ng-add/index.js +12 -0
- package/schematics/ng-add/index.js.map +1 -0
- package/schematics/random.d.ts +1 -0
- package/schematics/random.js +604 -0
- package/schematics/random.js.map +1 -0
- package/esm2022/lib/resources/responses/annotations.mjs +0 -140
- package/esm2022/lib/resources/responses/csdl/csdl-annotation.mjs +0 -33
- package/esm2022/lib/resources/responses/csdl/csdl-entity-container.mjs +0 -11
- package/esm2022/lib/resources/responses/csdl/csdl-entity-set.mjs +0 -9
- package/esm2022/lib/resources/responses/csdl/csdl-enum-type.mjs +0 -15
- package/esm2022/lib/resources/responses/csdl/csdl-function-action.mjs +0 -56
- package/esm2022/lib/resources/responses/csdl/csdl-navigation-property-binding.mjs +0 -7
- package/esm2022/lib/resources/responses/csdl/csdl-reference.mjs +0 -23
- package/esm2022/lib/resources/responses/csdl/csdl-schema.mjs +0 -18
- package/esm2022/lib/resources/responses/csdl/csdl-singleton.mjs +0 -8
- package/esm2022/lib/resources/responses/csdl/csdl-structural-property.mjs +0 -39
- package/esm2022/lib/resources/responses/csdl/csdl-structured-type.mjs +0 -34
- package/esm2022/lib/resources/responses/csdl/csdl-type-definition.mjs +0 -14
- package/esm2022/lib/resources/responses/index.mjs +0 -5
- package/esm2022/lib/resources/responses/metadata.mjs +0 -547
- package/esm2022/lib/resources/responses/options.mjs +0 -56
- package/esm2022/lib/resources/responses/response.mjs +0 -174
- package/esm2022/lib/resources/responses/types.mjs +0 -2
- package/lib/resources/responses/csdl/csdl-annotation.d.ts +0 -27
- package/lib/resources/responses/csdl/csdl-entity-container.d.ts +0 -12
- package/lib/resources/responses/csdl/csdl-entity-set.d.ts +0 -8
- package/lib/resources/responses/csdl/csdl-enum-type.d.ts +0 -12
- package/lib/resources/responses/csdl/csdl-function-action.d.ts +0 -49
- package/lib/resources/responses/csdl/csdl-navigation-property-binding.d.ts +0 -5
- package/lib/resources/responses/csdl/csdl-reference.d.ts +0 -18
- package/lib/resources/responses/csdl/csdl-schema.d.ts +0 -20
- package/lib/resources/responses/csdl/csdl-singleton.d.ts +0 -7
- package/lib/resources/responses/csdl/csdl-structural-property.d.ts +0 -31
- package/lib/resources/responses/csdl/csdl-structured-type.d.ts +0 -27
- package/lib/resources/responses/csdl/csdl-type-definition.d.ts +0 -11
- package/lib/resources/responses/index.d.ts +0 -4
- package/lib/resources/responses/types.d.ts +0 -13
package/esm2022/lib/api.mjs
CHANGED
|
@@ -1,59 +1,70 @@
|
|
|
1
1
|
import { HttpEventType } from '@angular/common/http';
|
|
2
2
|
import { NEVER } from 'rxjs';
|
|
3
3
|
import { catchError, map } from 'rxjs/operators';
|
|
4
|
-
import { ODataInMemoryCache } from './cache
|
|
4
|
+
import { ODataInMemoryCache } from './cache';
|
|
5
5
|
import { DEFAULT_VERSION } from './constants';
|
|
6
|
-
import { ODataCollection, ODataModel } from './models
|
|
6
|
+
import { ODataCollection, ODataModel, } from './models';
|
|
7
7
|
import { ODataApiOptions } from './options';
|
|
8
|
-
import {
|
|
8
|
+
import { ODataQueryOptions, ODataPathSegments, ODataRequest, ODataResponse, ODataBatchResource, ODataMetadataResource, ODataActionResource, ODataFunctionResource, ODataEntityResource, ODataEntitySetResource, ODataSingletonResource, ODataNavigationPropertyResource, } from './resources';
|
|
9
9
|
import { EDM_PARSERS, ODataSchema, } from './schema';
|
|
10
10
|
import { NONE_PARSER, PathSegment, } from './types';
|
|
11
11
|
/**
|
|
12
12
|
* Api abstraction for consuming OData services.
|
|
13
13
|
*/
|
|
14
14
|
export class ODataApi {
|
|
15
|
+
requester;
|
|
16
|
+
serviceRootUrl;
|
|
17
|
+
metadataUrl;
|
|
18
|
+
name;
|
|
19
|
+
version;
|
|
20
|
+
default;
|
|
21
|
+
creation;
|
|
22
|
+
// Options
|
|
23
|
+
options;
|
|
24
|
+
// Cache
|
|
25
|
+
cache;
|
|
26
|
+
// Error Handler
|
|
27
|
+
errorHandler;
|
|
28
|
+
// Base Parsers
|
|
29
|
+
parsers;
|
|
30
|
+
// Schemas
|
|
31
|
+
schemas;
|
|
15
32
|
constructor(config) {
|
|
16
|
-
//# region Find by Type
|
|
17
|
-
// Memoize
|
|
18
|
-
this.memo = {
|
|
19
|
-
forType: {
|
|
20
|
-
enum: new Map(),
|
|
21
|
-
structured: new Map(),
|
|
22
|
-
callable: new Map(),
|
|
23
|
-
entitySet: new Map(),
|
|
24
|
-
parser: new Map(),
|
|
25
|
-
options: new Map(),
|
|
26
|
-
},
|
|
27
|
-
byName: {
|
|
28
|
-
enum: new Map(),
|
|
29
|
-
structured: new Map(),
|
|
30
|
-
callable: new Map(),
|
|
31
|
-
entitySet: new Map(),
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
33
|
this.serviceRootUrl = config.serviceRootUrl;
|
|
35
|
-
if (this.serviceRootUrl.
|
|
34
|
+
if (this.serviceRootUrl.includes('?'))
|
|
36
35
|
throw new Error("The 'serviceRootUrl' should not contain query string. Please use 'params' to add extra parameters");
|
|
37
36
|
if (!this.serviceRootUrl.endsWith('/'))
|
|
38
37
|
this.serviceRootUrl += '/';
|
|
39
|
-
this.metadataUrl = `${this.serviceRootUrl}$metadata`;
|
|
38
|
+
this.metadataUrl = config.metadataUrl ?? `${this.serviceRootUrl}$metadata`;
|
|
40
39
|
this.name = config.name;
|
|
41
|
-
this.version = config.version
|
|
42
|
-
this.default = config.default
|
|
43
|
-
this.creation = config.creation
|
|
44
|
-
this.options = new ODataApiOptions(
|
|
45
|
-
|
|
40
|
+
this.version = config.version ?? DEFAULT_VERSION;
|
|
41
|
+
this.default = config.default ?? false;
|
|
42
|
+
this.creation = config.creation ?? new Date();
|
|
43
|
+
this.options = new ODataApiOptions({
|
|
44
|
+
...config.options,
|
|
45
|
+
version: this.version,
|
|
46
|
+
});
|
|
47
|
+
this.cache = config.cache ?? new ODataInMemoryCache();
|
|
46
48
|
this.errorHandler = config.errorHandler;
|
|
47
|
-
this.parsers = new Map(Object.entries(config.parsers
|
|
48
|
-
this.schemas = (config.schemas
|
|
49
|
+
this.parsers = new Map(Object.entries(config.parsers ?? EDM_PARSERS));
|
|
50
|
+
this.schemas = (config.schemas ?? []).map((schema) => new ODataSchema(schema, this));
|
|
49
51
|
}
|
|
50
52
|
configure(settings = {}) {
|
|
51
53
|
this.requester = settings.requester;
|
|
52
54
|
this.schemas.forEach((schema) => {
|
|
53
55
|
schema.configure({
|
|
54
56
|
options: this.options.parserOptions,
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
populate(metadata) {
|
|
61
|
+
const config = metadata.toConfig();
|
|
62
|
+
this.version = config.version ?? DEFAULT_VERSION;
|
|
63
|
+
const schemas = (config.schemas ?? []).map((schema) => new ODataSchema(schema, this));
|
|
64
|
+
this.schemas = [...this.schemas, ...schemas];
|
|
65
|
+
schemas.forEach((schema) => {
|
|
66
|
+
schema.configure({
|
|
67
|
+
options: this.options.parserOptions,
|
|
57
68
|
});
|
|
58
69
|
});
|
|
59
70
|
}
|
|
@@ -98,24 +109,24 @@ export class ODataApi {
|
|
|
98
109
|
* @param path Name of the singleton
|
|
99
110
|
* @returns
|
|
100
111
|
*/
|
|
101
|
-
singleton(
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
:
|
|
106
|
-
|
|
112
|
+
singleton(name) {
|
|
113
|
+
const singleton = this.findSingleton(name);
|
|
114
|
+
return ODataSingletonResource.factory(this, {
|
|
115
|
+
path: singleton?.name ?? name,
|
|
116
|
+
type: singleton?.singletonType,
|
|
117
|
+
});
|
|
107
118
|
}
|
|
108
119
|
/**
|
|
109
120
|
* Build an entity set resource.
|
|
110
121
|
* @param path Name of the entity set
|
|
111
122
|
* @returns
|
|
112
123
|
*/
|
|
113
|
-
entitySet(
|
|
114
|
-
const entitySet = this.
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
:
|
|
118
|
-
|
|
124
|
+
entitySet(name) {
|
|
125
|
+
const entitySet = this.findEntitySet(name);
|
|
126
|
+
return ODataEntitySetResource.factory(this, {
|
|
127
|
+
path: entitySet?.name ?? name,
|
|
128
|
+
type: entitySet?.entityType,
|
|
129
|
+
});
|
|
119
130
|
}
|
|
120
131
|
/**
|
|
121
132
|
* Unbound Action
|
|
@@ -123,8 +134,12 @@ export class ODataApi {
|
|
|
123
134
|
* @returns ODataActionResource
|
|
124
135
|
*/
|
|
125
136
|
action(path) {
|
|
126
|
-
const
|
|
127
|
-
return ODataActionResource.factory(this, {
|
|
137
|
+
const callable = this.findCallable(path);
|
|
138
|
+
return ODataActionResource.factory(this, {
|
|
139
|
+
path,
|
|
140
|
+
outgoingType: callable?.type(),
|
|
141
|
+
incomingType: callable?.returnType(),
|
|
142
|
+
});
|
|
128
143
|
}
|
|
129
144
|
/**
|
|
130
145
|
* Unbound Function
|
|
@@ -132,8 +147,21 @@ export class ODataApi {
|
|
|
132
147
|
* @returns ODataFunctionResource
|
|
133
148
|
*/
|
|
134
149
|
function(path) {
|
|
135
|
-
const
|
|
136
|
-
return ODataFunctionResource.factory(this, {
|
|
150
|
+
const callable = this.findCallable(path);
|
|
151
|
+
return ODataFunctionResource.factory(this, {
|
|
152
|
+
path,
|
|
153
|
+
outgoingType: callable?.type(),
|
|
154
|
+
incomingType: callable?.returnType(),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
callable(type) {
|
|
158
|
+
return this.findCallable(type);
|
|
159
|
+
}
|
|
160
|
+
enumType(type) {
|
|
161
|
+
return this.findEnumType(type);
|
|
162
|
+
}
|
|
163
|
+
structuredType(type) {
|
|
164
|
+
return this.findStructuredType(type);
|
|
137
165
|
}
|
|
138
166
|
//request(req: ODataRequest<any>): Observable<any> {
|
|
139
167
|
request(method, resource, options) {
|
|
@@ -185,7 +213,26 @@ export class ODataApi {
|
|
|
185
213
|
throw new Error(`Unreachable: unhandled observe type ${options.observe}}`);
|
|
186
214
|
}
|
|
187
215
|
}
|
|
188
|
-
|
|
216
|
+
//# region Find by Type
|
|
217
|
+
// Memoize
|
|
218
|
+
memo = {
|
|
219
|
+
enumTypes: new Map(),
|
|
220
|
+
structuredTypes: new Map(),
|
|
221
|
+
callables: new Map(),
|
|
222
|
+
entitySets: new Map(),
|
|
223
|
+
singletons: new Map(),
|
|
224
|
+
parsers: new Map(),
|
|
225
|
+
options: new Map(),
|
|
226
|
+
};
|
|
227
|
+
createSchema(config) {
|
|
228
|
+
const schema = new ODataSchema(config, this);
|
|
229
|
+
schema.configure({
|
|
230
|
+
options: this.options.parserOptions,
|
|
231
|
+
});
|
|
232
|
+
this.schemas.push(schema);
|
|
233
|
+
return schema;
|
|
234
|
+
}
|
|
235
|
+
findSchema(type) {
|
|
189
236
|
const schemas = this.schemas.filter((s) => s.isNamespaceOf(type));
|
|
190
237
|
if (schemas.length === 0)
|
|
191
238
|
return undefined;
|
|
@@ -195,152 +242,165 @@ export class ODataApi {
|
|
|
195
242
|
.sort((s1, s2) => s1.namespace.length - s2.namespace.length)
|
|
196
243
|
.pop();
|
|
197
244
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
245
|
+
//#region EnumTypes
|
|
246
|
+
findEnumType(value) {
|
|
247
|
+
if (this.memo.enumTypes.has(value)) {
|
|
248
|
+
return this.memo.enumTypes.get(value);
|
|
201
249
|
}
|
|
202
|
-
const
|
|
203
|
-
|
|
250
|
+
const enumTypes = this.schemas.reduce((acc, schema) => [...acc, ...schema.enums], []);
|
|
251
|
+
let enumType = enumTypes.find((e) => e.type() === value);
|
|
252
|
+
enumType = enumType ?? enumTypes.find((e) => e.name === value);
|
|
253
|
+
this.memo.enumTypes.set(value, enumType);
|
|
204
254
|
return enumType;
|
|
205
255
|
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
256
|
+
//#endregion
|
|
257
|
+
//#region StructuredTypes
|
|
258
|
+
findStructuredType(value) {
|
|
259
|
+
if (this.memo.structuredTypes.has(value)) {
|
|
260
|
+
return this.memo.structuredTypes.get(value);
|
|
209
261
|
}
|
|
210
|
-
const
|
|
211
|
-
|
|
262
|
+
const structuredTypes = this.schemas.reduce((acc, schema) => [...acc, ...schema.entities], []);
|
|
263
|
+
let structuredType = structuredTypes.find((e) => e.type() === value);
|
|
264
|
+
structuredType =
|
|
265
|
+
structuredType ?? structuredTypes.find((e) => e.name === value);
|
|
266
|
+
this.memo.structuredTypes.set(value, structuredType);
|
|
212
267
|
return structuredType;
|
|
213
268
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
269
|
+
//#endregion
|
|
270
|
+
//#region Callables
|
|
271
|
+
findCallable(value, bindingType) {
|
|
272
|
+
const key = bindingType !== undefined ? `${bindingType}/${value}` : value;
|
|
273
|
+
if (this.memo.callables.has(key)) {
|
|
274
|
+
return this.memo.callables.get(key);
|
|
218
275
|
}
|
|
219
|
-
const
|
|
220
|
-
|
|
276
|
+
const bindingStructuredType = bindingType !== undefined
|
|
277
|
+
? this.findStructuredType(bindingType)
|
|
278
|
+
: undefined;
|
|
279
|
+
const callables = this.schemas.reduce((acc, schema) => [...acc, ...schema.callables], []);
|
|
280
|
+
let callable = callables.find((c) => {
|
|
281
|
+
const isCallableType = c.type() == value;
|
|
282
|
+
const callableBindingType = c.binding()?.type;
|
|
283
|
+
const callableBindingStructuredType = callableBindingType !== undefined
|
|
284
|
+
? this.findStructuredType(callableBindingType)
|
|
285
|
+
: undefined;
|
|
286
|
+
return (isCallableType &&
|
|
287
|
+
(!bindingStructuredType ||
|
|
288
|
+
(callableBindingStructuredType &&
|
|
289
|
+
bindingStructuredType.isSubtypeOf(callableBindingStructuredType))));
|
|
290
|
+
});
|
|
291
|
+
callable =
|
|
292
|
+
callable ??
|
|
293
|
+
callables.find((c) => {
|
|
294
|
+
const isCallableType = c.name == value;
|
|
295
|
+
const callableBindingType = c.binding()?.type;
|
|
296
|
+
const callableBindingStructuredType = callableBindingType !== undefined
|
|
297
|
+
? this.findStructuredType(callableBindingType)
|
|
298
|
+
: undefined;
|
|
299
|
+
return (isCallableType &&
|
|
300
|
+
(!bindingStructuredType ||
|
|
301
|
+
(callableBindingStructuredType &&
|
|
302
|
+
bindingStructuredType.isSubtypeOf(callableBindingStructuredType))));
|
|
303
|
+
});
|
|
304
|
+
this.memo.callables.set(key, callable);
|
|
221
305
|
return callable;
|
|
222
306
|
}
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
307
|
+
//#endregion
|
|
308
|
+
//#region EntitySets
|
|
309
|
+
findEntitySet(value) {
|
|
310
|
+
if (this.memo.entitySets.has(value)) {
|
|
311
|
+
return this.memo.entitySets.get(value);
|
|
226
312
|
}
|
|
227
|
-
const
|
|
228
|
-
|
|
313
|
+
const entitySets = this.schemas.reduce((acc, schema) => [...acc, ...schema.entitySets], []);
|
|
314
|
+
let entitySet = entitySets.find((e) => e.type() === value);
|
|
315
|
+
entitySet = entitySet ?? entitySets.find((e) => e.name === value);
|
|
316
|
+
this.memo.entitySets.set(value, entitySet);
|
|
229
317
|
return entitySet;
|
|
230
318
|
}
|
|
231
|
-
|
|
232
|
-
|
|
319
|
+
//#endregion
|
|
320
|
+
//#region Singletons
|
|
321
|
+
findSingleton(value) {
|
|
322
|
+
if (this.memo.singletons.has(value)) {
|
|
323
|
+
return this.memo.singletons.get(value);
|
|
324
|
+
}
|
|
325
|
+
const singletons = this.schemas.reduce((acc, schema) => [...acc, ...schema.singletons], []);
|
|
326
|
+
let singleton = singletons.find((e) => e.type() === value);
|
|
327
|
+
singleton = singleton ?? singletons.find((e) => e.name === value);
|
|
328
|
+
this.memo.singletons.set(value, singleton);
|
|
329
|
+
return singleton;
|
|
233
330
|
}
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
331
|
+
//#endregion
|
|
332
|
+
findModel(type) {
|
|
333
|
+
return this.findStructuredType(type)?.model;
|
|
334
|
+
}
|
|
335
|
+
createModel(structured) {
|
|
336
|
+
if (structured.model !== undefined)
|
|
337
|
+
return structured.model;
|
|
338
|
+
// Build Ad-hoc model
|
|
339
|
+
const Model = class extends ODataModel {
|
|
340
|
+
};
|
|
341
|
+
// Build Meta
|
|
342
|
+
Model.meta = this.optionsForType(structured.type(), {
|
|
343
|
+
structuredType: structured,
|
|
344
|
+
});
|
|
345
|
+
if (Model.meta !== undefined) {
|
|
245
346
|
// Configure
|
|
246
347
|
Model.meta.configure({
|
|
247
348
|
options: this.options.parserOptions,
|
|
248
|
-
parserForType: (type) => this.parserForType(type),
|
|
249
|
-
findOptionsForType: (type) => this.findOptionsForType(type),
|
|
250
349
|
});
|
|
251
|
-
// Store New Model for next time
|
|
252
|
-
schema.model = Model;
|
|
253
350
|
}
|
|
351
|
+
// Store New Model for next time
|
|
352
|
+
structured.model = Model;
|
|
254
353
|
return Model;
|
|
255
354
|
}
|
|
256
|
-
|
|
257
|
-
|
|
355
|
+
modelForType(type) {
|
|
356
|
+
let Model = this.findModel(type);
|
|
357
|
+
if (Model === undefined) {
|
|
358
|
+
const structured = this.findStructuredType(type);
|
|
359
|
+
if (structured === undefined)
|
|
360
|
+
throw Error(`No structured type for ${type}`);
|
|
361
|
+
Model = this.createModel(structured);
|
|
362
|
+
}
|
|
363
|
+
return Model;
|
|
364
|
+
}
|
|
365
|
+
findCollection(type) {
|
|
366
|
+
return this.findStructuredType(type)?.collection;
|
|
367
|
+
}
|
|
368
|
+
createCollection(structured, model) {
|
|
369
|
+
if (structured.collection !== undefined)
|
|
370
|
+
return structured.collection;
|
|
371
|
+
if (model === undefined)
|
|
372
|
+
model = this.createModel(structured);
|
|
373
|
+
const Collection = class extends ODataCollection {
|
|
374
|
+
static model = model;
|
|
375
|
+
};
|
|
376
|
+
structured.collection = Collection;
|
|
377
|
+
return Collection;
|
|
258
378
|
}
|
|
259
379
|
collectionForType(type) {
|
|
260
|
-
let Collection = this.
|
|
380
|
+
let Collection = this.findCollection(type);
|
|
261
381
|
if (Collection === undefined) {
|
|
262
|
-
|
|
263
|
-
if (
|
|
264
|
-
throw Error(
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
Collection.model = this.modelForType(type);
|
|
268
|
-
// Store New Collection for next time
|
|
269
|
-
schema.collection = Collection;
|
|
382
|
+
const structured = this.findStructuredType(type);
|
|
383
|
+
if (structured === undefined)
|
|
384
|
+
throw Error(`No structured type for ${type}`);
|
|
385
|
+
const Model = this.modelForType(type);
|
|
386
|
+
Collection = this.createCollection(structured, Model);
|
|
270
387
|
}
|
|
271
388
|
return Collection;
|
|
272
389
|
}
|
|
273
|
-
findServiceForType(type) {
|
|
274
|
-
return this.findEntitySetForType(type)?.service;
|
|
275
|
-
}
|
|
276
390
|
findEntitySetForEntityType(entityType) {
|
|
277
|
-
if (this.memo.
|
|
278
|
-
return this.memo.
|
|
391
|
+
if (this.memo.entitySets.has(entityType)) {
|
|
392
|
+
return this.memo.entitySets.get(entityType);
|
|
279
393
|
}
|
|
280
394
|
const entitySet = this.schemas
|
|
281
395
|
.reduce((acc, schema) => [...acc, ...schema.entitySets], [])
|
|
282
396
|
.find((e) => e.entityType === entityType);
|
|
283
|
-
this.memo.
|
|
397
|
+
this.memo.entitySets.set(entityType, entitySet);
|
|
284
398
|
return entitySet;
|
|
285
399
|
}
|
|
286
|
-
findServiceForEntityType(entityType) {
|
|
287
|
-
return this.findEntitySetForEntityType(entityType)?.service;
|
|
288
|
-
}
|
|
289
|
-
findEnumTypeByName(name) {
|
|
290
|
-
if (this.memo.byName.enum.has(name)) {
|
|
291
|
-
return this.memo.byName.enum.get(name);
|
|
292
|
-
}
|
|
293
|
-
const enumType = this.schemas
|
|
294
|
-
.reduce((acc, schema) => [...acc, ...schema.enums], [])
|
|
295
|
-
.find((e) => e.name === name);
|
|
296
|
-
this.memo.byName.enum.set(name, enumType);
|
|
297
|
-
return enumType;
|
|
298
|
-
}
|
|
299
|
-
findStructuredTypeByName(name) {
|
|
300
|
-
if (this.memo.byName.structured.has(name)) {
|
|
301
|
-
return this.memo.byName.structured.get(name);
|
|
302
|
-
}
|
|
303
|
-
const structuredType = this.schemas
|
|
304
|
-
.reduce((acc, schema) => [...acc, ...schema.entities], [])
|
|
305
|
-
.find((e) => e.name === name);
|
|
306
|
-
this.memo.byName.structured.set(name, structuredType);
|
|
307
|
-
return structuredType;
|
|
308
|
-
}
|
|
309
|
-
findCallableByName(name, bindingType) {
|
|
310
|
-
const key = bindingType !== undefined ? `${bindingType}/${name}` : name;
|
|
311
|
-
if (this.memo.byName.callable.has(key)) {
|
|
312
|
-
return this.memo.byName.callable.get(key);
|
|
313
|
-
}
|
|
314
|
-
const callable = this.schemas
|
|
315
|
-
.reduce((acc, schema) => [...acc, ...schema.callables], [])
|
|
316
|
-
.find((c) => c.name === name &&
|
|
317
|
-
(bindingType === undefined || c.binding()?.type === bindingType));
|
|
318
|
-
this.memo.byName.callable.set(key, callable);
|
|
319
|
-
return callable;
|
|
320
|
-
}
|
|
321
|
-
findEntitySetByName(name) {
|
|
322
|
-
if (this.memo.byName.entitySet.has(name)) {
|
|
323
|
-
return this.memo.byName.entitySet.get(name);
|
|
324
|
-
}
|
|
325
|
-
const schema = this.schemas
|
|
326
|
-
.reduce((acc, schema) => [...acc, ...schema.entitySets], [])
|
|
327
|
-
.find((e) => e.name === name);
|
|
328
|
-
this.memo.byName.entitySet.set(name, schema);
|
|
329
|
-
return schema;
|
|
330
|
-
}
|
|
331
|
-
findModelByName(name) {
|
|
332
|
-
return this.findStructuredTypeByName(name)?.model;
|
|
333
|
-
}
|
|
334
|
-
findCollectionByName(name) {
|
|
335
|
-
return this.findStructuredTypeByName(name)?.collection;
|
|
336
|
-
}
|
|
337
|
-
findServiceByName(name) {
|
|
338
|
-
return this.findEntitySetByName(name)?.service;
|
|
339
|
-
}
|
|
340
400
|
parserForType(type, bindingType) {
|
|
341
401
|
const key = bindingType !== undefined ? `${bindingType}/${type}` : type;
|
|
342
|
-
if (this.memo.
|
|
343
|
-
return this.memo.
|
|
402
|
+
if (this.memo.parsers.has(key)) {
|
|
403
|
+
return this.memo.parsers.get(key);
|
|
344
404
|
}
|
|
345
405
|
// None Parser by default
|
|
346
406
|
let parser = NONE_PARSER;
|
|
@@ -349,26 +409,31 @@ export class ODataApi {
|
|
|
349
409
|
parser = this.parsers.get(type);
|
|
350
410
|
}
|
|
351
411
|
else if (!type.startsWith('Edm.')) {
|
|
352
|
-
// EnumType, ComplexType and EntityType Parsers
|
|
353
|
-
let value = this.
|
|
354
|
-
this.
|
|
355
|
-
this.
|
|
412
|
+
// Callable, EnumType, StructuredType (ComplexType and EntityType) Parsers
|
|
413
|
+
let value = this.findCallable(type, bindingType) ??
|
|
414
|
+
this.findEnumType(type) ??
|
|
415
|
+
this.findStructuredType(type);
|
|
356
416
|
parser = value?.parser;
|
|
357
417
|
}
|
|
358
418
|
// Set Parser for next time
|
|
359
|
-
this.memo.
|
|
419
|
+
this.memo.parsers.set(key, parser);
|
|
360
420
|
return parser;
|
|
361
421
|
}
|
|
362
|
-
|
|
422
|
+
optionsForType(type, { structuredType, config, } = {}) {
|
|
363
423
|
// Strucutred Options
|
|
364
|
-
if (this.memo.
|
|
365
|
-
return this.memo.
|
|
424
|
+
if (this.memo.options.has(type)) {
|
|
425
|
+
return this.memo.options.get(type);
|
|
426
|
+
}
|
|
427
|
+
let meta = undefined;
|
|
428
|
+
if (!type.startsWith('Edm.')) {
|
|
429
|
+
structuredType = this.findStructuredType(type) ?? structuredType;
|
|
430
|
+
if (structuredType !== undefined) {
|
|
431
|
+
meta = ODataModel.buildMetaOptions({ config, structuredType });
|
|
432
|
+
}
|
|
366
433
|
}
|
|
367
|
-
const st = this.findStructuredTypeForType(type);
|
|
368
|
-
const options = st?.model?.meta;
|
|
369
434
|
// Set Options for next time
|
|
370
|
-
this.memo.
|
|
371
|
-
return
|
|
435
|
+
this.memo.options.set(type, meta);
|
|
436
|
+
return meta;
|
|
372
437
|
}
|
|
373
438
|
}
|
|
374
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFxQixNQUFNLGdCQUFnQixDQUFDO0FBQ2hGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDNUMsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLCtCQUErQixFQUUvQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLFlBQVksRUFFWixhQUFhLEVBRWIsc0JBQXNCLEdBQ3ZCLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUNMLFdBQVcsRUFJWCxXQUFXLEdBRVosTUFBTSxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUlMLFdBQVcsRUFFWCxXQUFXLEdBRVosTUFBTSxTQUFTLENBQUM7QUFFakI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQW1CbkIsWUFBWSxNQUFpQjtRQWtPN0IsdUJBQXVCO1FBQ3ZCLFVBQVU7UUFDRixTQUFJLEdBZVI7WUFDRixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLElBQUksR0FBRyxFQUEwQztnQkFDdkQsVUFBVSxFQUFFLElBQUksR0FBRyxFQUFn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QUNoQyw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgTkVWRVIsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9EYXRhQ2FjaGUsIE9EYXRhSW5NZW1vcnlDYWNoZSB9IGZyb20gJy4vY2FjaGUvaW5kZXgnO1xuaW1wb3J0IHsgREVGQVVMVF9WRVJTSU9OIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgT0RhdGFDb2xsZWN0aW9uLCBPRGF0YU1vZGVsLCBPRGF0YU1vZGVsT3B0aW9ucyB9IGZyb20gJy4vbW9kZWxzL2luZGV4JztcbmltcG9ydCB7IE9EYXRhQXBpT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQge1xuICBPRGF0YUFjdGlvblJlc291cmNlLFxuICBPRGF0YUJhdGNoUmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhRnVuY3Rpb25SZXNvdXJjZSxcbiAgT0RhdGFNZXRhZGF0YVJlc291cmNlLFxuICBPRGF0YU5hdmlnYXRpb25Qcm9wZXJ0eVJlc291cmNlLFxuICBPRGF0YU9wdGlvbnMsXG4gIE9EYXRhUGF0aFNlZ21lbnRzLFxuICBPRGF0YVF1ZXJ5T3B0aW9ucyxcbiAgT0RhdGFSZXF1ZXN0LFxuICBPRGF0YVJlc291cmNlLFxuICBPRGF0YVJlc3BvbnNlLFxuICBPRGF0YVNlZ21lbnQsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG59IGZyb20gJy4vcmVzb3VyY2VzL2luZGV4JztcbmltcG9ydCB7XG4gIEVETV9QQVJTRVJTLFxuICBPRGF0YUNhbGxhYmxlLFxuICBPRGF0YUVudGl0eVNldCxcbiAgT0RhdGFFbnVtVHlwZSxcbiAgT0RhdGFTY2hlbWEsXG4gIE9EYXRhU3RydWN0dXJlZFR5cGUsXG59IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IE9EYXRhRW50aXR5U2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvZW50aXR5JztcbmltcG9ydCB7XG4gIEFwaUNvbmZpZyxcbiAgQXBpT3B0aW9ucyxcbiAgRWRtVHlwZSxcbiAgTk9ORV9QQVJTRVIsXG4gIFBhcnNlcixcbiAgUGF0aFNlZ21lbnQsXG4gIFF1ZXJ5T3B0aW9uLFxufSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBBcGkgYWJzdHJhY3Rpb24gZm9yIGNvbnN1bWluZyBPRGF0YSBzZXJ2aWNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE9EYXRhQXBpIHtcbiAgcmVxdWVzdGVyPzogKHJlcXVlc3Q6IE9EYXRhUmVxdWVzdDxhbnk+KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gIHNlcnZpY2VSb290VXJsOiBzdHJpbmc7XG4gIG1ldGFkYXRhVXJsOiBzdHJpbmc7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbiAgZGVmYXVsdDogYm9vbGVhbjtcbiAgY3JlYXRpb246IERhdGU7XG4gIC8vIE9wdGlvbnNcbiAgb3B0aW9uczogT0RhdGFBcGlPcHRpb25zO1xuICAvLyBDYWNoZVxuICBjYWNoZSE6IE9EYXRhQ2FjaGU7XG4gIC8vIEVycm9yIEhhbmRsZXJcbiAgZXJyb3JIYW5kbGVyPzogKGVycm9yOiBhbnksIGNhdWdodDogT2JzZXJ2YWJsZTxhbnk+KSA9PiBPYnNlcnZhYmxlPG5ldmVyPjtcbiAgLy8gQmFzZSBQYXJzZXJzXG4gIHBhcnNlcnM6IE1hcDxzdHJpbmcsIFBhcnNlcjxhbnk+PjtcbiAgLy8gU2NoZW1hc1xuICBzY2hlbWFzOiBPRGF0YVNjaGVtYVtdO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQXBpQ29uZmlnKSB7XG4gICAgdGhpcy5zZXJ2aWNlUm9vdFVybCA9IGNvbmZpZy5zZXJ2aWNlUm9vdFVybDtcbiAgICBpZiAodGhpcy5zZXJ2aWNlUm9vdFVybC5pbmRleE9mKCc/JykgIT0gLTEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlICdzZXJ2aWNlUm9vdFVybCcgc2hvdWxkIG5vdCBjb250YWluIHF1ZXJ5IHN0cmluZy4gUGxlYXNlIHVzZSAncGFyYW1zJyB0byBhZGQgZXh0cmEgcGFyYW1ldGVyc1wiXG4gICAgICApO1xuICAgIGlmICghdGhpcy5zZXJ2aWNlUm9vdFVybC5lbmRzV2l0aCgnLycpKSB0aGlzLnNlcnZpY2VSb290VXJsICs9ICcvJztcbiAgICB0aGlzLm1ldGFkYXRhVXJsID0gYCR7dGhpcy5zZXJ2aWNlUm9vdFVybH0kbWV0YWRhdGFgO1xuICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMudmVyc2lvbiA9IGNvbmZpZy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTjtcbiAgICB0aGlzLmRlZmF1bHQgPSBjb25maWcuZGVmYXVsdCB8fCBmYWxzZTtcbiAgICB0aGlzLmNyZWF0aW9uID0gY29uZmlnLmNyZWF0aW9uIHx8IG5ldyBEYXRlKCk7XG4gICAgdGhpcy5vcHRpb25zID0gbmV3IE9EYXRhQXBpT3B0aW9ucyhcbiAgICAgIE9iamVjdC5hc3NpZ24oPEFwaU9wdGlvbnM+eyB2ZXJzaW9uOiB0aGlzLnZlcnNpb24gfSwgY29uZmlnLm9wdGlvbnMgfHwge30pXG4gICAgKTtcblxuICAgIHRoaXMuY2FjaGUgPSAoY29uZmlnLmNhY2hlIGFzIE9EYXRhQ2FjaGUpIHx8IG5ldyBPRGF0YUluTWVtb3J5Q2FjaGUoKTtcbiAgICB0aGlzLmVycm9ySGFuZGxlciA9IGNvbmZpZy5lcnJvckhhbmRsZXI7XG5cbiAgICB0aGlzLnBhcnNlcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5wYXJzZXJzIHx8IEVETV9QQVJTRVJTKSk7XG5cbiAgICB0aGlzLnNjaGVtYXMgPSAoY29uZmlnLnNjaGVtYXMgfHwgW10pLm1hcChcbiAgICAgIChzY2hlbWEpID0+IG5ldyBPRGF0YVNjaGVtYShzY2hlbWEsIHRoaXMpXG4gICAgKTtcbiAgfVxuXG4gIGNvbmZpZ3VyZShcbiAgICBzZXR0aW5nczoge1xuICAgICAgcmVxdWVzdGVyPzogKHJlcXVlc3Q6IE9EYXRhUmVxdWVzdDxhbnk+KSA9PiBPYnNlcnZhYmxlPGFueT47XG4gICAgfSA9IHt9XG4gICkge1xuICAgIHRoaXMucmVxdWVzdGVyID0gc2V0dGluZ3MucmVxdWVzdGVyO1xuICAgIHRoaXMuc2NoZW1hcy5mb3JFYWNoKChzY2hlbWEpID0+IHtcbiAgICAgIHNjaGVtYS5jb25maWd1cmUoe1xuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgICAgcGFyc2VyRm9yVHlwZTogKHR5cGU6IHN0cmluZyB8IEVkbVR5cGUpID0+IHRoaXMucGFyc2VyRm9yVHlwZSh0eXBlKSxcbiAgICAgICAgZmluZE9wdGlvbnNGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiB0aGlzLmZpbmRPcHRpb25zRm9yVHlwZSh0eXBlKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnJvbUpzb248UCwgUj4oanNvbjoge1xuICAgIHNlZ21lbnRzOiBPRGF0YVNlZ21lbnRbXTtcbiAgICBvcHRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4gfCBPRGF0YUZ1bmN0aW9uUmVzb3VyY2U8UCwgUj47XG4gIGZyb21Kc29uPEU+KGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pOlxuICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxFPjtcbiAgZnJvbUpzb24oanNvbjoge1xuICAgIHNlZ21lbnRzOiBPRGF0YVNlZ21lbnRbXTtcbiAgICBvcHRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSkge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gT0RhdGFQYXRoU2VnbWVudHMuZnJvbUpzb24oanNvbi5zZWdtZW50cyk7XG4gICAgY29uc3QgcXVlcnkgPSBPRGF0YVF1ZXJ5T3B0aW9ucy5mcm9tSnNvbjxhbnk+KGpzb24ub3B0aW9ucyk7XG4gICAgc3dpdGNoIChzZWdtZW50cy5sYXN0KCk/Lm5hbWUgYXMgUGF0aFNlZ21lbnQpIHtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuZW50aXR5U2V0OlxuICAgICAgICBpZiAoc2VnbWVudHMubGFzdCgpPy5oYXNLZXkoKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgT0RhdGFFbnRpdHlSZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE9EYXRhRW50aXR5U2V0UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQubmF2aWdhdGlvblByb3BlcnR5OlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LnNpbmdsZXRvbjpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YVNpbmdsZXRvblJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5hY3Rpb246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFBY3Rpb25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuZnVuY3Rpb246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFGdW5jdGlvblJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFJlc291cmNlIGZvciBqc29uJyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBtZXRhZGF0YSByZXNvdXJjZS5cbiAgICogQHJldHVybnMgT0RhdGFNZXRhZGF0YVJlc291cmNlXG4gICAqL1xuICBtZXRhZGF0YSgpOiBPRGF0YU1ldGFkYXRhUmVzb3VyY2Uge1xuICAgIHJldHVybiBPRGF0YU1ldGFkYXRhUmVzb3VyY2UuZmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGJhdGNoIHJlc291cmNlLlxuICAgKiBAcmV0dXJucyBPRGF0YUJhdGNoUmVzb3VyY2VcbiAgICovXG4gIGJhdGNoKCk6IE9EYXRhQmF0Y2hSZXNvdXJjZSB7XG4gICAgcmV0dXJuIE9EYXRhQmF0Y2hSZXNvdXJjZS5mYWN0b3J5KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc2luZ2xldG9uIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcGF0aCBOYW1lIG9mIHRoZSBzaW5nbGV0b25cbiAgICogQHJldHVybnNcbiAgICovXG4gIHNpbmdsZXRvbjxUPihwYXRoOiBzdHJpbmcpIHtcbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLmZpbmRFbnRpdHlTZXRCeU5hbWUocGF0aCk7XG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIGVudGl0eVNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KGVudGl0eVNldC5lbnRpdHlUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT0RhdGFTaW5nbGV0b25SZXNvdXJjZS5mYWN0b3J5PFQ+KHRoaXMsIHsgcGF0aCwgc2NoZW1hIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGFuIGVudGl0eSBzZXQgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSBwYXRoIE5hbWUgb2YgdGhlIGVudGl0eSBzZXRcbiAgICogQHJldHVybnNcbiAgICovXG4gIGVudGl0eVNldDxUPihwYXRoOiBzdHJpbmcpOiBPRGF0YUVudGl0eVNldFJlc291cmNlPFQ+IHtcbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLmZpbmRFbnRpdHlTZXRCeU5hbWUocGF0aCk7XG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIGVudGl0eVNldCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KGVudGl0eVNldC5lbnRpdHlUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gT0RhdGFFbnRpdHlTZXRSZXNvdXJjZS5mYWN0b3J5PFQ+KHRoaXMsIHsgcGF0aCwgc2NoZW1hIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYm91bmQgQWN0aW9uXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcGF0aD9cbiAgICogQHJldHVybnMgT0RhdGFBY3Rpb25SZXNvdXJjZVxuICAgKi9cbiAgYWN0aW9uPFAsIFI+KHBhdGg6IHN0cmluZyk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4ge1xuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZmluZENhbGxhYmxlRm9yVHlwZTxSPihwYXRoKTtcbiAgICByZXR1cm4gT0RhdGFBY3Rpb25SZXNvdXJjZS5mYWN0b3J5PFAsIFI+KHRoaXMsIHsgcGF0aCwgc2NoZW1hIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYm91bmQgRnVuY3Rpb25cbiAgICogQHBhcmFtICB7c3RyaW5nfSBwYXRoP1xuICAgKiBAcmV0dXJucyBPRGF0YUZ1bmN0aW9uUmVzb3VyY2VcbiAgICovXG4gIGZ1bmN0aW9uPFAsIFI+KHBhdGg6IHN0cmluZyk6IE9EYXRhRnVuY3Rpb25SZXNvdXJjZTxQLCBSPiB7XG4gICAgY29uc3Qgc2NoZW1hID0gdGhpcy5maW5kQ2FsbGFibGVGb3JUeXBlPFI+KHBhdGgpO1xuICAgIHJldHVybiBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPih0aGlzLCB7IHBhdGgsIHNjaGVtYSB9KTtcbiAgfVxuXG4gIC8vcmVxdWVzdChyZXE6IE9EYXRhUmVxdWVzdDxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICByZXNvdXJjZTogT0RhdGFSZXNvdXJjZTxhbnk+LFxuICAgIG9wdGlvbnM6IE9EYXRhT3B0aW9ucyAmIHtcbiAgICAgIGJvZHk/OiBhbnk7XG4gICAgICBldGFnPzogc3RyaW5nO1xuICAgICAgcmVzcG9uc2VUeXBlPzpcbiAgICAgICAgfCAnYXJyYXlidWZmZXInXG4gICAgICAgIHwgJ2Jsb2InXG4gICAgICAgIHwgJ2pzb24nXG4gICAgICAgIHwgJ3RleHQnXG4gICAgICAgIHwgJ3ZhbHVlJ1xuICAgICAgICB8ICdwcm9wZXJ0eSdcbiAgICAgICAgfCAnZW50aXR5J1xuICAgICAgICB8ICdlbnRpdGllcyc7XG4gICAgICBvYnNlcnZlPzogJ2JvZHknIHwgJ2V2ZW50cycgfCAncmVzcG9uc2UnO1xuICAgICAgd2l0aENvdW50PzogYm9vbGVhbjtcbiAgICAgIGJvZHlRdWVyeU9wdGlvbnM/OiBRdWVyeU9wdGlvbltdO1xuICAgIH1cbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcmVxID0gT0RhdGFSZXF1ZXN0LmZhY3RvcnkodGhpcywgbWV0aG9kLCByZXNvdXJjZSwge1xuICAgICAgYm9keTogb3B0aW9ucy5ib2R5LFxuICAgICAgZXRhZzogb3B0aW9ucy5ldGFnLFxuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LFxuICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsXG4gICAgICBvYnNlcnZlOiAob3B0aW9ucy5vYnNlcnZlID09PSAnZXZlbnRzJyA/ICdldmVudHMnIDogJ3Jlc3BvbnNlJykgYXNcbiAgICAgICAgfCAnZXZlbnRzJ1xuICAgICAgICB8ICdyZXNwb25zZScsXG4gICAgICB3aXRoQ291bnQ6IG9wdGlvbnMud2l0aENvdW50LFxuICAgICAgYm9keVF1ZXJ5T3B0aW9uczogb3B0aW9ucy5ib2R5UXVlcnlPcHRpb25zLFxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsXG4gICAgICBmZXRjaFBvbGljeTogb3B0aW9ucy5mZXRjaFBvbGljeSxcbiAgICAgIHBhcnNlck9wdGlvbnM6IG9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzJCA9IHRoaXMucmVxdWVzdGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLnJlcXVlc3RlcihyZXEpIDogTkVWRVI7XG5cbiAgICByZXMkID0gcmVzJC5waXBlKFxuICAgICAgbWFwKChyZXM6IEh0dHBFdmVudDxhbnk+KSA9PlxuICAgICAgICByZXMudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZVxuICAgICAgICAgID8gT0RhdGFSZXNwb25zZS5mcm9tSHR0cFJlc3BvbnNlPGFueT4ocmVxLCByZXMpXG4gICAgICAgICAgOiByZXNcbiAgICAgIClcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuZXJyb3JIYW5kbGVyICE9PSB1bmRlZmluZWQpXG4gICAgICByZXMkID0gcmVzJC5waXBlKGNhdGNoRXJyb3IodGhpcy5lcnJvckhhbmRsZXIpKTtcblxuICAgIGlmIChvcHRpb25zLm9ic2VydmUgPT09ICdldmVudHMnKSB7XG4gICAgICByZXR1cm4gcmVzJDtcbiAgICB9XG5cbiAgICByZXMkID0gdGhpcy5jYWNoZS5oYW5kbGVSZXF1ZXN0KHJlcSwgcmVzJCk7XG5cbiAgICBzd2l0Y2ggKG9wdGlvbnMub2JzZXJ2ZSB8fCAnYm9keScpIHtcbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICBzd2l0Y2ggKG9wdGlvbnMucmVzcG9uc2VUeXBlKSB7XG4gICAgICAgICAgY2FzZSAnZW50aXRpZXMnOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmVudGl0aWVzKCkpKTtcbiAgICAgICAgICBjYXNlICdlbnRpdHknOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmVudGl0eSgpKSk7XG4gICAgICAgICAgY2FzZSAncHJvcGVydHknOlxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLnByb3BlcnR5KCkpKTtcbiAgICAgICAgICBjYXNlICd2YWx1ZSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMudmFsdWUoKSBhcyBUKSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIC8vIE90aGVyIHJlc3BvbnNlVHlwZXMgKGFycmF5YnVmZmVyLCBibG9iLCBqc29uLCB0ZXh0KSByZXR1cm4gYm9keVxuICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKHJlczogT0RhdGFSZXNwb25zZTxUPikgPT4gcmVzLmJvZHkpKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSAncmVzcG9uc2UnOlxuICAgICAgICAvLyBUaGUgcmVzcG9uc2Ugc3RyZWFtIHdhcyByZXF1ZXN0ZWQgZGlyZWN0bHksIHNvIHJldHVybiBpdC5cbiAgICAgICAgcmV0dXJuIHJlcyQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IG5ldyBmdXR1cmUgb2JzZXJ2ZSB0eXBlcyBiZWluZyBhZGRlZC5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBVbnJlYWNoYWJsZTogdW5oYW5kbGVkIG9ic2VydmUgdHlwZSAke29wdGlvbnMub2JzZXJ2ZX19YFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIyByZWdpb24gRmluZCBieSBUeXBlXG4gIC8vIE1lbW9pemVcbiAgcHJpdmF0ZSBtZW1vOiB7XG4gICAgZm9yVHlwZToge1xuICAgICAgZW51bTogTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIHN0cnVjdHVyZWQ6IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBjYWxsYWJsZTogTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIGVudGl0eVNldDogTWFwPHN0cmluZywgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ+O1xuICAgICAgcGFyc2VyOiBNYXA8c3RyaW5nLCBQYXJzZXI8YW55Pj47XG4gICAgICBvcHRpb25zOiBNYXA8c3RyaW5nLCBPRGF0YU1vZGVsT3B0aW9uczxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICB9O1xuICAgIGJ5TmFtZToge1xuICAgICAgZW51bTogTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIHN0cnVjdHVyZWQ6IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgICBjYWxsYWJsZTogTWFwPHN0cmluZywgT0RhdGFDYWxsYWJsZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICAgIGVudGl0eVNldDogTWFwPHN0cmluZywgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ+O1xuICAgIH07XG4gIH0gPSB7XG4gICAgZm9yVHlwZToge1xuICAgICAgZW51bTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIHN0cnVjdHVyZWQ6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBjYWxsYWJsZTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhQ2FsbGFibGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIGVudGl0eVNldDogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPigpLFxuICAgICAgcGFyc2VyOiBuZXcgTWFwPHN0cmluZywgUGFyc2VyPGFueT4+KCksXG4gICAgICBvcHRpb25zOiBuZXcgTWFwPHN0cmluZywgT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICB9LFxuICAgIGJ5TmFtZToge1xuICAgICAgZW51bTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW51bVR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIHN0cnVjdHVyZWQ6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgICBjYWxsYWJsZTogbmV3IE1hcDxzdHJpbmcsIE9EYXRhQ2FsbGFibGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICAgIGVudGl0eVNldDogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPigpLFxuICAgIH0sXG4gIH07XG5cbiAgcHJpdmF0ZSBmaW5kU2NoZW1hRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzY2hlbWFzID0gdGhpcy5zY2hlbWFzLmZpbHRlcigocykgPT4gcy5pc05hbWVzcGFjZU9mKHR5cGUpKTtcbiAgICBpZiAoc2NoZW1hcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHNjaGVtYXMubGVuZ3RoID09PSAxKSByZXR1cm4gc2NoZW1hc1swXTtcbiAgICByZXR1cm4gc2NoZW1hc1xuICAgICAgLnNvcnQoKHMxLCBzMikgPT4gczEubmFtZXNwYWNlLmxlbmd0aCAtIHMyLm5hbWVzcGFjZS5sZW5ndGgpXG4gICAgICAucG9wKCk7XG4gIH1cblxuICBwdWJsaWMgZmluZEVudW1UeXBlRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUuZW51bS5oYXModHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5lbnVtLmdldCh0eXBlKSBhcyBPRGF0YUVudW1UeXBlPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnVtVHlwZSA9IHRoaXMuZmluZFNjaGVtYUZvclR5cGUodHlwZSk/LmZpbmRFbnVtVHlwZUZvclR5cGU8VD4odHlwZSk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuZW51bS5zZXQodHlwZSwgZW51bVR5cGUpO1xuICAgIHJldHVybiBlbnVtVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5zdHJ1Y3R1cmVkLmhhcyh0eXBlKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLnN0cnVjdHVyZWQuZ2V0KHR5cGUpIGFzXG4gICAgICAgIHwgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3RydWN0dXJlZFR5cGUgPVxuICAgICAgdGhpcy5maW5kU2NoZW1hRm9yVHlwZSh0eXBlKT8uZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5zdHJ1Y3R1cmVkLnNldCh0eXBlLCBzdHJ1Y3R1cmVkVHlwZSk7XG4gICAgcmV0dXJuIHN0cnVjdHVyZWRUeXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRDYWxsYWJsZUZvclR5cGU8VD4odHlwZTogc3RyaW5nLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt0eXBlfWAgOiB0eXBlO1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5jYWxsYWJsZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5mb3JUeXBlLmNhbGxhYmxlLmdldChrZXkpIGFzXG4gICAgICAgIHwgT0RhdGFDYWxsYWJsZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLmZpbmRTY2hlbWFGb3JUeXBlKHR5cGUpPy5maW5kQ2FsbGFibGVGb3JUeXBlPFQ+KFxuICAgICAgdHlwZSxcbiAgICAgIGJpbmRpbmdUeXBlXG4gICAgKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5jYWxsYWJsZS5zZXQoa2V5LCBjYWxsYWJsZSk7XG4gICAgcmV0dXJuIGNhbGxhYmxlO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5lbnRpdHlTZXQuaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LmdldCh0eXBlKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLmZpbmRTY2hlbWFGb3JUeXBlKHR5cGUpPy5maW5kRW50aXR5U2V0Rm9yVHlwZSh0eXBlKTtcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5lbnRpdHlTZXQuc2V0KHR5cGUsIGVudGl0eVNldCk7XG4gICAgcmV0dXJuIGVudGl0eVNldDtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kTW9kZWxGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUZvclR5cGU8YW55Pih0eXBlKT8ubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgbW9kZWxGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIGxldCBNb2RlbCA9IHRoaXMuZmluZE1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICBpZiAoTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQnVpbGQgQWQtaG9jIG1vZGVsXG4gICAgICBsZXQgc2NoZW1hID0gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk7XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHRocm93IEVycm9yKGBObyBzY2hlbWEgZm9yICR7dHlwZX1gKTtcbiAgICAgIE1vZGVsID0gY2xhc3MgZXh0ZW5kcyBPRGF0YU1vZGVsPGFueT4ge30gYXMgdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgICAvLyBCdWlsZCBNZXRhXG4gICAgICBNb2RlbC5idWlsZE1ldGEoeyBzY2hlbWEgfSk7XG4gICAgICAvLyBDb25maWd1cmVcbiAgICAgIE1vZGVsLm1ldGEuY29uZmlndXJlKHtcbiAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcgfCBFZG1UeXBlKSA9PiB0aGlzLnBhcnNlckZvclR5cGUodHlwZSksXG4gICAgICAgIGZpbmRPcHRpb25zRm9yVHlwZTogKHR5cGU6IHN0cmluZykgPT4gdGhpcy5maW5kT3B0aW9uc0ZvclR5cGUodHlwZSksXG4gICAgICB9KTtcbiAgICAgIC8vIFN0b3JlIE5ldyBNb2RlbCBmb3IgbmV4dCB0aW1lXG4gICAgICBzY2hlbWEubW9kZWwgPSBNb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIE1vZGVsO1xuICB9XG5cbiAgcHVibGljIGZpbmRDb2xsZWN0aW9uRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk/LmNvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgY29sbGVjdGlvbkZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IENvbGxlY3Rpb24gPSB0aGlzLmZpbmRDb2xsZWN0aW9uRm9yVHlwZSh0eXBlKTtcbiAgICBpZiAoQ29sbGVjdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgc2NoZW1hID0gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVGb3JUeXBlPGFueT4odHlwZSk7XG4gICAgICBpZiAoc2NoZW1hID09PSB1bmRlZmluZWQpIHRocm93IEVycm9yKCcnKTtcbiAgICAgIENvbGxlY3Rpb24gPSBjbGFzcyBleHRlbmRzIE9EYXRhQ29sbGVjdGlvbjxcbiAgICAgICAgYW55LFxuICAgICAgICBPRGF0YU1vZGVsPGFueT5cbiAgICAgID4ge30gYXMgdHlwZW9mIE9EYXRhQ29sbGVjdGlvbjtcbiAgICAgIENvbGxlY3Rpb24ubW9kZWwgPSB0aGlzLm1vZGVsRm9yVHlwZSh0eXBlKTtcbiAgICAgIC8vIFN0b3JlIE5ldyBDb2xsZWN0aW9uIGZvciBuZXh0IHRpbWVcbiAgICAgIHNjaGVtYS5jb2xsZWN0aW9uID0gQ29sbGVjdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIENvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgZmluZFNlcnZpY2VGb3JUeXBlKHR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbnRpdHlTZXRGb3JUeXBlKHR5cGUpPy5zZXJ2aWNlIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YUVudGl0eVNlcnZpY2VcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRGb3JFbnRpdHlUeXBlKGVudGl0eVR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5lbnRpdHlTZXQuaGFzKGVudGl0eVR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LmdldChlbnRpdHlUeXBlKSBhc1xuICAgICAgICB8IE9EYXRhRW50aXR5U2V0XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBlbnRpdHlTZXQgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudGl0eVNldHNdLFxuICAgICAgICA8T0RhdGFFbnRpdHlTZXRbXT5bXVxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUuZW50aXR5VHlwZSA9PT0gZW50aXR5VHlwZSk7XG4gICAgdGhpcy5tZW1vLmZvclR5cGUuZW50aXR5U2V0LnNldChlbnRpdHlUeXBlLCBlbnRpdHlTZXQpO1xuICAgIHJldHVybiBlbnRpdHlTZXQ7XG4gIH1cblxuICBwdWJsaWMgZmluZFNlcnZpY2VGb3JFbnRpdHlUeXBlKGVudGl0eVR5cGU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbnRpdHlTZXRGb3JFbnRpdHlUeXBlKGVudGl0eVR5cGUpPy5zZXJ2aWNlIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YUVudGl0eVNlcnZpY2VcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnVtVHlwZUJ5TmFtZTxUPihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmJ5TmFtZS5lbnVtLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5ieU5hbWUuZW51bS5nZXQobmFtZSkgYXMgT0RhdGFFbnVtVHlwZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZW51bVR5cGUgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudW1zXSxcbiAgICAgICAgPE9EYXRhRW51bVR5cGU8VD5bXT5bXVxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gbmFtZSk7XG4gICAgdGhpcy5tZW1vLmJ5TmFtZS5lbnVtLnNldChuYW1lLCBlbnVtVHlwZSk7XG4gICAgcmV0dXJuIGVudW1UeXBlO1xuICB9XG5cbiAgcHVibGljIGZpbmRTdHJ1Y3R1cmVkVHlwZUJ5TmFtZTxUPihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmJ5TmFtZS5zdHJ1Y3R1cmVkLmhhcyhuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5ieU5hbWUuc3RydWN0dXJlZC5nZXQobmFtZSkgYXNcbiAgICAgICAgfCBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdHJ1Y3R1cmVkVHlwZSA9IHRoaXMuc2NoZW1hc1xuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW50aXRpZXNdLFxuICAgICAgICA8T0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPltdPltdXG4gICAgICApXG4gICAgICAuZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLm1lbW8uYnlOYW1lLnN0cnVjdHVyZWQuc2V0KG5hbWUsIHN0cnVjdHVyZWRUeXBlKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZmluZENhbGxhYmxlQnlOYW1lPFQ+KG5hbWU6IHN0cmluZywgYmluZGluZ1R5cGU/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBrZXkgPSBiaW5kaW5nVHlwZSAhPT0gdW5kZWZpbmVkID8gYCR7YmluZGluZ1R5cGV9LyR7bmFtZX1gIDogbmFtZTtcbiAgICBpZiAodGhpcy5tZW1vLmJ5TmFtZS5jYWxsYWJsZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5ieU5hbWUuY2FsbGFibGUuZ2V0KGtleSkgYXMgT0RhdGFDYWxsYWJsZTxUPiB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLnNjaGVtYXNcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmNhbGxhYmxlc10sXG4gICAgICAgIDxPRGF0YUNhbGxhYmxlPFQ+W10+W11cbiAgICAgIClcbiAgICAgIC5maW5kKFxuICAgICAgICAoYykgPT5cbiAgICAgICAgICBjLm5hbWUgPT09IG5hbWUgJiZcbiAgICAgICAgICAoYmluZGluZ1R5cGUgPT09IHVuZGVmaW5lZCB8fCBjLmJpbmRpbmcoKT8udHlwZSA9PT0gYmluZGluZ1R5cGUpXG4gICAgICApO1xuICAgIHRoaXMubWVtby5ieU5hbWUuY2FsbGFibGUuc2V0KGtleSwgY2FsbGFibGUpO1xuICAgIHJldHVybiBjYWxsYWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kRW50aXR5U2V0QnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uYnlOYW1lLmVudGl0eVNldC5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uYnlOYW1lLmVudGl0eVNldC5nZXQobmFtZSkgYXMgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuc2NoZW1hc1xuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW50aXR5U2V0c10sXG4gICAgICAgIDxPRGF0YUVudGl0eVNldFtdPltdXG4gICAgICApXG4gICAgICAuZmluZCgoZSkgPT4gZS5uYW1lID09PSBuYW1lKTtcbiAgICB0aGlzLm1lbW8uYnlOYW1lLmVudGl0eVNldC5zZXQobmFtZSwgc2NoZW1hKTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgcHVibGljIGZpbmRNb2RlbEJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kU3RydWN0dXJlZFR5cGVCeU5hbWU8YW55PihuYW1lKT8ubW9kZWwgYXNcbiAgICAgIHwgdHlwZW9mIE9EYXRhTW9kZWxcbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRDb2xsZWN0aW9uQnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZUJ5TmFtZTxhbnk+KG5hbWUpPy5jb2xsZWN0aW9uIGFzXG4gICAgICB8IHR5cGVvZiBPRGF0YUNvbGxlY3Rpb25cbiAgICAgIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIGZpbmRTZXJ2aWNlQnlOYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZpbmRFbnRpdHlTZXRCeU5hbWUobmFtZSk/LnNlcnZpY2UgYXNcbiAgICAgIHwgdHlwZW9mIE9EYXRhRW50aXR5U2VydmljZVxuICAgICAgfCB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcGFyc2VyRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcgfCBFZG1UeXBlLCBiaW5kaW5nVHlwZT86IHN0cmluZykge1xuICAgIGNvbnN0IGtleSA9IGJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWQgPyBgJHtiaW5kaW5nVHlwZX0vJHt0eXBlfWAgOiB0eXBlO1xuICAgIGlmICh0aGlzLm1lbW8uZm9yVHlwZS5wYXJzZXIuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5wYXJzZXIuZ2V0KGtleSkgYXMgUGFyc2VyPFQ+O1xuICAgIH1cbiAgICAvLyBOb25lIFBhcnNlciBieSBkZWZhdWx0XG4gICAgbGV0IHBhcnNlcjogUGFyc2VyPFQ+ID0gTk9ORV9QQVJTRVI7XG4gICAgaWYgKHRoaXMucGFyc2Vycy5oYXModHlwZSkpIHtcbiAgICAgIC8vIEVkbSwgQmFzZSBQYXJzZXJzXG4gICAgICBwYXJzZXIgPSB0aGlzLnBhcnNlcnMuZ2V0KHR5cGUpIGFzIFBhcnNlcjxUPjtcbiAgICB9IGVsc2UgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ0VkbS4nKSkge1xuICAgICAgLy8gRW51bVR5cGUsIENvbXBsZXhUeXBlIGFuZCBFbnRpdHlUeXBlIFBhcnNlcnNcbiAgICAgIGxldCB2YWx1ZSA9XG4gICAgICAgIHRoaXMuZmluZENhbGxhYmxlRm9yVHlwZTxUPih0eXBlLCBiaW5kaW5nVHlwZSkgfHxcbiAgICAgICAgdGhpcy5maW5kRW51bVR5cGVGb3JUeXBlPFQ+KHR5cGUpIHx8XG4gICAgICAgIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgICAgIHBhcnNlciA9IHZhbHVlPy5wYXJzZXIgYXMgUGFyc2VyPFQ+O1xuICAgIH1cbiAgICAvLyBTZXQgUGFyc2VyIGZvciBuZXh0IHRpbWVcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5wYXJzZXIuc2V0KGtleSwgcGFyc2VyKTtcbiAgICByZXR1cm4gcGFyc2VyO1xuICB9XG5cbiAgcHVibGljIGZpbmRPcHRpb25zRm9yVHlwZTxUPih0eXBlOiBzdHJpbmcpIHtcbiAgICAvLyBTdHJ1Y3V0cmVkIE9wdGlvbnNcbiAgICBpZiAodGhpcy5tZW1vLmZvclR5cGUub3B0aW9ucy5oYXModHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZm9yVHlwZS5vcHRpb25zLmdldCh0eXBlKSBhc1xuICAgICAgICB8IE9EYXRhTW9kZWxPcHRpb25zPFQ+XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzdCA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlRm9yVHlwZTxUPih0eXBlKTtcbiAgICBjb25zdCBvcHRpb25zID0gc3Q/Lm1vZGVsPy5tZXRhO1xuICAgIC8vIFNldCBPcHRpb25zIGZvciBuZXh0IHRpbWVcbiAgICB0aGlzLm1lbW8uZm9yVHlwZS5vcHRpb25zLnNldCh0eXBlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gb3B0aW9ucztcbiAgfVxufVxuIl19
|
|
439
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDaEUsT0FBTyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBYyxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzlDLE9BQU8sRUFFTCxlQUFlLEVBQ2YsVUFBVSxHQUVYLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFNUMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsWUFBWSxFQUNaLGFBQWEsRUFDYixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsK0JBQStCLEdBQ2hDLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBSVgsV0FBVyxHQUdaLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFJTCxXQUFXLEVBR1gsV0FBVyxHQUdaLE1BQU0sU0FBUyxDQUFDO0FBR2pCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFFBQVE7SUFDbkIsU0FBUyxDQUFtRDtJQUM1RCxjQUFjLENBQVM7SUFDdkIsV0FBVyxDQUFTO0lBQ3BCLElBQUksQ0FBVTtJQUNkLE9BQU8sQ0FBZTtJQUN0QixPQUFPLENBQVU7SUFDakIsUUFBUSxDQUFPO0lBQ2YsVUFBVTtJQUNWLE9BQU8sQ0FBa0I7SUFD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QztJQUNoQixDQUFDO0lBRU0sY0FBYyxDQUNuQixJQUFZLEVBQ1osRUFDRSxjQUFjLEVBQ2QsTUFBTSxNQUNnRSxFQUFFO1FBRTFFLHFCQUFxQjtRQUNyQixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2hDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBcUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsSUFBSSxJQUFJLEdBQXFDLFNBQVMsQ0FBQztRQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzdCLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUksSUFBSSxDQUFDLElBQUksY0FBYyxDQUFDO1lBQ3BFLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztRQUNILENBQUM7UUFDRCw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNsQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFdmVudCwgSHR0cEV2ZW50VHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IE5FVkVSLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPRGF0YUNhY2hlLCBPRGF0YUluTWVtb3J5Q2FjaGUgfSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCB7IERFRkFVTFRfVkVSU0lPTiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIE1vZGVsT3B0aW9ucyxcbiAgT0RhdGFDb2xsZWN0aW9uLFxuICBPRGF0YU1vZGVsLFxuICBPRGF0YU1vZGVsT3B0aW9ucyxcbn0gZnJvbSAnLi9tb2RlbHMnO1xuaW1wb3J0IHsgT0RhdGFBcGlPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IE9EYXRhT3B0aW9ucywgT0RhdGFSZXNvdXJjZSwgT0RhdGFTZWdtZW50IH0gZnJvbSAnLi9yZXNvdXJjZXMnO1xuaW1wb3J0IHtcbiAgT0RhdGFRdWVyeU9wdGlvbnMsXG4gIE9EYXRhUGF0aFNlZ21lbnRzLFxuICBPRGF0YVJlcXVlc3QsXG4gIE9EYXRhUmVzcG9uc2UsXG4gIE9EYXRhQmF0Y2hSZXNvdXJjZSxcbiAgT0RhdGFNZXRhZGF0YVJlc291cmNlLFxuICBPRGF0YUFjdGlvblJlc291cmNlLFxuICBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5UmVzb3VyY2UsXG4gIE9EYXRhRW50aXR5U2V0UmVzb3VyY2UsXG4gIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UsXG4gIE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UsXG59IGZyb20gJy4vcmVzb3VyY2VzJztcbmltcG9ydCB7XG4gIEVETV9QQVJTRVJTLFxuICBPRGF0YUNhbGxhYmxlLFxuICBPRGF0YUVudGl0eVNldCxcbiAgT0RhdGFFbnVtVHlwZSxcbiAgT0RhdGFTY2hlbWEsXG4gIE9EYXRhU2luZ2xldG9uLFxuICBPRGF0YVN0cnVjdHVyZWRUeXBlLFxufSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQge1xuICBBcGlDb25maWcsXG4gIEFwaU9wdGlvbnMsXG4gIEVkbVR5cGUsXG4gIE5PTkVfUEFSU0VSLFxuICBPRGF0YVZlcnNpb24sXG4gIFBhcnNlcixcbiAgUGF0aFNlZ21lbnQsXG4gIFF1ZXJ5T3B0aW9uLFxuICBTY2hlbWFDb25maWcsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgT0RhdGFNZXRhZGF0YSB9IGZyb20gJy4vbWV0YWRhdGEvbWV0YWRhdGEnO1xuXG4vKipcbiAqIEFwaSBhYnN0cmFjdGlvbiBmb3IgY29uc3VtaW5nIE9EYXRhIHNlcnZpY2VzLlxuICovXG5leHBvcnQgY2xhc3MgT0RhdGFBcGkge1xuICByZXF1ZXN0ZXI/OiAocmVxdWVzdDogT0RhdGFSZXF1ZXN0PGFueT4pID0+IE9ic2VydmFibGU8YW55PjtcbiAgc2VydmljZVJvb3RVcmw6IHN0cmluZztcbiAgbWV0YWRhdGFVcmw6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgdmVyc2lvbjogT0RhdGFWZXJzaW9uO1xuICBkZWZhdWx0OiBib29sZWFuO1xuICBjcmVhdGlvbjogRGF0ZTtcbiAgLy8gT3B0aW9uc1xuICBvcHRpb25zOiBPRGF0YUFwaU9wdGlvbnM7XG4gIC8vIENhY2hlXG4gIGNhY2hlITogT0RhdGFDYWNoZTtcbiAgLy8gRXJyb3IgSGFuZGxlclxuICBlcnJvckhhbmRsZXI/OiAoZXJyb3I6IGFueSwgY2F1Z2h0OiBPYnNlcnZhYmxlPGFueT4pID0+IE9ic2VydmFibGU8bmV2ZXI+O1xuICAvLyBCYXNlIFBhcnNlcnNcbiAgcGFyc2VyczogTWFwPHN0cmluZywgUGFyc2VyPGFueT4+O1xuICAvLyBTY2hlbWFzXG4gIHNjaGVtYXM6IE9EYXRhU2NoZW1hW107XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBBcGlDb25maWcpIHtcbiAgICB0aGlzLnNlcnZpY2VSb290VXJsID0gY29uZmlnLnNlcnZpY2VSb290VXJsO1xuICAgIGlmICh0aGlzLnNlcnZpY2VSb290VXJsLmluY2x1ZGVzKCc/JykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiVGhlICdzZXJ2aWNlUm9vdFVybCcgc2hvdWxkIG5vdCBjb250YWluIHF1ZXJ5IHN0cmluZy4gUGxlYXNlIHVzZSAncGFyYW1zJyB0byBhZGQgZXh0cmEgcGFyYW1ldGVyc1wiLFxuICAgICAgKTtcbiAgICBpZiAoIXRoaXMuc2VydmljZVJvb3RVcmwuZW5kc1dpdGgoJy8nKSkgdGhpcy5zZXJ2aWNlUm9vdFVybCArPSAnLyc7XG4gICAgdGhpcy5tZXRhZGF0YVVybCA9IGNvbmZpZy5tZXRhZGF0YVVybCA/PyBgJHt0aGlzLnNlcnZpY2VSb290VXJsfSRtZXRhZGF0YWA7XG4gICAgdGhpcy5uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy52ZXJzaW9uID0gY29uZmlnLnZlcnNpb24gPz8gREVGQVVMVF9WRVJTSU9OO1xuICAgIHRoaXMuZGVmYXVsdCA9IGNvbmZpZy5kZWZhdWx0ID8/IGZhbHNlO1xuICAgIHRoaXMuY3JlYXRpb24gPSBjb25maWcuY3JlYXRpb24gPz8gbmV3IERhdGUoKTtcbiAgICB0aGlzLm9wdGlvbnMgPSBuZXcgT0RhdGFBcGlPcHRpb25zKHtcbiAgICAgIC4uLmNvbmZpZy5vcHRpb25zLFxuICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jYWNoZSA9IChjb25maWcuY2FjaGUgYXMgT0RhdGFDYWNoZSkgPz8gbmV3IE9EYXRhSW5NZW1vcnlDYWNoZSgpO1xuICAgIHRoaXMuZXJyb3JIYW5kbGVyID0gY29uZmlnLmVycm9ySGFuZGxlcjtcbiAgICB0aGlzLnBhcnNlcnMgPSBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGNvbmZpZy5wYXJzZXJzID8/IEVETV9QQVJTRVJTKSk7XG5cbiAgICB0aGlzLnNjaGVtYXMgPSAoY29uZmlnLnNjaGVtYXMgPz8gW10pLm1hcChcbiAgICAgIChzY2hlbWEpID0+IG5ldyBPRGF0YVNjaGVtYShzY2hlbWEsIHRoaXMpLFxuICAgICk7XG4gIH1cblxuICBjb25maWd1cmUoXG4gICAgc2V0dGluZ3M6IHtcbiAgICAgIHJlcXVlc3Rlcj86IChyZXF1ZXN0OiBPRGF0YVJlcXVlc3Q8YW55PikgPT4gT2JzZXJ2YWJsZTxhbnk+O1xuICAgIH0gPSB7fSxcbiAgKSB7XG4gICAgdGhpcy5yZXF1ZXN0ZXIgPSBzZXR0aW5ncy5yZXF1ZXN0ZXI7XG4gICAgdGhpcy5zY2hlbWFzLmZvckVhY2goKHNjaGVtYSkgPT4ge1xuICAgICAgc2NoZW1hLmNvbmZpZ3VyZSh7XG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwb3B1bGF0ZShtZXRhZGF0YTogT0RhdGFNZXRhZGF0YSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IG1ldGFkYXRhLnRvQ29uZmlnKCk7XG4gICAgdGhpcy52ZXJzaW9uID0gY29uZmlnLnZlcnNpb24gPz8gREVGQVVMVF9WRVJTSU9OO1xuICAgIGNvbnN0IHNjaGVtYXMgPSAoY29uZmlnLnNjaGVtYXMgPz8gW10pLm1hcChcbiAgICAgIChzY2hlbWEpID0+IG5ldyBPRGF0YVNjaGVtYShzY2hlbWEsIHRoaXMpLFxuICAgICk7XG4gICAgdGhpcy5zY2hlbWFzID0gWy4uLnRoaXMuc2NoZW1hcywgLi4uc2NoZW1hc107XG4gICAgc2NoZW1hcy5mb3JFYWNoKChzY2hlbWEpID0+IHtcbiAgICAgIHNjaGVtYS5jb25maWd1cmUoe1xuICAgICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZnJvbUpzb248UCwgUj4oanNvbjoge1xuICAgIHNlZ21lbnRzOiBPRGF0YVNlZ21lbnRbXTtcbiAgICBvcHRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSk6IE9EYXRhQWN0aW9uUmVzb3VyY2U8UCwgUj4gfCBPRGF0YUZ1bmN0aW9uUmVzb3VyY2U8UCwgUj47XG4gIGZyb21Kc29uPEU+KGpzb246IHtcbiAgICBzZWdtZW50czogT0RhdGFTZWdtZW50W107XG4gICAgb3B0aW9uczogeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gIH0pOlxuICAgIHwgT0RhdGFFbnRpdHlSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFOYXZpZ2F0aW9uUHJvcGVydHlSZXNvdXJjZTxFPlxuICAgIHwgT0RhdGFTaW5nbGV0b25SZXNvdXJjZTxFPjtcbiAgZnJvbUpzb24oanNvbjoge1xuICAgIHNlZ21lbnRzOiBPRGF0YVNlZ21lbnRbXTtcbiAgICBvcHRpb25zOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfTtcbiAgfSkge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gT0RhdGFQYXRoU2VnbWVudHMuZnJvbUpzb24oanNvbi5zZWdtZW50cyk7XG4gICAgY29uc3QgcXVlcnkgPSBPRGF0YVF1ZXJ5T3B0aW9ucy5mcm9tSnNvbjxhbnk+KGpzb24ub3B0aW9ucyk7XG4gICAgc3dpdGNoIChzZWdtZW50cy5sYXN0KCk/Lm5hbWUgYXMgUGF0aFNlZ21lbnQpIHtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuZW50aXR5U2V0OlxuICAgICAgICBpZiAoc2VnbWVudHMubGFzdCgpPy5oYXNLZXkoKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgT0RhdGFFbnRpdHlSZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IE9EYXRhRW50aXR5U2V0UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQubmF2aWdhdGlvblByb3BlcnR5OlxuICAgICAgICByZXR1cm4gbmV3IE9EYXRhTmF2aWdhdGlvblByb3BlcnR5UmVzb3VyY2UodGhpcywgeyBzZWdtZW50cywgcXVlcnkgfSk7XG4gICAgICBjYXNlIFBhdGhTZWdtZW50LnNpbmdsZXRvbjpcbiAgICAgICAgcmV0dXJuIG5ldyBPRGF0YVNpbmdsZXRvblJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgICAgY2FzZSBQYXRoU2VnbWVudC5hY3Rpb246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFBY3Rpb25SZXNvdXJjZSh0aGlzLCB7IHNlZ21lbnRzLCBxdWVyeSB9KTtcbiAgICAgIGNhc2UgUGF0aFNlZ21lbnQuZnVuY3Rpb246XG4gICAgICAgIHJldHVybiBuZXcgT0RhdGFGdW5jdGlvblJlc291cmNlKHRoaXMsIHsgc2VnbWVudHMsIHF1ZXJ5IH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIFJlc291cmNlIGZvciBqc29uJyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBtZXRhZGF0YSByZXNvdXJjZS5cbiAgICogQHJldHVybnMgT0RhdGFNZXRhZGF0YVJlc291cmNlXG4gICAqL1xuICBtZXRhZGF0YSgpOiBPRGF0YU1ldGFkYXRhUmVzb3VyY2Uge1xuICAgIHJldHVybiBPRGF0YU1ldGFkYXRhUmVzb3VyY2UuZmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhIGJhdGNoIHJlc291cmNlLlxuICAgKiBAcmV0dXJucyBPRGF0YUJhdGNoUmVzb3VyY2VcbiAgICovXG4gIGJhdGNoKCk6IE9EYXRhQmF0Y2hSZXNvdXJjZSB7XG4gICAgcmV0dXJuIE9EYXRhQmF0Y2hSZXNvdXJjZS5mYWN0b3J5KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgc2luZ2xldG9uIHJlc291cmNlLlxuICAgKiBAcGFyYW0gcGF0aCBOYW1lIG9mIHRoZSBzaW5nbGV0b25cbiAgICogQHJldHVybnNcbiAgICovXG4gIHNpbmdsZXRvbjxUPihuYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzaW5nbGV0b24gPSB0aGlzLmZpbmRTaW5nbGV0b24obmFtZSk7XG4gICAgcmV0dXJuIE9EYXRhU2luZ2xldG9uUmVzb3VyY2UuZmFjdG9yeTxUPih0aGlzLCB7XG4gICAgICBwYXRoOiBzaW5nbGV0b24/Lm5hbWUgPz8gbmFtZSxcbiAgICAgIHR5cGU6IHNpbmdsZXRvbj8uc2luZ2xldG9uVHlwZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBhbiBlbnRpdHkgc2V0IHJlc291cmNlLlxuICAgKiBAcGFyYW0gcGF0aCBOYW1lIG9mIHRoZSBlbnRpdHkgc2V0XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBlbnRpdHlTZXQ8VD4obmFtZTogc3RyaW5nKTogT0RhdGFFbnRpdHlTZXRSZXNvdXJjZTxUPiB7XG4gICAgY29uc3QgZW50aXR5U2V0ID0gdGhpcy5maW5kRW50aXR5U2V0KG5hbWUpO1xuICAgIHJldHVybiBPRGF0YUVudGl0eVNldFJlc291cmNlLmZhY3Rvcnk8VD4odGhpcywge1xuICAgICAgcGF0aDogZW50aXR5U2V0Py5uYW1lID8/IG5hbWUsXG4gICAgICB0eXBlOiBlbnRpdHlTZXQ/LmVudGl0eVR5cGUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5ib3VuZCBBY3Rpb25cbiAgICogQHBhcmFtICB7c3RyaW5nfSBwYXRoP1xuICAgKiBAcmV0dXJucyBPRGF0YUFjdGlvblJlc291cmNlXG4gICAqL1xuICBhY3Rpb248UCwgUj4ocGF0aDogc3RyaW5nKTogT0RhdGFBY3Rpb25SZXNvdXJjZTxQLCBSPiB7XG4gICAgY29uc3QgY2FsbGFibGUgPSB0aGlzLmZpbmRDYWxsYWJsZTxSPihwYXRoKTtcbiAgICByZXR1cm4gT0RhdGFBY3Rpb25SZXNvdXJjZS5mYWN0b3J5PFAsIFI+KHRoaXMsIHtcbiAgICAgIHBhdGgsXG4gICAgICBvdXRnb2luZ1R5cGU6IGNhbGxhYmxlPy50eXBlKCksXG4gICAgICBpbmNvbWluZ1R5cGU6IGNhbGxhYmxlPy5yZXR1cm5UeXBlKCksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5ib3VuZCBGdW5jdGlvblxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IHBhdGg/XG4gICAqIEByZXR1cm5zIE9EYXRhRnVuY3Rpb25SZXNvdXJjZVxuICAgKi9cbiAgZnVuY3Rpb248UCwgUj4ocGF0aDogc3RyaW5nKTogT0RhdGFGdW5jdGlvblJlc291cmNlPFAsIFI+IHtcbiAgICBjb25zdCBjYWxsYWJsZSA9IHRoaXMuZmluZENhbGxhYmxlPFI+KHBhdGgpO1xuICAgIHJldHVybiBPRGF0YUZ1bmN0aW9uUmVzb3VyY2UuZmFjdG9yeTxQLCBSPih0aGlzLCB7XG4gICAgICBwYXRoLFxuICAgICAgb3V0Z29pbmdUeXBlOiBjYWxsYWJsZT8udHlwZSgpLFxuICAgICAgaW5jb21pbmdUeXBlOiBjYWxsYWJsZT8ucmV0dXJuVHlwZSgpLFxuICAgIH0pO1xuICB9XG5cbiAgY2FsbGFibGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZENhbGxhYmxlPFQ+KHR5cGUpO1xuICB9XG5cbiAgZW51bVR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZEVudW1UeXBlPFQ+KHR5cGUpO1xuICB9XG5cbiAgc3RydWN0dXJlZFR5cGU8VD4odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlPFQ+KHR5cGUpO1xuICB9XG5cbiAgLy9yZXF1ZXN0KHJlcTogT0RhdGFSZXF1ZXN0PGFueT4pOiBPYnNlcnZhYmxlPGFueT4ge1xuICByZXF1ZXN0PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHJlc291cmNlOiBPRGF0YVJlc291cmNlPGFueT4sXG4gICAgb3B0aW9uczogT0RhdGFPcHRpb25zICYge1xuICAgICAgYm9keT86IGFueTtcbiAgICAgIGV0YWc/OiBzdHJpbmc7XG4gICAgICByZXNwb25zZVR5cGU/OlxuICAgICAgICB8ICdhcnJheWJ1ZmZlcidcbiAgICAgICAgfCAnYmxvYidcbiAgICAgICAgfCAnanNvbidcbiAgICAgICAgfCAndGV4dCdcbiAgICAgICAgfCAndmFsdWUnXG4gICAgICAgIHwgJ3Byb3BlcnR5J1xuICAgICAgICB8ICdlbnRpdHknXG4gICAgICAgIHwgJ2VudGl0aWVzJztcbiAgICAgIG9ic2VydmU/OiAnYm9keScgfCAnZXZlbnRzJyB8ICdyZXNwb25zZSc7XG4gICAgICB3aXRoQ291bnQ/OiBib29sZWFuO1xuICAgICAgYm9keVF1ZXJ5T3B0aW9ucz86IFF1ZXJ5T3B0aW9uW107XG4gICAgfSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBsZXQgcmVxID0gT0RhdGFSZXF1ZXN0LmZhY3RvcnkodGhpcywgbWV0aG9kLCByZXNvdXJjZSwge1xuICAgICAgYm9keTogb3B0aW9ucy5ib2R5LFxuICAgICAgZXRhZzogb3B0aW9ucy5ldGFnLFxuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LFxuICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzLFxuICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcyxcbiAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsXG4gICAgICBvYnNlcnZlOiAob3B0aW9ucy5vYnNlcnZlID09PSAnZXZlbnRzJyA/ICdldmVudHMnIDogJ3Jlc3BvbnNlJykgYXNcbiAgICAgICAgfCAnZXZlbnRzJ1xuICAgICAgICB8ICdyZXNwb25zZScsXG4gICAgICB3aXRoQ291bnQ6IG9wdGlvbnMud2l0aENvdW50LFxuICAgICAgYm9keVF1ZXJ5T3B0aW9uczogb3B0aW9ucy5ib2R5UXVlcnlPcHRpb25zLFxuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsXG4gICAgICBmZXRjaFBvbGljeTogb3B0aW9ucy5mZXRjaFBvbGljeSxcbiAgICAgIHBhcnNlck9wdGlvbnM6IG9wdGlvbnMucGFyc2VyT3B0aW9ucyxcbiAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsXG4gICAgfSk7XG5cbiAgICBsZXQgcmVzJCA9IHRoaXMucmVxdWVzdGVyICE9PSB1bmRlZmluZWQgPyB0aGlzLnJlcXVlc3RlcihyZXEpIDogTkVWRVI7XG5cbiAgICByZXMkID0gcmVzJC5waXBlKFxuICAgICAgbWFwKChyZXM6IEh0dHBFdmVudDxhbnk+KSA9PlxuICAgICAgICByZXMudHlwZSA9PT0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZVxuICAgICAgICAgID8gT0RhdGFSZXNwb25zZS5mcm9tSHR0cFJlc3BvbnNlPGFueT4ocmVxLCByZXMpXG4gICAgICAgICAgOiByZXMsXG4gICAgICApLFxuICAgICk7XG5cbiAgICBpZiAodGhpcy5lcnJvckhhbmRsZXIgIT09IHVuZGVmaW5lZClcbiAgICAgIHJlcyQgPSByZXMkLnBpcGUoY2F0Y2hFcnJvcih0aGlzLmVycm9ySGFuZGxlcikpO1xuXG4gICAgaWYgKG9wdGlvbnMub2JzZXJ2ZSA9PT0gJ2V2ZW50cycpIHtcbiAgICAgIHJldHVybiByZXMkO1xuICAgIH1cblxuICAgIHJlcyQgPSB0aGlzLmNhY2hlLmhhbmRsZVJlcXVlc3QocmVxLCByZXMkKTtcblxuICAgIHN3aXRjaCAob3B0aW9ucy5vYnNlcnZlIHx8ICdib2R5Jykge1xuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICAgIHN3aXRjaCAob3B0aW9ucy5yZXNwb25zZVR5cGUpIHtcbiAgICAgICAgICBjYXNlICdlbnRpdGllcyc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMuZW50aXRpZXMoKSkpO1xuICAgICAgICAgIGNhc2UgJ2VudGl0eSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMuZW50aXR5KCkpKTtcbiAgICAgICAgICBjYXNlICdwcm9wZXJ0eSc6XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMucHJvcGVydHkoKSkpO1xuICAgICAgICAgIGNhc2UgJ3ZhbHVlJzpcbiAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKChyZXM6IE9EYXRhUmVzcG9uc2U8VD4pID0+IHJlcy52YWx1ZSgpIGFzIFQpKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgLy8gT3RoZXIgcmVzcG9uc2VUeXBlcyAoYXJyYXlidWZmZXIsIGJsb2IsIGpzb24sIHRleHQpIHJldHVybiBib2R5XG4gICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgocmVzOiBPRGF0YVJlc3BvbnNlPFQ+KSA9PiByZXMuYm9keSkpO1xuICAgICAgICB9XG4gICAgICBjYXNlICdyZXNwb25zZSc6XG4gICAgICAgIC8vIFRoZSByZXNwb25zZSBzdHJlYW0gd2FzIHJlcXVlc3RlZCBkaXJlY3RseSwgc28gcmV0dXJuIGl0LlxuICAgICAgICByZXR1cm4gcmVzJDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgbmV3IGZ1dHVyZSBvYnNlcnZlIHR5cGVzIGJlaW5nIGFkZGVkLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFVucmVhY2hhYmxlOiB1bmhhbmRsZWQgb2JzZXJ2ZSB0eXBlICR7b3B0aW9ucy5vYnNlcnZlfX1gLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIyByZWdpb24gRmluZCBieSBUeXBlXG4gIC8vIE1lbW9pemVcbiAgcHJpdmF0ZSBtZW1vOiB7XG4gICAgZW51bVR5cGVzOiBNYXA8c3RyaW5nLCBPRGF0YUVudW1UeXBlPGFueT4gfCB1bmRlZmluZWQ+O1xuICAgIHN0cnVjdHVyZWRUeXBlczogTWFwPHN0cmluZywgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxhbnk+IHwgdW5kZWZpbmVkPjtcbiAgICBjYWxsYWJsZXM6IE1hcDxzdHJpbmcsIE9EYXRhQ2FsbGFibGU8YW55PiB8IHVuZGVmaW5lZD47XG4gICAgZW50aXR5U2V0czogTWFwPHN0cmluZywgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ+O1xuICAgIHNpbmdsZXRvbnM6IE1hcDxzdHJpbmcsIE9EYXRhU2luZ2xldG9uIHwgdW5kZWZpbmVkPjtcbiAgICBwYXJzZXJzOiBNYXA8c3RyaW5nLCBQYXJzZXI8YW55Pj47XG4gICAgb3B0aW9uczogTWFwPHN0cmluZywgT0RhdGFNb2RlbE9wdGlvbnM8YW55PiB8IHVuZGVmaW5lZD47XG4gIH0gPSB7XG4gICAgZW51bVR5cGVzOiBuZXcgTWFwPHN0cmluZywgT0RhdGFFbnVtVHlwZTxhbnk+IHwgdW5kZWZpbmVkPigpLFxuICAgIHN0cnVjdHVyZWRUeXBlczogbmV3IE1hcDxzdHJpbmcsIE9EYXRhU3RydWN0dXJlZFR5cGU8YW55PiB8IHVuZGVmaW5lZD4oKSxcbiAgICBjYWxsYWJsZXM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YUNhbGxhYmxlPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gICAgZW50aXR5U2V0czogbmV3IE1hcDxzdHJpbmcsIE9EYXRhRW50aXR5U2V0IHwgdW5kZWZpbmVkPigpLFxuICAgIHNpbmdsZXRvbnM6IG5ldyBNYXA8c3RyaW5nLCBPRGF0YVNpbmdsZXRvbiB8IHVuZGVmaW5lZD4oKSxcbiAgICBwYXJzZXJzOiBuZXcgTWFwPHN0cmluZywgUGFyc2VyPGFueT4+KCksXG4gICAgb3B0aW9uczogbmV3IE1hcDxzdHJpbmcsIE9EYXRhTW9kZWxPcHRpb25zPGFueT4gfCB1bmRlZmluZWQ+KCksXG4gIH07XG5cbiAgcHVibGljIGNyZWF0ZVNjaGVtYShjb25maWc6IFNjaGVtYUNvbmZpZykge1xuICAgIGNvbnN0IHNjaGVtYSA9IG5ldyBPRGF0YVNjaGVtYShjb25maWcsIHRoaXMpO1xuICAgIHNjaGVtYS5jb25maWd1cmUoe1xuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zLnBhcnNlck9wdGlvbnMsXG4gICAgfSk7XG4gICAgdGhpcy5zY2hlbWFzLnB1c2goc2NoZW1hKTtcbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgcHVibGljIGZpbmRTY2hlbWEodHlwZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2NoZW1hcyA9IHRoaXMuc2NoZW1hcy5maWx0ZXIoKHMpID0+IHMuaXNOYW1lc3BhY2VPZih0eXBlKSk7XG4gICAgaWYgKHNjaGVtYXMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChzY2hlbWFzLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHNjaGVtYXNbMF07XG4gICAgcmV0dXJuIHNjaGVtYXNcbiAgICAgIC5zb3J0KChzMSwgczIpID0+IHMxLm5hbWVzcGFjZS5sZW5ndGggLSBzMi5uYW1lc3BhY2UubGVuZ3RoKVxuICAgICAgLnBvcCgpO1xuICB9XG5cbiAgLy8jcmVnaW9uIEVudW1UeXBlc1xuICBwdWJsaWMgZmluZEVudW1UeXBlPFQ+KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLmVudW1UeXBlcy5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmVudW1UeXBlcy5nZXQodmFsdWUpIGFzIE9EYXRhRW51bVR5cGU8VD4gfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVudW1UeXBlcyA9IHRoaXMuc2NoZW1hcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnVtc10sXG4gICAgICA8T0RhdGFFbnVtVHlwZTxUPltdPltdLFxuICAgICk7XG4gICAgbGV0IGVudW1UeXBlID0gZW51bVR5cGVzLmZpbmQoKGUpID0+IGUudHlwZSgpID09PSB2YWx1ZSk7XG4gICAgZW51bVR5cGUgPSBlbnVtVHlwZSA/PyBlbnVtVHlwZXMuZmluZCgoZSkgPT4gZS5uYW1lID09PSB2YWx1ZSk7XG4gICAgdGhpcy5tZW1vLmVudW1UeXBlcy5zZXQodmFsdWUsIGVudW1UeXBlKTtcbiAgICByZXR1cm4gZW51bVR5cGU7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFN0cnVjdHVyZWRUeXBlc1xuICBwdWJsaWMgZmluZFN0cnVjdHVyZWRUeXBlPFQ+KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5tZW1vLnN0cnVjdHVyZWRUeXBlcy5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLnN0cnVjdHVyZWRUeXBlcy5nZXQodmFsdWUpIGFzXG4gICAgICAgIHwgT0RhdGFTdHJ1Y3R1cmVkVHlwZTxUPlxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3Qgc3RydWN0dXJlZFR5cGVzID0gdGhpcy5zY2hlbWFzLnJlZHVjZShcbiAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLmVudGl0aWVzXSxcbiAgICAgIDxPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+W10+W10sXG4gICAgKTtcbiAgICBsZXQgc3RydWN0dXJlZFR5cGUgPSBzdHJ1Y3R1cmVkVHlwZXMuZmluZCgoZSkgPT4gZS50eXBlKCkgPT09IHZhbHVlKTtcbiAgICBzdHJ1Y3R1cmVkVHlwZSA9XG4gICAgICBzdHJ1Y3R1cmVkVHlwZSA/PyBzdHJ1Y3R1cmVkVHlwZXMuZmluZCgoZSkgPT4gZS5uYW1lID09PSB2YWx1ZSk7XG4gICAgdGhpcy5tZW1vLnN0cnVjdHVyZWRUeXBlcy5zZXQodmFsdWUsIHN0cnVjdHVyZWRUeXBlKTtcbiAgICByZXR1cm4gc3RydWN0dXJlZFR5cGU7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIENhbGxhYmxlc1xuICBwdWJsaWMgZmluZENhbGxhYmxlPFI+KHZhbHVlOiBzdHJpbmcsIGJpbmRpbmdUeXBlPzogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5ID0gYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCA/IGAke2JpbmRpbmdUeXBlfS8ke3ZhbHVlfWAgOiB2YWx1ZTtcbiAgICBpZiAodGhpcy5tZW1vLmNhbGxhYmxlcy5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMubWVtby5jYWxsYWJsZXMuZ2V0KGtleSkgYXMgT0RhdGFDYWxsYWJsZTxSPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5kaW5nU3RydWN0dXJlZFR5cGUgPVxuICAgICAgYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlPGFueT4oYmluZGluZ1R5cGUpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNhbGxhYmxlcyA9IHRoaXMuc2NoZW1hcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5jYWxsYWJsZXNdLFxuICAgICAgPE9EYXRhQ2FsbGFibGU8Uj5bXT5bXSxcbiAgICApO1xuICAgIGxldCBjYWxsYWJsZSA9IGNhbGxhYmxlcy5maW5kKChjKSA9PiB7XG4gICAgICBjb25zdCBpc0NhbGxhYmxlVHlwZSA9IGMudHlwZSgpID09IHZhbHVlO1xuICAgICAgY29uc3QgY2FsbGFibGVCaW5kaW5nVHlwZSA9IGMuYmluZGluZygpPy50eXBlO1xuICAgICAgY29uc3QgY2FsbGFibGVCaW5kaW5nU3RydWN0dXJlZFR5cGUgPVxuICAgICAgICBjYWxsYWJsZUJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlKGNhbGxhYmxlQmluZGluZ1R5cGUpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzQ2FsbGFibGVUeXBlICYmXG4gICAgICAgICghYmluZGluZ1N0cnVjdHVyZWRUeXBlIHx8XG4gICAgICAgICAgKGNhbGxhYmxlQmluZGluZ1N0cnVjdHVyZWRUeXBlICYmXG4gICAgICAgICAgICBiaW5kaW5nU3RydWN0dXJlZFR5cGUuaXNTdWJ0eXBlT2YoY2FsbGFibGVCaW5kaW5nU3RydWN0dXJlZFR5cGUpKSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY2FsbGFibGUgPVxuICAgICAgY2FsbGFibGUgPz9cbiAgICAgIGNhbGxhYmxlcy5maW5kKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzQ2FsbGFibGVUeXBlID0gYy5uYW1lID09IHZhbHVlO1xuICAgICAgICBjb25zdCBjYWxsYWJsZUJpbmRpbmdUeXBlID0gYy5iaW5kaW5nKCk/LnR5cGU7XG4gICAgICAgIGNvbnN0IGNhbGxhYmxlQmluZGluZ1N0cnVjdHVyZWRUeXBlID1cbiAgICAgICAgICBjYWxsYWJsZUJpbmRpbmdUeXBlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gdGhpcy5maW5kU3RydWN0dXJlZFR5cGUoY2FsbGFibGVCaW5kaW5nVHlwZSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgaXNDYWxsYWJsZVR5cGUgJiZcbiAgICAgICAgICAoIWJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSB8fFxuICAgICAgICAgICAgKGNhbGxhYmxlQmluZGluZ1N0cnVjdHVyZWRUeXBlICYmXG4gICAgICAgICAgICAgIGJpbmRpbmdTdHJ1Y3R1cmVkVHlwZS5pc1N1YnR5cGVPZihjYWxsYWJsZUJpbmRpbmdTdHJ1Y3R1cmVkVHlwZSkpKVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLm1lbW8uY2FsbGFibGVzLnNldChrZXksIGNhbGxhYmxlKTtcbiAgICByZXR1cm4gY2FsbGFibGU7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIEVudGl0eVNldHNcbiAgcHVibGljIGZpbmRFbnRpdHlTZXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZW50aXR5U2V0cy5oYXModmFsdWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLmVudGl0eVNldHMuZ2V0KHZhbHVlKSBhcyBPRGF0YUVudGl0eVNldCB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZW50aXR5U2V0cyA9IHRoaXMuc2NoZW1hcy5yZWR1Y2UoXG4gICAgICAoYWNjLCBzY2hlbWEpID0+IFsuLi5hY2MsIC4uLnNjaGVtYS5lbnRpdHlTZXRzXSxcbiAgICAgIDxPRGF0YUVudGl0eVNldFtdPltdLFxuICAgICk7XG4gICAgbGV0IGVudGl0eVNldCA9IGVudGl0eVNldHMuZmluZCgoZSkgPT4gZS50eXBlKCkgPT09IHZhbHVlKTtcbiAgICBlbnRpdHlTZXQgPSBlbnRpdHlTZXQgPz8gZW50aXR5U2V0cy5maW5kKChlKSA9PiBlLm5hbWUgPT09IHZhbHVlKTtcbiAgICB0aGlzLm1lbW8uZW50aXR5U2V0cy5zZXQodmFsdWUsIGVudGl0eVNldCk7XG4gICAgcmV0dXJuIGVudGl0eVNldDtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICAvLyNyZWdpb24gU2luZ2xldG9uc1xuICBwdWJsaWMgZmluZFNpbmdsZXRvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMubWVtby5zaW5nbGV0b25zLmhhcyh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uc2luZ2xldG9ucy5nZXQodmFsdWUpIGFzIE9EYXRhU2luZ2xldG9uIHwgdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBzaW5nbGV0b25zID0gdGhpcy5zY2hlbWFzLnJlZHVjZShcbiAgICAgIChhY2MsIHNjaGVtYSkgPT4gWy4uLmFjYywgLi4uc2NoZW1hLnNpbmdsZXRvbnNdLFxuICAgICAgPE9EYXRhU2luZ2xldG9uW10+W10sXG4gICAgKTtcbiAgICBsZXQgc2luZ2xldG9uID0gc2luZ2xldG9ucy5maW5kKChlKSA9PiBlLnR5cGUoKSA9PT0gdmFsdWUpO1xuICAgIHNpbmdsZXRvbiA9IHNpbmdsZXRvbiA/PyBzaW5nbGV0b25zLmZpbmQoKGUpID0+IGUubmFtZSA9PT0gdmFsdWUpO1xuICAgIHRoaXMubWVtby5zaW5nbGV0b25zLnNldCh2YWx1ZSwgc2luZ2xldG9uKTtcbiAgICByZXR1cm4gc2luZ2xldG9uO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIHB1YmxpYyBmaW5kTW9kZWwodHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlPGFueT4odHlwZSk/Lm1vZGVsO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZU1vZGVsKHN0cnVjdHVyZWQ6IE9EYXRhU3RydWN0dXJlZFR5cGU8YW55Pikge1xuICAgIGlmIChzdHJ1Y3R1cmVkLm1vZGVsICE9PSB1bmRlZmluZWQpIHJldHVybiBzdHJ1Y3R1cmVkLm1vZGVsO1xuICAgIC8vIEJ1aWxkIEFkLWhvYyBtb2RlbFxuICAgIGNvbnN0IE1vZGVsID0gY2xhc3MgZXh0ZW5kcyBPRGF0YU1vZGVsPGFueT4ge30gYXMgdHlwZW9mIE9EYXRhTW9kZWw7XG4gICAgLy8gQnVpbGQgTWV0YVxuICAgIE1vZGVsLm1ldGEgPSB0aGlzLm9wdGlvbnNGb3JUeXBlKHN0cnVjdHVyZWQudHlwZSgpLCB7XG4gICAgICBzdHJ1Y3R1cmVkVHlwZTogc3RydWN0dXJlZCxcbiAgICB9KSE7XG4gICAgaWYgKE1vZGVsLm1ldGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQ29uZmlndXJlXG4gICAgICBNb2RlbC5tZXRhLmNvbmZpZ3VyZSh7XG4gICAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucy5wYXJzZXJPcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIFN0b3JlIE5ldyBNb2RlbCBmb3IgbmV4dCB0aW1lXG4gICAgc3RydWN0dXJlZC5tb2RlbCA9IE1vZGVsO1xuICAgIHJldHVybiBNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBtb2RlbEZvclR5cGUodHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IE1vZGVsID0gdGhpcy5maW5kTW9kZWwodHlwZSk7XG4gICAgaWYgKE1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHN0cnVjdHVyZWQgPSB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxhbnk+KHR5cGUpO1xuICAgICAgaWYgKHN0cnVjdHVyZWQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgdGhyb3cgRXJyb3IoYE5vIHN0cnVjdHVyZWQgdHlwZSBmb3IgJHt0eXBlfWApO1xuICAgICAgTW9kZWwgPSB0aGlzLmNyZWF0ZU1vZGVsKHN0cnVjdHVyZWQpO1xuICAgIH1cbiAgICByZXR1cm4gTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZmluZENvbGxlY3Rpb24odHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlPGFueT4odHlwZSk/LmNvbGxlY3Rpb247XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQ29sbGVjdGlvbihcbiAgICBzdHJ1Y3R1cmVkOiBPRGF0YVN0cnVjdHVyZWRUeXBlPGFueT4sXG4gICAgbW9kZWw/OiB0eXBlb2YgT0RhdGFNb2RlbDxhbnk+LFxuICApIHtcbiAgICBpZiAoc3RydWN0dXJlZC5jb2xsZWN0aW9uICE9PSB1bmRlZmluZWQpIHJldHVybiBzdHJ1Y3R1cmVkLmNvbGxlY3Rpb247XG4gICAgaWYgKG1vZGVsID09PSB1bmRlZmluZWQpIG1vZGVsID0gdGhpcy5jcmVhdGVNb2RlbChzdHJ1Y3R1cmVkKTtcbiAgICBjb25zdCBDb2xsZWN0aW9uID0gY2xhc3MgZXh0ZW5kcyBPRGF0YUNvbGxlY3Rpb248YW55LCBPRGF0YU1vZGVsPGFueT4+IHtcbiAgICAgIHN0YXRpYyBvdmVycmlkZSBtb2RlbCA9IG1vZGVsITtcbiAgICB9IGFzIHR5cGVvZiBPRGF0YUNvbGxlY3Rpb247XG4gICAgc3RydWN0dXJlZC5jb2xsZWN0aW9uID0gQ29sbGVjdGlvbjtcbiAgICByZXR1cm4gQ29sbGVjdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBjb2xsZWN0aW9uRm9yVHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBsZXQgQ29sbGVjdGlvbiA9IHRoaXMuZmluZENvbGxlY3Rpb24odHlwZSk7XG4gICAgaWYgKENvbGxlY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc3RydWN0dXJlZCA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlPGFueT4odHlwZSk7XG4gICAgICBpZiAoc3RydWN0dXJlZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICB0aHJvdyBFcnJvcihgTm8gc3RydWN0dXJlZCB0eXBlIGZvciAke3R5cGV9YCk7XG4gICAgICBjb25zdCBNb2RlbCA9IHRoaXMubW9kZWxGb3JUeXBlKHR5cGUpO1xuICAgICAgQ29sbGVjdGlvbiA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvbihzdHJ1Y3R1cmVkLCBNb2RlbCk7XG4gICAgfVxuICAgIHJldHVybiBDb2xsZWN0aW9uO1xuICB9XG5cbiAgcHVibGljIGZpbmRFbnRpdHlTZXRGb3JFbnRpdHlUeXBlKGVudGl0eVR5cGU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm1lbW8uZW50aXR5U2V0cy5oYXMoZW50aXR5VHlwZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lbW8uZW50aXR5U2V0cy5nZXQoZW50aXR5VHlwZSkgYXMgT0RhdGFFbnRpdHlTZXQgfCB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGVudGl0eVNldCA9IHRoaXMuc2NoZW1hc1xuICAgICAgLnJlZHVjZShcbiAgICAgICAgKGFjYywgc2NoZW1hKSA9PiBbLi4uYWNjLCAuLi5zY2hlbWEuZW50aXR5U2V0c10sXG4gICAgICAgIDxPRGF0YUVudGl0eVNldFtdPltdLFxuICAgICAgKVxuICAgICAgLmZpbmQoKGUpID0+IGUuZW50aXR5VHlwZSA9PT0gZW50aXR5VHlwZSk7XG4gICAgdGhpcy5tZW1vLmVudGl0eVNldHMuc2V0KGVudGl0eVR5cGUsIGVudGl0eVNldCk7XG4gICAgcmV0dXJuIGVudGl0eVNldDtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZXJGb3JUeXBlPFQ+KHR5cGU6IHN0cmluZyB8IEVkbVR5cGUsIGJpbmRpbmdUeXBlPzogc3RyaW5nKSB7XG4gICAgY29uc3Qga2V5ID0gYmluZGluZ1R5cGUgIT09IHVuZGVmaW5lZCA/IGAke2JpbmRpbmdUeXBlfS8ke3R5cGV9YCA6IHR5cGU7XG4gICAgaWYgKHRoaXMubWVtby5wYXJzZXJzLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLnBhcnNlcnMuZ2V0KGtleSkgYXMgUGFyc2VyPFQ+O1xuICAgIH1cbiAgICAvLyBOb25lIFBhcnNlciBieSBkZWZhdWx0XG4gICAgbGV0IHBhcnNlcjogUGFyc2VyPFQ+ID0gTk9ORV9QQVJTRVI7XG4gICAgaWYgKHRoaXMucGFyc2Vycy5oYXModHlwZSkpIHtcbiAgICAgIC8vIEVkbSwgQmFzZSBQYXJzZXJzXG4gICAgICBwYXJzZXIgPSB0aGlzLnBhcnNlcnMuZ2V0KHR5cGUpIGFzIFBhcnNlcjxUPjtcbiAgICB9IGVsc2UgaWYgKCF0eXBlLnN0YXJ0c1dpdGgoJ0VkbS4nKSkge1xuICAgICAgLy8gQ2FsbGFibGUsIEVudW1UeXBlLCBTdHJ1Y3R1cmVkVHlwZSAoQ29tcGxleFR5cGUgYW5kIEVudGl0eVR5cGUpIFBhcnNlcnNcbiAgICAgIGxldCB2YWx1ZSA9XG4gICAgICAgIHRoaXMuZmluZENhbGxhYmxlPFQ+KHR5cGUsIGJpbmRpbmdUeXBlKSA/P1xuICAgICAgICB0aGlzLmZpbmRFbnVtVHlwZTxUPih0eXBlKSA/P1xuICAgICAgICB0aGlzLmZpbmRTdHJ1Y3R1cmVkVHlwZTxUPih0eXBlKTtcbiAgICAgIHBhcnNlciA9IHZhbHVlPy5wYXJzZXIgYXMgUGFyc2VyPFQ+O1xuICAgIH1cbiAgICAvLyBTZXQgUGFyc2VyIGZvciBuZXh0IHRpbWVcbiAgICB0aGlzLm1lbW8ucGFyc2Vycy5zZXQoa2V5LCBwYXJzZXIpO1xuICAgIHJldHVybiBwYXJzZXI7XG4gIH1cblxuICBwdWJsaWMgb3B0aW9uc0ZvclR5cGU8VD4oXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIHtcbiAgICAgIHN0cnVjdHVyZWRUeXBlLFxuICAgICAgY29uZmlnLFxuICAgIH06IHsgc3RydWN0dXJlZFR5cGU/OiBPRGF0YVN0cnVjdHVyZWRUeXBlPFQ+OyBjb25maWc/OiBNb2RlbE9wdGlvbnMgfSA9IHt9LFxuICApIHtcbiAgICAvLyBTdHJ1Y3V0cmVkIE9wdGlvbnNcbiAgICBpZiAodGhpcy5tZW1vLm9wdGlvbnMuaGFzKHR5cGUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW1vLm9wdGlvbnMuZ2V0KHR5cGUpIGFzIE9EYXRhTW9kZWxPcHRpb25zPFQ+IHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGxldCBtZXRhOiBPRGF0YU1vZGVsT3B0aW9uczxUPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR5cGUuc3RhcnRzV2l0aCgnRWRtLicpKSB7XG4gICAgICBzdHJ1Y3R1cmVkVHlwZSA9IHRoaXMuZmluZFN0cnVjdHVyZWRUeXBlPFQ+KHR5cGUpID8/IHN0cnVjdHVyZWRUeXBlO1xuICAgICAgaWYgKHN0cnVjdHVyZWRUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbWV0YSA9IE9EYXRhTW9kZWwuYnVpbGRNZXRhT3B0aW9ucyh7IGNvbmZpZywgc3RydWN0dXJlZFR5cGUgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFNldCBPcHRpb25zIGZvciBuZXh0IHRpbWVcbiAgICB0aGlzLm1lbW8ub3B0aW9ucy5zZXQodHlwZSwgbWV0YSk7XG4gICAgcmV0dXJuIG1ldGE7XG4gIH1cbn1cbiJdfQ==
|