occam-nominal 1.0.336 → 1.0.340

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 (39) hide show
  1. package/lib/context.js +5 -1
  2. package/lib/element/assumption.js +134 -111
  3. package/lib/element/constraint.js +114 -102
  4. package/lib/element/goal.js +65 -55
  5. package/lib/element/hypothesis.js +2 -2
  6. package/lib/element/judgement.js +13 -14
  7. package/lib/element/label.js +24 -21
  8. package/lib/element/metaType.js +2 -2
  9. package/lib/element/metavariable.js +25 -26
  10. package/lib/element/parameter.js +2 -2
  11. package/lib/element/procedureCall.js +2 -2
  12. package/lib/element/procedureReference.js +2 -2
  13. package/lib/element/reference.js +25 -22
  14. package/lib/element/schema.js +165 -154
  15. package/lib/element/signature.js +2 -2
  16. package/lib/element/statement.js +4 -2
  17. package/lib/element/substitution/reference.js +22 -29
  18. package/lib/element/typePrefix.js +2 -2
  19. package/lib/process/unification.js +36 -42
  20. package/package.json +3 -3
  21. package/src/context.js +6 -0
  22. package/src/element/assumption.js +158 -132
  23. package/src/element/constraint.js +134 -125
  24. package/src/element/goal.js +79 -72
  25. package/src/element/hypothesis.js +2 -2
  26. package/src/element/judgement.js +18 -20
  27. package/src/element/label.js +25 -24
  28. package/src/element/metaType.js +2 -2
  29. package/src/element/metavariable.js +32 -31
  30. package/src/element/parameter.js +2 -2
  31. package/src/element/procedureCall.js +2 -2
  32. package/src/element/procedureReference.js +2 -2
  33. package/src/element/reference.js +26 -25
  34. package/src/element/schema.js +193 -195
  35. package/src/element/signature.js +2 -2
  36. package/src/element/statement.js +6 -2
  37. package/src/element/substitution/reference.js +22 -35
  38. package/src/element/typePrefix.js +2 -2
  39. package/src/process/unification.js +39 -54
@@ -10,13 +10,14 @@ Object.defineProperty(exports, "default", {
10
10
  });
11
11
  const _occamlanguages = require("occam-languages");
12
12
  const _elements = require("../elements");
13
+ const _continuation = require("../utilities/continuation");
13
14
  const _unify = require("../process/unify");
14
15
  const _instantiate = require("../process/instantiate");
15
16
  const _brackets = require("../utilities/brackets");
16
17
  const _element = require("../utilities/element");
17
18
  const _string = require("../utilities/string");
18
19
  const _context = require("../utilities/context");
