angular-odata 0.128.0 → 0.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +27 -244
  2. package/fesm2022/angular-odata.mjs +2320 -1118
  3. package/fesm2022/angular-odata.mjs.map +1 -1
  4. package/lib/api.d.ts +10 -11
  5. package/lib/cache/cache.d.ts +2 -2
  6. package/lib/cache/memory.d.ts +2 -2
  7. package/lib/cache/storage.d.ts +2 -2
  8. package/lib/index.d.ts +1 -0
  9. package/lib/loaders.d.ts +8 -8
  10. package/lib/metadata/csdl/csdl-annotation.d.ts +62 -26
  11. package/lib/metadata/csdl/csdl-entity-container.d.ts +8 -3
  12. package/lib/metadata/csdl/csdl-entity-set.d.ts +7 -2
  13. package/lib/metadata/csdl/csdl-enum-type.d.ts +11 -3
  14. package/lib/metadata/csdl/csdl-function-action.d.ts +54 -11
  15. package/lib/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
  16. package/lib/metadata/csdl/csdl-reference.d.ts +26 -3
  17. package/lib/metadata/csdl/csdl-schema.d.ts +5 -2
  18. package/lib/metadata/csdl/csdl-singleton.d.ts +5 -0
  19. package/lib/metadata/csdl/csdl-structural-property.d.ts +19 -3
  20. package/lib/metadata/csdl/csdl-structured-type.d.ts +28 -7
  21. package/lib/metadata/csdl/csdl-type-definition.d.ts +3 -0
  22. package/lib/metadata/metadata.d.ts +16 -3
  23. package/lib/models/collection.d.ts +2 -1
  24. package/lib/models/model.d.ts +6 -5
  25. package/lib/models/options.d.ts +11 -4
  26. package/lib/module.d.ts +3 -3
  27. package/lib/options.d.ts +3 -3
  28. package/lib/resources/path/segments.d.ts +3 -3
  29. package/lib/resources/query/builder.d.ts +3 -2
  30. package/lib/resources/query/expressions/apply.d.ts +1 -1
  31. package/lib/resources/query/expressions/compute.d.ts +1 -1
  32. package/lib/resources/query/expressions/count.d.ts +1 -1
  33. package/lib/resources/query/expressions/expand.d.ts +5 -2
  34. package/lib/resources/query/expressions/filter.d.ts +2 -1
  35. package/lib/resources/query/expressions/orderby.d.ts +2 -1
  36. package/lib/resources/query/expressions/search.d.ts +2 -1
  37. package/lib/resources/query/expressions/select.d.ts +2 -1
  38. package/lib/resources/query/expressions/syntax.d.ts +2 -2
  39. package/lib/resources/query/handlers.d.ts +17 -5
  40. package/lib/resources/query/options.d.ts +3 -3
  41. package/lib/resources/resource.d.ts +36 -8
  42. package/lib/resources/types/action.d.ts +4 -4
  43. package/lib/resources/types/entity-set.d.ts +15 -8
  44. package/lib/resources/types/entity.d.ts +5 -1
  45. package/lib/resources/types/function.d.ts +4 -4
  46. package/lib/resources/types/navigation-property.d.ts +12 -3
  47. package/lib/resources/types/property.d.ts +14 -3
  48. package/lib/resources/types/singleton.d.ts +5 -1
  49. package/lib/schema/annotation.d.ts +3 -3
  50. package/lib/schema/callable.d.ts +3 -3
  51. package/lib/schema/element.d.ts +3 -3
  52. package/lib/schema/entity-container.d.ts +2 -2
  53. package/lib/schema/entity-set.d.ts +2 -2
  54. package/lib/schema/enum-type.d.ts +10 -10
  55. package/lib/schema/parsers/callable.d.ts +4 -4
  56. package/lib/schema/parsers/enum-type.d.ts +15 -15
  57. package/lib/schema/parsers/structured-type.d.ts +8 -5
  58. package/lib/schema/schema.d.ts +3 -3
  59. package/lib/schema/singleton.d.ts +2 -2
  60. package/lib/schema/structured-type.d.ts +7 -4
  61. package/lib/services/entity-set.d.ts +9 -6
  62. package/lib/services/entity.d.ts +1 -1
  63. package/lib/services/singleton.d.ts +1 -1
  64. package/lib/settings.d.ts +2 -2
  65. package/lib/types.d.ts +82 -69
  66. package/lib/utils/enums.d.ts +12 -12
  67. package/lib/utils/http.d.ts +1 -1
  68. package/lib/utils/objects.d.ts +1 -1
  69. package/lib/utils/odata.d.ts +2 -2
  70. package/lib/utils/strings.d.ts +2 -2
  71. package/package.json +3 -5
  72. package/schematics/apigen/angular/api-config.js +7 -1
  73. package/schematics/apigen/angular/api-config.js.map +1 -1
  74. package/schematics/apigen/angular/base.d.ts +22 -2
  75. package/schematics/apigen/angular/base.js +82 -42
  76. package/schematics/apigen/angular/base.js.map +1 -1
  77. package/schematics/apigen/angular/entity.js +7 -1
  78. package/schematics/apigen/angular/entity.js.map +1 -1
  79. package/schematics/apigen/angular/enum.js +1 -0
  80. package/schematics/apigen/angular/enum.js.map +1 -1
  81. package/schematics/apigen/angular/module.js.map +1 -1
  82. package/schematics/apigen/angular/service.js +3 -2
  83. package/schematics/apigen/angular/service.js.map +1 -1
  84. package/schematics/apigen/files/api-config/__fileName__.ts +8 -6
  85. package/schematics/apigen/files/entity/__fileName__.ts +2 -2
  86. package/schematics/apigen/files/entitycontainer-service/__fileName__.ts +1 -1
  87. package/schematics/apigen/files/entityset-service/__fileName__.ts +1 -1
  88. package/schematics/apigen/files/enum/__fileName__.ts +1 -1
  89. package/schematics/apigen/files/metadata/metadata.json +1 -0
  90. package/schematics/apigen/files/singleton-service/__fileName__.ts +1 -1
  91. package/schematics/apigen/index.js +56 -12
  92. package/schematics/apigen/index.js.map +1 -1
  93. package/schematics/apigen/metadata/csdl/csdl-annotation.d.ts +56 -23
  94. package/schematics/apigen/metadata/csdl/csdl-annotation.js +143 -13
  95. package/schematics/apigen/metadata/csdl/csdl-annotation.js.map +1 -1
  96. package/schematics/apigen/metadata/csdl/csdl-entity-container.d.ts +3 -0
  97. package/schematics/apigen/metadata/csdl/csdl-entity-container.js +19 -0
  98. package/schematics/apigen/metadata/csdl/csdl-entity-container.js.map +1 -1
  99. package/schematics/apigen/metadata/csdl/csdl-entity-set.d.ts +3 -0
  100. package/schematics/apigen/metadata/csdl/csdl-entity-set.js +11 -0
  101. package/schematics/apigen/metadata/csdl/csdl-entity-set.js.map +1 -1
  102. package/schematics/apigen/metadata/csdl/csdl-enum-type.d.ts +6 -0
  103. package/schematics/apigen/metadata/csdl/csdl-enum-type.js +17 -0
  104. package/schematics/apigen/metadata/csdl/csdl-enum-type.js.map +1 -1
  105. package/schematics/apigen/metadata/csdl/csdl-function-action.d.ts +37 -0
  106. package/schematics/apigen/metadata/csdl/csdl-function-action.js +52 -0
  107. package/schematics/apigen/metadata/csdl/csdl-function-action.js.map +1 -1
  108. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.d.ts +4 -0
  109. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js +6 -0
  110. package/schematics/apigen/metadata/csdl/csdl-navigation-property-binding.js.map +1 -1
  111. package/schematics/apigen/metadata/csdl/csdl-reference.d.ts +15 -3
  112. package/schematics/apigen/metadata/csdl/csdl-reference.js +26 -2
  113. package/schematics/apigen/metadata/csdl/csdl-reference.js.map +1 -1
  114. package/schematics/apigen/metadata/csdl/csdl-schema.d.ts +3 -0
  115. package/schematics/apigen/metadata/csdl/csdl-schema.js +37 -0
  116. package/schematics/apigen/metadata/csdl/csdl-schema.js.map +1 -1
  117. package/schematics/apigen/metadata/csdl/csdl-singleton.d.ts +3 -0
  118. package/schematics/apigen/metadata/csdl/csdl-singleton.js +8 -0
  119. package/schematics/apigen/metadata/csdl/csdl-singleton.js.map +1 -1
  120. package/schematics/apigen/metadata/csdl/csdl-structural-property.d.ts +16 -0
  121. package/schematics/apigen/metadata/csdl/csdl-structural-property.js +53 -0
  122. package/schematics/apigen/metadata/csdl/csdl-structural-property.js.map +1 -1
  123. package/schematics/apigen/metadata/csdl/csdl-structured-type.d.ts +22 -3
  124. package/schematics/apigen/metadata/csdl/csdl-structured-type.js +47 -2
  125. package/schematics/apigen/metadata/csdl/csdl-structured-type.js.map +1 -1
  126. package/schematics/apigen/metadata/csdl/csdl-type-definition.d.ts +3 -0
  127. package/schematics/apigen/metadata/csdl/csdl-type-definition.js +19 -0
  128. package/schematics/apigen/metadata/csdl/csdl-type-definition.js.map +1 -1
  129. package/schematics/apigen/metadata/metadata.d.ts +10 -0
  130. package/schematics/apigen/metadata/metadata.js +12 -6
  131. package/schematics/apigen/metadata/metadata.js.map +1 -1
  132. package/schematics/apigen/metadata/parser.js.map +1 -1
  133. package/schematics/apigen/schema.d.ts +2 -1
  134. package/schematics/apigen/schema.json +15 -14
  135. package/schematics/apigen/utils.d.ts +1 -0
  136. package/schematics/apigen/utils.js +25 -1
  137. package/schematics/apigen/utils.js.map +1 -1
  138. package/schematics/ng-add/index.js +1 -2
  139. package/schematics/ng-add/index.js.map +1 -1
  140. package/esm2022/angular-odata.mjs +0 -5
  141. package/esm2022/lib/annotations.mjs +0 -140
  142. package/esm2022/lib/api.mjs +0 -419
  143. package/esm2022/lib/cache/cache.mjs +0 -175
  144. package/esm2022/lib/cache/index.mjs +0 -4
  145. package/esm2022/lib/cache/memory.mjs +0 -30
  146. package/esm2022/lib/cache/storage.mjs +0 -55
  147. package/esm2022/lib/client.mjs +0 -212
  148. package/esm2022/lib/constants.mjs +0 -95
  149. package/esm2022/lib/helper.mjs +0 -280
  150. package/esm2022/lib/index.mjs +0 -21
  151. package/esm2022/lib/loaders.mjs +0 -39
  152. package/esm2022/lib/metadata/csdl/csdl-annotation.mjs +0 -95
  153. package/esm2022/lib/metadata/csdl/csdl-entity-container.mjs +0 -27
  154. package/esm2022/lib/metadata/csdl/csdl-entity-set.mjs +0 -24
  155. package/esm2022/lib/metadata/csdl/csdl-enum-type.mjs +0 -37
  156. package/esm2022/lib/metadata/csdl/csdl-function-action.mjs +0 -94
  157. package/esm2022/lib/metadata/csdl/csdl-navigation-property-binding.mjs +0 -7
  158. package/esm2022/lib/metadata/csdl/csdl-reference.mjs +0 -23
  159. package/esm2022/lib/metadata/csdl/csdl-schema.mjs +0 -39
  160. package/esm2022/lib/metadata/csdl/csdl-singleton.mjs +0 -15
  161. package/esm2022/lib/metadata/csdl/csdl-structural-property.mjs +0 -70
  162. package/esm2022/lib/metadata/csdl/csdl-structured-type.mjs +0 -92
  163. package/esm2022/lib/metadata/csdl/csdl-type-definition.mjs +0 -15
  164. package/esm2022/lib/metadata/index.mjs +0 -3
  165. package/esm2022/lib/metadata/metadata.mjs +0 -14
  166. package/esm2022/lib/metadata/parser.mjs +0 -563
  167. package/esm2022/lib/models/collection.mjs +0 -814
  168. package/esm2022/lib/models/index.mjs +0 -4
  169. package/esm2022/lib/models/model.mjs +0 -553
  170. package/esm2022/lib/models/options.mjs +0 -1179
  171. package/esm2022/lib/module.mjs +0 -55
  172. package/esm2022/lib/options.mjs +0 -36
  173. package/esm2022/lib/resources/index.mjs +0 -7
  174. package/esm2022/lib/resources/options.mjs +0 -56
  175. package/esm2022/lib/resources/path/handlers.mjs +0 -79
  176. package/esm2022/lib/resources/path/index.mjs +0 -3
  177. package/esm2022/lib/resources/path/segments.mjs +0 -148
  178. package/esm2022/lib/resources/query/builder.mjs +0 -636
  179. package/esm2022/lib/resources/query/expressions/apply.mjs +0 -236
  180. package/esm2022/lib/resources/query/expressions/base.mjs +0 -25
  181. package/esm2022/lib/resources/query/expressions/compute.mjs +0 -54
  182. package/esm2022/lib/resources/query/expressions/count.mjs +0 -116
  183. package/esm2022/lib/resources/query/expressions/expand.mjs +0 -147
  184. package/esm2022/lib/resources/query/expressions/filter.mjs +0 -178
  185. package/esm2022/lib/resources/query/expressions/index.mjs +0 -10
  186. package/esm2022/lib/resources/query/expressions/orderby.mjs +0 -79
  187. package/esm2022/lib/resources/query/expressions/search.mjs +0 -141
  188. package/esm2022/lib/resources/query/expressions/select.mjs +0 -47
  189. package/esm2022/lib/resources/query/expressions/syntax.mjs +0 -751
  190. package/esm2022/lib/resources/query/handlers.mjs +0 -420
  191. package/esm2022/lib/resources/query/index.mjs +0 -5
  192. package/esm2022/lib/resources/query/options.mjs +0 -139
  193. package/esm2022/lib/resources/request.mjs +0 -196
  194. package/esm2022/lib/resources/resource.mjs +0 -311
  195. package/esm2022/lib/resources/response.mjs +0 -174
  196. package/esm2022/lib/resources/types/action.mjs +0 -116
  197. package/esm2022/lib/resources/types/batch.mjs +0 -428
  198. package/esm2022/lib/resources/types/count.mjs +0 -33
  199. package/esm2022/lib/resources/types/entity-set.mjs +0 -131
  200. package/esm2022/lib/resources/types/entity.mjs +0 -112
  201. package/esm2022/lib/resources/types/function.mjs +0 -146
  202. package/esm2022/lib/resources/types/index.mjs +0 -15
  203. package/esm2022/lib/resources/types/media.mjs +0 -44
  204. package/esm2022/lib/resources/types/metadata.mjs +0 -35
  205. package/esm2022/lib/resources/types/navigation-property.mjs +0 -256
  206. package/esm2022/lib/resources/types/options.mjs +0 -2
  207. package/esm2022/lib/resources/types/property.mjs +0 -197
  208. package/esm2022/lib/resources/types/reference.mjs +0 -87
  209. package/esm2022/lib/resources/types/singleton.mjs +0 -130
  210. package/esm2022/lib/resources/types/value.mjs +0 -48
  211. package/esm2022/lib/schema/annotation.mjs +0 -37
  212. package/esm2022/lib/schema/callable.mjs +0 -66
  213. package/esm2022/lib/schema/element.mjs +0 -67
  214. package/esm2022/lib/schema/entity-container.mjs +0 -11
  215. package/esm2022/lib/schema/entity-set.mjs +0 -9
  216. package/esm2022/lib/schema/enum-type.mjs +0 -68
  217. package/esm2022/lib/schema/index.mjs +0 -9
  218. package/esm2022/lib/schema/parsers/callable.mjs +0 -110
  219. package/esm2022/lib/schema/parsers/edm.mjs +0 -101
  220. package/esm2022/lib/schema/parsers/enum-type.mjs +0 -130
  221. package/esm2022/lib/schema/parsers/index.mjs +0 -5
  222. package/esm2022/lib/schema/parsers/structured-type.mjs +0 -514
  223. package/esm2022/lib/schema/schema.mjs +0 -45
  224. package/esm2022/lib/schema/singleton.mjs +0 -9
  225. package/esm2022/lib/schema/structured-type.mjs +0 -213
  226. package/esm2022/lib/services/base.mjs +0 -29
  227. package/esm2022/lib/services/entity-set.mjs +0 -155
  228. package/esm2022/lib/services/entity.mjs +0 -12
  229. package/esm2022/lib/services/factory.mjs +0 -44
  230. package/esm2022/lib/services/index.mjs +0 -5
  231. package/esm2022/lib/services/singleton.mjs +0 -54
  232. package/esm2022/lib/settings.mjs +0 -112
  233. package/esm2022/lib/types.mjs +0 -118
  234. package/esm2022/lib/utils/arraybuffers.mjs +0 -46
  235. package/esm2022/lib/utils/arrays.mjs +0 -10
  236. package/esm2022/lib/utils/dates.mjs +0 -18
  237. package/esm2022/lib/utils/durations.mjs +0 -40
  238. package/esm2022/lib/utils/enums.mjs +0 -61
  239. package/esm2022/lib/utils/http.mjs +0 -95
  240. package/esm2022/lib/utils/index.mjs +0 -10
  241. package/esm2022/lib/utils/objects.mjs +0 -204
  242. package/esm2022/lib/utils/odata.mjs +0 -22
  243. package/esm2022/lib/utils/strings.mjs +0 -20
  244. package/esm2022/lib/utils/types.mjs +0 -136
  245. package/esm2022/lib/utils/urls.mjs +0 -24
  246. package/esm2022/public-api.mjs +0 -5