19
- const { breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
20
+ const { some } = _occamlanguages.continuationUtilities, { breakPointFromJSON, breakPointToBreakPointJSON } = _occamlanguages.breakPointUtilities;
20
21
  const _default = (0, _elements.define)(class Constraint extends _occamlanguages.Element {
21
22
  constructor(context, string, node, breakPoint, reference, statement){
22
23
  super(context, string, node, breakPoint);
@@ -48,84 +49,88 @@ const _default = (0, _elements.define)(class Constraint extends _occamlanguages.
48
49
  const constraintNode = this.getConstraintNode(), constraint = context.findConstraintByConstraintNode(constraintNode), validConstraint = constraint; ///
49
50
  return validConstraint;
50
51
  }
51
- async validate(context) {
52
- let constraint = null;
52
+ validate(context, continuation) {
53
53
  const constraintString = this.getString(); ///
54
54
  context.trace(`Validating the '${constraintString}' constraint...`);
55
- let validates = false;
56
55
  const validConstraint = this.findValidConstraint(context);
57
56
  if (validConstraint !== null) {
58
- validates = true;
59
- constraint = validConstraint; ///
57
+ const constraint = validConstraint; ///
60
58
  context.debug(`...the '${constraintString}' constraint is already valid.`);
59
+ return continuation(constraint);
61
60
  } else {
62
- const temporaryContext = context; ///
63
61
  context = this.getContext();
64
62
  (0, _context.attempt)((context)=>{
65
- const statementValidates = this.validateStatement(context);
66
- if (statementValidates) {
67
- const referenceValidates = this.validateReference(context);
68
- if (referenceValidates) {
69
- const stated = context.isStated();
70
- let validatesWhenStated = false, validatesWhenDerived = false;
71
- if (stated) {
72
- validatesWhenStated = this.validateWhenStated(context);
73
- } else {
74
- validatesWhenDerived = this.validateWhenDerived(context);
63
+ const validateStatement = this.validateStatement.bind(this), validateReference = this.validateReference.bind(this);
64
+ return (0, _continuation.all)([
65
+ validateStatement,
66
+ validateReference
67
+ ], context, (validates)=>{
68
+ if (!validates) {
69
+ const constraint = null;
70
+ return continuation(constraint);
71
+ }
72
+ const validateWhenStated = this.validateWhenStated.bind(this), validateWhenDerived = this.validateWhenDerived.bind(this);
73
+ return (0, _continuation.exists)([
74
+ validateWhenStated,
75
+ validateWhenDerived
76
+ ], context, (validates)=>{
77
+ let constraint = null;
78
+ if (validates) {
79
+ constraint = this; ///
80
+ context.addConstraint(constraint);
75
81
  }
76
- if (validatesWhenStated || validatesWhenDerived) {
77
- validates = true;
82
+ if (validates) {
83
+ this.commit(context);
78
84
  }
79
- }
80
- }
81
- if (validates) {
82
- this.commit(context);
83
- }
85
+ if (validates) {
86
+ context.debug(`...validated the '${constraintString}' constraint.`);
87
+ }
88
+ return continuation(constraint);
89
+ });
90
+ });
84
91
  }, context);
85
- context = temporaryContext; ///
86
- if (validates) {
87
- constraint = this; ///
88
- context.addConstraint(constraint);
89
- }
90
92
  }
91
- if (validates) {
92
- context.debug(`...validated the '${constraintString}' constraint.`);
93
- }
94
- return constraint;
95
93
  }
96
- validateReference(context) {
94
+ validateReference(context, continuation) {
97
95
  let referenceValidates = false;
98
96
  const constraintString = this.getString(); ///
99
97
  context.trace(`Validating the '${constraintString}' constraint's reference...`);
100
- const reference = this.reference.validate(context);
101
- if (reference !== null) {
102
- const metavariable = this.reference.getMetavariable(), metavariableDeclared = metavariable.isDeclared();
103
- if (metavariableDeclared) {
104
- this.reference = reference;
105
- referenceValidates = true;
98
+ this.reference.validate(context, (reference)=>{
99
+ if (reference !== null) {
100
+ const metavariable = this.reference.getMetavariable(), metavariableDeclared = metavariable.isDeclared();
101
+ if (metavariableDeclared) {
102
+ this.reference = reference;
103
+ referenceValidates = true;
104
+ }
106
105
  }
107
- }
108
- if (referenceValidates) {
109
- context.debug(`...validated the '${constraintString}' constraint's reference.`);
110
- }
111
- return referenceValidates;
106
+ if (referenceValidates) {
107
+ context.debug(`...validated the '${constraintString}' constraint's reference.`);
108
+ }
109
+ return continuation(referenceValidates);
110
+ });
112
111
  }
113
- async validateStatement(context) {
114
- let statementValidates = false;
112
+ validateStatement(context, continuation) {
115
113
  const constraintString = this.getString(); ///
116
114
  context.trace(`Validating the '${constraintString}' constraint's statement...`);
117
- (0, _context.descend)(async (context)=>{
118
- const statement = this.statement.validate(context);
119
- if (statement !== null) {
120
- statementValidates = true;
121
- }
115
+ (0, _context.descend)((context)=>{
116
+ this.statement.validate(context, (statement)=>{
117
+ let statementValidates = false;
118
+ if (statement !== null) {
119
+ statementValidates = true;
120
+ }
121
+ if (statementValidates) {
122
+ context.debug(`...validated the '${constraintString}' constraint's statement.`);
123
+ }
124
+ return continuation(statementValidates);
125
+ });
122
126
  }, context);
123
- if (statementValidates) {
124
- context.debug(`...validated the '${constraintString}' constraint's statement.`);
125
- }
126
- return statementValidates;
127
127
  }
128
- validateWhenStated(context) {
128
+ validateWhenStated(context, continuation) {
129
+ const stated = context.isStated();
130
+ if (!stated) {
131
+ const validatesWhenStated = false;
132
+ return continuation(validatesWhenStated);
133
+ }
129
134
  let validatesWhenStated;
130
135
  const constraintString = this.getString(); ///
131
136
  context.trace(`Validating the '${constraintString}' stated constraint...`);
@@ -133,9 +138,14 @@ const _default = (0, _elements.define)(class Constraint extends _occamlanguages.
133
138
  if (validatesWhenStated) {
134
139
  context.debug(`...validated the '${constraintString}' stated constraint.`);
135
140
  }
136
- return validatesWhenStated;
141
+ return continuation(validatesWhenStated);
137
142
  }
138
- validateWhenDerived(context) {
143
+ validateWhenDerived(context, continuation) {
144
+ const stated = context.isStated();
145
+ if (stated) {
146
+ const validatesWhenDerived = false;
147
+ return continuation(validatesWhenDerived);
148
+ }
139
149
  let validatesWhenDerived;
140
150
  const constraintString = this.getString(); ///
141
151
  context.trace(`Validating the '${constraintString}' derived constraint...`);
@@ -143,62 +153,64 @@ const _default = (0, _elements.define)(class Constraint extends _occamlanguages.
143
153
  if (validatesWhenDerived) {
144
154
  context.debug(`...validated the '${constraintString}' derived constraint.`);
145
155
  }
146
- return validatesWhenDerived;
147
- }
148
- unifyReference(reference, generalContext, specificContext) {
149
- let referenceUnifies;
150
- if (reference !== null) {
151
- const context = specificContext, referenceString = reference.getString(), constraintString = this.getString(); ///
152
- context.trace(`Unifying the '${referenceString}' reference with the '${constraintString}' constraint's reference...`);
153
- const metavariable = this.getMetavariable();
154
- referenceUnifies = metavariable.unifyReference(reference, generalContext, specificContext);
156
+ return continuation(validatesWhenDerived);
157
+ }
158
+ unifyReference(reference, generalContext, specificContext, continuation) {
159
+ if (reference === null) {
160
+ const referenceUnifies = true; ///
161
+ return continuation(referenceUnifies);
162
+ }
163
+ const context = specificContext, referenceString = reference.getString(), constraintString = this.getString(); ///
164
+ context.trace(`Unifying the '${referenceString}' reference with the '${constraintString}' constraint's reference...`);
165
+ const metavariable = this.getMetavariable();
166
+ return metavariable.unifyReference(reference, generalContext, specificContext, (referenceUnifies)=>{
155
167
  if (referenceUnifies) {
156
168
  context.debug(`..unified the '${referenceString}' with the '${constraintString}' constraint's reference.`);
157
169
  }
158
- } else {
159
- referenceUnifies = true; ///
160
- }
161
- return referenceUnifies;
170
+ return continuation(referenceUnifies);
171
+ });
162
172
  }
163
- async unifyStatement(statement, generalContext, specificContext) {
164
- let statementUnifies;
173
+ unifyStatement(statement, generalContext, specificContext, continuation) {
165
174
  const context = specificContext, statementString = statement.getString(), constraintString = this.getString(); ///
166
175
  context.trace(`Unifying the '${statementString}' statement with the '${constraintString}' constraint's statement...`);
167
176
  const generalStatement = this.statement, specificStatement = (0, _brackets.stripBracketsFromStatement)(statement, context); ///
168
- statementUnifies = (0, _unify.unifyStatement)(generalStatement, specificStatement, generalContext, specificContext);
169
- if (statementUnifies) {
170
- context.debug(`...unified the '${statementString}' statement with the '${constraintString}' constraint's statement.`);
171
- }
172
- return statementUnifies;
177
+ return (0, _unify.unifyStatement)(generalStatement, specificStatement, generalContext, specificContext, (statementUnifies)=>{
178
+ if (statementUnifies) {
179
+ context.debug(`...unified the '${statementString}' statement with the '${constraintString}' constraint's statement.`);
180
+ }
181
+ return continuation(statementUnifies);
182
+ });
173
183
  }
174
- async unifyAssumption(assumption, context) {
175
- let assumptionUnifies = false;
184
+ unifyAssumption(assumption, context, continuation) {
176
185
  const assumptionString = assumption.getString(), constraintString = this.getString();
177
186
  context.trace(`Unifying the '${assumptionString}' assumption with the '${constraintString}' constraint...`);
178
187
  const constraintContext = this.getContext(), generalContext = constraintContext; ///
179
- (0, _context.reconcile)(async (context)=>{
180
- const reference = assumption.getReference(), specificContext = context, referneceUnifies = this.unifyReference(reference, generalContext, specificContext);
181
- if (referneceUnifies) {
182
- const statement = assumption.getStatement(), statementUnified = this.unifyStatement(statement, generalContext, specificContext);
183
- if (statementUnified) {
184
- context.commit();
185
- assumptionUnifies = true;
188
+ (0, _context.reconcile)((context)=>{
189
+ const reference = assumption.getReference(), specificContext = context; ///
190
+ return this.unifyReference(reference, generalContext, specificContext, (referneceUnifies)=>{
191
+ if (!referneceUnifies) {
192
+ const assumptionUnifies = false;
193
+ return continuation(assumptionUnifies);
186
194
  }
187
- }
195
+ const statement = assumption.getStatement();
196
+ return this.unifyStatement(statement, generalContext, specificContext, (statementUnifies)=>{
197
+ let assumptionUnifies = false;
198
+ if (statementUnifies) {
199
+ context.commit();
200
+ assumptionUnifies = true;
201
+ }
202
+ if (assumptionUnifies) {
203
+ context.debug(`...unified the '${assumptionString}' assumption with the '${constraintString}' constraint...`);
204
+ }
205
+ return continuation(assumptionUnifies);
206
+ });
207
+ });
188
208
  }, context);
189
- if (assumptionUnifies) {
190
- context.debug(`...unified the '${assumptionString}' assumption with the '${constraintString}' constraint...`);
191
- }
192
- return assumptionUnifies;
193
209
  }
194
- unifyAssumptions(assumptions, context) {
195
- const assumptionsUnify = assumptions.some((assumption)=>{
196
- const assumptionUnifies = this.unifyAssumption(assumption, context);
197
- if (assumptionUnifies) {
198
- return true;
199
- }
200
- });
201
- return assumptionsUnify;
210
+ unifyAssumptions(assumptions, context, continuation) {
211
+ some(assumptions, (assumption, continuation)=>{
212
+ this.unifyAssumption(assumption, context, continuation);
213
+ }, continuation);
202
214
  }
203
215
  toJSON() {
204
216
  const context = this.getContext();
@@ -251,4 +263,4 @@ function statementFromConstraintNode(constraintNode, context) {
251
263
  return statement;
252
264
  }
253
265
 
254
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cmFpbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IEVsZW1lbnQsIGJyZWFrUG9pbnRVdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmltcG9ydCB7IGRlZmluZSB9IGZyb20gXCIuLi9lbGVtZW50c1wiO1xuaW1wb3J0IHsgdW5pZnlTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vcHJvY2Vzcy91bmlmeVwiO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVDb25zdHJhaW50IH0gZnJvbSBcIi4uL3Byb2Nlc3MvaW5zdGFudGlhdGVcIjtcbmltcG9ydCB7IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50IH0gZnJvbSBcIi4uL3V0aWxpdGllcy9icmFja2V0c1wiO1xuaW1wb3J0IHsgY29uc3RyYWludEZyb21Db25zdHJhaW50Tm9kZSB9IGZyb20gXCIuLi91dGlsaXRpZXMvZWxlbWVudFwiO1xuaW1wb3J0IHsgY29uc3RyYWludFN0cmluZ0Zyb21SZWZlcmVuY2VBbmRTdGF0ZW1lbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL3N0cmluZ1wiO1xuaW1wb3J0IHsgYWJsYXRlLCBhdHRlbXB0LCBkZXNjZW5kLCByZWNvbmNpbGUsIHNlcmlhbGlzZSwgdW5zZXJpYWxpc2UsIGluc3RhbnRpYXRlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9jb250ZXh0XCI7XG5cbmNvbnN0IHsgYnJlYWtQb2ludEZyb21KU09OLCBicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiB9ID0gYnJlYWtQb2ludFV0aWxpdGllcztcblxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lKGNsYXNzIENvbnN0cmFpbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCByZWZlcmVuY2UsIHN0YXRlbWVudCkge1xuICAgIHN1cGVyKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcbiAgICB0aGlzLnN0YXRlbWVudCA9IHN0YXRlbWVudDtcbiAgfVxuXG4gIGdldFJlZmVyZW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2U7XG4gIH1cblxuICBnZXRTdGF0ZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVtZW50O1xuICB9XG5cbiAgZ2V0Q29uc3RyYWludE5vZGUoKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cmFpbnROb2RlID0gbm9kZTsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbnN0cmFpbnROb2RlO1xuICB9XG5cbiAgZ2V0TWV0YXZhcmlhYmxlKCkgeyByZXR1cm4gdGhpcy5yZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCk7IH1cblxuICBpc0VxdWFsVG8oY29uc3RyYWludCkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnROb2RlID0gY29uc3RyYWludC5nZXROb2RlKCksXG4gICAgICAgICAgY29uc3RyYWludE5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaENvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlKSxcbiAgICAgICAgICBlcXVhbFRvID0gY29uc3RyYWludE5vZGVNYXRjaGVzOyAgLy8vXG5cbiAgICByZXR1cm4gZXF1YWxUbztcbiAgfVxuXG4gIG1hdGNoQ29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUpIHtcbiAgICBjb25zdCBub2RlID0gY29uc3RyYWludE5vZGUsIC8vL1xuICAgICAgICAgIG5vZGVNYXRjaGVzID0gdGhpcy5tYXRjaE5vZGUobm9kZSksXG4gICAgICAgICAgY29uc3RyYWludE5vZGVNYXRjaGVzID0gbm9kZU1hdGNoZXM7IC8vL1xuXG4gICAgcmV0dXJuIGNvbnN0cmFpbnROb2RlTWF0Y2hlcztcbiAgfVxuXG4gIGZpbmRWYWxpZENvbnN0cmFpbnQoY29udGV4dCkge1xuICAgIGNvbnN0IGNvbnN0cmFpbnROb2RlID0gdGhpcy5nZXRDb25zdHJhaW50Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cmFpbnQgPSBjb250ZXh0LmZpbmRDb25zdHJhaW50QnlDb25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSksXG4gICAgICAgICAgdmFsaWRDb25zdHJhaW50ID0gY29uc3RyYWludDsgIC8vL1xuXG4gICAgcmV0dXJuIHZhbGlkQ29uc3RyYWludDtcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlKGNvbnRleHQpIHtcbiAgICBsZXQgY29uc3RyYWludCA9IG51bGw7XG5cbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIGxldCB2YWxpZGF0ZXMgPSBmYWxzZTtcblxuICAgIGNvbnN0IHZhbGlkQ29uc3RyYWludCA9IHRoaXMuZmluZFZhbGlkQ29uc3RyYWludChjb250ZXh0KTtcblxuICAgIGlmICh2YWxpZENvbnN0cmFpbnQgIT09IG51bGwpIHtcbiAgICAgIHZhbGlkYXRlcyA9IHRydWU7XG5cbiAgICAgIGNvbnN0cmFpbnQgPSB2YWxpZENvbnN0cmFpbnQ7IC8vL1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi50aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQgaXMgYWxyZWFkeSB2YWxpZC5gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdGVtcG9yYXJ5Q29udGV4dCA9IGNvbnRleHQ7IC8vL1xuXG4gICAgICBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICAgIGF0dGVtcHQoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdGVtZW50VmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVN0YXRlbWVudChjb250ZXh0KTtcblxuICAgICAgICBpZiAoc3RhdGVtZW50VmFsaWRhdGVzKSB7XG4gICAgICAgICAgY29uc3QgcmVmZXJlbmNlVmFsaWRhdGVzID0gdGhpcy52YWxpZGF0ZVJlZmVyZW5jZShjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXRlZCA9IGNvbnRleHQuaXNTdGF0ZWQoKTtcblxuICAgICAgICAgICAgbGV0IHZhbGlkYXRlc1doZW5TdGF0ZWQgPSBmYWxzZSxcbiAgICAgICAgICAgICAgdmFsaWRhdGVzV2hlbkRlcml2ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgaWYgKHN0YXRlZCkge1xuICAgICAgICAgICAgICB2YWxpZGF0ZXNXaGVuU3RhdGVkID0gdGhpcy52YWxpZGF0ZVdoZW5TdGF0ZWQoY29udGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHRoaXMudmFsaWRhdGVXaGVuRGVyaXZlZChjb250ZXh0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlc1doZW5TdGF0ZWQgfHwgdmFsaWRhdGVzV2hlbkRlcml2ZWQpIHtcbiAgICAgICAgICAgICAgdmFsaWRhdGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgdGhpcy5jb21taXQoY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQpO1xuXG4gICAgICBjb250ZXh0ID0gdGVtcG9yYXJ5Q29udGV4dDsgLy8vXG5cbiAgICAgIGlmICh2YWxpZGF0ZXMpIHtcbiAgICAgICAgY29uc3RyYWludCA9IHRoaXM7ICAvLy9cblxuICAgICAgICBjb250ZXh0LmFkZENvbnN0cmFpbnQoY29uc3RyYWludCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkYXRlcykge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxuXG4gIHZhbGlkYXRlUmVmZXJlbmNlKGNvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlVmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyByZWZlcmVuY2UuLi5gKTtcblxuICAgIGNvbnN0IHJlZmVyZW5jZSA9IHRoaXMucmVmZXJlbmNlLnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgaWYgKHJlZmVyZW5jZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcy5yZWZlcmVuY2UuZ2V0TWV0YXZhcmlhYmxlKCksXG4gICAgICAgICAgICBtZXRhdmFyaWFibGVEZWNsYXJlZCA9IG1ldGF2YXJpYWJsZS5pc0RlY2xhcmVkKCk7XG5cbiAgICAgIGlmIChtZXRhdmFyaWFibGVEZWNsYXJlZCkge1xuICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTtcblxuICAgICAgICByZWZlcmVuY2VWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyByZWZlcmVuY2UuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVZhbGlkYXRlcztcbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlU3RhdGVtZW50KGNvbnRleHQpIHtcbiAgICBsZXQgc3RhdGVtZW50VmFsaWRhdGVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyBzdGF0ZW1lbnQuLi5gKTtcblxuICAgIGRlc2NlbmQoYXN5bmMgKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50LnZhbGlkYXRlKGNvbnRleHQpO1xuXG4gICAgICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgIHN0YXRlbWVudFZhbGlkYXRlcyA9IHRydWU7XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAoc3RhdGVtZW50VmFsaWRhdGVzKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50LmApO1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRWYWxpZGF0ZXM7XG4gIH1cblxuICB2YWxpZGF0ZVdoZW5TdGF0ZWQoY29udGV4dCkge1xuICAgIGxldCB2YWxpZGF0ZXNXaGVuU3RhdGVkO1xuXG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBzdGF0ZWQgY29uc3RyYWludC4uLmApO1xuXG4gICAgdmFsaWRhdGVzV2hlblN0YXRlZCA9IHRydWVcblxuICAgIGlmICh2YWxpZGF0ZXNXaGVuU3RhdGVkKSB7XG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBzdGF0ZWQgY29uc3RyYWludC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVzV2hlblN0YXRlZDtcbiAgfVxuXG4gIHZhbGlkYXRlV2hlbkRlcml2ZWQoY29udGV4dCkge1xuICAgIGxldCB2YWxpZGF0ZXNXaGVuRGVyaXZlZDtcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgZGVyaXZlZCBjb25zdHJhaW50Li4uYCk7XG5cbiAgICB2YWxpZGF0ZXNXaGVuRGVyaXZlZCA9IHRydWU7XG5cbiAgICBpZiAodmFsaWRhdGVzV2hlbkRlcml2ZWQpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGRlcml2ZWQgY29uc3RyYWludC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRhdGVzV2hlbkRlcml2ZWQ7XG4gIH1cblxuICB1bmlmeVJlZmVyZW5jZShyZWZlcmVuY2UsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgcmVmZXJlbmNlVW5pZmllcztcblxuICAgIGlmIChyZWZlcmVuY2UgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICAgIHJlZmVyZW5jZVN0cmluZyA9IHJlZmVyZW5jZS5nZXRTdHJpbmcoKSxcbiAgICAgICAgICAgIGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAvLy9cblxuICAgICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS4uLmApO1xuXG4gICAgICBjb25zdCBtZXRhdmFyaWFibGUgPSB0aGlzLmdldE1ldGF2YXJpYWJsZSgpO1xuXG4gICAgICByZWZlcmVuY2VVbmlmaWVzID0gbWV0YXZhcmlhYmxlLnVuaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgIGlmIChyZWZlcmVuY2VVbmlmaWVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4udW5pZmllZCB0aGUgJyR7cmVmZXJlbmNlU3RyaW5nfScgd2l0aCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQncyByZWZlcmVuY2UuYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZmVyZW5jZVVuaWZpZXMgPSB0cnVlOyAgLy8vXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZmVyZW5jZVVuaWZpZXM7XG4gIH1cblxuICBhc3luYyB1bmlmeVN0YXRlbWVudChzdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpIHtcbiAgICBsZXQgc3RhdGVtZW50VW5pZmllcztcblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICBzdGF0ZW1lbnRTdHJpbmcgPSBzdGF0ZW1lbnQuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHN0YXRlbWVudC4uLmApO1xuXG4gICAgY29uc3QgZ2VuZXJhbFN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50LCAgLy8vXG4gICAgICAgICAgc3BlY2lmaWNTdGF0ZW1lbnQgPSBzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnRleHQpOyAgLy8vXG5cbiAgICBzdGF0ZW1lbnRVbmlmaWVzID0gdW5pZnlTdGF0ZW1lbnQoZ2VuZXJhbFN0YXRlbWVudCwgc3BlY2lmaWNTdGF0ZW1lbnQsIGdlbmVyYWxDb250ZXh0LCBzcGVjaWZpY0NvbnRleHQpO1xuXG4gICAgaWYgKHN0YXRlbWVudFVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHN0YXRlbWVudC5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50VW5pZmllcztcbiAgfVxuXG4gIGFzeW5jIHVuaWZ5QXNzdW1wdGlvbihhc3N1bXB0aW9uLCBjb250ZXh0KSB7XG4gICAgbGV0IGFzc3VtcHRpb25VbmlmaWVzID0gZmFsc2U7XG5cbiAgICBjb25zdCBhc3N1bXB0aW9uU3RyaW5nID0gYXNzdW1wdGlvbi5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50Li4uYCk7XG5cbiAgICBjb25zdCBjb25zdHJhaW50Q29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpLCAvLy9cbiAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGNvbnN0cmFpbnRDb250ZXh0OyAvLy9cblxuICAgIHJlY29uY2lsZShhc3luYyAoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlID0gYXNzdW1wdGlvbi5nZXRSZWZlcmVuY2UoKSxcbiAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQsICAvLy9cbiAgICAgICAgICAgIHJlZmVybmVjZVVuaWZpZXMgPSB0aGlzLnVuaWZ5UmVmZXJlbmNlKHJlZmVyZW5jZSwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgIGlmIChyZWZlcm5lY2VVbmlmaWVzKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IGFzc3VtcHRpb24uZ2V0U3RhdGVtZW50KCksXG4gICAgICAgICAgICAgIHN0YXRlbWVudFVuaWZpZWQgPSB0aGlzLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCk7XG5cbiAgICAgICAgaWYgKHN0YXRlbWVudFVuaWZpZWQpIHtcbiAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgICAgICAgYXNzdW1wdGlvblVuaWZpZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICBpZiAoYXNzdW1wdGlvblVuaWZpZXMpIHtcbiAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50Li4uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFzc3VtcHRpb25VbmlmaWVzO1xuICB9XG5cbiAgdW5pZnlBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucywgY29udGV4dCkge1xuICAgIGNvbnN0IGFzc3VtcHRpb25zVW5pZnkgPSBhc3N1bXB0aW9ucy5zb21lKChhc3N1bXB0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhc3N1bXB0aW9uVW5pZmllcyA9IHRoaXMudW5pZnlBc3N1bXB0aW9uKGFzc3VtcHRpb24sIGNvbnRleHQpO1xuXG4gICAgICBpZiAoYXNzdW1wdGlvblVuaWZpZXMpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYXNzdW1wdGlvbnNVbmlmeTtcbiAgfVxuXG4gIHRvSlNPTigpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cbiAgICByZXR1cm4gc2VyaWFsaXNlKChjb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBzdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgICBsZXQgYnJlYWtQb2ludDtcblxuICAgICAgYnJlYWtQb2ludCA9IHRoaXMuZ2V0QnJlYWtQb2ludCgpO1xuXG4gICAgICBjb25zdCBicmVha1BvaW50SlNPTiA9IGJyZWFrUG9pbnRUb0JyZWFrUG9pbnRKU09OKGJyZWFrUG9pbnQpO1xuXG4gICAgICBicmVha1BvaW50ID0gYnJlYWtQb2ludEpTT047ICAvLy9cblxuICAgICAgY29uc3QganNvbiA9IHtcbiAgICAgICAgY29udGV4dCxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBicmVha1BvaW50XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4ganNvbjtcbiAgICB9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHN0YXRpYyBuYW1lID0gXCJDb25zdHJhaW50XCI7XG5cbiAgc3RhdGljIGZyb21KU09OKGpzb24sIGNvbnRleHQpIHtcbiAgICBsZXQgY29uc3RyYWludDtcblxuICAgIGluc3RhbnRpYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICB1bnNlcmlhbGlzZSgoanNvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCB7IHN0cmluZyB9ID0ganNvbixcbiAgICAgICAgICAgICAgY29uc3RyYWludE5vZGUgPSBpbnN0YW50aWF0ZUNvbnN0cmFpbnQoc3RyaW5nLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgbm9kZSA9IGNvbnN0cmFpbnROb2RlLCAgLy8vXG4gICAgICAgICAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50RnJvbUpTT04oanNvbiksXG4gICAgICAgICAgICAgIHJlZmVyZW5jZSA9IHJlZmVyZW5jZUZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCksXG4gICAgICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudEZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCk7XG5cbiAgICAgICAgY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgcmVmZXJlbmNlLCBzdGF0ZW1lbnQpO1xuICAgICAgfSwganNvbiwgY29udGV4dCk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU3RlcChzdGVwLCBjb250ZXh0KSB7XG4gICAgbGV0IGNvbnN0cmFpbnQ7XG5cbiAgICBsZXQgc3RhdGVtZW50O1xuXG4gICAgc3RhdGVtZW50ID0gc3RlcC5nZXRTdGF0ZW1lbnQoKTtcblxuICAgIHN0YXRlbWVudCA9IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7IC8vL1xuXG4gICAgY29uc3QgcmVmZXJlbmNlID0gc3RlcC5nZXRSZWZlcmVuY2UoKTtcblxuICAgIGFibGF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IGNvbnN0cmFpbnRTdHJpbmdGcm9tUmVmZXJlbmNlQW5kU3RhdGVtZW50KHJlZmVyZW5jZSwgc3RhdGVtZW50KSxcbiAgICAgICAgICAgICAgc3RyaW5nID0gY29uc3RyYWludFN0cmluZywgIC8vL1xuICAgICAgICAgICAgICBjb25zdHJhaW50Tm9kZSA9IGluc3RhbnRpYXRlQ29uc3RyYWludChzdHJpbmcsIGNvbnRleHQpO1xuXG4gICAgICAgIGNvbnN0cmFpbnQgPSBjb25zdHJhaW50RnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KTtcbiAgICAgIH0sIGNvbnRleHQpO1xuICAgIH0sIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGNvbnN0cmFpbnQ7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiByZWZlcmVuY2VGcm9tQ29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUsIGNvbnRleHQpIHtcbiAgY29uc3QgcmVmZXJlbmNlTm9kZSA9IGNvbnN0cmFpbnROb2RlLmdldFJlZmVyZW5jZU5vZGUoKSxcbiAgICAgICAgcmVmZXJuZWNlID0gY29udGV4dC5maW5kUmVmZXJlbmNlQnlSZWZlcmVuY2VOb2RlKHJlZmVyZW5jZU5vZGUpO1xuXG4gIHJldHVybiByZWZlcm5lY2U7XG59XG5cbmZ1bmN0aW9uIHN0YXRlbWVudEZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCkge1xuICBjb25zdCBzdGF0ZW1lbnROb2RlID0gY29uc3RyYWludE5vZGUuZ2V0U3RhdGVtZW50Tm9kZSgpLFxuICAgICAgICBzdGF0ZW1lbnQgPSBjb250ZXh0LmZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUoc3RhdGVtZW50Tm9kZSk7XG5cbiAgcmV0dXJuIHN0YXRlbWVudDtcbn1cbiJdLCJuYW1lcyI6WyJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJDb25zdHJhaW50IiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInJlZmVyZW5jZSIsInN0YXRlbWVudCIsImdldFJlZmVyZW5jZSIsImdldFN0YXRlbWVudCIsImdldENvbnN0cmFpbnROb2RlIiwiZ2V0Tm9kZSIsImNvbnN0cmFpbnROb2RlIiwiZ2V0TWV0YXZhcmlhYmxlIiwiaXNFcXVhbFRvIiwiY29uc3RyYWludCIsImNvbnN0cmFpbnROb2RlTWF0Y2hlcyIsIm1hdGNoQ29uc3RyYWludE5vZGUiLCJlcXVhbFRvIiwibm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJmaW5kVmFsaWRDb25zdHJhaW50IiwiZmluZENvbnN0cmFpbnRCeUNvbnN0cmFpbnROb2RlIiwidmFsaWRDb25zdHJhaW50IiwidmFsaWRhdGUiLCJjb25zdHJhaW50U3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJ2YWxpZGF0ZXMiLCJkZWJ1ZyIsInRlbXBvcmFyeUNvbnRleHQiLCJnZXRDb250ZXh0IiwiYXR0ZW1wdCIsInN0YXRlbWVudFZhbGlkYXRlcyIsInZhbGlkYXRlU3RhdGVtZW50IiwicmVmZXJlbmNlVmFsaWRhdGVzIiwidmFsaWRhdGVSZWZlcmVuY2UiLCJzdGF0ZWQiLCJpc1N0YXRlZCIsInZhbGlkYXRlc1doZW5TdGF0ZWQiLCJ2YWxpZGF0ZXNXaGVuRGVyaXZlZCIsInZhbGlkYXRlV2hlblN0YXRlZCIsInZhbGlkYXRlV2hlbkRlcml2ZWQiLCJjb21taXQiLCJhZGRDb25zdHJhaW50IiwibWV0YXZhcmlhYmxlIiwibWV0YXZhcmlhYmxlRGVjbGFyZWQiLCJpc0RlY2xhcmVkIiwiZGVzY2VuZCIsInVuaWZ5UmVmZXJlbmNlIiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJyZWZlcmVuY2VVbmlmaWVzIiwicmVmZXJlbmNlU3RyaW5nIiwidW5pZnlTdGF0ZW1lbnQiLCJzdGF0ZW1lbnRVbmlmaWVzIiwic3RhdGVtZW50U3RyaW5nIiwiZ2VuZXJhbFN0YXRlbWVudCIsInNwZWNpZmljU3RhdGVtZW50Iiwic3RyaXBCcmFja2V0c0Zyb21TdGF0ZW1lbnQiLCJ1bmlmeUFzc3VtcHRpb24iLCJhc3N1bXB0aW9uIiwiYXNzdW1wdGlvblVuaWZpZXMiLCJhc3N1bXB0aW9uU3RyaW5nIiwiY29uc3RyYWludENvbnRleHQiLCJyZWNvbmNpbGUiLCJyZWZlcm5lY2VVbmlmaWVzIiwic3RhdGVtZW50VW5pZmllZCIsInVuaWZ5QXNzdW1wdGlvbnMiLCJhc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zVW5pZnkiLCJzb21lIiwidG9KU09OIiwic2VyaWFsaXNlIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwianNvbiIsIm5hbWUiLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwidW5zZXJpYWxpc2UiLCJpbnN0YW50aWF0ZUNvbnN0cmFpbnQiLCJyZWZlcmVuY2VGcm9tQ29uc3RyYWludE5vZGUiLCJzdGF0ZW1lbnRGcm9tQ29uc3RyYWludE5vZGUiLCJmcm9tU3RlcCIsInN0ZXAiLCJhYmxhdGUiLCJjb25zdHJhaW50U3RyaW5nRnJvbVJlZmVyZW5jZUFuZFN0YXRlbWVudCIsImNvbnN0cmFpbnRGcm9tQ29uc3RyYWludE5vZGUiLCJyZWZlcmVuY2VOb2RlIiwiZ2V0UmVmZXJlbmNlTm9kZSIsInJlZmVybmVjZSIsImZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUiLCJzdGF0ZW1lbnROb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWNBOzs7ZUFBQTs7O2dDQVo2QzswQkFFdEI7dUJBQ1E7NkJBQ087MEJBQ0s7eUJBQ0U7d0JBQ2E7eUJBQytCO0FBRXpGLE1BQU0sRUFBRUEsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLG1CQUFtQkMsdUJBQU87SUFDcEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsQ0FBRTtRQUNuRSxLQUFLLENBQUNMLFNBQVNDLFFBQVFDLE1BQU1DO1FBRTdCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtRQUNqQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7SUFDbkI7SUFFQUMsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDRixTQUFTO0lBQ3ZCO0lBRUFHLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQ0YsU0FBUztJQUN2QjtJQUVBRyxvQkFBb0I7UUFDbEIsTUFBTU4sT0FBTyxJQUFJLENBQUNPLE9BQU8sSUFDbkJDLGlCQUFpQlIsTUFBTyxHQUFHO1FBRWpDLE9BQU9RO0lBQ1Q7SUFFQUMsa0JBQWtCO1FBQUUsT0FBTyxJQUFJLENB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
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbGVtZW50L2NvbnN0cmFpbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IEVsZW1lbnQsIGJyZWFrUG9pbnRVdGlsaXRpZXMsIGNvbnRpbnVhdGlvblV0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sYW5ndWFnZXNcIjtcblxuaW1wb3J0IHsgZGVmaW5lIH0gZnJvbSBcIi4uL2VsZW1lbnRzXCI7XG5pbXBvcnQgeyBhbGwsIGV4aXN0cyB9IGZyb20gXCIuLi91dGlsaXRpZXMvY29udGludWF0aW9uXCI7XG5pbXBvcnQgeyB1bmlmeVN0YXRlbWVudCB9IGZyb20gXCIuLi9wcm9jZXNzL3VuaWZ5XCI7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZUNvbnN0cmFpbnQgfSBmcm9tIFwiLi4vcHJvY2Vzcy9pbnN0YW50aWF0ZVwiO1xuaW1wb3J0IHsgc3RyaXBCcmFja2V0c0Zyb21TdGF0ZW1lbnQgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2JyYWNrZXRzXCI7XG5pbXBvcnQgeyBjb25zdHJhaW50RnJvbUNvbnN0cmFpbnROb2RlIH0gZnJvbSBcIi4uL3V0aWxpdGllcy9lbGVtZW50XCI7XG5pbXBvcnQgeyBjb25zdHJhaW50U3RyaW5nRnJvbVJlZmVyZW5jZUFuZFN0YXRlbWVudCB9IGZyb20gXCIuLi91dGlsaXRpZXMvc3RyaW5nXCI7XG5pbXBvcnQgeyBhYmxhdGUsIGF0dGVtcHQsIGRlc2NlbmQsIHJlY29uY2lsZSwgc2VyaWFsaXNlLCB1bnNlcmlhbGlzZSwgaW5zdGFudGlhdGUgfSBmcm9tIFwiLi4vdXRpbGl0aWVzL2NvbnRleHRcIjtcblxuY29uc3QgeyBzb21lIH0gPSBjb250aW51YXRpb25VdGlsaXRpZXMsXG4gICAgICB7IGJyZWFrUG9pbnRGcm9tSlNPTiwgYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04gfSA9IGJyZWFrUG9pbnRVdGlsaXRpZXM7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZShjbGFzcyBDb25zdHJhaW50IGV4dGVuZHMgRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKGNvbnRleHQsIHN0cmluZywgbm9kZSwgYnJlYWtQb2ludCwgcmVmZXJlbmNlLCBzdGF0ZW1lbnQpIHtcbiAgICBzdXBlcihjb250ZXh0LCBzdHJpbmcsIG5vZGUsIGJyZWFrUG9pbnQpO1xuXG4gICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG4gICAgdGhpcy5zdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7XG4gIH1cblxuICBnZXRSZWZlcmVuY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVmZXJlbmNlO1xuICB9XG5cbiAgZ2V0U3RhdGVtZW50KCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlbWVudDtcbiAgfVxuXG4gIGdldENvbnN0cmFpbnROb2RlKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdldE5vZGUoKSxcbiAgICAgICAgICBjb25zdHJhaW50Tm9kZSA9IG5vZGU7ICAvLy9cblxuICAgIHJldHVybiBjb25zdHJhaW50Tm9kZTtcbiAgfVxuXG4gIGdldE1ldGF2YXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMucmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZSgpOyB9XG5cbiAgaXNFcXVhbFRvKGNvbnN0cmFpbnQpIHtcbiAgICBjb25zdCBjb25zdHJhaW50Tm9kZSA9IGNvbnN0cmFpbnQuZ2V0Tm9kZSgpLFxuICAgICAgICAgIGNvbnN0cmFpbnROb2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hDb25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSksXG4gICAgICAgICAgZXF1YWxUbyA9IGNvbnN0cmFpbnROb2RlTWF0Y2hlczsgIC8vL1xuXG4gICAgcmV0dXJuIGVxdWFsVG87XG4gIH1cblxuICBtYXRjaENvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlKSB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnN0cmFpbnROb2RlLCAvLy9cbiAgICAgICAgICBub2RlTWF0Y2hlcyA9IHRoaXMubWF0Y2hOb2RlKG5vZGUpLFxuICAgICAgICAgIGNvbnN0cmFpbnROb2RlTWF0Y2hlcyA9IG5vZGVNYXRjaGVzOyAvLy9cblxuICAgIHJldHVybiBjb25zdHJhaW50Tm9kZU1hdGNoZXM7XG4gIH1cblxuICBmaW5kVmFsaWRDb25zdHJhaW50KGNvbnRleHQpIHtcbiAgICBjb25zdCBjb25zdHJhaW50Tm9kZSA9IHRoaXMuZ2V0Q29uc3RyYWludE5vZGUoKSxcbiAgICAgICAgICBjb25zdHJhaW50ID0gY29udGV4dC5maW5kQ29uc3RyYWludEJ5Q29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUpLFxuICAgICAgICAgIHZhbGlkQ29uc3RyYWludCA9IGNvbnN0cmFpbnQ7ICAvLy9cblxuICAgIHJldHVybiB2YWxpZENvbnN0cmFpbnQ7XG4gIH1cblxuICB2YWxpZGF0ZShjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgIC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVmFsaWRhdGluZyB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIGNvbnN0IHZhbGlkQ29uc3RyYWludCA9IHRoaXMuZmluZFZhbGlkQ29uc3RyYWludChjb250ZXh0KTtcblxuICAgIGlmICh2YWxpZENvbnN0cmFpbnQgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSB2YWxpZENvbnN0cmFpbnQ7IC8vL1xuXG4gICAgICBjb250ZXh0LmRlYnVnKGAuLi50aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQgaXMgYWxyZWFkeSB2YWxpZC5gKTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb25zdHJhaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXG4gICAgICBhdHRlbXB0KChjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlU3RhdGVtZW50ID0gdGhpcy52YWxpZGF0ZVN0YXRlbWVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZSA9IHRoaXMudmFsaWRhdGVSZWZlcmVuY2UuYmluZCh0aGlzKTtcblxuICAgICAgICByZXR1cm4gYWxsKFtcbiAgICAgICAgICB2YWxpZGF0ZVN0YXRlbWVudCxcbiAgICAgICAgICB2YWxpZGF0ZVJlZmVyZW5jZVxuICAgICAgICBdLCBjb250ZXh0LCAodmFsaWRhdGVzKSA9PiB7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0ZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnN0cmFpbnQgPSBudWxsO1xuXG4gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKGNvbnN0cmFpbnQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbGlkYXRlV2hlblN0YXRlZCA9IHRoaXMudmFsaWRhdGVXaGVuU3RhdGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVXaGVuRGVyaXZlZCA9IHRoaXMudmFsaWRhdGVXaGVuRGVyaXZlZC5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgcmV0dXJuIGV4aXN0cyhbXG4gICAgICAgICAgICB2YWxpZGF0ZVdoZW5TdGF0ZWQsXG4gICAgICAgICAgICB2YWxpZGF0ZVdoZW5EZXJpdmVkXG4gICAgICAgICAgXSwgY29udGV4dCwgKHZhbGlkYXRlcykgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgICAgIGNvbnN0cmFpbnQgPSB0aGlzOyAgLy8vXG5cbiAgICAgICAgICAgICAgY29udGV4dC5hZGRDb25zdHJhaW50KGNvbnN0cmFpbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29tbWl0KGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodmFsaWRhdGVzKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnZhbGlkYXRlZCB0aGUgJyR7Y29uc3RyYWludFN0cmluZ30nIGNvbnN0cmFpbnQuYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oY29uc3RyYWludCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgdmFsaWRhdGVSZWZlcmVuY2UoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgbGV0IHJlZmVyZW5jZVZhbGlkYXRlcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3MgcmVmZXJlbmNlLi4uYCk7XG5cbiAgICB0aGlzLnJlZmVyZW5jZS52YWxpZGF0ZShjb250ZXh0LCAocmVmZXJlbmNlKSA9PiB7XG4gICAgICBpZiAocmVmZXJlbmNlICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG1ldGF2YXJpYWJsZSA9IHRoaXMucmVmZXJlbmNlLmdldE1ldGF2YXJpYWJsZSgpLFxuICAgICAgICAgICAgICBtZXRhdmFyaWFibGVEZWNsYXJlZCA9IG1ldGF2YXJpYWJsZS5pc0RlY2xhcmVkKCk7XG5cbiAgICAgICAgaWYgKG1ldGF2YXJpYWJsZURlY2xhcmVkKSB7XG4gICAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7XG5cbiAgICAgICAgICByZWZlcmVuY2VWYWxpZGF0ZXMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWZlcmVuY2VWYWxpZGF0ZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZWZlcmVuY2VWYWxpZGF0ZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGVTdGF0ZW1lbnQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50Li4uYCk7XG5cbiAgICBkZXNjZW5kKChjb250ZXh0KSA9PiB7XG4gICAgICB0aGlzLnN0YXRlbWVudC52YWxpZGF0ZShjb250ZXh0LCAoc3RhdGVtZW50KSA9PiB7XG4gICAgICAgIGxldCBzdGF0ZW1lbnRWYWxpZGF0ZXMgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGVtZW50VmFsaWRhdGVzID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGF0ZW1lbnRWYWxpZGF0ZXMpIHtcbiAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi52YWxpZGF0ZWQgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdGF0ZW1lbnRWYWxpZGF0ZXMpO1xuICAgICAgfSk7XG4gICAgfSwgY29udGV4dCk7XG4gIH1cblxuICB2YWxpZGF0ZVdoZW5TdGF0ZWQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3Qgc3RhdGVkID0gY29udGV4dC5pc1N0YXRlZCgpO1xuXG4gICAgaWYgKCFzdGF0ZWQpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRlc1doZW5TdGF0ZWQgPSBmYWxzZTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuU3RhdGVkKTtcbiAgICB9XG5cbiAgICBsZXQgdmFsaWRhdGVzV2hlblN0YXRlZDtcblxuICAgIGNvbnN0IGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpOyAgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBWYWxpZGF0aW5nIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgc3RhdGVkIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIHZhbGlkYXRlc1doZW5TdGF0ZWQgPSB0cnVlXG5cbiAgICBpZiAodmFsaWRhdGVzV2hlblN0YXRlZCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgc3RhdGVkIGNvbnN0cmFpbnQuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuU3RhdGVkKTtcbiAgfVxuXG4gIHZhbGlkYXRlV2hlbkRlcml2ZWQoY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3Qgc3RhdGVkID0gY29udGV4dC5pc1N0YXRlZCgpO1xuXG4gICAgaWYgKHN0YXRlZCkge1xuICAgICAgY29uc3QgdmFsaWRhdGVzV2hlbkRlcml2ZWQgPSBmYWxzZTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWxpZGF0ZXNXaGVuRGVyaXZlZCk7XG4gICAgfVxuXG4gICAgbGV0IHZhbGlkYXRlc1doZW5EZXJpdmVkO1xuXG4gICAgY29uc3QgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7ICAvLy9cblxuICAgIGNvbnRleHQudHJhY2UoYFZhbGlkYXRpbmcgdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBkZXJpdmVkIGNvbnN0cmFpbnQuLi5gKTtcblxuICAgIHZhbGlkYXRlc1doZW5EZXJpdmVkID0gdHJ1ZTtcblxuICAgIGlmICh2YWxpZGF0ZXNXaGVuRGVyaXZlZCkge1xuICAgICAgY29udGV4dC5kZWJ1ZyhgLi4udmFsaWRhdGVkIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgZGVyaXZlZCBjb25zdHJhaW50LmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250aW51YXRpb24odmFsaWRhdGVzV2hlbkRlcml2ZWQpO1xuICB9XG5cbiAgdW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBpZiAocmVmZXJlbmNlID09PSBudWxsKSB7XG4gICAgICBjb25zdCByZWZlcmVuY2VVbmlmaWVzID0gdHJ1ZTsgIC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHJlZmVyZW5jZVVuaWZpZXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSBzcGVjaWZpY0NvbnRleHQsICAvLy9cbiAgICAgICAgICByZWZlcmVuY2VTdHJpbmcgPSByZWZlcmVuY2UuZ2V0U3RyaW5nKCksXG4gICAgICAgICAgY29uc3RyYWludFN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7IC8vL1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke3JlZmVyZW5jZVN0cmluZ30nIHJlZmVyZW5jZSB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS4uLmApO1xuXG4gICAgY29uc3QgbWV0YXZhcmlhYmxlID0gdGhpcy5nZXRNZXRhdmFyaWFibGUoKTtcblxuICAgIHJldHVybiBtZXRhdmFyaWFibGUudW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAocmVmZXJlbmNlVW5pZmllcykgPT4ge1xuICAgICAgaWYgKHJlZmVyZW5jZVVuaWZpZXMpIHtcbiAgICAgICAgY29udGV4dC5kZWJ1ZyhgLi51bmlmaWVkIHRoZSAnJHtyZWZlcmVuY2VTdHJpbmd9JyB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHJlZmVyZW5jZS5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihyZWZlcmVuY2VVbmlmaWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHNwZWNpZmljQ29udGV4dCwgIC8vL1xuICAgICAgICAgIHN0YXRlbWVudFN0cmluZyA9IHN0YXRlbWVudC5nZXRTdHJpbmcoKSxcbiAgICAgICAgICBjb25zdHJhaW50U3RyaW5nID0gdGhpcy5nZXRTdHJpbmcoKTsgLy8vXG5cbiAgICBjb250ZXh0LnRyYWNlKGBVbmlmeWluZyB0aGUgJyR7c3RhdGVtZW50U3RyaW5nfScgc3RhdGVtZW50IHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50J3Mgc3RhdGVtZW50Li4uYCk7XG5cbiAgICBjb25zdCBnZW5lcmFsU3RhdGVtZW50ID0gdGhpcy5zdGF0ZW1lbnQsICAvLy9cbiAgICAgICAgICBzcGVjaWZpY1N0YXRlbWVudCA9IHN0cmlwQnJhY2tldHNGcm9tU3RhdGVtZW50KHN0YXRlbWVudCwgY29udGV4dCk7ICAvLy9cblxuICAgIHJldHVybiB1bmlmeVN0YXRlbWVudChnZW5lcmFsU3RhdGVtZW50LCBzcGVjaWZpY1N0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKHN0YXRlbWVudFVuaWZpZXMpID0+IHtcbiAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgIGNvbnRleHQuZGVidWcoYC4uLnVuaWZpZWQgdGhlICcke3N0YXRlbWVudFN0cmluZ30nIHN0YXRlbWVudCB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludCdzIHN0YXRlbWVudC5gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdGF0ZW1lbnRVbmlmaWVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVuaWZ5QXNzdW1wdGlvbihhc3N1bXB0aW9uLCBjb250ZXh0LCBjb250aW51YXRpb24pIHtcbiAgICBjb25zdCBhc3N1bXB0aW9uU3RyaW5nID0gYXNzdW1wdGlvbi5nZXRTdHJpbmcoKSwgIC8vL1xuICAgICAgICAgIGNvbnN0cmFpbnRTdHJpbmcgPSB0aGlzLmdldFN0cmluZygpO1xuXG4gICAgY29udGV4dC50cmFjZShgVW5pZnlpbmcgdGhlICcke2Fzc3VtcHRpb25TdHJpbmd9JyBhc3N1bXB0aW9uIHdpdGggdGhlICcke2NvbnN0cmFpbnRTdHJpbmd9JyBjb25zdHJhaW50Li4uYCk7XG5cbiAgICBjb25zdCBjb25zdHJhaW50Q29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpLCAvLy9cbiAgICAgICAgICBnZW5lcmFsQ29udGV4dCA9IGNvbnN0cmFpbnRDb250ZXh0OyAvLy9cblxuICAgIHJlY29uY2lsZSgoY29udGV4dCkgPT4ge1xuICAgICAgY29uc3QgcmVmZXJlbmNlID0gYXNzdW1wdGlvbi5nZXRSZWZlcmVuY2UoKSxcbiAgICAgICAgICAgIHNwZWNpZmljQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICAgICAgcmV0dXJuIHRoaXMudW5pZnlSZWZlcmVuY2UocmVmZXJlbmNlLCBnZW5lcmFsQ29udGV4dCwgc3BlY2lmaWNDb250ZXh0LCAocmVmZXJuZWNlVW5pZmllcykgPT4ge1xuICAgICAgICBpZiAoIXJlZmVybmVjZVVuaWZpZXMpIHtcbiAgICAgICAgICBjb25zdCBhc3N1bXB0aW9uVW5pZmllcyA9IGZhbHNlO1xuXG4gICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihhc3N1bXB0aW9uVW5pZmllcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZW1lbnQgPSBhc3N1bXB0aW9uLmdldFN0YXRlbWVudCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnVuaWZ5U3RhdGVtZW50KHN0YXRlbWVudCwgZ2VuZXJhbENvbnRleHQsIHNwZWNpZmljQ29udGV4dCwgKHN0YXRlbWVudFVuaWZpZXMpID0+IHtcbiAgICAgICAgICBsZXQgYXNzdW1wdGlvblVuaWZpZXMgPSBmYWxzZTtcblxuICAgICAgICAgIGlmIChzdGF0ZW1lbnRVbmlmaWVzKSB7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgpO1xuXG4gICAgICAgICAgICBhc3N1bXB0aW9uVW5pZmllcyA9IHRydWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGFzc3VtcHRpb25VbmlmaWVzKSB7XG4gICAgICAgICAgICBjb250ZXh0LmRlYnVnKGAuLi51bmlmaWVkIHRoZSAnJHthc3N1bXB0aW9uU3RyaW5nfScgYXNzdW1wdGlvbiB3aXRoIHRoZSAnJHtjb25zdHJhaW50U3RyaW5nfScgY29uc3RyYWludC4uLmApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjb250aW51YXRpb24oYXNzdW1wdGlvblVuaWZpZXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgdW5pZnlBc3N1bXB0aW9ucyhhc3N1bXB0aW9ucywgY29udGV4dCwgY29udGludWF0aW9uKSB7XG4gICAgc29tZShhc3N1bXB0aW9ucywgKGFzc3VtcHRpb24sIGNvbnRpbnVhdGlvbikgPT4ge1xuICAgICAgdGhpcy51bmlmeUFzc3VtcHRpb24oYXNzdW1wdGlvbiwgY29udGV4dCwgY29udGludWF0aW9uKTtcbiAgICB9LCBjb250aW51YXRpb24pO1xuICB9XG5cbiAgdG9KU09OKCkge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmdldENvbnRleHQoKTtcblxuICAgIHJldHVybiBzZXJpYWxpc2UoKGNvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IHN0cmluZyA9IHRoaXMuZ2V0U3RyaW5nKCk7XG5cbiAgICAgIGxldCBicmVha1BvaW50O1xuXG4gICAgICBicmVha1BvaW50ID0gdGhpcy5nZXRCcmVha1BvaW50KCk7XG5cbiAgICAgIGNvbnN0IGJyZWFrUG9pbnRKU09OID0gYnJlYWtQb2ludFRvQnJlYWtQb2ludEpTT04oYnJlYWtQb2ludCk7XG5cbiAgICAgIGJyZWFrUG9pbnQgPSBicmVha1BvaW50SlNPTjsgIC8vL1xuXG4gICAgICBjb25zdCBqc29uID0ge1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIGJyZWFrUG9pbnRcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBqc29uO1xuICAgIH0sIGNvbnRleHQpO1xuICB9XG5cbiAgc3RhdGljIG5hbWUgPSBcIkNvbnN0cmFpbnRcIjtcblxuICBzdGF0aWMgZnJvbUpTT04oanNvbiwgY29udGV4dCkge1xuICAgIGxldCBjb25zdHJhaW50O1xuXG4gICAgaW5zdGFudGlhdGUoKGNvbnRleHQpID0+IHtcbiAgICAgIHVuc2VyaWFsaXNlKChqc29uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RyaW5nIH0gPSBqc29uLFxuICAgICAgICAgICAgICBjb25zdHJhaW50Tm9kZSA9IGluc3RhbnRpYXRlQ29uc3RyYWludChzdHJpbmcsIGNvbnRleHQpLFxuICAgICAgICAgICAgICBub2RlID0gY29uc3RyYWludE5vZGUsICAvLy9cbiAgICAgICAgICAgICAgYnJlYWtQb2ludCA9IGJyZWFrUG9pbnRGcm9tSlNPTihqc29uKSxcbiAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcmVmZXJlbmNlRnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KSxcbiAgICAgICAgICAgICAgc3RhdGVtZW50ID0gc3RhdGVtZW50RnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoY29udGV4dCwgc3RyaW5nLCBub2RlLCBicmVha1BvaW50LCByZWZlcmVuY2UsIHN0YXRlbWVudCk7XG4gICAgICB9LCBqc29uLCBjb250ZXh0KTtcbiAgICB9LCBjb250ZXh0KTtcblxuICAgIHJldHVybiBjb25zdHJhaW50O1xuICB9XG5cbiAgc3RhdGljIGZyb21TdGVwKHN0ZXAsIGNvbnRleHQpIHtcbiAgICBsZXQgY29uc3RyYWludDtcblxuICAgIGxldCBzdGF0ZW1lbnQ7XG5cbiAgICBzdGF0ZW1lbnQgPSBzdGVwLmdldFN0YXRlbWVudCgpO1xuXG4gICAgc3RhdGVtZW50ID0gc3RyaXBCcmFja2V0c0Zyb21TdGF0ZW1lbnQoc3RhdGVtZW50LCBjb250ZXh0KTsgLy8vXG5cbiAgICBjb25zdCByZWZlcmVuY2UgPSBzdGVwLmdldFJlZmVyZW5jZSgpO1xuXG4gICAgYWJsYXRlKChjb250ZXh0KSA9PiB7XG4gICAgICBpbnN0YW50aWF0ZSgoY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBjb25zdHJhaW50U3RyaW5nID0gY29uc3RyYWludFN0cmluZ0Zyb21SZWZlcmVuY2VBbmRTdGF0ZW1lbnQocmVmZXJlbmNlLCBzdGF0ZW1lbnQpLFxuICAgICAgICAgICAgICBzdHJpbmcgPSBjb25zdHJhaW50U3RyaW5nLCAgLy8vXG4gICAgICAgICAgICAgIGNvbnN0cmFpbnROb2RlID0gaW5zdGFudGlhdGVDb25zdHJhaW50KHN0cmluZywgY29udGV4dCk7XG5cbiAgICAgICAgY29uc3RyYWludCA9IGNvbnN0cmFpbnRGcm9tQ29uc3RyYWludE5vZGUoY29uc3RyYWludE5vZGUsIGNvbnRleHQpO1xuICAgICAgfSwgY29udGV4dCk7XG4gICAgfSwgY29udGV4dCk7XG5cbiAgICByZXR1cm4gY29uc3RyYWludDtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlZmVyZW5jZUZyb21Db25zdHJhaW50Tm9kZShjb25zdHJhaW50Tm9kZSwgY29udGV4dCkge1xuICBjb25zdCByZWZlcmVuY2VOb2RlID0gY29uc3RyYWludE5vZGUuZ2V0UmVmZXJlbmNlTm9kZSgpLFxuICAgICAgICByZWZlcm5lY2UgPSBjb250ZXh0LmZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUocmVmZXJlbmNlTm9kZSk7XG5cbiAgcmV0dXJuIHJlZmVybmVjZTtcbn1cblxuZnVuY3Rpb24gc3RhdGVtZW50RnJvbUNvbnN0cmFpbnROb2RlKGNvbnN0cmFpbnROb2RlLCBjb250ZXh0KSB7XG4gIGNvbnN0IHN0YXRlbWVudE5vZGUgPSBjb25zdHJhaW50Tm9kZS5nZXRTdGF0ZW1lbnROb2RlKCksXG4gICAgICAgIHN0YXRlbWVudCA9IGNvbnRleHQuZmluZFN0YXRlbWVudEJ5U3RhdGVtZW50Tm9kZShzdGF0ZW1lbnROb2RlKTtcblxuICByZXR1cm4gc3RhdGVtZW50O1xufVxuIl0sIm5hbWVzIjpbInNvbWUiLCJjb250aW51YXRpb25VdGlsaXRpZXMiLCJicmVha1BvaW50RnJvbUpTT04iLCJicmVha1BvaW50VG9CcmVha1BvaW50SlNPTiIsImJyZWFrUG9pbnRVdGlsaXRpZXMiLCJkZWZpbmUiLCJDb25zdHJhaW50IiwiRWxlbWVudCIsImNvbnRleHQiLCJzdHJpbmciLCJub2RlIiwiYnJlYWtQb2ludCIsInJlZmVyZW5jZSIsInN0YXRlbWVudCIsImdldFJlZmVyZW5jZSIsImdldFN0YXRlbWVudCIsImdldENvbnN0cmFpbnROb2RlIiwiZ2V0Tm9kZSIsImNvbnN0cmFpbnROb2RlIiwiZ2V0TWV0YXZhcmlhYmxlIiwiaXNFcXVhbFRvIiwiY29uc3RyYWludCIsImNvbnN0cmFpbnROb2RlTWF0Y2hlcyIsIm1hdGNoQ29uc3RyYWludE5vZGUiLCJlcXVhbFRvIiwibm9kZU1hdGNoZXMiLCJtYXRjaE5vZGUiLCJmaW5kVmFsaWRDb25zdHJhaW50IiwiZmluZENvbnN0cmFpbnRCeUNvbnN0cmFpbnROb2RlIiwidmFsaWRDb25zdHJhaW50IiwidmFsaWRhdGUiLCJjb250aW51YXRpb24iLCJjb25zdHJhaW50U3RyaW5nIiwiZ2V0U3RyaW5nIiwidHJhY2UiLCJkZWJ1ZyIsImdldENvbnRleHQiLCJhdHRlbXB0IiwidmFsaWRhdGVTdGF0ZW1lbnQiLCJiaW5kIiwidmFsaWRhdGVSZWZlcmVuY2UiLCJhbGwiLCJ2YWxpZGF0ZXMiLCJ2YWxpZGF0ZVdoZW5TdGF0ZWQiLCJ2YWxpZGF0ZVdoZW5EZXJpdmVkIiwiZXhpc3RzIiwiYWRkQ29uc3RyYWludCIsImNvbW1pdCIsInJlZmVyZW5jZVZhbGlkYXRlcyIsIm1ldGF2YXJpYWJsZSIsIm1ldGF2YXJpYWJsZURlY2xhcmVkIiwiaXNEZWNsYXJlZCIsImRlc2NlbmQiLCJzdGF0ZW1lbnRWYWxpZGF0ZXMiLCJzdGF0ZWQiLCJpc1N0YXRlZCIsInZhbGlkYXRlc1doZW5TdGF0ZWQiLCJ2YWxpZGF0ZXNXaGVuRGVyaXZlZCIsInVuaWZ5UmVmZXJlbmNlIiwiZ2VuZXJhbENvbnRleHQiLCJzcGVjaWZpY0NvbnRleHQiLCJyZWZlcmVuY2VVbmlmaWVzIiwicmVmZXJlbmNlU3RyaW5nIiwidW5pZnlTdGF0ZW1lbnQiLCJzdGF0ZW1lbnRTdHJpbmciLCJnZW5lcmFsU3RhdGVtZW50Iiwic3BlY2lmaWNTdGF0ZW1lbnQiLCJzdHJpcEJyYWNrZXRzRnJvbVN0YXRlbWVudCIsInN0YXRlbWVudFVuaWZpZXMiLCJ1bmlmeUFzc3VtcHRpb24iLCJhc3N1bXB0aW9uIiwiYXNzdW1wdGlvblN0cmluZyIsImNvbnN0cmFpbnRDb250ZXh0IiwicmVjb25jaWxlIiwicmVmZXJuZWNlVW5pZmllcyIsImFzc3VtcHRpb25VbmlmaWVzIiwidW5pZnlBc3N1bXB0aW9ucyIsImFzc3VtcHRpb25zIiwidG9KU09OIiwic2VyaWFsaXNlIiwiZ2V0QnJlYWtQb2ludCIsImJyZWFrUG9pbnRKU09OIiwianNvbiIsIm5hbWUiLCJmcm9tSlNPTiIsImluc3RhbnRpYXRlIiwidW5zZXJpYWxpc2UiLCJpbnN0YW50aWF0ZUNvbnN0cmFpbnQiLCJyZWZlcmVuY2VGcm9tQ29uc3RyYWludE5vZGUiLCJzdGF0ZW1lbnRGcm9tQ29uc3RyYWludE5vZGUiLCJmcm9tU3RlcCIsInN0ZXAiLCJhYmxhdGUiLCJjb25zdHJhaW50U3RyaW5nRnJvbVJlZmVyZW5jZUFuZFN0YXRlbWVudCIsImNvbnN0cmFpbnRGcm9tQ29uc3RyYWludE5vZGUiLCJyZWZlcmVuY2VOb2RlIiwiZ2V0UmVmZXJlbmNlTm9kZSIsInJlZmVybmVjZSIsImZpbmRSZWZlcmVuY2VCeVJlZmVyZW5jZU5vZGUiLCJzdGF0ZW1lbnROb2RlIiwiZ2V0U3RhdGVtZW50Tm9kZSIsImZpbmRTdGF0ZW1lbnRCeVN0YXRlbWVudE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7OytCQWdCQTs7O2VBQUE7OztnQ0Fkb0U7MEJBRTdDOzhCQUNLO3VCQUNHOzZCQUNPOzBCQUNLO3lCQUNFO3dCQUNhO3lCQUMrQjtBQUV6RixNQUFNLEVBQUVBLElBQUksRUFBRSxHQUFHQyxxQ0FBcUIsRUFDaEMsRUFBRUMsa0JBQWtCLEVBQUVDLDBCQUEwQixFQUFFLEdBQUdDLG1DQUFtQjtNQUU5RSxXQUFlQyxJQUFBQSxnQkFBTSxFQUFDLE1BQU1DLG1CQUFtQkMsdUJBQU87SUFDcEQsWUFBWUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLElBQUksRUFBRUMsVUFBVSxFQUFFQyxTQUFTLEVBQUVDLFNBQVMsQ0FBRTtRQUNuRSxLQUFLLENBQUNMLFNBQVNDLFFBQVFDLE1BQU1DO1FBRTdCLElBQUksQ0FBQ0MsU0FBUyxHQUFHQTtRQUNqQixJQUFJLENBQUNDLFNBQVMsR0FBR0E7SUFDbkI7SUFFQUMsZUFBZTtRQUNiLE9BQU8sSUFBSSxDQUFDRixTQUFTO0lBQ3ZCO0lBRUFHLGVBQWU7UUFDYixPQUFPLElBQUksQ0FBQ0YsU0FBUztJQUN2QjtJQUVBRyxvQkFBb0I7UUFDbEIsTUFBTU4sT0FBTyxJQUFJLENBQUNPLE9BQU8sSUFDbkJDLGlCQUFpQlIsTUFBTyxHQUFHO1FBRWpDLE9BQU9RO0lBQ1Q7SUFFQUMsa0JBQWtCO1FBQUUsT0FBTyxJQUFJLENBQUNQLFNBQVMsQ0FBQ08sZUFBZTtJQUFJO0lBRTdEQyxVQUFVQyxVQUFVLEVBQUU7UUFDcEIsTUFBTUgsaUJBQWlCRyxXQUFX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