@@ -1,514 +0,0 @@
1
- import { COMPUTED, DEFAULT_VERSION, DESCRIPTION, LONG_DESCRIPTION, } from '../../constants';
2
- import { ODataHelper } from '../../helper';
3
- import { raw } from '../../resources/query';
4
- import { NONE_PARSER, EdmType, JsonType as JsonSchemaType, } from '../../types';
5
- import { Objects, Strings, Types } from '../../utils';
6
- import { ODataAnnotatable } from '../annotation';
7
- import { ODataEnumTypeParser } from './enum-type';
8
- export class ODataEntityTypeKey {
9
- constructor({ name, alias }) {
10
- this.name = name;
11
- this.alias = alias;
12
- }
13
- }
14
- export class ODataReferential {
15
- constructor({ property, referencedProperty, }) {
16
- this.property = property;
17
- this.referencedProperty = referencedProperty;
18
- }
19
- }
20
- export class ODataStructuredTypeFieldParser extends ODataAnnotatable {
21
- constructor(name, structured, field) {
22
- super(field);
23
- this.name = name;
24
- this.structured = structured;
25
- this.type = field.type;
26
- this.parser = NONE_PARSER;
27
- this.referentials = (field.referentials || []).map((referential) => new ODataReferential(referential));
28
- this.default = field.default;
29
- this.maxLength = field.maxLength;
30
- this.nullable = field.nullable ?? true;
31
- this.collection = Boolean(field.collection);
32
- this.navigation = Boolean(field.navigation);
33
- this.precision = field.precision;
34
- this.scale = field.scale;
35
- }
36
- validate(value, { method, navigation = false, } = {}) {
37
- let errors;
38
- if (this.collection && Array.isArray(value)) {
39
- errors = value.map((v) => this.validate(v, { method, navigation }));
40
- }
41
- else if ((this.isStructuredType() &&
42
- typeof value === 'object' &&
43
- value !== null) ||
44
- (this.navigation && value !== undefined)) {
45
- errors =
46
- this.structuredType().validate(value, { method, navigation }) ||
47
- {};
48
- }
49
- else if (this.isEnumType() &&
50
- (typeof value === 'string' || typeof value === 'number')) {
51
- errors = this.enumType().validate(value, { method, navigation });
52
- }
53
- else {
54
- // IsEdmType
55
- const computed = this.annotatedValue(COMPUTED);
56
- errors = [];
57
- if (!this.nullable &&
58
- (value === null || (value === undefined && method !== 'modify')) && // Is null or undefined without patch?
59
- !(computed && method === 'create') // Not (Is Computed field and create) ?
60
- ) {
61
- errors.push(`required`);
62
- }
63
- if (this.maxLength !== undefined &&
64
- typeof value === 'string' &&
65
- value.length > this.maxLength) {
66
- errors.push(`maxlength`);
67
- }
68
- }
69
- return !Types.isEmpty(errors) ? errors : undefined;
70
- }
71
- //#region Deserialize
72
- parse(parser, value, options) {
73
- const type = options !== undefined && Types.isPlainObject(value)
74
- ? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
75
- : undefined;
76
- if (type !== undefined) {
77
- return parser
78
- .childParser((c) => c.isTypeOf(type))
79
- .deserialize(value, options);
80
- }
81
- return parser.deserialize(value, options);
82
- }
83
- deserialize(value, options) {
84
- const parserOptions = { ...this.parserOptions, ...options };
85
- if (this.parser instanceof ODataStructuredTypeParser) {
86
- const parser = this.parser;
87
- return Array.isArray(value)
88
- ? value.map((v) => this.parse(parser, v, parserOptions))
89
- : this.parse(parser, value, parserOptions);
90
- }
91
- return this.parser.deserialize(value, {
92
- field: this,
93
- ...parserOptions,
94
- });
95
- }
96
- //#endregion
97
- //#region Serialize
98
- toJson(parser, value, options) {
99
- const type = options !== undefined && Types.isPlainObject(value)
100
- ? ODataHelper[options?.version || DEFAULT_VERSION].type(value)
101
- : undefined;
102
- if (type !== undefined) {
103
- return parser
104
- .childParser((c) => c.isTypeOf(type))
105
- .serialize(value, options);
106
- }
107
- return parser.serialize(value, options);
108
- }
109
- serialize(value, options) {
110
- const parserOptions = { ...this.parserOptions, ...options };
111
- if (this.parser instanceof ODataStructuredTypeParser) {
112
- const parser = this.parser;
113
- return Array.isArray(value)
114
- ? value.map((v) => this.toJson(parser, v, parserOptions))
115
- : this.toJson(parser, value, parserOptions);
116
- }
117
- return this.parser.serialize(value, {
118
- field: this,
119
- ...parserOptions,
120
- });
121
- }
122
- //#endregion
123
- //#region Encode
124
- encode(value, options) {
125
- const parserOptions = { ...this.parserOptions, ...options };
126
- return this.parser.encode(value, {
127
- field: this,
128
- ...parserOptions,
129
- });
130
- }
131
- //#endregion
132
- configure({ options, parserForType, }) {
133
- this.parserOptions = options;
134
- this.parser = parserForType(this.type);
135
- if (this.default !== undefined) {
136
- this.default = this.deserialize(this.default, options);
137
- }
138
- }
139
- //#region Json Schema
140
- // https://json-schema.org/
141
- toJsonSchema(options = {}) {
142
- let schema = this.parser instanceof ODataStructuredTypeFieldParser ||
143
- this.parser instanceof ODataStructuredTypeParser ||
144
- this.parser instanceof ODataEnumTypeParser
145
- ? this.parser.toJsonSchema(options)
146
- : { title: this.name, type: JsonSchemaType.object };
147
- switch (this.type) {
148
- case EdmType.String:
149
- schema.type = JsonSchemaType.string;
150
- break;
151
- case EdmType.Guid:
152
- schema.type = JsonSchemaType.string;
153
- schema.pattern =
154
- '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$';
155
- break;
156
- case EdmType.Binary:
157
- schema.type = JsonSchemaType.string;
158
- schema.contentEncoding = 'base64';
159
- break;
160
- case EdmType.Date:
161
- schema.type = JsonSchemaType.string;
162
- schema.format = 'date';
163
- break;
164
- case EdmType.TimeOfDay:
165
- schema.type = JsonSchemaType.string;
166
- schema.format = 'time';
167
- break;
168
- case EdmType.DateTimeOffset:
169
- schema.type = JsonSchemaType.string;
170
- schema.format = 'date-time';
171
- break;
172
- case EdmType.Duration:
173
- schema.type = JsonSchemaType.string;
174
- schema.format = 'duration';
175
- break;
176
- case EdmType.Byte:
177
- case EdmType.SByte:
178
- case EdmType.Int16:
179
- case EdmType.Int32:
180
- case EdmType.Int64:
181
- //TODO: Range
182
- schema.type = JsonSchemaType.integer;
183
- break;
184
- case EdmType.Single:
185
- case EdmType.Double:
186
- case EdmType.Decimal:
187
- schema.type = JsonSchemaType.number;
188
- break;
189
- case EdmType.Boolean:
190
- schema.type = JsonSchemaType.boolean;
191
- break;
192
- }
193
- if (this.maxLength)
194
- schema.maxLength = this.maxLength;
195
- if (this.default)
196
- schema.default = this.default;
197
- if (this.nullable)
198
- schema.type = [schema.type, JsonSchemaType.null];
199
- if (this.collection)
200
- schema = {
201
- type: JsonSchemaType.array,
202
- items: schema,
203
- additionalItems: false,
204
- };
205
- return schema;
206
- }
207
- //#endregion
208
- isKey() {
209
- return (this.structured
210
- .keys({ include_parents: true })
211
- ?.find((k) => k.name === this.name) !== undefined);
212
- }
213
- hasReferentials() {
214
- return this.referentials.length !== 0;
215
- }
216
- isEdmType() {
217
- return this.type.startsWith('Edm.');
218
- }
219
- isEnumType() {
220
- return this.parser instanceof ODataEnumTypeParser;
221
- }
222
- enumType() {
223
- if (!this.isEnumType())
224
- throw new Error('Field are not EnumType');
225
- return this.parser;
226
- }
227
- isStructuredType() {
228
- return this.parser instanceof ODataStructuredTypeParser;
229
- }
230
- structuredType() {
231
- if (!this.isStructuredType())
232
- throw new Error('Field are not StrucuturedType');
233
- return this.parser;
234
- }
235
- field(name) {
236
- if (this.isStructuredType())
237
- return this.parser.field(name);
238
- throw new Error(`The field ${this.name} is not related to a StructuredType`);
239
- }
240
- }
241
- export class ODataStructuredTypeParser extends ODataAnnotatable {
242
- constructor(config, namespace, alias) {
243
- super(config);
244
- this.children = [];
245
- this._fields = [];
246
- this.name = config.name;
247
- this.base = config.base;
248
- this.open = config.open || false;
249
- this.namespace = namespace;
250
- this.alias = alias;
251
- if (Array.isArray(config.keys))
252
- this._keys = config.keys.map((key) => new ODataEntityTypeKey(key));
253
- Object.entries((config.fields ?? {})).forEach(([name, config]) => this.addField(name, config));
254
- }
255
- addField(name, config) {
256
- const field = new ODataStructuredTypeFieldParser(name, this, config);
257
- this._fields.push(field);
258
- return field;
259
- }
260
- /**
261
- * Create a nicer looking title.
262
- * Titleize is meant for creating pretty output.
263
- * @param term The term of the annotation to find.
264
- * @returns The titleized string.
265
- */
266
- titleize(term) {
267
- return (term && this.annotatedValue(term)) || Strings.titleCase(this.name);
268
- }
269
- isTypeOf(type) {
270
- var names = [`${this.namespace}.${this.name}`];
271
- if (this.alias)
272
- names.push(`${this.alias}.${this.name}`);
273
- return names.indexOf(type) !== -1;
274
- }
275
- isSubtypeOf(type) {
276
- if (this.isTypeOf(type))
277
- return true;
278
- if (this.parent)
279
- return this.parent.isSubtypeOf(type);
280
- return false;
281
- }
282
- isSupertypeOf(type) {
283
- return (this.isTypeOf(type) || this.children.some((c) => c.isSupertypeOf(type)));
284
- }
285
- isOpenType() {
286
- return this.open;
287
- }
288
- findChildParser(predicate) {
289
- if (predicate(this))
290
- return this;
291
- let match;
292
- for (let ch of this.children) {
293
- match = ch.findChildParser(predicate);
294
- if (match !== undefined)
295
- break;
296
- }
297
- return match;
298
- }
299
- childParser(predicate) {
300
- return this.findChildParser(predicate) || NONE_PARSER;
301
- }
302
- // Deserialize
303
- deserialize(value, options) {
304
- const parserOptions = { ...this.parserOptions, ...options };
305
- const fields = this.fields({
306
- include_navigation: true,
307
- include_parents: true,
308
- }).filter((f) => f.name in value &&
309
- value[f.name] !== undefined &&
310
- value[f.name] !== null);
311
- return {
312
- ...value,
313
- ...fields.reduce((acc, f) => ({
314
- ...acc,
315
- [f.name]: f.deserialize(value[f.name], parserOptions),
316
- }), {}),
317
- };
318
- }
319
- // Serialize
320
- serialize(value, options) {
321
- const parserOptions = { ...this.parserOptions, ...options };
322
- const fields = this.fields({
323
- include_navigation: true,
324
- include_parents: true,
325
- }).filter((f) => f.name in value &&
326
- value[f.name] !== undefined &&
327
- value[f.name] !== null);
328
- return {
329
- ...value,
330
- ...fields.reduce((acc, f) => ({
331
- ...acc,
332
- [f.name]: f.serialize(value[f.name], parserOptions),
333
- }), {}),
334
- };
335
- }
336
- // Encode
337
- encode(value, options) {
338
- const parserOptions = { ...this.parserOptions, ...options };
339
- return raw(JSON.stringify(this.serialize(value, parserOptions)));
340
- }
341
- configure({ options, parserForType, }) {
342
- this.parserOptions = options;
343
- if (this.base) {
344
- const parent = parserForType(this.base);
345
- parent.children.push(this);
346
- this.parent = parent;
347
- }
348
- this._fields.forEach((f) => f.configure({ options, parserForType }));
349
- }
350
- /**
351
- * Returns all fields of the structured type.
352
- * @param include_navigation Include navigation properties in the result.
353
- * @param include_parents Include the parent types in the result.
354
- * @returns All fields of the structured type.
355
- */
356
- fields({ include_navigation, include_parents, }) {
357
- return [
358
- ...(include_parents && this.parent !== undefined
359
- ? this.parent.fields({ include_parents, include_navigation })
360
- : []),
361
- ...this._fields.filter((field) => include_navigation || !field.navigation),
362
- ];
363
- }
364
- /**
365
- * Returns the keys of the structured type.
366
- * @param include_parents Include the parent fields
367
- * @returns The keys of the structured type
368
- */
369
- keys({ include_parents, }) {
370
- return [
371
- ...(include_parents && this.parent !== undefined
372
- ? this.parent.keys({ include_parents })
373
- : []),
374
- ...(this._keys || []),
375
- ];
376
- }
377
- isEntityType() {
378
- return (this._keys !== undefined ||
379
- (this.parent !== undefined && this.parent.isEntityType()));
380
- }
381
- isComplexType() {
382
- return !this.isEntityType();
383
- }
384
- /**
385
- * Find the field parser for the given field name.
386
- * @param name Name of the field
387
- * @returns The field parser
388
- */
389
- field(name) {
390
- let field = this.fields({
391
- include_parents: true,
392
- include_navigation: true,
393
- }).find((field) => field.name === name);
394
- //Throw error if not found
395
- if (field === undefined)
396
- throw new Error(`${this.name} has no field named ${String(name)}`);
397
- return field;
398
- }
399
- /**
400
- * Picks the fields from attributes.
401
- * @param attrs
402
- * @param include_parents Include the parent fields
403
- * @param include_navigation Include the navigation fields
404
- * @param include_etag Include the etag field
405
- * @returns The picked fields
406
- */
407
- pick(attrs, { include_parents = true, include_navigation = false, include_etag = true, options, } = {}) {
408
- const parserOptions = options || this.parserOptions;
409
- const names = this.fields({ include_parents, include_navigation }).map((f) => f.name);
410
- return Object.keys(attrs)
411
- .filter((key) => names.indexOf(key) !== -1 ||
412
- (key ==
413
- ODataHelper[parserOptions?.version || DEFAULT_VERSION].ODATA_ETAG &&
414
- include_etag))
415
- .reduce((acc, key) => Object.assign(acc, { [key]: attrs[key] }), {});
416
- }
417
- resolveKey(value, { resolve = true, single = true, } = {}) {
418
- const keyTypes = this.keys({ include_parents: true });
419
- const key = new Map();
420
- for (var kt of keyTypes) {
421
- let v = value;
422
- let structured = this;
423
- let field;
424
- for (let name of kt.name.split('/')) {
425
- if (structured === undefined)
426
- break;
427
- field = structured
428
- .fields({ include_navigation: false, include_parents: true })
429
- .find((f) => f.name === name);
430
- if (field !== undefined) {
431
- v = Types.isPlainObject(v) ? v[field.name] : v;
432
- structured = field.isStructuredType()
433
- ? field.structuredType()
434
- : undefined;
435
- }
436
- }
437
- if (field !== undefined && v !== undefined) {
438
- key.set(kt.alias || field.name, field.encode(v));
439
- }
440
- }
441
- if (key.size === 0)
442
- return undefined;
443
- return resolve
444
- ? Objects.resolveKey(key, { single })
445
- : Object.fromEntries(key);
446
- }
447
- defaults() {
448
- let fields = this.fields({
449
- include_navigation: false,
450
- include_parents: true,
451
- }).filter((f) => f.default !== undefined || f.isStructuredType());
452
- return {
453
- ...fields.reduce((acc, f) => {
454
- let value = f.isStructuredType()
455
- ? f.structuredType().defaults()
456
- : f.default;
457
- return Types.isEmpty(value) ? acc : { ...acc, [f.name]: value };
458
- }, {}),
459
- };
460
- }
461
- // Json Schema
462
- toJsonSchema(options = {}) {
463
- let schema = {
464
- $schema: 'http://json-schema.org/draft-07/schema#',
465
- $id: `${this.namespace}.${this.name}`,
466
- title: this.titleize(DESCRIPTION),
467
- description: this.annotatedValue(LONG_DESCRIPTION),
468
- type: JsonSchemaType.object,
469
- properties: {},
470
- required: [],
471
- };
472
- const fields = this.fields({
473
- include_navigation: true,
474
- include_parents: true,
475
- }).filter((f) => (!f.navigation || (options.expand && f.name in options.expand)) &&
476
- (!options.select || options.select.indexOf(f.name) !== -1));
477
- schema.properties = Object.assign({}, schema.properties, fields
478
- .map((f) => {
479
- let expand = options.expand && f.name in options.expand
480
- ? options.expand[f.name]
481
- : undefined;
482
- let schema = f.toJsonSchema(expand);
483
- if (options.custom && f.name in options.custom)
484
- schema = options.custom[f.name](schema, f);
485
- return { [f.name]: schema };
486
- })
487
- .reduce((acc, v) => Object.assign(acc, v), {}));
488
- schema.required = [
489
- ...schema.required,
490
- ...fields
491
- .filter((f) => options.required && f.name in options.required
492
- ? options.required[f.name]
493
- : !f.nullable)
494
- .map((f) => f.name),
495
- ];
496
- return schema;
497
- }
498
- validate(attrs, { method, navigation = false, } = {}) {
499
- const errors = {};
500
- const fields = this.fields({
501
- include_navigation: true,
502
- include_parents: true,
503
- }).filter((f) => !f.navigation || navigation);
504
- for (var field of fields) {
505
- const value = attrs[field.name];
506
- const errs = field.validate(value, { method, navigation });
507
- if (errs !== undefined) {
508
- errors[field.name] = errs;
509
- }
510
- }
511
- return !Types.isEmpty(errors) ? errors : undefined;
512
- }
513
- }
514
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC10eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1vZGF0YS9zcmMvbGliL3NjaGVtYS9wYXJzZXJzL3N0cnVjdHVyZWQtdHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixXQUFXLEVBQ1gsZ0JBQWdCLEdBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFdBQVcsRUFPWCxPQUFPLEVBQ1AsUUFBUSxJQUFJLGNBQWMsR0FDM0IsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFtQmxELE1BQU0sT0FBTyxrQkFBa0I7SUFHN0IsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQW9DO1FBQzNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFHM0IsWUFBWSxFQUNWLFFBQVEsRUFDUixrQkFBa0IsR0FJbkI7UUFDQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7SUFDL0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLDhCQUNYLFNBQVEsZ0JBQWdCO0lBaUJ4QixZQUNF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LENBQUMsTUFBTSxDQUFDO1lBQ3pCLGtCQUFrQixFQUFFLElBQUk7WUFDeEIsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLFVBQVUsQ0FBQyxDQUFDO1FBQzlDLEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxFQUFFO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBZSxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUMzRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7Z0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzNCO1NBQ0Y7UUFDRCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ09NUFVURUQsXG4gIERFRkFVTFRfVkVSU0lPTixcbiAgREVTQ1JJUFRJT04sXG4gIExPTkdfREVTQ1JJUFRJT04sXG59IGZyb20gJy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBPRGF0YUhlbHBlciB9IGZyb20gJy4uLy4uL2hlbHBlcic7XG5pbXBvcnQgeyByYXcgfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvcXVlcnknO1xuaW1wb3J0IHtcbiAgTk9ORV9QQVJTRVIsXG4gIFBhcnNlck9wdGlvbnMsXG4gIFBhcnNlcixcbiAgU3RydWN0dXJlZFR5cGVDb25maWcsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRDb25maWcsXG4gIFN0cnVjdHVyZWRUeXBlRmllbGRPcHRpb25zLFxuICBGaWVsZFBhcnNlcixcbiAgRWRtVHlwZSxcbiAgSnNvblR5cGUgYXMgSnNvblNjaGVtYVR5cGUsXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IE9iamVjdHMsIFN0cmluZ3MsIFR5cGVzIH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgT0RhdGFBbm5vdGF0YWJsZSB9IGZyb20gJy4uL2Fubm90YXRpb24nO1xuaW1wb3J0IHsgT0RhdGFFbnVtVHlwZVBhcnNlciB9IGZyb20gJy4vZW51bS10eXBlJztcblxuLy8gSlNPTiBTQ0hFTUFcbnR5cGUgSnNvblNjaGVtYVNlbGVjdDxUPiA9IEFycmF5PGtleW9mIFQ+O1xudHlwZSBKc29uU2NoZW1hQ3VzdG9tPFQ+ID0ge1xuICBbUCBpbiBrZXlvZiBUXT86IChcbiAgICBzY2hlbWE6IGFueSxcbiAgICBmaWVsZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPFRbUF0+LFxuICApID0+IGFueTtcbn07XG50eXBlIEpzb25TY2hlbWFFeHBhbmQ8VD4gPSB7IFtQIGluIGtleW9mIFRdPzogSnNvblNjaGVtYU9wdGlvbnM8VFtQXT4gfTtcbnR5cGUgSnNvblNjaGVtYVJlcXVpcmVkPFQ+ID0geyBbUCBpbiBrZXlvZiBUXT86IGJvb2xlYW4gfTtcbmV4cG9ydCB0eXBlIEpzb25TY2hlbWFPcHRpb25zPFQ+ID0ge1xuICBzZWxlY3Q/OiBKc29uU2NoZW1hU2VsZWN0PFQ+O1xuICBjdXN0b20/OiBKc29uU2NoZW1hQ3VzdG9tPFQ+O1xuICBleHBhbmQ/OiBKc29uU2NoZW1hRXhwYW5kPFQ+O1xuICByZXF1aXJlZD86IEpzb25TY2hlbWFSZXF1aXJlZDxUPjtcbn07XG5cbmV4cG9ydCBjbGFzcyBPRGF0YUVudGl0eVR5cGVLZXkge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFsaWFzPzogc3RyaW5nO1xuICBjb25zdHJ1Y3Rvcih7IG5hbWUsIGFsaWFzIH06IHsgbmFtZTogc3RyaW5nOyBhbGlhcz86IHN0cmluZyB9KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmFsaWFzID0gYWxpYXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhUmVmZXJlbnRpYWwge1xuICBwcm9wZXJ0eTogc3RyaW5nO1xuICByZWZlcmVuY2VkUHJvcGVydHk6IHN0cmluZztcbiAgY29uc3RydWN0b3Ioe1xuICAgIHByb3BlcnR5LFxuICAgIHJlZmVyZW5jZWRQcm9wZXJ0eSxcbiAgfToge1xuICAgIHByb3BlcnR5OiBzdHJpbmc7XG4gICAgcmVmZXJlbmNlZFByb3BlcnR5OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgdGhpcy5yZWZlcmVuY2VkUHJvcGVydHkgPSByZWZlcmVuY2VkUHJvcGVydHk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxUPlxuICBleHRlbmRzIE9EYXRhQW5ub3RhdGFibGVcbiAgaW1wbGVtZW50cyBGaWVsZFBhcnNlcjxUPlxue1xuICBuYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgc3RydWN0dXJlZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICB0eXBlOiBzdHJpbmcgfCBFZG1UeXBlO1xuICBwcml2YXRlIHBhcnNlcjogUGFyc2VyPFQ+O1xuICBjb2xsZWN0aW9uOiBib29sZWFuO1xuICBuYXZpZ2F0aW9uOiBib29sZWFuO1xuICBudWxsYWJsZT86IGJvb2xlYW47XG4gIGRlZmF1bHQ/OiBhbnk7XG4gIG1heExlbmd0aD86IG51bWJlcjtcbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuICBzY2FsZT86IG51bWJlciB8ICd2YXJpYWJsZSc7XG4gIHJlZmVyZW50aWFsczogT0RhdGFSZWZlcmVudGlhbFtdO1xuICBwYXJzZXJPcHRpb25zPzogUGFyc2VyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgc3RydWN0dXJlZDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+LFxuICAgIGZpZWxkOiBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxuICApIHtcbiAgICBzdXBlcihmaWVsZCk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnN0cnVjdHVyZWQgPSBzdHJ1Y3R1cmVkO1xuICAgIHRoaXMudHlwZSA9IGZpZWxkLnR5cGU7XG4gICAgdGhpcy5wYXJzZXIgPSBOT05FX1BBUlNFUjtcbiAgICB0aGlzLnJlZmVyZW50aWFscyA9IChmaWVsZC5yZWZlcmVudGlhbHMgfHwgW10pLm1hcChcbiAgICAgIChyZWZlcmVudGlhbCkgPT4gbmV3IE9EYXRhUmVmZXJlbnRpYWwocmVmZXJlbnRpYWwpLFxuICAgICk7XG4gICAgdGhpcy5kZWZhdWx0ID0gZmllbGQuZGVmYXVsdDtcbiAgICB0aGlzLm1heExlbmd0aCA9IGZpZWxkLm1heExlbmd0aDtcbiAgICB0aGlzLm51bGxhYmxlID0gZmllbGQubnVsbGFibGUgPz8gdHJ1ZTtcbiAgICB0aGlzLmNvbGxlY3Rpb24gPSBCb29sZWFuKGZpZWxkLmNvbGxlY3Rpb24pO1xuICAgIHRoaXMubmF2aWdhdGlvbiA9IEJvb2xlYW4oZmllbGQubmF2aWdhdGlvbik7XG4gICAgdGhpcy5wcmVjaXNpb24gPSBmaWVsZC5wcmVjaXNpb247XG4gICAgdGhpcy5zY2FsZSA9IGZpZWxkLnNjYWxlO1xuICB9XG5cbiAgdmFsaWRhdGUoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICBtZXRob2QsXG4gICAgICBuYXZpZ2F0aW9uID0gZmFsc2UsXG4gICAgfToge1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOlxuICAgIHwgeyBbbmFtZTogc3RyaW5nXTogYW55IH1cbiAgICB8IHsgW25hbWU6IHN0cmluZ106IGFueSB9W11cbiAgICB8IHN0cmluZ1tdXG4gICAgfCB1bmRlZmluZWQge1xuICAgIGxldCBlcnJvcnM7XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbiAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgZXJyb3JzID0gdmFsdWUubWFwKCh2KSA9PiB0aGlzLnZhbGlkYXRlKHYsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pKSBhcyB7XG4gICAgICAgIFtuYW1lOiBzdHJpbmddOiBhbnlbXTtcbiAgICAgIH1bXTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKHRoaXMuaXNTdHJ1Y3R1cmVkVHlwZSgpICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgdmFsdWUgIT09IG51bGwpIHx8XG4gICAgICAodGhpcy5uYXZpZ2F0aW9uICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgKSB7XG4gICAgICBlcnJvcnMgPVxuICAgICAgICB0aGlzLnN0cnVjdHVyZWRUeXBlKCkudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pIHx8XG4gICAgICAgICh7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBhbnlbXSB9KTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5pc0VudW1UeXBlKCkgJiZcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpXG4gICAgKSB7XG4gICAgICBlcnJvcnMgPSB0aGlzLmVudW1UeXBlKCkudmFsaWRhdGUodmFsdWUsIHsgbWV0aG9kLCBuYXZpZ2F0aW9uIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJc0VkbVR5cGVcbiAgICAgIGNvbnN0IGNvbXB1dGVkID0gdGhpcy5hbm5vdGF0ZWRWYWx1ZTxib29sZWFuPihDT01QVVRFRCk7XG4gICAgICBlcnJvcnMgPSBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgIXRoaXMubnVsbGFibGUgJiZcbiAgICAgICAgKHZhbHVlID09PSBudWxsIHx8ICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIG1ldGhvZCAhPT0gJ21vZGlmeScpKSAmJiAvLyBJcyBudWxsIG9yIHVuZGVmaW5lZCB3aXRob3V0IHBhdGNoP1xuICAgICAgICAhKGNvbXB1dGVkICYmIG1ldGhvZCA9PT0gJ2NyZWF0ZScpIC8vIE5vdCAoSXMgQ29tcHV0ZWQgZmllbGQgYW5kIGNyZWF0ZSkgP1xuICAgICAgKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKGByZXF1aXJlZGApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLm1heExlbmd0aCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGhcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaChgbWF4bGVuZ3RoYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8jcmVnaW9uIERlc2VyaWFsaXplXG4gIHByaXZhdGUgcGFyc2UoXG4gICAgcGFyc2VyOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+LFxuICAgIHZhbHVlOiBhbnksXG4gICAgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMsXG4gICk6IGFueSB7XG4gICAgY29uc3QgdHlwZSA9XG4gICAgICBvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgVHlwZXMuaXNQbGFpbk9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBPRGF0YUhlbHBlcltvcHRpb25zPy52ZXJzaW9uIHx8IERFRkFVTFRfVkVSU0lPTl0udHlwZSh2YWx1ZSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHBhcnNlclxuICAgICAgICAuY2hpbGRQYXJzZXIoKGMpID0+IGMuaXNUeXBlT2YodHlwZSkpXG4gICAgICAgIC5kZXNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZXIuZGVzZXJpYWxpemUodmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZGVzZXJpYWxpemUodmFsdWU6IGFueSwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBUIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICBpZiAodGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyKSB7XG4gICAgICBjb25zdCBwYXJzZXIgPSB0aGlzLnBhcnNlciBhcyBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPFQ+O1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpXG4gICAgICAgID8gdmFsdWUubWFwKCh2KSA9PiB0aGlzLnBhcnNlKHBhcnNlciwgdiwgcGFyc2VyT3B0aW9ucykpXG4gICAgICAgIDogdGhpcy5wYXJzZShwYXJzZXIsIHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmRlc2VyaWFsaXplKHZhbHVlLCB7XG4gICAgICBmaWVsZDogdGhpcyxcbiAgICAgIC4uLnBhcnNlck9wdGlvbnMsXG4gICAgfSBhcyBTdHJ1Y3R1cmVkVHlwZUZpZWxkT3B0aW9ucyk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgLy8jcmVnaW9uIFNlcmlhbGl6ZVxuICBwcml2YXRlIHRvSnNvbihcbiAgICBwYXJzZXI6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD4sXG4gICAgdmFsdWU6IGFueSxcbiAgICBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyxcbiAgKTogYW55IHtcbiAgICBjb25zdCB0eXBlID1cbiAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBUeXBlcy5pc1BsYWluT2JqZWN0KHZhbHVlKVxuICAgICAgICA/IE9EYXRhSGVscGVyW29wdGlvbnM/LnZlcnNpb24gfHwgREVGQVVMVF9WRVJTSU9OXS50eXBlKHZhbHVlKVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcGFyc2VyXG4gICAgICAgIC5jaGlsZFBhcnNlcigoYykgPT4gYy5pc1R5cGVPZih0eXBlKSlcbiAgICAgICAgLnNlcmlhbGl6ZSh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZXIuc2VyaWFsaXplKHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSh2YWx1ZTogVCwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBhbnkge1xuICAgIGNvbnN0IHBhcnNlck9wdGlvbnMgPSB7IC4uLnRoaXMucGFyc2VyT3B0aW9ucywgLi4ub3B0aW9ucyB9O1xuICAgIGlmICh0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXIpIHtcbiAgICAgIGNvbnN0IHBhcnNlciA9IHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD47XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgPyAodmFsdWUgYXMgYW55W10pLm1hcCgodikgPT4gdGhpcy50b0pzb24ocGFyc2VyLCB2LCBwYXJzZXJPcHRpb25zKSlcbiAgICAgICAgOiB0aGlzLnRvSnNvbihwYXJzZXIsIHZhbHVlLCBwYXJzZXJPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnNlcmlhbGl6ZSh2YWx1ZSwge1xuICAgICAgZmllbGQ6IHRoaXMsXG4gICAgICAuLi5wYXJzZXJPcHRpb25zLFxuICAgIH0gYXMgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiBFbmNvZGVcbiAgZW5jb2RlKHZhbHVlOiBULCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5wYXJzZXJPcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLmVuY29kZSh2YWx1ZSwge1xuICAgICAgZmllbGQ6IHRoaXMsXG4gICAgICAuLi5wYXJzZXJPcHRpb25zLFxuICAgIH0gYXMgU3RydWN0dXJlZFR5cGVGaWVsZE9wdGlvbnMpO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIGNvbmZpZ3VyZSh7XG4gICAgb3B0aW9ucyxcbiAgICBwYXJzZXJGb3JUeXBlLFxuICB9OiB7XG4gICAgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcbiAgICBwYXJzZXJGb3JUeXBlOiAodHlwZTogc3RyaW5nKSA9PiBQYXJzZXI8YW55PjtcbiAgfSkge1xuICAgIHRoaXMucGFyc2VyT3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5wYXJzZXIgPSBwYXJzZXJGb3JUeXBlKHRoaXMudHlwZSk7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmRlZmF1bHQgPSB0aGlzLmRlc2VyaWFsaXplKHRoaXMuZGVmYXVsdCwgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLy8jcmVnaW9uIEpzb24gU2NoZW1hXG4gIC8vIGh0dHBzOi8vanNvbi1zY2hlbWEub3JnL1xuICB0b0pzb25TY2hlbWEob3B0aW9uczogSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGxldCBzY2hlbWE6IGFueSA9XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlciB8fFxuICAgICAgdGhpcy5wYXJzZXIgaW5zdGFuY2VvZiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyIHx8XG4gICAgICB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXJcbiAgICAgICAgPyB0aGlzLnBhcnNlci50b0pzb25TY2hlbWEob3B0aW9ucylcbiAgICAgICAgOiAoeyB0aXRsZTogdGhpcy5uYW1lLCB0eXBlOiBKc29uU2NoZW1hVHlwZS5vYmplY3QgfSBhcyBhbnkpO1xuXG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgRWRtVHlwZS5TdHJpbmc6XG4gICAgICAgIHNjaGVtYS50eXBlID0gSnNvblNjaGVtYVR5cGUuc3RyaW5nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRWRtVHlwZS5HdWlkOlxuICAgICAgICBzY2hlbWEudHlwZSA9IEpzb25TY2hlbWFUeXBlLnN0cmluZztcbiAgICAgICAgc2NoZW1hLnBhdHRlcm4gPVxuICAgICAgICAgICdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFZG1UeXBlLkJpbmFyeTpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5zdHJpbmc7XG4gICAgICAgIHNjaGVtYS5jb250ZW50RW5jb2RpbmcgPSAnYmFzZTY0JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVkbVR5cGUuRGF0ZTpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5zdHJpbmc7XG4gICAgICAgIHNjaGVtYS5mb3JtYXQgPSAnZGF0ZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFZG1UeXBlLlRpbWVPZkRheTpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5zdHJpbmc7XG4gICAgICAgIHNjaGVtYS5mb3JtYXQgPSAndGltZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBFZG1UeXBlLkRhdGVUaW1lT2Zmc2V0OlxuICAgICAgICBzY2hlbWEudHlwZSA9IEpzb25TY2hlbWFUeXBlLnN0cmluZztcbiAgICAgICAgc2NoZW1hLmZvcm1hdCA9ICdkYXRlLXRpbWUnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRWRtVHlwZS5EdXJhdGlvbjpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5zdHJpbmc7XG4gICAgICAgIHNjaGVtYS5mb3JtYXQgPSAnZHVyYXRpb24nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgRWRtVHlwZS5CeXRlOlxuICAgICAgY2FzZSBFZG1UeXBlLlNCeXRlOlxuICAgICAgY2FzZSBFZG1UeXBlLkludDE2OlxuICAgICAgY2FzZSBFZG1UeXBlLkludDMyOlxuICAgICAgY2FzZSBFZG1UeXBlLkludDY0OlxuICAgICAgICAvL1RPRE86IFJhbmdlXG4gICAgICAgIHNjaGVtYS50eXBlID0gSnNvblNjaGVtYVR5cGUuaW50ZWdlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVkbVR5cGUuU2luZ2xlOlxuICAgICAgY2FzZSBFZG1UeXBlLkRvdWJsZTpcbiAgICAgIGNhc2UgRWRtVHlwZS5EZWNpbWFsOlxuICAgICAgICBzY2hlbWEudHlwZSA9IEpzb25TY2hlbWFUeXBlLm51bWJlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEVkbVR5cGUuQm9vbGVhbjpcbiAgICAgICAgc2NoZW1hLnR5cGUgPSBKc29uU2NoZW1hVHlwZS5ib29sZWFuO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaWYgKHRoaXMubWF4TGVuZ3RoKSBzY2hlbWEubWF4TGVuZ3RoID0gdGhpcy5tYXhMZW5ndGg7XG4gICAgaWYgKHRoaXMuZGVmYXVsdCkgc2NoZW1hLmRlZmF1bHQgPSB0aGlzLmRlZmF1bHQ7XG4gICAgaWYgKHRoaXMubnVsbGFibGUpIHNjaGVtYS50eXBlID0gW3NjaGVtYS50eXBlLCBKc29uU2NoZW1hVHlwZS5udWxsXTtcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uKVxuICAgICAgc2NoZW1hID0ge1xuICAgICAgICB0eXBlOiBKc29uU2NoZW1hVHlwZS5hcnJheSxcbiAgICAgICAgaXRlbXM6IHNjaGVtYSxcbiAgICAgICAgYWRkaXRpb25hbEl0ZW1zOiBmYWxzZSxcbiAgICAgIH07XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBpc0tleSgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5zdHJ1Y3R1cmVkXG4gICAgICAgIC5rZXlzKHsgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgID8uZmluZCgoaykgPT4gay5uYW1lID09PSB0aGlzLm5hbWUpICE9PSB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgaGFzUmVmZXJlbnRpYWxzKCkge1xuICAgIHJldHVybiB0aGlzLnJlZmVyZW50aWFscy5sZW5ndGggIT09IDA7XG4gIH1cblxuICBpc0VkbVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZS5zdGFydHNXaXRoKCdFZG0uJyk7XG4gIH1cblxuICBpc0VudW1UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnBhcnNlciBpbnN0YW5jZW9mIE9EYXRhRW51bVR5cGVQYXJzZXI7XG4gIH1cblxuICBlbnVtVHlwZSgpIHtcbiAgICBpZiAoIXRoaXMuaXNFbnVtVHlwZSgpKSB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkIGFyZSBub3QgRW51bVR5cGUnKTtcbiAgICByZXR1cm4gdGhpcy5wYXJzZXIgYXMgT0RhdGFFbnVtVHlwZVBhcnNlcjxUPjtcbiAgfVxuXG4gIGlzU3RydWN0dXJlZFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyIGluc3RhbmNlb2YgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjtcbiAgfVxuXG4gIHN0cnVjdHVyZWRUeXBlKCkge1xuICAgIGlmICghdGhpcy5pc1N0cnVjdHVyZWRUeXBlKCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkIGFyZSBub3QgU3RydWN1dHVyZWRUeXBlJyk7XG4gICAgcmV0dXJuIHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD47XG4gIH1cblxuICBmaWVsZDxGPihuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5pc1N0cnVjdHVyZWRUeXBlKCkpXG4gICAgICByZXR1cm4gKHRoaXMucGFyc2VyIGFzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD4pLmZpZWxkPEY+KFxuICAgICAgICBuYW1lIGFzIGtleW9mIFQsXG4gICAgICApO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgZmllbGQgJHt0aGlzLm5hbWV9IGlzIG5vdCByZWxhdGVkIHRvIGEgU3RydWN0dXJlZFR5cGVgLFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8VD5cbiAgZXh0ZW5kcyBPRGF0YUFubm90YXRhYmxlXG4gIGltcGxlbWVudHMgUGFyc2VyPFQ+XG57XG4gIG5hbWU6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIG9wZW46IGJvb2xlYW47XG4gIGNoaWxkcmVuOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT5bXSA9IFtdO1xuICBhbGlhcz86IHN0cmluZztcbiAgYmFzZT86IHN0cmluZztcbiAgcGFyZW50PzogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICBwcml2YXRlIF9rZXlzPzogT0RhdGFFbnRpdHlUeXBlS2V5W107XG4gIHByaXZhdGUgX2ZpZWxkczogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPGFueT5bXSA9IFtdO1xuICBwYXJzZXJPcHRpb25zPzogUGFyc2VyT3B0aW9ucztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBjb25maWc6IFN0cnVjdHVyZWRUeXBlQ29uZmlnPFQ+LFxuICAgIG5hbWVzcGFjZTogc3RyaW5nLFxuICAgIGFsaWFzPzogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihjb25maWcpO1xuICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgIHRoaXMuYmFzZSA9IGNvbmZpZy5iYXNlO1xuICAgIHRoaXMub3BlbiA9IGNvbmZpZy5vcGVuIHx8IGZhbHNlO1xuICAgIHRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuICAgIHRoaXMuYWxpYXMgPSBhbGlhcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcua2V5cykpXG4gICAgICB0aGlzLl9rZXlzID0gY29uZmlnLmtleXMubWFwKChrZXkpID0+IG5ldyBPRGF0YUVudGl0eVR5cGVLZXkoa2V5KSk7XG4gICAgT2JqZWN0LmVudHJpZXM8U3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZz4oXG4gICAgICAoY29uZmlnLmZpZWxkcyA/PyB7fSkgYXMgeyBbUCBpbiBrZXlvZiBUXTogU3RydWN0dXJlZFR5cGVGaWVsZENvbmZpZyB9LFxuICAgICkuZm9yRWFjaCgoW25hbWUsIGNvbmZpZ10pID0+IHRoaXMuYWRkRmllbGQobmFtZSwgY29uZmlnKSk7XG4gIH1cblxuICBhZGRGaWVsZDxGPihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTdHJ1Y3R1cmVkVHlwZUZpZWxkQ29uZmlnLFxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8Rj4ge1xuICAgIGNvbnN0IGZpZWxkID0gbmV3IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPihuYW1lLCB0aGlzLCBjb25maWcpO1xuICAgIHRoaXMuX2ZpZWxkcy5wdXNoKGZpZWxkKTtcbiAgICByZXR1cm4gZmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmljZXIgbG9va2luZyB0aXRsZS5cbiAgICogVGl0bGVpemUgaXMgbWVhbnQgZm9yIGNyZWF0aW5nIHByZXR0eSBvdXRwdXQuXG4gICAqIEBwYXJhbSB0ZXJtIFRoZSB0ZXJtIG9mIHRoZSBhbm5vdGF0aW9uIHRvIGZpbmQuXG4gICAqIEByZXR1cm5zIFRoZSB0aXRsZWl6ZWQgc3RyaW5nLlxuICAgKi9cbiAgdGl0bGVpemUodGVybT86IHN0cmluZyB8IFJlZ0V4cCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0ZXJtICYmIHRoaXMuYW5ub3RhdGVkVmFsdWUodGVybSkpIHx8IFN0cmluZ3MudGl0bGVDYXNlKHRoaXMubmFtZSk7XG4gIH1cblxuICBpc1R5cGVPZih0eXBlOiBzdHJpbmcpIHtcbiAgICB2YXIgbmFtZXMgPSBbYCR7dGhpcy5uYW1lc3BhY2V9LiR7dGhpcy5uYW1lfWBdO1xuICAgIGlmICh0aGlzLmFsaWFzKSBuYW1lcy5wdXNoKGAke3RoaXMuYWxpYXN9LiR7dGhpcy5uYW1lfWApO1xuICAgIHJldHVybiBuYW1lcy5pbmRleE9mKHR5cGUpICE9PSAtMTtcbiAgfVxuXG4gIGlzU3VidHlwZU9mKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmlzVHlwZU9mKHR5cGUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAodGhpcy5wYXJlbnQpIHJldHVybiB0aGlzLnBhcmVudC5pc1N1YnR5cGVPZih0eXBlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc1N1cGVydHlwZU9mKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmlzVHlwZU9mKHR5cGUpIHx8IHRoaXMuY2hpbGRyZW4uc29tZSgoYykgPT4gYy5pc1N1cGVydHlwZU9mKHR5cGUpKVxuICAgICk7XG4gIH1cblxuICBpc09wZW5UeXBlKCkge1xuICAgIHJldHVybiB0aGlzLm9wZW47XG4gIH1cblxuICBmaW5kQ2hpbGRQYXJzZXIoXG4gICAgcHJlZGljYXRlOiAocDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+KSA9PiBib29sZWFuLFxuICApOiBPRGF0YVN0cnVjdHVyZWRUeXBlUGFyc2VyPGFueT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChwcmVkaWNhdGUodGhpcykpIHJldHVybiB0aGlzO1xuICAgIGxldCBtYXRjaDogT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IGNoIG9mIHRoaXMuY2hpbGRyZW4pIHtcbiAgICAgIG1hdGNoID0gY2guZmluZENoaWxkUGFyc2VyKHByZWRpY2F0ZSk7XG4gICAgICBpZiAobWF0Y2ggIT09IHVuZGVmaW5lZCkgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIGNoaWxkUGFyc2VyKFxuICAgIHByZWRpY2F0ZTogKHA6IE9EYXRhU3RydWN0dXJlZFR5cGVQYXJzZXI8YW55PikgPT4gYm9vbGVhbixcbiAgKTogUGFyc2VyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRDaGlsZFBhcnNlcihwcmVkaWNhdGUpIHx8IE5PTkVfUEFSU0VSO1xuICB9XG5cbiAgLy8gRGVzZXJpYWxpemVcbiAgZGVzZXJpYWxpemUodmFsdWU6IGFueSwgb3B0aW9ucz86IFBhcnNlck9wdGlvbnMpOiBUIHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSkuZmlsdGVyKFxuICAgICAgKGYpID0+XG4gICAgICAgIGYubmFtZSBpbiB2YWx1ZSAmJlxuICAgICAgICB2YWx1ZVtmLm5hbWVdICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgdmFsdWVbZi5uYW1lXSAhPT0gbnVsbCxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIC4uLmZpZWxkcy5yZWR1Y2UoXG4gICAgICAgIChhY2MsIGYpID0+ICh7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtmLm5hbWVdOiBmLmRlc2VyaWFsaXplKHZhbHVlW2YubmFtZV0sIHBhcnNlck9wdGlvbnMpLFxuICAgICAgICB9KSxcbiAgICAgICAge30sXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICAvLyBTZXJpYWxpemVcbiAgc2VyaWFsaXplKHZhbHVlOiBQYXJ0aWFsPFQ+LCBvcHRpb25zPzogUGFyc2VyT3B0aW9ucyk6IGFueSB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IHsgLi4udGhpcy5wYXJzZXJPcHRpb25zLCAuLi5vcHRpb25zIH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLmZpbHRlcihcbiAgICAgIChmKSA9PlxuICAgICAgICBmLm5hbWUgaW4gdmFsdWUgJiZcbiAgICAgICAgKHZhbHVlIGFzIGFueSlbZi5uYW1lXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh2YWx1ZSBhcyBhbnkpW2YubmFtZV0gIT09IG51bGwsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICAuLi5maWVsZHMucmVkdWNlKFxuICAgICAgICAoYWNjLCBmKSA9PiAoe1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICBbZi5uYW1lXTogZi5zZXJpYWxpemUoKHZhbHVlIGFzIGFueSlbZi5uYW1lXSwgcGFyc2VyT3B0aW9ucyksXG4gICAgICAgIH0pLFxuICAgICAgICB7fSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIC8vIEVuY29kZVxuICBlbmNvZGUodmFsdWU6IFQsIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zKTogYW55IHtcbiAgICBjb25zdCBwYXJzZXJPcHRpb25zID0geyAuLi50aGlzLnBhcnNlck9wdGlvbnMsIC4uLm9wdGlvbnMgfTtcbiAgICByZXR1cm4gcmF3KEpTT04uc3RyaW5naWZ5KHRoaXMuc2VyaWFsaXplKHZhbHVlLCBwYXJzZXJPcHRpb25zKSkpO1xuICB9XG5cbiAgY29uZmlndXJlKHtcbiAgICBvcHRpb25zLFxuICAgIHBhcnNlckZvclR5cGUsXG4gIH06IHtcbiAgICBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICAgIHBhcnNlckZvclR5cGU6ICh0eXBlOiBzdHJpbmcpID0+IFBhcnNlcjxhbnk+O1xuICB9KSB7XG4gICAgdGhpcy5wYXJzZXJPcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAodGhpcy5iYXNlKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJzZXJGb3JUeXBlKHRoaXMuYmFzZSkgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+O1xuICAgICAgcGFyZW50LmNoaWxkcmVuLnB1c2godGhpcyk7XG4gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgICB9XG4gICAgdGhpcy5fZmllbGRzLmZvckVhY2goKGYpID0+IGYuY29uZmlndXJlKHsgb3B0aW9ucywgcGFyc2VyRm9yVHlwZSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbGwgZmllbGRzIG9mIHRoZSBzdHJ1Y3R1cmVkIHR5cGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlX25hdmlnYXRpb24gSW5jbHVkZSBuYXZpZ2F0aW9uIHByb3BlcnRpZXMgaW4gdGhlIHJlc3VsdC5cbiAgICogQHBhcmFtIGluY2x1ZGVfcGFyZW50cyBJbmNsdWRlIHRoZSBwYXJlbnQgdHlwZXMgaW4gdGhlIHJlc3VsdC5cbiAgICogQHJldHVybnMgQWxsIGZpZWxkcyBvZiB0aGUgc3RydWN0dXJlZCB0eXBlLlxuICAgKi9cbiAgZmllbGRzKHtcbiAgICBpbmNsdWRlX25hdmlnYXRpb24sXG4gICAgaW5jbHVkZV9wYXJlbnRzLFxuICB9OiB7XG4gICAgaW5jbHVkZV9wYXJlbnRzOiBib29sZWFuO1xuICAgIGluY2x1ZGVfbmF2aWdhdGlvbjogYm9vbGVhbjtcbiAgfSk6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+W10ge1xuICAgIHJldHVybiBbXG4gICAgICAuLi4oaW5jbHVkZV9wYXJlbnRzICYmIHRoaXMucGFyZW50ICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyB0aGlzLnBhcmVudC5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHMsIGluY2x1ZGVfbmF2aWdhdGlvbiB9KVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLnRoaXMuX2ZpZWxkcy5maWx0ZXIoXG4gICAgICAgIChmaWVsZCkgPT4gaW5jbHVkZV9uYXZpZ2F0aW9uIHx8ICFmaWVsZC5uYXZpZ2F0aW9uLFxuICAgICAgKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGtleXMgb2YgdGhlIHN0cnVjdHVyZWQgdHlwZS5cbiAgICogQHBhcmFtIGluY2x1ZGVfcGFyZW50cyBJbmNsdWRlIHRoZSBwYXJlbnQgZmllbGRzXG4gICAqIEByZXR1cm5zIFRoZSBrZXlzIG9mIHRoZSBzdHJ1Y3R1cmVkIHR5cGVcbiAgICovXG4gIGtleXMoe1xuICAgIGluY2x1ZGVfcGFyZW50cyxcbiAgfToge1xuICAgIGluY2x1ZGVfcGFyZW50czogYm9vbGVhbjtcbiAgfSk6IE9EYXRhRW50aXR5VHlwZUtleVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKGluY2x1ZGVfcGFyZW50cyAmJiB0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gdGhpcy5wYXJlbnQua2V5cyh7IGluY2x1ZGVfcGFyZW50cyB9KVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLih0aGlzLl9rZXlzIHx8IFtdKSxcbiAgICBdO1xuICB9XG5cbiAgaXNFbnRpdHlUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9rZXlzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICh0aGlzLnBhcmVudCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucGFyZW50LmlzRW50aXR5VHlwZSgpKVxuICAgICk7XG4gIH1cblxuICBpc0NvbXBsZXhUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5pc0VudGl0eVR5cGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBmaWVsZCBwYXJzZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBmaWVsZFxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgcGFyc2VyXG4gICAqL1xuICBmaWVsZDxGPihuYW1lOiBrZXlvZiBUKTogT0RhdGFTdHJ1Y3R1cmVkVHlwZUZpZWxkUGFyc2VyPEY+IHtcbiAgICBsZXQgZmllbGQgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgfSkuZmluZCgoZmllbGQ6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxGPikgPT4gZmllbGQubmFtZSA9PT0gbmFtZSk7XG4gICAgLy9UaHJvdyBlcnJvciBpZiBub3QgZm91bmRcbiAgICBpZiAoZmllbGQgPT09IHVuZGVmaW5lZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5hbWV9IGhhcyBubyBmaWVsZCBuYW1lZCAke1N0cmluZyhuYW1lKX1gKTtcbiAgICByZXR1cm4gZmllbGQ7XG4gIH1cblxuICAvKipcbiAgICogUGlja3MgdGhlIGZpZWxkcyBmcm9tIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSBhdHRyc1xuICAgKiBAcGFyYW0gaW5jbHVkZV9wYXJlbnRzIEluY2x1ZGUgdGhlIHBhcmVudCBmaWVsZHNcbiAgICogQHBhcmFtIGluY2x1ZGVfbmF2aWdhdGlvbiBJbmNsdWRlIHRoZSBuYXZpZ2F0aW9uIGZpZWxkc1xuICAgKiBAcGFyYW0gaW5jbHVkZV9ldGFnIEluY2x1ZGUgdGhlIGV0YWcgZmllbGRcbiAgICogQHJldHVybnMgVGhlIHBpY2tlZCBmaWVsZHNcbiAgICovXG4gIHBpY2soXG4gICAgYXR0cnM6IHsgW25hbWU6IHN0cmluZ106IGFueSB9LFxuICAgIHtcbiAgICAgIGluY2x1ZGVfcGFyZW50cyA9IHRydWUsXG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24gPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVfZXRhZyA9IHRydWUsXG4gICAgICBvcHRpb25zLFxuICAgIH06IHtcbiAgICAgIGluY2x1ZGVfcGFyZW50cz86IGJvb2xlYW47XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb24/OiBib29sZWFuO1xuICAgICAgaW5jbHVkZV9ldGFnPzogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM/OiBQYXJzZXJPcHRpb25zO1xuICAgIH0gPSB7fSxcbiAgKTogUGFydGlhbDxUPiB7XG4gICAgY29uc3QgcGFyc2VyT3B0aW9ucyA9IG9wdGlvbnMgfHwgdGhpcy5wYXJzZXJPcHRpb25zO1xuICAgIGNvbnN0IG5hbWVzID0gdGhpcy5maWVsZHMoeyBpbmNsdWRlX3BhcmVudHMsIGluY2x1ZGVfbmF2aWdhdGlvbiB9KS5tYXAoXG4gICAgICAoZikgPT4gZi5uYW1lLFxuICAgICk7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGF0dHJzKVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKGtleSkgPT5cbiAgICAgICAgICBuYW1lcy5pbmRleE9mKGtleSkgIT09IC0xIHx8XG4gICAgICAgICAgKGtleSA9PVxuICAgICAgICAgICAgT0RhdGFIZWxwZXJbcGFyc2VyT3B0aW9ucz8udmVyc2lvbiB8fCBERUZBVUxUX1ZFUlNJT05dLk9EQVRBX0VUQUcgJiZcbiAgICAgICAgICAgIGluY2x1ZGVfZXRhZyksXG4gICAgICApXG4gICAgICAucmVkdWNlKChhY2MsIGtleSkgPT4gT2JqZWN0LmFzc2lnbihhY2MsIHsgW2tleV06IGF0dHJzW2tleV0gfSksIHt9KTtcbiAgfVxuXG4gIHJlc29sdmVLZXkoXG4gICAgdmFsdWU6IGFueSxcbiAgICB7XG4gICAgICByZXNvbHZlID0gdHJ1ZSxcbiAgICAgIHNpbmdsZSA9IHRydWUsXG4gICAgfTogeyByZXNvbHZlPzogYm9vbGVhbjsgc2luZ2xlPzogYm9vbGVhbiB9ID0ge30sXG4gICk6IGFueSB7XG4gICAgY29uc3Qga2V5VHlwZXMgPSB0aGlzLmtleXMoeyBpbmNsdWRlX3BhcmVudHM6IHRydWUgfSk7XG4gICAgY29uc3Qga2V5ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICBmb3IgKHZhciBrdCBvZiBrZXlUeXBlcykge1xuICAgICAgbGV0IHYgPSB2YWx1ZSBhcyBhbnk7XG4gICAgICBsZXQgc3RydWN0dXJlZCA9IHRoaXMgYXMgT0RhdGFTdHJ1Y3R1cmVkVHlwZVBhcnNlcjxhbnk+IHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IGZpZWxkOiBPRGF0YVN0cnVjdHVyZWRUeXBlRmllbGRQYXJzZXI8YW55PiB8IHVuZGVmaW5lZDtcbiAgICAgIGZvciAobGV0IG5hbWUgb2Yga3QubmFtZS5zcGxpdCgnLycpKSB7XG4gICAgICAgIGlmIChzdHJ1Y3R1cmVkID09PSB1bmRlZmluZWQpIGJyZWFrO1xuICAgICAgICBmaWVsZCA9IHN0cnVjdHVyZWRcbiAgICAgICAgICAuZmllbGRzKHsgaW5jbHVkZV9uYXZpZ2F0aW9uOiBmYWxzZSwgaW5jbHVkZV9wYXJlbnRzOiB0cnVlIH0pXG4gICAgICAgICAgLmZpbmQoKGY6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+KSA9PiBmLm5hbWUgPT09IG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHYgPSBUeXBlcy5pc1BsYWluT2JqZWN0KHYpID8gdltmaWVsZC5uYW1lXSA6IHY7XG4gICAgICAgICAgc3RydWN0dXJlZCA9IGZpZWxkLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgICAgICAgPyBmaWVsZC5zdHJ1Y3R1cmVkVHlwZSgpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZpZWxkICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleS5zZXQoa3QuYWxpYXMgfHwgZmllbGQubmFtZSwgZmllbGQuZW5jb2RlKHYpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleS5zaXplID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXNvbHZlXG4gICAgICA/IE9iamVjdHMucmVzb2x2ZUtleShrZXksIHsgc2luZ2xlIH0pXG4gICAgICA6IE9iamVjdC5mcm9tRW50cmllcyhrZXkpO1xuICB9XG5cbiAgZGVmYXVsdHMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGxldCBmaWVsZHMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IGZhbHNlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLmZpbHRlcigoZikgPT4gZi5kZWZhdWx0ICE9PSB1bmRlZmluZWQgfHwgZi5pc1N0cnVjdHVyZWRUeXBlKCkpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5maWVsZHMucmVkdWNlKChhY2MsIGYpID0+IHtcbiAgICAgICAgbGV0IHZhbHVlOiBhbnkgPSBmLmlzU3RydWN0dXJlZFR5cGUoKVxuICAgICAgICAgID8gZi5zdHJ1Y3R1cmVkVHlwZSgpLmRlZmF1bHRzKClcbiAgICAgICAgICA6IGYuZGVmYXVsdDtcbiAgICAgICAgcmV0dXJuIFR5cGVzLmlzRW1wdHkodmFsdWUpID8gYWNjIDogeyAuLi5hY2MsIFtmLm5hbWVdOiB2YWx1ZSB9O1xuICAgICAgfSwge30pLFxuICAgIH07XG4gIH1cblxuICAvLyBKc29uIFNjaGVtYVxuICB0b0pzb25TY2hlbWEob3B0aW9uczogSnNvblNjaGVtYU9wdGlvbnM8VD4gPSB7fSkge1xuICAgIGxldCBzY2hlbWE6IGFueSA9IHtcbiAgICAgICRzY2hlbWE6ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMnLFxuICAgICAgJGlkOiBgJHt0aGlzLm5hbWVzcGFjZX0uJHt0aGlzLm5hbWV9YCxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlaXplKERFU0NSSVBUSU9OKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmFubm90YXRlZFZhbHVlKExPTkdfREVTQ1JJUFRJT04pLFxuICAgICAgdHlwZTogSnNvblNjaGVtYVR5cGUub2JqZWN0LFxuICAgICAgcHJvcGVydGllczoge30sXG4gICAgICByZXF1aXJlZDogW10sXG4gICAgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkcyh7XG4gICAgICBpbmNsdWRlX25hdmlnYXRpb246IHRydWUsXG4gICAgICBpbmNsdWRlX3BhcmVudHM6IHRydWUsXG4gICAgfSkuZmlsdGVyKFxuICAgICAgKGYpID0+XG4gICAgICAgICghZi5uYXZpZ2F0aW9uIHx8IChvcHRpb25zLmV4cGFuZCAmJiBmLm5hbWUgaW4gb3B0aW9ucy5leHBhbmQpKSAmJlxuICAgICAgICAoIW9wdGlvbnMuc2VsZWN0IHx8ICg8c3RyaW5nW10+b3B0aW9ucy5zZWxlY3QpLmluZGV4T2YoZi5uYW1lKSAhPT0gLTEpLFxuICAgICk7XG4gICAgc2NoZW1hLnByb3BlcnRpZXMgPSBPYmplY3QuYXNzaWduKFxuICAgICAge30sXG4gICAgICBzY2hlbWEucHJvcGVydGllcyxcbiAgICAgIGZpZWxkc1xuICAgICAgICAubWFwKChmKSA9PiB7XG4gICAgICAgICAgbGV0IGV4cGFuZCA9XG4gICAgICAgICAgICBvcHRpb25zLmV4cGFuZCAmJiBmLm5hbWUgaW4gb3B0aW9ucy5leHBhbmRcbiAgICAgICAgICAgICAgPyAob3B0aW9ucy5leHBhbmQgYXMgYW55KVtmLm5hbWVdXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgIGxldCBzY2hlbWEgPSBmLnRvSnNvblNjaGVtYShleHBhbmQpO1xuICAgICAgICAgIGlmIChvcHRpb25zLmN1c3RvbSAmJiBmLm5hbWUgaW4gb3B0aW9ucy5jdXN0b20pXG4gICAgICAgICAgICBzY2hlbWEgPSAoXG4gICAgICAgICAgICAgIG9wdGlvbnMuY3VzdG9tW2YubmFtZSBhcyBrZXlvZiBUXSBhcyAoXG4gICAgICAgICAgICAgICAgc2NoZW1hOiBhbnksXG4gICAgICAgICAgICAgICAgZmllbGQ6IE9EYXRhU3RydWN0dXJlZFR5cGVGaWVsZFBhcnNlcjxhbnk+LFxuICAgICAgICAgICAgICApID0+IGFueVxuICAgICAgICAgICAgKShzY2hlbWEsIGYpO1xuICAgICAgICAgIHJldHVybiB7IFtmLm5hbWVdOiBzY2hlbWEgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZSgoYWNjLCB2KSA9PiBPYmplY3QuYXNzaWduKGFjYywgdiksIHt9KSxcbiAgICApO1xuICAgIHNjaGVtYS5yZXF1aXJlZCA9IFtcbiAgICAgIC4uLnNjaGVtYS5yZXF1aXJlZCxcbiAgICAgIC4uLmZpZWxkc1xuICAgICAgICAuZmlsdGVyKChmKSA9PlxuICAgICAgICAgIG9wdGlvbnMucmVxdWlyZWQgJiYgZi5uYW1lIGluIG9wdGlvbnMucmVxdWlyZWRcbiAgICAgICAgICAgID8gb3B0aW9ucy5yZXF1aXJlZFtmLm5hbWUgYXMga2V5b2YgVF1cbiAgICAgICAgICAgIDogIWYubnVsbGFibGUsXG4gICAgICAgIClcbiAgICAgICAgLm1hcCgoZikgPT4gZi5uYW1lKSxcbiAgICBdO1xuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICB2YWxpZGF0ZShcbiAgICBhdHRyczogYW55LFxuICAgIHtcbiAgICAgIG1ldGhvZCxcbiAgICAgIG5hdmlnYXRpb24gPSBmYWxzZSxcbiAgICB9OiB7XG4gICAgICBjcmVhdGU/OiBib29sZWFuO1xuICAgICAgbWV0aG9kPzogJ2NyZWF0ZScgfCAndXBkYXRlJyB8ICdtb2RpZnknO1xuICAgICAgbmF2aWdhdGlvbj86IGJvb2xlYW47XG4gICAgfSA9IHt9LFxuICApOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXJyb3JzID0ge30gYXMgeyBbbmFtZTogc3RyaW5nXTogYW55IH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHMoe1xuICAgICAgaW5jbHVkZV9uYXZpZ2F0aW9uOiB0cnVlLFxuICAgICAgaW5jbHVkZV9wYXJlbnRzOiB0cnVlLFxuICAgIH0pLmZpbHRlcigoZikgPT4gIWYubmF2aWdhdGlvbiB8fCBuYXZpZ2F0aW9uKTtcbiAgICBmb3IgKHZhciBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbZmllbGQubmFtZSBhcyBrZXlvZiBUXTtcbiAgICAgIGNvbnN0IGVycnMgPSBmaWVsZC52YWxpZGF0ZSh2YWx1ZSwgeyBtZXRob2QsIG5hdmlnYXRpb24gfSk7XG4gICAgICBpZiAoZXJycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGVycm9yc1tmaWVsZC5uYW1lXSA9IGVycnM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAhVHlwZXMuaXNFbXB0eShlcnJvcnMpID8gZXJyb3JzIDogdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=