flexdataset 0.15.0 → 0.17.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.
@@ -74,6 +74,9 @@ function normalizeColumns(value) {
74
74
  expressionColumns: 'expressionColumns' in record ? asStringArray(record.expressionColumns) : undefined,
75
75
  identity: asOptionalString(record.identity),
76
76
  default: asOptionalString(record.default),
77
+ collation: asOptionalString(record.collation),
78
+ compression: asOptionalString(record.compression),
79
+ storage: asOptionalString(record.storage),
77
80
  };
78
81
  });
79
82
  }
@@ -138,6 +141,22 @@ function normalizeCheckConstraints(value) {
138
141
  };
139
142
  });
140
143
  }
144
+ function normalizeExclusionConstraints(value) {
145
+ return asArray(value).map((raw) => {
146
+ const record = asRecord(raw);
147
+ return {
148
+ name: asString(record.name),
149
+ using: asString(record.using),
150
+ elements: asArray(record.elements).map((rawElement) => {
151
+ const elementRecord = asRecord(rawElement);
152
+ return {
153
+ column: asString(elementRecord.column),
154
+ operator: asString(elementRecord.operator),
155
+ };
156
+ }),
157
+ };
158
+ });
159
+ }
141
160
  function normalizeBucketing(value) {
142
161
  if (value === null || typeof value !== 'object') {
143
162
  return undefined;
@@ -191,6 +210,7 @@ function normalizeTableDefinition(raw) {
191
210
  indexes: normalizeIndexes(record.indexes),
192
211
  uniqueConstraints: normalizeUniqueConstraints(record.uniqueConstraints),
193
212
  checkConstraints: normalizeCheckConstraints(record.checkConstraints),
213
+ exclusionConstraints: normalizeExclusionConstraints(record.exclusionConstraints),
194
214
  bucketing: normalizeBucketing(record.bucketing),
195
215
  tableProperties: normalizeStringMap(record.tableProperties),
196
216
  dependsOn: asStringArray(record.dependsOn),
@@ -336,4 +356,4 @@ function loadRoot(rootDir) {
336
356
  violations,
337
357
  };
338
358
  }
339
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpUEgsNEJBd0lDO0FBdlhELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFlN0IsNkNBRXNCO0FBSXRCLHFEQUVnQztBQWVoQyxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQWdDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMvRixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQUMsS0FBYztJQUMzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxLQUFjO0lBQzVCLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsS0FBYztJQUM3QixPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEQsQ0FBQztBQUVELFNBQVMsaUJBQWlCLENBQUMsS0FBYztJQUNyQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBYztJQUNwQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxT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QUFFLFdBQVcsVUFBVSxzQ0FBc0MsWUFBWSxHQUFHO2FBQ3RGLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLEVBQUUsVUFBVTtZQUNoQixPQUFPO1lBQ1AsV0FBVztZQUNYLE1BQU0sRUFBRSxZQUFZO1NBQ3ZCLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPO1FBQ0gsS0FBSyxFQUFFO1lBQ0gsT0FBTyxFQUFFLFlBQVk7WUFDckIsT0FBTztZQUNQLE1BQU07U0FDVDtRQUNELFVBQVU7S0FDYixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlsZXN5c3RlbSBsb2FkZXIuIFdhbGtzIGEgZGF0YXNldCByb290LCBwYXJzZXMgZWFjaCBKU09OIGZpbGUsIHJ1bnMgTGF5ZXIgMVxuICogc3RydWN0dXJhbCB2YWxpZGF0aW9uLCBhbmQgbm9ybWFsaXplcyBldmVyeXRoaW5nIGludG8gYSBgV29ybGRgIG9mXG4gKiBjb25jcmV0ZSBgVGFibGVUeXBlQmFzZWAgaW5zdGFuY2VzIHRoYXQgdGhlIHNlbWFudGljIHJ1bGVzIG9wZXJhdGUgb24uXG4gKlxuICogUGFyc2UgZXJyb3JzLCBzdHJ1Y3R1cmFsIGVycm9ycywgYW5kIGEgbWlzc2luZyBzY2hlbWEtZGVzY3JpcHRpb24gZmlsZSBhcmVcbiAqIHJlcG9ydGVkIGhlcmU7IGFsbCBjcm9zcy1maWVsZCAvIGNyb3NzLWZpbGUgbG9naWMgbGl2ZXMgaW4gdGhlIHRhYmxlLXR5cGVcbiAqIGNsYXNzZXMgKGAuL3RhYmxlLXR5cGUudHNgLCBgLi90YWJsZS10eXBlcy8qYCkuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtcbiAgICBCdWNrZXRpbmcsXG4gICAgQ2hlY2tDb25zdHJhaW50LFxuICAgIENvbHVtbixcbiAgICBGb3JlaWduS2V5LFxuICAgIEluZGV4LFxuICAgIFBhcnRpdGlvbixcbiAgICBTY2hlbWFEZXNjcmlwdGlvbixcbiAgICBTb3J0RmllbGQsXG4gICAgVGFibGVEZWZpbml0aW9uLFxuICAgIFVuaXF1ZUNvbnN0cmFpbnQsXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuL21vZGVsJztcbmltcG9ydCB7XG4gICAgdmFsaWRhdGVTdHJ1Y3R1cmUsXG59IGZyb20gJy4vc3RydWN0dXJhbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG59IGZyb20gJy4vdGFibGUtdHlwZSc7XG5pbXBvcnQge1xuICAgIGNyZWF0ZVRhYmxlVHlwZSxcbn0gZnJvbSAnLi90YWJsZS10eXBlcy9yZWdpc3RyeSc7XG5pbXBvcnQge1xuICAgIExvYWRlZFNjaGVtYSxcbiAgICBXb3JsZCxcbn0gZnJvbSAnLi93b3JsZCc7XG5cbi8qKiBSZXN1bHQgb2YgbG9hZGluZyBhIHJvb3Q6IHRoZSBtb2RlbCBwbHVzIGFueSBsb2FkLXRpbWUgdmlvbGF0aW9ucy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZE91dGNvbWUge1xuICAgIC8qKiBUaGUgbG9hZGVkIG1vZGVsLiAqL1xuICAgIHJlYWRvbmx5IHdvcmxkOiBXb3JsZDtcblxuICAgIC8qKiBQYXJzZSwgc3RydWN0dXJhbCwgYW5kIG1pc3NpbmctZGVzY3JpcHRpb24gdmlvbGF0aW9ucy4gKi9cbiAgICByZWFkb25seSB2aW9sYXRpb25zOiBWaW9sYXRpb25bXTtcbn1cblxuZnVuY3Rpb24gYXNSZWNvcmQodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA6IHt9O1xufVxuXG5mdW5jdGlvbiBhc0FycmF5KHZhbHVlOiB1bmtub3duKTogdW5rbm93bltdIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFtdO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6ICcnO1xufVxuXG5mdW5jdGlvbiBhc0Jvb2xlYW4odmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgPyB2YWx1ZSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsTnVtYmVyKHZhbHVlOiB1bmtub3duKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc09wdGlvbmFsU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb2x1bW5zKHZhbHVlOiB1bmtub3duKTogQ29sdW1uW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogYXNTdHJpbmcocmVjb3JkLnR5cGUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgICAgICBudWxsYWJsZTogYXNPcHRpb25hbEJvb2xlYW4ocmVjb3JkLm51bGxhYmxlKSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuZ2VuZXJhdGVkKSxcbiAgICAgICAgICAgIGV4cHJlc3Npb246IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmV4cHJlc3Npb24pLFxuICAgICAgICAgICAgZXhwcmVzc2lvbkNvbHVtbnM6ICdleHByZXNzaW9uQ29sdW1ucycgaW4gcmVjb3JkID8gYXNTdHJpbmdBcnJheShyZWNvcmQuZXhwcmVzc2lvbkNvbHVtbnMpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgaWRlbnRpdHk6IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmlkZW50aXR5KSxcbiAgICAgICAgICAgIGRlZmF1bHQ6IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmRlZmF1bHQpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXJ0aXRpb25zKHZhbHVlOiB1bmtub3duKTogUGFydGl0aW9uW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgdHlwZTogYXNTdHJpbmcocmVjb3JkLnR5cGUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNvcnRPcmRlcih2YWx1ZTogdW5rbm93bik6IFNvcnRGaWVsZFtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbHVtbjogYXNTdHJpbmcocmVjb3JkLmNvbHVtbiksXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLnRyYW5zZm9ybSksXG4gICAgICAgICAgICBkaXJlY3Rpb246IGFzU3RyaW5nKHJlY29yZC5kaXJlY3Rpb24pLFxuICAgICAgICAgICAgbnVsbE9yZGVyOiBhc1N0cmluZyhyZWNvcmQubnVsbE9yZGVyKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplSW5kZXhlcyh2YWx1ZTogdW5rbm93bik6IEluZGV4W10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgbWV0aG9kOiBhc1N0cmluZyhyZWNvcmQubWV0aG9kKSxcbiAgICAgICAgICAgIHVuaXF1ZTogYXNPcHRpb25hbEJvb2xlYW4ocmVjb3JkLnVuaXF1ZSksXG4gICAgICAgICAgICBjb2x1bW5zOiBhc0FycmF5KHJlY29yZC5jb2x1bW5zKS5tYXAoKHJhd0NvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtblJlY29yZCA9IGFzUmVjb3JkKHJhd0NvbHVtbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcoY29sdW1uUmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICBzb3J0OiBhc09wdGlvbmFsU3RyaW5nKGNvbHVtblJlY29yZC5zb3J0KSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbHM6IGFzT3B0aW9uYWxTdHJpbmcoY29sdW1uUmVjb3JkLm51bGxzKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBpbmNsdWRlOiBhc1N0cmluZ0FycmF5KHJlY29yZC5pbmNsdWRlKSxcbiAgICAgICAgICAgIHdoZXJlOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC53aGVyZSksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVVuaXF1ZUNvbnN0cmFpbnRzKHZhbHVlOiB1bmtub3duKTogVW5pcXVlQ29uc3RyYWludFtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGFzU3RyaW5nKHJlY29yZC5uYW1lKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGFzU3RyaW5nQXJyYXkocmVjb3JkLmNvbHVtbnMpLFxuICAgICAgICAgICAgbnVsbHNOb3REaXN0aW5jdDogYXNPcHRpb25hbEJvb2xlYW4ocmVjb3JkLm51bGxzTm90RGlzdGluY3QpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDaGVja0NvbnN0cmFpbnRzKHZhbHVlOiB1bmtub3duKTogQ2hlY2tDb25zdHJhaW50W10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogYXNTdHJpbmcocmVjb3JkLmV4cHJlc3Npb24pLFxuICAgICAgICAgICAgY29sdW1uczogYXNTdHJpbmdBcnJheShyZWNvcmQuY29sdW1ucyksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUJ1Y2tldGluZyh2YWx1ZTogdW5rbm93bik6IEJ1Y2tldGluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQodmFsdWUpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IGFzU3RyaW5nQXJyYXkocmVjb3JkLmNvbHVtbnMpLFxuICAgICAgICBidWNrZXRDb3VudDogdHlwZW9mIHJlY29yZC5idWNrZXRDb3VudCA9PT0gJ251bWJlcicgPyByZWNvcmQuYnVja2V0Q291bnQgOiAwLFxuICAgICAgICBzb3J0ZWRCeTogYXNBcnJheShyZWNvcmQuc29ydGVkQnkpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzb3J0UmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiBhc1N0cmluZyhzb3J0UmVjb3JkLmNvbHVtbiksXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBhc1N0cmluZyhzb3J0UmVjb3JkLmRpcmVjdGlvbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmdNYXAodmFsdWU6IHVua25vd24pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZCh2YWx1ZSk7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBbXG4gICAgICAgIGtleSxcbiAgICAgICAgcmF3LFxuICAgIF0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkKSkge1xuICAgICAgICBpZiAodHlwZW9mIHJhdyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcmF3O1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUZvcmVpZ25LZXlzKHZhbHVlOiB1bmtub3duKTogRm9yZWlnbktleVtdIHtcbiAgICByZXR1cm4gYXNBcnJheSh2YWx1ZSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZVRhYmxlOiBhc1N0cmluZyhyZWNvcmQuc291cmNlVGFibGUpLFxuICAgICAgICAgICAgc291cmNlQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQuc291cmNlQ29sdW1uKSxcbiAgICAgICAgICAgIGxvY2FsQ29sdW1uOiBhc1N0cmluZyhyZWNvcmQubG9jYWxDb2x1bW4pLFxuICAgICAgICAgICAgYWxsb3dOdWxsczogYXNCb29sZWFuKHJlY29yZC5hbGxvd051bGxzKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVGFibGVEZWZpbml0aW9uKHJhdzogdW5rbm93bik6IFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgICAgIHRhYmxlVHlwZTogYXNTdHJpbmcocmVjb3JkLnRhYmxlVHlwZSksXG4gICAgICAgIGlzUmF3RGF0YTogYXNCb29sZWFuKHJlY29yZC5pc1Jhd0RhdGEpLFxuICAgICAgICBmb3JtYXRWZXJzaW9uOiBhc09wdGlvbmFsTnVtYmVyKHJlY29yZC5mb3JtYXRWZXJzaW9uKSxcbiAgICAgICAgY29sdW1uczogbm9ybWFsaXplQ29sdW1ucyhyZWNvcmQuY29sdW1ucyksXG4gICAgICAgIHByaW1hcnlLZXk6IGFzU3RyaW5nQXJyYXkocmVjb3JkLnByaW1hcnlLZXkpLFxuICAgICAgICBwYXJ0aXRpb25zOiBub3JtYWxpemVQYXJ0aXRpb25zKHJlY29yZC5wYXJ0aXRpb25zKSxcbiAgICAgICAgc29ydE9yZGVyOiBub3JtYWxpemVTb3J0T3JkZXIocmVjb3JkLnNvcnRPcmRlciksXG4gICAgICAgIGluZGV4ZXM6IG5vcm1hbGl6ZUluZGV4ZXMocmVjb3JkLmluZGV4ZXMpLFxuICAgICAgICB1bmlxdWVDb25zdHJhaW50czogbm9ybWFsaXplVW5pcXVlQ29uc3RyYWludHMocmVjb3JkLnVuaXF1ZUNvbnN0cmFpbnRzKSxcbiAgICAgICAgY2hlY2tDb25zdHJhaW50czogbm9ybWFsaXplQ2hlY2tDb25zdHJhaW50cyhyZWNvcmQuY2hlY2tDb25zdHJhaW50cyksXG4gICAgICAgIGJ1Y2tldGluZzogbm9ybWFsaXplQnVja2V0aW5nKHJlY29yZC5idWNrZXRpbmcpLFxuICAgICAgICB0YWJsZVByb3BlcnRpZXM6IG5vcm1hbGl6ZVN0cmluZ01hcChyZWNvcmQudGFibGVQcm9wZXJ0aWVzKSxcbiAgICAgICAgZGVwZW5kc09uOiBhc1N0cmluZ0FycmF5KHJlY29yZC5kZXBlbmRzT24pLFxuICAgICAgICBmb3JlaWduS2V5czogbm9ybWFsaXplRm9yZWlnbktleXMocmVjb3JkLmZvcmVpZ25LZXlzKSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTY2hlbWFEZXNjcmlwdGlvbihyYXc6IHVua25vd24pOiBTY2hlbWFEZXNjcmlwdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgfTtcbn1cblxuLy8vIFNjaGVtYSBhbmQgdGFibGUgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugc25ha2VfY2FzZSBzbyB0aGV5IGNhbiBiZSByZWZlcmVuY2VkXG4vLy8gZnJvbSBgZGVwZW5kc09uYCBhbmQgZm9yZWlnbiBrZXlzLCB3aG9zZSBwYXR0ZXJucyByZXF1aXJlIHRoZSBzYW1lIHNoYXBlLlxuY29uc3QgTkFNRV9SRSA9IC9eW2EtejAtOV9dKyQvO1xuXG4vKipcbiAqIExvYWQgYSBkYXRhc2V0IHJvb3QgaW50byBhIGBXb3JsZGAuXG4gKlxuICogQHBhcmFtIHJvb3REaXIgQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGF0YXNldCByb290LlxuICogQHJldHVybnMgVGhlIGxvYWRlZCB3b3JsZCBwbHVzIGxvYWQtdGltZSB2aW9sYXRpb25zLlxuICogQHRocm93cyBFcnJvciBXaGVuIGByb290RGlyYCBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFJvb3Qocm9vdERpcjogc3RyaW5nKTogTG9hZE91dGNvbWUge1xuICAgIGNvbnN0IGFic29sdXRlUm9vdCA9IHBhdGgucmVzb2x2ZShyb290RGlyKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzb2x1dGVSb290KSB8fCAhZnMuc3RhdFN5bmMoYWJzb2x1dGVSb290KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YXNldCByb290IGlzIG5vdCBhIGRpcmVjdG9yeTogJHthYnNvbHV0ZVJvb3R9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIExvYWRlZFNjaGVtYT4oKTtcbiAgICBjb25zdCB0YWJsZXMgPSBuZXcgTWFwPHN0cmluZywgVGFibGVUeXBlQmFzZT4oKTtcblxuICAgIGNvbnN0IHNjaGVtYURpcnMgPSBmcy5yZWFkZGlyU3luYyhhYnNvbHV0ZVJvb3QsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpICYmICFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWFEaXIgb2Ygc2NoZW1hRGlycykge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gc2NoZW1hRGlyLm5hbWU7XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4oYWJzb2x1dGVSb290LCBzY2hlbWFOYW1lKTtcblxuICAgICAgICBpZiAoIU5BTUVfUkUudGVzdChzY2hlbWFOYW1lKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBkaXJQYXRoLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzY2hlbWEgbmFtZSBcIiR7c2NoZW1hTmFtZX1cIiBtdXN0IGJlIGxvd2VyY2FzZSBzbmFrZV9jYXNlIChtYXRjaGluZyAke05BTUVfUkV9KWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NGaWxlTmFtZSA9IGAke3NjaGVtYU5hbWV9Lmpzb25gO1xuICAgICAgICBjb25zdCBqc29uRmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLmpzb24nKSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogU2NoZW1hRGVzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgbG9hZGVkVGFibGVzOiBUYWJsZVR5cGVCYXNlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YganNvbkZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAgICAgICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0ZJTEVfUEFSU0VfRVJST1InLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW52YWxpZCBKU09OOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlsZSA9PT0gZGVzY0ZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCdzY2hlbWEnLCBwYXJzZWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RydWN0dXJhbEVycm9yIG9mIHN0cnVjdHVyYWwuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdTQ0hFTUFfVkFMSURBVElPTicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogc3RydWN0dXJhbEVycm9yLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbm9ybWFsaXplU2NoZW1hRGVzY3JpcHRpb24ocGFyc2VkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZmlsZS5zbGljZSgwLCAtJy5qc29uJy5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgcXVhbGlmaWVkTmFtZSA9IGAke3NjaGVtYU5hbWV9LiR7dGFibGVOYW1lfWA7XG5cbiAgICAgICAgICAgIGlmICghTkFNRV9SRS50ZXN0KHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1RBQkxFX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgbmFtZSBcIiR7dGFibGVOYW1lfVwiIG11c3QgYmUgbG93ZXJjYXNlIHNuYWtlX2Nhc2UgKG1hdGNoaW5nICR7TkFNRV9SRX0pYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCd0YWJsZScsIHBhcnNlZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0cnVjdHVyYWxFcnJvciBvZiBzdHJ1Y3R1cmFsLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX1ZBTElEQVRJT04nLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzdHJ1Y3R1cmFsRXJyb3IuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkVGFibGUgPSBjcmVhdGVUYWJsZVR5cGUoe1xuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsbHlWYWxpZDogc3RydWN0dXJhbC52YWxpZCxcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiBub3JtYWxpemVUYWJsZURlZmluaXRpb24ocGFyc2VkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZGVkVGFibGVzLnB1c2gobG9hZGVkVGFibGUpO1xuICAgICAgICAgICAgdGFibGVzLnNldChxdWFsaWZpZWROYW1lLCBsb2FkZWRUYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1NDSEVNQV9ERVNDX1BSRVNFTlQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4oZGlyUGF0aCwgZGVzY0ZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc2NoZW1hIFwiJHtzY2hlbWFOYW1lfVwiIGlzIG1pc3NpbmcgaXRzIGRlc2NyaXB0aW9uIGZpbGUgXCIke2Rlc2NGaWxlTmFtZX1cImAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVtYXMuc2V0KHNjaGVtYU5hbWUsIHtcbiAgICAgICAgICAgIG5hbWU6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0YWJsZXM6IGxvYWRlZFRhYmxlcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd29ybGQ6IHtcbiAgICAgICAgICAgIHJvb3REaXI6IGFic29sdXRlUm9vdCxcbiAgICAgICAgICAgIHNjaGVtYXMsXG4gICAgICAgICAgICB0YWJsZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHZpb2xhdGlvbnMsXG4gICAgfTtcbn1cbiJdfQ==
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1UUgsNEJBd0lDO0FBN1lELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFnQjdCLDZDQUVzQjtBQUl0QixxREFFZ0M7QUFlaEMsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM1QixPQUFPLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFnQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDL0YsQ0FBQztBQUVELFNBQVMsT0FBTyxDQUFDLEtBQWM7SUFDM0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxRQUFRLENBQUMsS0FBYztJQUM1QixPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEtBQWM7SUFDN0IsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3RELENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEtBQWM7SUFDckMsT0FBTyxPQUFPLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDcEMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMs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QUMsQ0FBQztJQUNQLENBQUM7SUFFRCxPQUFPO1FBQ0gsS0FBSyxFQUFFO1lBQ0gsT0FBTyxFQUFFLFlBQVk7WUFDckIsT0FBTztZQUNQLE1BQU07U0FDVDtRQUNELFVBQVU7S0FDYixDQUFDO0FBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlsZXN5c3RlbSBsb2FkZXIuIFdhbGtzIGEgZGF0YXNldCByb290LCBwYXJzZXMgZWFjaCBKU09OIGZpbGUsIHJ1bnMgTGF5ZXIgMVxuICogc3RydWN0dXJhbCB2YWxpZGF0aW9uLCBhbmQgbm9ybWFsaXplcyBldmVyeXRoaW5nIGludG8gYSBgV29ybGRgIG9mXG4gKiBjb25jcmV0ZSBgVGFibGVUeXBlQmFzZWAgaW5zdGFuY2VzIHRoYXQgdGhlIHNlbWFudGljIHJ1bGVzIG9wZXJhdGUgb24uXG4gKlxuICogUGFyc2UgZXJyb3JzLCBzdHJ1Y3R1cmFsIGVycm9ycywgYW5kIGEgbWlzc2luZyBzY2hlbWEtZGVzY3JpcHRpb24gZmlsZSBhcmVcbiAqIHJlcG9ydGVkIGhlcmU7IGFsbCBjcm9zcy1maWVsZCAvIGNyb3NzLWZpbGUgbG9naWMgbGl2ZXMgaW4gdGhlIHRhYmxlLXR5cGVcbiAqIGNsYXNzZXMgKGAuL3RhYmxlLXR5cGUudHNgLCBgLi90YWJsZS10eXBlcy8qYCkuXG4gKi9cblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtcbiAgICBCdWNrZXRpbmcsXG4gICAgQ2hlY2tDb25zdHJhaW50LFxuICAgIENvbHVtbixcbiAgICBFeGNsdXNpb25Db25zdHJhaW50LFxuICAgIEZvcmVpZ25LZXksXG4gICAgSW5kZXgsXG4gICAgUGFydGl0aW9uLFxuICAgIFNjaGVtYURlc2NyaXB0aW9uLFxuICAgIFNvcnRGaWVsZCxcbiAgICBUYWJsZURlZmluaXRpb24sXG4gICAgVW5pcXVlQ29uc3RyYWludCxcbiAgICBWaW9sYXRpb24sXG59IGZyb20gJy4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICB2YWxpZGF0ZVN0cnVjdHVyZSxcbn0gZnJvbSAnLi9zdHJ1Y3R1cmFsJztcbmltcG9ydCB7XG4gICAgVGFibGVUeXBlQmFzZSxcbn0gZnJvbSAnLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgY3JlYXRlVGFibGVUeXBlLFxufSBmcm9tICcuL3RhYmxlLXR5cGVzL3JlZ2lzdHJ5JztcbmltcG9ydCB7XG4gICAgTG9hZGVkU2NoZW1hLFxuICAgIFdvcmxkLFxufSBmcm9tICcuL3dvcmxkJztcblxuLyoqIFJlc3VsdCBvZiBsb2FkaW5nIGEgcm9vdDogdGhlIG1vZGVsIHBsdXMgYW55IGxvYWQtdGltZSB2aW9sYXRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FkT3V0Y29tZSB7XG4gICAgLyoqIFRoZSBsb2FkZWQgbW9kZWwuICovXG4gICAgcmVhZG9ubHkgd29ybGQ6IFdvcmxkO1xuXG4gICAgLyoqIFBhcnNlLCBzdHJ1Y3R1cmFsLCBhbmQgbWlzc2luZy1kZXNjcmlwdGlvbiB2aW9sYXRpb25zLiAqL1xuICAgIHJlYWRvbmx5IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdO1xufVxuXG5mdW5jdGlvbiBhc1JlY29yZCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IDoge307XG59XG5cbmZ1bmN0aW9uIGFzQXJyYXkodmFsdWU6IHVua25vd24pOiB1bmtub3duW10ge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW107XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7XG59XG5cbmZ1bmN0aW9uIGFzQm9vbGVhbih2YWx1ZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJyA/IHZhbHVlIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGFzT3B0aW9uYWxCb29sZWFuKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzT3B0aW9uYWxOdW1iZXIodmFsdWU6IHVua25vd24pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzT3B0aW9uYWxTdHJpbmcodmFsdWU6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+IHR5cGVvZiBpdGVtID09PSAnc3RyaW5nJyk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvbHVtbnModmFsdWU6IHVua25vd24pOiBDb2x1bW5bXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhyZWNvcmQubmFtZSksXG4gICAgICAgICAgICB0eXBlOiBhc1N0cmluZyhyZWNvcmQudHlwZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYXNTdHJpbmcocmVjb3JkLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgICAgIG51bGxhYmxlOiBhc09wdGlvbmFsQm9vbGVhbihyZWNvcmQubnVsbGFibGUpLFxuICAgICAgICAgICAgZ2VuZXJhdGVkOiBhc09wdGlvbmFsU3RyaW5nKHJlY29yZC5nZW5lcmF0ZWQpLFxuICAgICAgICAgICAgZXhwcmVzc2lvbjogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuZXhwcmVzc2lvbiksXG4gICAgICAgICAgICBleHByZXNzaW9uQ29sdW1uczogJ2V4cHJlc3Npb25Db2x1bW5zJyBpbiByZWNvcmQgPyBhc1N0cmluZ0FycmF5KHJlY29yZC5leHByZXNzaW9uQ29sdW1ucykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBpZGVudGl0eTogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuaWRlbnRpdHkpLFxuICAgICAgICAgICAgZGVmYXVsdDogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuZGVmYXVsdCksXG4gICAgICAgICAgICBjb2xsYXRpb246IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLmNvbGxhdGlvbiksXG4gICAgICAgICAgICBjb21wcmVzc2lvbjogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuY29tcHJlc3Npb24pLFxuICAgICAgICAgICAgc3RvcmFnZTogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQuc3RvcmFnZSksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnRpdGlvbnModmFsdWU6IHVua25vd24pOiBQYXJ0aXRpb25bXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhyZWNvcmQubmFtZSksXG4gICAgICAgICAgICB0eXBlOiBhc1N0cmluZyhyZWNvcmQudHlwZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYXNTdHJpbmcocmVjb3JkLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU29ydE9yZGVyKHZhbHVlOiB1bmtub3duKTogU29ydEZpZWxkW10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29sdW1uOiBhc1N0cmluZyhyZWNvcmQuY29sdW1uKSxcbiAgICAgICAgICAgIHRyYW5zZm9ybTogYXNPcHRpb25hbFN0cmluZyhyZWNvcmQudHJhbnNmb3JtKSxcbiAgICAgICAgICAgIGRpcmVjdGlvbjogYXNTdHJpbmcocmVjb3JkLmRpcmVjdGlvbiksXG4gICAgICAgICAgICBudWxsT3JkZXI6IGFzU3RyaW5nKHJlY29yZC5udWxsT3JkZXIpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVJbmRleGVzKHZhbHVlOiB1bmtub3duKTogSW5kZXhbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhyZWNvcmQubmFtZSksXG4gICAgICAgICAgICBtZXRob2Q6IGFzU3RyaW5nKHJlY29yZC5tZXRob2QpLFxuICAgICAgICAgICAgdW5pcXVlOiBhc09wdGlvbmFsQm9vbGVhbihyZWNvcmQudW5pcXVlKSxcbiAgICAgICAgICAgIGNvbHVtbnM6IGFzQXJyYXkocmVjb3JkLmNvbHVtbnMpLm1hcCgocmF3Q29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uUmVjb3JkID0gYXNSZWNvcmQocmF3Q29sdW1uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhjb2x1bW5SZWNvcmQubmFtZSksXG4gICAgICAgICAgICAgICAgICAgIHNvcnQ6IGFzT3B0aW9uYWxTdHJpbmcoY29sdW1uUmVjb3JkLnNvcnQpLFxuICAgICAgICAgICAgICAgICAgICBudWxsczogYXNPcHRpb25hbFN0cmluZyhjb2x1bW5SZWNvcmQubnVsbHMpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGluY2x1ZGU6IGFzU3RyaW5nQXJyYXkocmVjb3JkLmluY2x1ZGUpLFxuICAgICAgICAgICAgd2hlcmU6IGFzT3B0aW9uYWxTdHJpbmcocmVjb3JkLndoZXJlKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVW5pcXVlQ29uc3RyYWludHModmFsdWU6IHVua25vd24pOiBVbmlxdWVDb25zdHJhaW50W10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgY29sdW1uczogYXNTdHJpbmdBcnJheShyZWNvcmQuY29sdW1ucyksXG4gICAgICAgICAgICBudWxsc05vdERpc3RpbmN0OiBhc09wdGlvbmFsQm9vbGVhbihyZWNvcmQubnVsbHNOb3REaXN0aW5jdCksXG4gICAgICAgIH07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNoZWNrQ29uc3RyYWludHModmFsdWU6IHVua25vd24pOiBDaGVja0NvbnN0cmFpbnRbXSB7XG4gICAgcmV0dXJuIGFzQXJyYXkodmFsdWUpLm1hcCgocmF3KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHJhdyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBhc1N0cmluZyhyZWNvcmQubmFtZSksXG4gICAgICAgICAgICBleHByZXNzaW9uOiBhc1N0cmluZyhyZWNvcmQuZXhwcmVzc2lvbiksXG4gICAgICAgICAgICBjb2x1bW5zOiBhc1N0cmluZ0FycmF5KHJlY29yZC5jb2x1bW5zKSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRXhjbHVzaW9uQ29uc3RyYWludHModmFsdWU6IHVua25vd24pOiBFeGNsdXNpb25Db25zdHJhaW50W10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYXNTdHJpbmcocmVjb3JkLm5hbWUpLFxuICAgICAgICAgICAgdXNpbmc6IGFzU3RyaW5nKHJlY29yZC51c2luZyksXG4gICAgICAgICAgICBlbGVtZW50czogYXNBcnJheShyZWNvcmQuZWxlbWVudHMpLm1hcCgocmF3RWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRSZWNvcmQgPSBhc1JlY29yZChyYXdFbGVtZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGFzU3RyaW5nKGVsZW1lbnRSZWNvcmQuY29sdW1uKSxcbiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I6IGFzU3RyaW5nKGVsZW1lbnRSZWNvcmQub3BlcmF0b3IpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQnVja2V0aW5nKHZhbHVlOiB1bmtub3duKTogQnVja2V0aW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZCh2YWx1ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY29sdW1uczogYXNTdHJpbmdBcnJheShyZWNvcmQuY29sdW1ucyksXG4gICAgICAgIGJ1Y2tldENvdW50OiB0eXBlb2YgcmVjb3JkLmJ1Y2tldENvdW50ID09PSAnbnVtYmVyJyA/IHJlY29yZC5idWNrZXRDb3VudCA6IDAsXG4gICAgICAgIHNvcnRlZEJ5OiBhc0FycmF5KHJlY29yZC5zb3J0ZWRCeSkubWFwKChyYXcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRSZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb2x1bW46IGFzU3RyaW5nKHNvcnRSZWNvcmQuY29sdW1uKSxcbiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IGFzU3RyaW5nKHNvcnRSZWNvcmQuZGlyZWN0aW9uKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0cmluZ01hcCh2YWx1ZTogdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHJlY29yZCA9IGFzUmVjb3JkKHZhbHVlKTtcbiAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgICAga2V5LFxuICAgICAgICByYXcsXG4gICAgXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQpKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF3ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0W2tleV0gPSByYXc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRm9yZWlnbktleXModmFsdWU6IHVua25vd24pOiBGb3JlaWduS2V5W10ge1xuICAgIHJldHVybiBhc0FycmF5KHZhbHVlKS5tYXAoKHJhdykgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc291cmNlVGFibGU6IGFzU3RyaW5nKHJlY29yZC5zb3VyY2VUYWJsZSksXG4gICAgICAgICAgICBzb3VyY2VDb2x1bW46IGFzU3RyaW5nKHJlY29yZC5zb3VyY2VDb2x1bW4pLFxuICAgICAgICAgICAgbG9jYWxDb2x1bW46IGFzU3RyaW5nKHJlY29yZC5sb2NhbENvbHVtbiksXG4gICAgICAgICAgICBhbGxvd051bGxzOiBhc0Jvb2xlYW4ocmVjb3JkLmFsbG93TnVsbHMpLFxuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVUYWJsZURlZmluaXRpb24ocmF3OiB1bmtub3duKTogVGFibGVEZWZpbml0aW9uIHtcbiAgICBjb25zdCByZWNvcmQgPSBhc1JlY29yZChyYXcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHNwZWNWZXJzaW9uOiBhc1N0cmluZyhyZWNvcmQuc3BlY1ZlcnNpb24pLFxuICAgICAgICBkZXNjcmlwdGlvbjogYXNTdHJpbmcocmVjb3JkLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgdGFibGVUeXBlOiBhc1N0cmluZyhyZWNvcmQudGFibGVUeXBlKSxcbiAgICAgICAgaXNSYXdEYXRhOiBhc0Jvb2xlYW4ocmVjb3JkLmlzUmF3RGF0YSksXG4gICAgICAgIGZvcm1hdFZlcnNpb246IGFzT3B0aW9uYWxOdW1iZXIocmVjb3JkLmZvcm1hdFZlcnNpb24pLFxuICAgICAgICBjb2x1bW5zOiBub3JtYWxpemVDb2x1bW5zKHJlY29yZC5jb2x1bW5zKSxcbiAgICAgICAgcHJpbWFyeUtleTogYXNTdHJpbmdBcnJheShyZWNvcmQucHJpbWFyeUtleSksXG4gICAgICAgIHBhcnRpdGlvbnM6IG5vcm1hbGl6ZVBhcnRpdGlvbnMocmVjb3JkLnBhcnRpdGlvbnMpLFxuICAgICAgICBzb3J0T3JkZXI6IG5vcm1hbGl6ZVNvcnRPcmRlcihyZWNvcmQuc29ydE9yZGVyKSxcbiAgICAgICAgaW5kZXhlczogbm9ybWFsaXplSW5kZXhlcyhyZWNvcmQuaW5kZXhlcyksXG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzOiBub3JtYWxpemVVbmlxdWVDb25zdHJhaW50cyhyZWNvcmQudW5pcXVlQ29uc3RyYWludHMpLFxuICAgICAgICBjaGVja0NvbnN0cmFpbnRzOiBub3JtYWxpemVDaGVja0NvbnN0cmFpbnRzKHJlY29yZC5jaGVja0NvbnN0cmFpbnRzKSxcbiAgICAgICAgZXhjbHVzaW9uQ29uc3RyYWludHM6IG5vcm1hbGl6ZUV4Y2x1c2lvbkNvbnN0cmFpbnRzKHJlY29yZC5leGNsdXNpb25Db25zdHJhaW50cyksXG4gICAgICAgIGJ1Y2tldGluZzogbm9ybWFsaXplQnVja2V0aW5nKHJlY29yZC5idWNrZXRpbmcpLFxuICAgICAgICB0YWJsZVByb3BlcnRpZXM6IG5vcm1hbGl6ZVN0cmluZ01hcChyZWNvcmQudGFibGVQcm9wZXJ0aWVzKSxcbiAgICAgICAgZGVwZW5kc09uOiBhc1N0cmluZ0FycmF5KHJlY29yZC5kZXBlbmRzT24pLFxuICAgICAgICBmb3JlaWduS2V5czogbm9ybWFsaXplRm9yZWlnbktleXMocmVjb3JkLmZvcmVpZ25LZXlzKSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTY2hlbWFEZXNjcmlwdGlvbihyYXc6IHVua25vd24pOiBTY2hlbWFEZXNjcmlwdGlvbiB7XG4gICAgY29uc3QgcmVjb3JkID0gYXNSZWNvcmQocmF3KTtcbiAgICByZXR1cm4ge1xuICAgICAgICBzcGVjVmVyc2lvbjogYXNTdHJpbmcocmVjb3JkLnNwZWNWZXJzaW9uKSxcbiAgICAgICAgZGVzY3JpcHRpb246IGFzU3RyaW5nKHJlY29yZC5kZXNjcmlwdGlvbiksXG4gICAgfTtcbn1cblxuLy8vIFNjaGVtYSBhbmQgdGFibGUgbmFtZXMgbXVzdCBiZSBsb3dlcmNhc2Ugc25ha2VfY2FzZSBzbyB0aGV5IGNhbiBiZSByZWZlcmVuY2VkXG4vLy8gZnJvbSBgZGVwZW5kc09uYCBhbmQgZm9yZWlnbiBrZXlzLCB3aG9zZSBwYXR0ZXJucyByZXF1aXJlIHRoZSBzYW1lIHNoYXBlLlxuY29uc3QgTkFNRV9SRSA9IC9eW2EtejAtOV9dKyQvO1xuXG4vKipcbiAqIExvYWQgYSBkYXRhc2V0IHJvb3QgaW50byBhIGBXb3JsZGAuXG4gKlxuICogQHBhcmFtIHJvb3REaXIgQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgZGF0YXNldCByb290LlxuICogQHJldHVybnMgVGhlIGxvYWRlZCB3b3JsZCBwbHVzIGxvYWQtdGltZSB2aW9sYXRpb25zLlxuICogQHRocm93cyBFcnJvciBXaGVuIGByb290RGlyYCBpcyBub3QgYW4gZXhpc3RpbmcgZGlyZWN0b3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZFJvb3Qocm9vdERpcjogc3RyaW5nKTogTG9hZE91dGNvbWUge1xuICAgIGNvbnN0IGFic29sdXRlUm9vdCA9IHBhdGgucmVzb2x2ZShyb290RGlyKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzb2x1dGVSb290KSB8fCAhZnMuc3RhdFN5bmMoYWJzb2x1dGVSb290KS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgZGF0YXNldCByb290IGlzIG5vdCBhIGRpcmVjdG9yeTogJHthYnNvbHV0ZVJvb3R9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICBjb25zdCBzY2hlbWFzID0gbmV3IE1hcDxzdHJpbmcsIExvYWRlZFNjaGVtYT4oKTtcbiAgICBjb25zdCB0YWJsZXMgPSBuZXcgTWFwPHN0cmluZywgVGFibGVUeXBlQmFzZT4oKTtcblxuICAgIGNvbnN0IHNjaGVtYURpcnMgPSBmcy5yZWFkZGlyU3luYyhhYnNvbHV0ZVJvb3QsIHtcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICB9KS5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0RpcmVjdG9yeSgpICYmICFlbnRyeS5uYW1lLnN0YXJ0c1dpdGgoJy4nKSlcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuXG4gICAgZm9yIChjb25zdCBzY2hlbWFEaXIgb2Ygc2NoZW1hRGlycykge1xuICAgICAgICBjb25zdCBzY2hlbWFOYW1lID0gc2NoZW1hRGlyLm5hbWU7XG4gICAgICAgIGNvbnN0IGRpclBhdGggPSBwYXRoLmpvaW4oYWJzb2x1dGVSb290LCBzY2hlbWFOYW1lKTtcblxuICAgICAgICBpZiAoIU5BTUVfUkUudGVzdChzY2hlbWFOYW1lKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBkaXJQYXRoLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBzY2hlbWEgbmFtZSBcIiR7c2NoZW1hTmFtZX1cIiBtdXN0IGJlIGxvd2VyY2FzZSBzbmFrZV9jYXNlIChtYXRjaGluZyAke05BTUVfUkV9KWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlc2NGaWxlTmFtZSA9IGAke3NjaGVtYU5hbWV9Lmpzb25gO1xuICAgICAgICBjb25zdCBqc29uRmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKVxuICAgICAgICAgICAgLmZpbHRlcigoZmlsZSkgPT4gZmlsZS5lbmRzV2l0aCgnLmpzb24nKSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuXG4gICAgICAgIGxldCBkZXNjcmlwdGlvbjogU2NoZW1hRGVzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgICAgICAgY29uc3QgbG9hZGVkVGFibGVzOiBUYWJsZVR5cGVCYXNlW10gPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YganNvbkZpbGVzKSB7XG4gICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBmaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAgICAgICBsZXQgcGFyc2VkOiB1bmtub3duO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ0ZJTEVfUEFSU0VfRVJST1InLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW52YWxpZCBKU09OOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZmlsZSA9PT0gZGVzY0ZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCdzY2hlbWEnLCBwYXJzZWQpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RydWN0dXJhbEVycm9yIG9mIHN0cnVjdHVyYWwuZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdTQ0hFTUFfVkFMSURBVElPTicsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogc3RydWN0dXJhbEVycm9yLmZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbm9ybWFsaXplU2NoZW1hRGVzY3JpcHRpb24ocGFyc2VkKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdGFibGVOYW1lID0gZmlsZS5zbGljZSgwLCAtJy5qc29uJy5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgcXVhbGlmaWVkTmFtZSA9IGAke3NjaGVtYU5hbWV9LiR7dGFibGVOYW1lfWA7XG5cbiAgICAgICAgICAgIGlmICghTkFNRV9SRS50ZXN0KHRhYmxlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1RBQkxFX05BTUVfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdGFibGUgbmFtZSBcIiR7dGFibGVOYW1lfVwiIG11c3QgYmUgbG93ZXJjYXNlIHNuYWtlX2Nhc2UgKG1hdGNoaW5nICR7TkFNRV9SRX0pYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc3RydWN0dXJhbCA9IHZhbGlkYXRlU3RydWN0dXJlKCd0YWJsZScsIHBhcnNlZCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHN0cnVjdHVyYWxFcnJvciBvZiBzdHJ1Y3R1cmFsLmVycm9ycykge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnU0NIRU1BX1ZBTElEQVRJT04nLFxuICAgICAgICAgICAgICAgICAgICBzY2hlbWE6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBzdHJ1Y3R1cmFsRXJyb3IuZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzdHJ1Y3R1cmFsRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9hZGVkVGFibGUgPSBjcmVhdGVUYWJsZVR5cGUoe1xuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBuYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgcXVhbGlmaWVkTmFtZSxcbiAgICAgICAgICAgICAgICBmaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsbHlWYWxpZDogc3RydWN0dXJhbC52YWxpZCxcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiBub3JtYWxpemVUYWJsZURlZmluaXRpb24ocGFyc2VkKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZGVkVGFibGVzLnB1c2gobG9hZGVkVGFibGUpO1xuICAgICAgICAgICAgdGFibGVzLnNldChxdWFsaWZpZWROYW1lLCBsb2FkZWRUYWJsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1NDSEVNQV9ERVNDX1BSRVNFTlQnLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogc2NoZW1hTmFtZSxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLmpvaW4oZGlyUGF0aCwgZGVzY0ZpbGVOYW1lKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc2NoZW1hIFwiJHtzY2hlbWFOYW1lfVwiIGlzIG1pc3NpbmcgaXRzIGRlc2NyaXB0aW9uIGZpbGUgXCIke2Rlc2NGaWxlTmFtZX1cImAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjaGVtYXMuc2V0KHNjaGVtYU5hbWUsIHtcbiAgICAgICAgICAgIG5hbWU6IHNjaGVtYU5hbWUsXG4gICAgICAgICAgICBkaXJQYXRoLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0YWJsZXM6IGxvYWRlZFRhYmxlcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgd29ybGQ6IHtcbiAgICAgICAgICAgIHJvb3REaXI6IGFic29sdXRlUm9vdCxcbiAgICAgICAgICAgIHNjaGVtYXMsXG4gICAgICAgICAgICB0YWJsZXMsXG4gICAgICAgIH0sXG4gICAgICAgIHZpb2xhdGlvbnMsXG4gICAgfTtcbn1cbiJdfQ==
@@ -46,6 +46,12 @@ export interface Column {
46
46
  readonly identity?: string;
47
47
  /** Opaque column default expression (Postgres). */
48
48
  readonly default?: string;
49
+ /** Column collation name (Postgres). Opaque; legal only on text types. */
50
+ readonly collation?: string;
51
+ /** Per-column TOAST compression (Postgres): `pglz` or `lz4`. */
52
+ readonly compression?: string;
53
+ /** Per-column storage strategy (Postgres): `plain`/`external`/`extended`/`main`/`default`. */
54
+ readonly storage?: string;
49
55
  }
50
56
  /**
51
57
  * A partition entry. The meaning of `name` and `type` is engine-specific: for
@@ -144,6 +150,25 @@ export interface Bucketing {
144
150
  /** Optional intra-bucket sort columns. */
145
151
  readonly sortedBy: BucketSort[];
146
152
  }
153
+ /** One element of an exclusion constraint: a column and its operator. */
154
+ export interface ExclusionElement {
155
+ /** Column the element applies to. */
156
+ readonly column: string;
157
+ /** Opaque operator (e.g. `&&`, `=`). */
158
+ readonly operator: string;
159
+ }
160
+ /**
161
+ * An exclusion constraint (Postgres): no two rows may have all listed
162
+ * column/operator pairs evaluate true together (generalized uniqueness).
163
+ */
164
+ export interface ExclusionConstraint {
165
+ /** Constraint name (unique within the table). */
166
+ readonly name: string;
167
+ /** Index access method (`gist` or `spgist`). */
168
+ readonly using: string;
169
+ /** Column/operator elements. */
170
+ readonly elements: ExclusionElement[];
171
+ }
147
172
  /** A foreign-key reference to a column in another table. */
148
173
  export interface ForeignKey {
149
174
  /** Referenced table in `schema.table` format. */
@@ -184,6 +209,8 @@ export interface TableDefinition {
184
209
  readonly uniqueConstraints: UniqueConstraint[];
185
210
  /** CHECK constraints (Postgres). Optional; other engines ignore them. */
186
211
  readonly checkConstraints: CheckConstraint[];
212
+ /** Exclusion constraints (Postgres). Optional; other engines ignore them. */
213
+ readonly exclusionConstraints: ExclusionConstraint[];
187
214
  /** Hive bucketing spec. Optional; other engines ignore it. */
188
215
  readonly bucketing?: Bucketing;
189
216
  /**
package/dist/src/model.js CHANGED
@@ -23,4 +23,4 @@ exports.TABLE_TYPES = [
23
23
  TableType.ICEBERG_PARQUET,
24
24
  TableType.POSTGRES_18,
25
25
  ];
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCx3RUFBd0U7QUFDeEUsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdEQUFtQyxDQUFBO0lBQ25DLHdDQUEyQixDQUFBO0FBQy9CLENBQUMsRUFKVyxTQUFTLHlCQUFULFNBQVMsUUFJcEI7QUFFRCw2REFBNkQ7QUFDaEQsUUFBQSxXQUFXLEdBQXNCO0lBQzFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3RCLFNBQVMsQ0FBQyxlQUFlO0lBQ3pCLFNBQVMsQ0FBQyxXQUFXO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgZGF0YSBtb2RlbCBmb3IgdGhlIEZsZXhpYmxlIERhdGFzZXQgRGVmaW5pdGlvbiAoRkREKSBzdGFuZGFyZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmZhY2VzIGRlc2NyaWJlIHRoZSAqcHVyZSBkYXRhKiBzaGFwZSBvZiBhIGRhdGFzZXQ6IGNvbHVtbnMsXG4gKiBwYXJ0aXRpb25zLCBmb3JlaWduIGtleXMsIHRhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIHZpb2xhdGlvbnMgdGhlXG4gKiB2YWxpZGF0b3IgZW1pdHMuIFRoZSBsb2FkZWQgd29ybGQgKHNjaGVtYXMgKyB0YWJsZSBpbnN0YW5jZXMpIGFuZCB0aGVcbiAqIGFic3RyYWN0IHRhYmxlIGJhc2UgY2xhc3MgbGl2ZSBpbiBgLi93b3JsZGAgYW5kIGAuL3RhYmxlLXR5cGVgIHNvIHRoaXNcbiAqIG1vZHVsZSBzdGF5cyBhIGxlYWYgd2l0aCBubyBiZWhhdmlvci5cbiAqL1xuXG4vKiogVGFibGUgZW5naW5lLiBFYWNoIHZhbHVlIHVubG9ja3MgZW5naW5lLXNwZWNpZmljIHNlbWFudGljIGNoZWNrcy4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlVHlwZSB7XG4gICAgSElWRV9QQVJRVUVUID0gJ2hpdmVfcGFycXVldCcsXG4gICAgSUNFQkVSR19QQVJRVUVUID0gJ2ljZWJlcmdfcGFycXVldCcsXG4gICAgUE9TVEdSRVNfMTggPSAncG9zdGdyZXNfMTgnLFxufVxuXG4vKiogRXZlcnkga25vd24gYHRhYmxlVHlwZWAgc3RyaW5nLCBmb3IgbWVtYmVyc2hpcCBjaGVja3MuICovXG5leHBvcnQgY29uc3QgVEFCTEVfVFlQRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgIFRhYmxlVHlwZS5ISVZFX1BBUlFVRVQsXG4gICAgVGFibGVUeXBlLklDRUJFUkdfUEFSUVVFVCxcbiAgICBUYWJsZVR5cGUuUE9TVEdSRVNfMTgsXG5dO1xuXG4vKiogQSBzaW5nbGUgZGF0YSBjb2x1bW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgLyoqIENvbHVtbiBuYW1lICh1bmlxdWUgd2l0aGluIGEgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUtc3BlY2lmaWMgdHlwZSBzdHJpbmcgKGUuZy4gYGxvbmdgLCBgdmFyY2hhcigyNTUpYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb2x1bW4gbWF5IGhvbGQgbnVsbC4gT3B0aW9uYWw6IHdoZW4gb21pdHRlZCwgbnVsbGFiaWxpdHkgaXNcbiAgICAgKiB1bnNwZWNpZmllZCBhbmQgdGhlIG51bGxhYmlsaXR5IGNyb3NzLWNoZWNrcyBkbyBub3QgZmlyZS4gYGZhbHNlYCBtYXJrcyBhXG4gICAgICogTk9UIE5VTEwgY29sdW1uIChJY2ViZXJnIGByZXF1aXJlZGApOyBgdHJ1ZWAgbWFya3MgYW4gZXhwbGljaXRseSBudWxsYWJsZVxuICAgICAqIGNvbHVtbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBudWxsYWJsZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZWQtY29sdW1uIGtpbmQgKFBvc3RncmVzKTogYHN0b3JlZGAgb3IgYHZpcnR1YWxgLiBPcHRpb25hbDsgd2hlblxuICAgICAqIHNldCwgdGhlIGNvbHVtbiBpcyBjb21wdXRlZCBmcm9tIGBleHByZXNzaW9uQ29sdW1uc2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZ2VuZXJhdGVkPzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBnZW5lcmF0aW9uIGV4cHJlc3Npb24gKFBvc3RncmVzIGdlbmVyYXRlZCBjb2x1bW4pLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb24/OiBzdHJpbmc7XG5cbiAgICAvKiogQ29sdW1ucyB0aGUgZ2VuZXJhdGlvbiBgZXhwcmVzc2lvbmAgcmVmZXJlbmNlcyAoUG9zdGdyZXMpLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb25Db2x1bW5zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGl0eS1jb2x1bW4ga2luZCAoUG9zdGdyZXMpOiBgYWx3YXlzYCBvciBgYnlEZWZhdWx0YC4gT3B0aW9uYWw7IHdoZW5cbiAgICAgKiBzZXQsIHRoZSBjb2x1bW4gaXMgYEdFTkVSQVRFRCDigKYgQVMgSURFTlRJVFlgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkZW50aXR5Pzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBjb2x1bW4gZGVmYXVsdCBleHByZXNzaW9uIChQb3N0Z3JlcykuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHBhcnRpdGlvbiBlbnRyeS4gVGhlIG1lYW5pbmcgb2YgYG5hbWVgIGFuZCBgdHlwZWAgaXMgZW5naW5lLXNwZWNpZmljOiBmb3JcbiAqIEhpdmUsIGBuYW1lYCBpcyBhIG5ldyBwYXJ0aXRpb24gY29sdW1uIGFuZCBgdHlwZWAgaXMgYSBub3JtYWwgdHlwZTsgZm9yXG4gKiBJY2ViZXJnLCBgbmFtZWAgaXMgYSBzb3VyY2UgZGF0YSBjb2x1bW4gYW5kIGB0eXBlYCBpcyBhIHRyYW5zZm9ybTsgZm9yXG4gKiBQb3N0Z3JlcywgYG5hbWVgIGlzIGFuIGV4aXN0aW5nIGtleSBjb2x1bW4gYW5kIGB0eXBlYCBpcyB0aGUgc3RyYXRlZ3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGl0aW9uIHtcbiAgICAvKiogSGl2ZTogbmV3IHBhcnRpdGlvbiBjb2x1bW4gbmFtZS4gSWNlYmVyZyAvIFBvc3RncmVzOiBleGlzdGluZyBkYXRhL2tleSBjb2x1bW4gbmFtZS4gKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogSGl2ZTogYSBub3JtYWwgdHlwZS4gSWNlYmVyZzogYSB0cmFuc2Zvcm0gKGUuZy4gYGRheWAsIGBidWNrZXRbMTZdYCkuIFBvc3RncmVzOiBhIHN0cmF0ZWd5IChgcmFuZ2VgIC8gYGxpc3RgIC8gYGhhc2hgKS4gKi9cbiAgICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4gZGVzY3JpcHRpb24uICovXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBzb3J0IGZpZWxkIGluIGFuIEljZWJlcmcgdGFibGUncyBzb3J0IG9yZGVyLiBgY29sdW1uYCBpcyBhIGRhdGFcbiAqIGNvbHVtbjsgYHRyYW5zZm9ybWAgaXMgYW4gb3B0aW9uYWwgSWNlYmVyZyB0cmFuc2Zvcm0gYXBwbGllZCBiZWZvcmUgc29ydGluZ1xuICogKGRlZmF1bHRzIHRvIGlkZW50aXR5KTsgYGRpcmVjdGlvbmAgYW5kIGBudWxsT3JkZXJgIHNldCB0aGUgb3JkZXJpbmcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU29ydEZpZWxkIHtcbiAgICAvKiogU291cmNlIGRhdGEgY29sdW1uIHRvIHNvcnQgYnkuICovXG4gICAgcmVhZG9ubHkgY29sdW1uOiBzdHJpbmc7XG5cbiAgICAvKiogT3B0aW9uYWwgSWNlYmVyZyB0cmFuc2Zvcm0gYXBwbGllZCBiZWZvcmUgc29ydGluZyAoZS5nLiBgZGF5YCwgYGJ1Y2tldFsxNl1gKS4gKi9cbiAgICByZWFkb25seSB0cmFuc2Zvcm0/OiBzdHJpbmc7XG5cbiAgICAvKiogU29ydCBkaXJlY3Rpb24gKGBhc2NgIG9yIGBkZXNjYCkuICovXG4gICAgcmVhZG9ubHkgZGlyZWN0aW9uOiBzdHJpbmc7XG5cbiAgICAvKiogTnVsbCBvcmRlcmluZyAoYG51bGxzLWZpcnN0YCBvciBgbnVsbHMtbGFzdGApLiAqL1xuICAgIHJlYWRvbmx5IG51bGxPcmRlcjogc3RyaW5nO1xufVxuXG4vKiogQSBzaW5nbGUga2V5IGNvbHVtbiB3aXRoaW4gYW4gaW5kZXgsIHdpdGggb3B0aW9uYWwgb3JkZXJpbmcgbW9kaWZpZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRleENvbHVtbiB7XG4gICAgLyoqIEluZGV4ZWQgY29sdW1uIG5hbWUuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIE9wdGlvbmFsIHNvcnQgb3JkZXIgKGBhc2NgIG9yIGBkZXNjYCkuICovXG4gICAgcmVhZG9ubHkgc29ydD86IHN0cmluZztcblxuICAgIC8qKiBPcHRpb25hbCBudWxsIG9yZGVyaW5nIChgZmlyc3RgIG9yIGBsYXN0YCkuICovXG4gICAgcmVhZG9ubHkgbnVsbHM/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzZWNvbmRhcnkgaW5kZXggKGUuZy4gUG9zdGdyZXMpLiBgY29sdW1uc2AgYXJlIHRoZSBrZXkgY29sdW1uczsgYGluY2x1ZGVgXG4gKiBhcmUgbm9uLWtleSBjb3ZlcmluZyBjb2x1bW5zOyBgd2hlcmVgIGlzIGFuIG9wYXF1ZSBwYXJ0aWFsLWluZGV4IHByZWRpY2F0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRleCB7XG4gICAgLyoqIEluZGV4IG5hbWUgKHVuaXF1ZSB3aXRoaW4gdGhlIHRhYmxlKS4gKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogQWNjZXNzIG1ldGhvZCAoZS5nLiBgYnRyZWVgLCBgaGFzaGAsIGBnaW5gKS4gKi9cbiAgICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBpbmRleCBlbmZvcmNlcyB1bmlxdWVuZXNzLiAqL1xuICAgIHJlYWRvbmx5IHVuaXF1ZT86IGJvb2xlYW47XG5cbiAgICAvKiogS2V5IGNvbHVtbnMuICovXG4gICAgcmVhZG9ubHkgY29sdW1uczogSW5kZXhDb2x1bW5bXTtcblxuICAgIC8qKiBOb24ta2V5IGNvdmVyaW5nIGNvbHVtbnMuICovXG4gICAgcmVhZG9ubHkgaW5jbHVkZTogc3RyaW5nW107XG5cbiAgICAvKiogT3B0aW9uYWwgcGFydGlhbC1pbmRleCBwcmVkaWNhdGUgKG9wYXF1ZSkuICovXG4gICAgcmVhZG9ubHkgd2hlcmU/OiBzdHJpbmc7XG59XG5cbi8qKiBBIHRhYmxlLWxldmVsIFVOSVFVRSBjb25zdHJhaW50IG92ZXIgb25lIG9yIG1vcmUgY29sdW1ucyAoUG9zdGdyZXMpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHtcbiAgICAvKiogQ29uc3RyYWludCBuYW1lICh1bmlxdWUgd2l0aGluIHRoZSB0YWJsZSkuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIENvbHVtbnMgdGhlIGNvbnN0cmFpbnQgc3BhbnMuICovXG4gICAgcmVhZG9ubHkgY29sdW1uczogc3RyaW5nW107XG5cbiAgICAvKiogV2hldGhlciBudWxscyBhcmUgdHJlYXRlZCBhcyBub3QgZGlzdGluY3QgKGBOVUxMUyBOT1QgRElTVElOQ1RgKS4gKi9cbiAgICByZWFkb25seSBudWxsc05vdERpc3RpbmN0PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIENIRUNLIGNvbnN0cmFpbnQgKFBvc3RncmVzKS4gYGV4cHJlc3Npb25gIGlzIGFuIG9wYXF1ZSBwcmVkaWNhdGU7IGBjb2x1bW5zYFxuICogaXMgdGhlIGV4cGxpY2l0IGxpc3Qgb2YgY29sdW1ucyBpdCByZWZlcmVuY2VzLCB3aGljaCBpcyB3aGF0IGdldHMgdmFsaWRhdGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrQ29uc3RyYWludCB7XG4gICAgLyoqIENvbnN0cmFpbnQgbmFtZSAodW5pcXVlIHdpdGhpbiB0aGUgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBPcGFxdWUgYm9vbGVhbiBwcmVkaWNhdGUuICovXG4gICAgcmVhZG9ubHkgZXhwcmVzc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqIENvbHVtbnMgdGhlIHByZWRpY2F0ZSByZWZlcmVuY2VzLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdO1xufVxuXG4vKiogQSBzb3J0IGNvbHVtbiB3aXRoaW4gYSBIaXZlIGJ1Y2tldGluZyBzcGVjLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRTb3J0IHtcbiAgICAvKiogQ29sdW1uIHRvIHNvcnQgZWFjaCBidWNrZXQgYnkuICovXG4gICAgcmVhZG9ubHkgY29sdW1uOiBzdHJpbmc7XG5cbiAgICAvKiogU29ydCBkaXJlY3Rpb24gKGBhc2NgIG9yIGBkZXNjYCwgY2FzZS1pbnNlbnNpdGl2ZSkuICovXG4gICAgcmVhZG9ubHkgZGlyZWN0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSGl2ZSBidWNrZXRpbmcgKGBDTFVTVEVSRUQgQlkg4oCmIElOVE8gTiBCVUNLRVRTIFtTT1JURUQgQlkg4oCmXWApLiBgY29sdW1uc2AgYXJlXG4gKiB0aGUgYnVja2V0LWtleSBjb2x1bW5zLCBgYnVja2V0Q291bnRgIHRoZSBudW1iZXIgb2YgYnVja2V0cywgYW5kIGBzb3J0ZWRCeWBcbiAqIHRoZSBvcHRpb25hbCBpbnRyYS1idWNrZXQgc29ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWNrZXRpbmcge1xuICAgIC8qKiBCdWNrZXQta2V5IGNvbHVtbnMuICovXG4gICAgcmVhZG9ubHkgY29sdW1uczogc3RyaW5nW107XG5cbiAgICAvKiogTnVtYmVyIG9mIGJ1Y2tldHMuICovXG4gICAgcmVhZG9ubHkgYnVja2V0Q291bnQ6IG51bWJlcjtcblxuICAgIC8qKiBPcHRpb25hbCBpbnRyYS1idWNrZXQgc29ydCBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IHNvcnRlZEJ5OiBCdWNrZXRTb3J0W107XG59XG5cbi8qKiBBIGZvcmVpZ24ta2V5IHJlZmVyZW5jZSB0byBhIGNvbHVtbiBpbiBhbm90aGVyIHRhYmxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JlaWduS2V5IHtcbiAgICAvKiogUmVmZXJlbmNlZCB0YWJsZSBpbiBgc2NoZW1hLnRhYmxlYCBmb3JtYXQuICovXG4gICAgcmVhZG9ubHkgc291cmNlVGFibGU6IHN0cmluZztcblxuICAgIC8qKiBSZWZlcmVuY2VkIGNvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHNvdXJjZUNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIExvY2FsIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSByZWZlcmVuY2UuICovXG4gICAgcmVhZG9ubHkgbG9jYWxDb2x1bW46IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSBsb2NhbCBjb2x1bW4gbWF5IGJlIG51bGwuICovXG4gICAgcmVhZG9ubHkgYWxsb3dOdWxsczogYm9vbGVhbjtcbn1cblxuLyoqIE5vcm1hbGl6ZWQgdGFibGUgZGVmaW5pdGlvbiAob3B0aW9uYWwgYXJyYXlzIGRlZmF1bHRlZCB0byBlbXB0eSkuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRGVmaW5pdGlvbiB7XG4gICAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgZmlsZS4gKi9cbiAgICByZWFkb25seSBzcGVjVmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKiogRW5naW5lLiBNYXkgYmUgYW4gdW5rbm93biBzdHJpbmcgaWYgdGhlIGZpbGUgZmFpbGVkIHN0cnVjdHVyYWwgY2hlY2tzLiAqL1xuICAgIHJlYWRvbmx5IHRhYmxlVHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhpcyB0YWJsZSBpcyB0aGUgdG9wIG9mIHRoZSBwaXBlbGluZS4gKi9cbiAgICByZWFkb25seSBpc1Jhd0RhdGE6IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBJY2ViZXJnIHRhYmxlIGZvcm1hdCB2ZXJzaW9uICgxLCAyLCBvciAzKS4gT3B0aW9uYWwgYW5kIGVuZ2luZS1zcGVjaWZpYzpcbiAgICAgKiBvbmx5IHRoZSBJY2ViZXJnIGVuZ2luZSB2YWxpZGF0ZXMgaXQuIE90aGVyIGVuZ2luZXMgaWdub3JlIGl0LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGZvcm1hdFZlcnNpb24/OiBudW1iZXI7XG5cbiAgICAvKiogRGF0YSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gICAgLyoqIFByaW1hcnkta2V5IGNvbHVtbiBuYW1lcy4gKi9cbiAgICByZWFkb25seSBwcmltYXJ5S2V5OiBzdHJpbmdbXTtcblxuICAgIC8qKiBQYXJ0aXRpb24gZW50cmllcyAoZW5naW5lLXNwZWNpZmljIHNlbWFudGljcykuICovXG4gICAgcmVhZG9ubHkgcGFydGl0aW9uczogUGFydGl0aW9uW107XG5cbiAgICAvKiogSWNlYmVyZyBzb3J0IG9yZGVyIChvcmRlcmVkIHNvcnQgZmllbGRzKS4gT3B0aW9uYWw7IG90aGVyIGVuZ2luZXMgaWdub3JlIGl0LiAqL1xuICAgIHJlYWRvbmx5IHNvcnRPcmRlcjogU29ydEZpZWxkW107XG5cbiAgICAvKiogU2Vjb25kYXJ5IGluZGV4ZXMgKFBvc3RncmVzKS4gT3B0aW9uYWw7IG90aGVyIGVuZ2luZXMgaWdub3JlIHRoZW0uICovXG4gICAgcmVhZG9ubHkgaW5kZXhlczogSW5kZXhbXTtcblxuICAgIC8qKiBVTklRVUUgY29uc3RyYWludHMgKFBvc3RncmVzKS4gT3B0aW9uYWw7IG90aGVyIGVuZ2luZXMgaWdub3JlIHRoZW0uICovXG4gICAgcmVhZG9ubHkgdW5pcXVlQ29uc3RyYWludHM6IFVuaXF1ZUNvbnN0cmFpbnRbXTtcblxuICAgIC8qKiBDSEVDSyBjb25zdHJhaW50cyAoUG9zdGdyZXMpLiBPcHRpb25hbDsgb3RoZXIgZW5naW5lcyBpZ25vcmUgdGhlbS4gKi9cbiAgICByZWFkb25seSBjaGVja0NvbnN0cmFpbnRzOiBDaGVja0NvbnN0cmFpbnRbXTtcblxuICAgIC8qKiBIaXZlIGJ1Y2tldGluZyBzcGVjLiBPcHRpb25hbDsgb3RoZXIgZW5naW5lcyBpZ25vcmUgaXQuICovXG4gICAgcmVhZG9ubHkgYnVja2V0aW5nPzogQnVja2V0aW5nO1xuXG4gICAgLyoqXG4gICAgICogRW5naW5lIHRhYmxlIHByb3BlcnRpZXMgYXMgYSBzdHJpbmfihpJzdHJpbmcgbWFwIChlLmcuIEljZWJlcmdcbiAgICAgKiBgd3JpdGUudGFyZ2V0LWZpbGUtc2l6ZS1ieXRlc2AsIEhpdmUgYHBhcnF1ZXQuY29tcHJlc3Npb25gKS4gT3B0aW9uYWwuXG4gICAgICogT25seSBrZXlzIHdpdGggYSBrbm93biwgY2xvc2VkIGxlZ2FsIGRvbWFpbiBhcmUgdmFsaWRhdGVkIHBlciBlbmdpbmU7XG4gICAgICogdW5rbm93biBrZXlzIHBhc3MgdGhyb3VnaCB1bnZhbGlkYXRlZC5cbiAgICAgKi9cbiAgICByZWFkb25seSB0YWJsZVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgICAvKiogVXBzdHJlYW0gdGFibGVzIGluIGBzY2hlbWEudGFibGVgIGZvcm1hdC4gKi9cbiAgICByZWFkb25seSBkZXBlbmRzT246IHN0cmluZ1tdO1xuXG4gICAgLyoqIEZvcmVpZ24ga2V5cy4gKi9cbiAgICByZWFkb25seSBmb3JlaWduS2V5czogRm9yZWlnbktleVtdO1xufVxuXG4vKiogQSBzY2hlbWEtZGVzY3JpcHRpb24gZmlsZSdzIG5vcm1hbGl6ZWQgY29udGVudC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NoZW1hRGVzY3JpcHRpb24ge1xuICAgIC8qKiBTcGVjIHZlcnNpb24gb2YgdGhlIGZpbGUuICovXG4gICAgcmVhZG9ubHkgc3BlY1ZlcnNpb246IHN0cmluZztcblxuICAgIC8qKiBIdW1hbiBkZXNjcmlwdGlvbi4gKi9cbiAgICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuXG4vKiogU2V2ZXJpdHkgb2YgYSB2aW9sYXRpb24uICovXG5leHBvcnQgdHlwZSBWaW9sYXRpb25MZXZlbCA9ICdlcnJvcicgfCAnd2FybmluZyc7XG5cbi8qKiBBIHNpbmdsZSB2YWxpZGF0aW9uIGZpbmRpbmcuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpb2xhdGlvbiB7XG4gICAgLyoqIFNldmVyaXR5LiBgZXJyb3JgIGZhaWxzIHZhbGlkYXRpb247IGB3YXJuaW5nYCBkb2VzIG5vdC4gKi9cbiAgICByZWFkb25seSBsZXZlbDogVmlvbGF0aW9uTGV2ZWw7XG5cbiAgICAvKiogU3RhYmxlIG1hY2hpbmUtcmVhZGFibGUgcnVsZSBjb2RlIChlLmcuIGBQS19DT0xVTU5TX0VYSVNUYCkuICovXG4gICAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuXG4gICAgLyoqIE93bmluZyBzY2hlbWEsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgc2NoZW1hPzogc3RyaW5nO1xuXG4gICAgLyoqIE93bmluZyB0YWJsZSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSB0YWJsZT86IHN0cmluZztcblxuICAgIC8qKiBGaWVsZCBwYXRoIHdpdGhpbiB0aGUgZmlsZSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSBmaWVsZD86IHN0cmluZztcblxuICAgIC8qKiBTb3VyY2UgZmlsZSBwYXRoLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHBhdGg/OiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4tcmVhZGFibGUgbWVzc2FnZS4gKi9cbiAgICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG59XG5cbi8qKiBUaGUgYWdncmVnYXRlIHJlc3VsdCBvZiB2YWxpZGF0aW5nIGEgcm9vdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgLyoqIFRydWUgd2hlbiB0aGVyZSBhcmUgbm8gYGVycm9yYC1sZXZlbCB2aW9sYXRpb25zLiAqL1xuICAgIHJlYWRvbmx5IG9rOiBib29sZWFuO1xuXG4gICAgLyoqIEFsbCBmaW5kaW5ncywgZXJyb3JzIGFuZCB3YXJuaW5ncy4gKi9cbiAgICByZWFkb25seSB2aW9sYXRpb25zOiBWaW9sYXRpb25bXTtcbn1cbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCx3RUFBd0U7QUFDeEUsSUFBWSxTQUlYO0FBSkQsV0FBWSxTQUFTO0lBQ2pCLDBDQUE2QixDQUFBO0lBQzdCLGdEQUFtQyxDQUFBO0lBQ25DLHdDQUEyQixDQUFBO0FBQy9CLENBQUMsRUFKVyxTQUFTLHlCQUFULFNBQVMsUUFJcEI7QUFFRCw2REFBNkQ7QUFDaEQsUUFBQSxXQUFXLEdBQXNCO0lBQzFDLFNBQVMsQ0FBQyxZQUFZO0lBQ3RCLFNBQVMsQ0FBQyxlQUFlO0lBQ3pCLFNBQVMsQ0FBQyxXQUFXO0NBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcmUgZGF0YSBtb2RlbCBmb3IgdGhlIEZsZXhpYmxlIERhdGFzZXQgRGVmaW5pdGlvbiAoRkREKSBzdGFuZGFyZC5cbiAqXG4gKiBUaGVzZSBpbnRlcmZhY2VzIGRlc2NyaWJlIHRoZSAqcHVyZSBkYXRhKiBzaGFwZSBvZiBhIGRhdGFzZXQ6IGNvbHVtbnMsXG4gKiBwYXJ0aXRpb25zLCBmb3JlaWduIGtleXMsIHRhYmxlIGRlZmluaXRpb25zLCBhbmQgdGhlIHZpb2xhdGlvbnMgdGhlXG4gKiB2YWxpZGF0b3IgZW1pdHMuIFRoZSBsb2FkZWQgd29ybGQgKHNjaGVtYXMgKyB0YWJsZSBpbnN0YW5jZXMpIGFuZCB0aGVcbiAqIGFic3RyYWN0IHRhYmxlIGJhc2UgY2xhc3MgbGl2ZSBpbiBgLi93b3JsZGAgYW5kIGAuL3RhYmxlLXR5cGVgIHNvIHRoaXNcbiAqIG1vZHVsZSBzdGF5cyBhIGxlYWYgd2l0aCBubyBiZWhhdmlvci5cbiAqL1xuXG4vKiogVGFibGUgZW5naW5lLiBFYWNoIHZhbHVlIHVubG9ja3MgZW5naW5lLXNwZWNpZmljIHNlbWFudGljIGNoZWNrcy4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlVHlwZSB7XG4gICAgSElWRV9QQVJRVUVUID0gJ2hpdmVfcGFycXVldCcsXG4gICAgSUNFQkVSR19QQVJRVUVUID0gJ2ljZWJlcmdfcGFycXVldCcsXG4gICAgUE9TVEdSRVNfMTggPSAncG9zdGdyZXNfMTgnLFxufVxuXG4vKiogRXZlcnkga25vd24gYHRhYmxlVHlwZWAgc3RyaW5nLCBmb3IgbWVtYmVyc2hpcCBjaGVja3MuICovXG5leHBvcnQgY29uc3QgVEFCTEVfVFlQRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAgIFRhYmxlVHlwZS5ISVZFX1BBUlFVRVQsXG4gICAgVGFibGVUeXBlLklDRUJFUkdfUEFSUVVFVCxcbiAgICBUYWJsZVR5cGUuUE9TVEdSRVNfMTgsXG5dO1xuXG4vKiogQSBzaW5nbGUgZGF0YSBjb2x1bW4uICovXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gICAgLyoqIENvbHVtbiBuYW1lICh1bmlxdWUgd2l0aGluIGEgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUtc3BlY2lmaWMgdHlwZSBzdHJpbmcgKGUuZy4gYGxvbmdgLCBgdmFyY2hhcigyNTUpYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBjb2x1bW4gbWF5IGhvbGQgbnVsbC4gT3B0aW9uYWw6IHdoZW4gb21pdHRlZCwgbnVsbGFiaWxpdHkgaXNcbiAgICAgKiB1bnNwZWNpZmllZCBhbmQgdGhlIG51bGxhYmlsaXR5IGNyb3NzLWNoZWNrcyBkbyBub3QgZmlyZS4gYGZhbHNlYCBtYXJrcyBhXG4gICAgICogTk9UIE5VTEwgY29sdW1uIChJY2ViZXJnIGByZXF1aXJlZGApOyBgdHJ1ZWAgbWFya3MgYW4gZXhwbGljaXRseSBudWxsYWJsZVxuICAgICAqIGNvbHVtbi5cbiAgICAgKi9cbiAgICByZWFkb25seSBudWxsYWJsZT86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZWQtY29sdW1uIGtpbmQgKFBvc3RncmVzKTogYHN0b3JlZGAgb3IgYHZpcnR1YWxgLiBPcHRpb25hbDsgd2hlblxuICAgICAqIHNldCwgdGhlIGNvbHVtbiBpcyBjb21wdXRlZCBmcm9tIGBleHByZXNzaW9uQ29sdW1uc2AuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZ2VuZXJhdGVkPzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBnZW5lcmF0aW9uIGV4cHJlc3Npb24gKFBvc3RncmVzIGdlbmVyYXRlZCBjb2x1bW4pLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb24/OiBzdHJpbmc7XG5cbiAgICAvKiogQ29sdW1ucyB0aGUgZ2VuZXJhdGlvbiBgZXhwcmVzc2lvbmAgcmVmZXJlbmNlcyAoUG9zdGdyZXMpLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb25Db2x1bW5zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBJZGVudGl0eS1jb2x1bW4ga2luZCAoUG9zdGdyZXMpOiBgYWx3YXlzYCBvciBgYnlEZWZhdWx0YC4gT3B0aW9uYWw7IHdoZW5cbiAgICAgKiBzZXQsIHRoZSBjb2x1bW4gaXMgYEdFTkVSQVRFRCDigKYgQVMgSURFTlRJVFlgLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkZW50aXR5Pzogc3RyaW5nO1xuXG4gICAgLyoqIE9wYXF1ZSBjb2x1bW4gZGVmYXVsdCBleHByZXNzaW9uIChQb3N0Z3JlcykuICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdD86IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW4gY29sbGF0aW9uIG5hbWUgKFBvc3RncmVzKS4gT3BhcXVlOyBsZWdhbCBvbmx5IG9uIHRleHQgdHlwZXMuICovXG4gICAgcmVhZG9ubHkgY29sbGF0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqIFBlci1jb2x1bW4gVE9BU1QgY29tcHJlc3Npb24gKFBvc3RncmVzKTogYHBnbHpgIG9yIGBsejRgLiAqL1xuICAgIHJlYWRvbmx5IGNvbXByZXNzaW9uPzogc3RyaW5nO1xuXG4gICAgLyoqIFBlci1jb2x1bW4gc3RvcmFnZSBzdHJhdGVneSAoUG9zdGdyZXMpOiBgcGxhaW5gL2BleHRlcm5hbGAvYGV4dGVuZGVkYC9gbWFpbmAvYGRlZmF1bHRgLiAqL1xuICAgIHJlYWRvbmx5IHN0b3JhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwYXJ0aXRpb24gZW50cnkuIFRoZSBtZWFuaW5nIG9mIGBuYW1lYCBhbmQgYHR5cGVgIGlzIGVuZ2luZS1zcGVjaWZpYzogZm9yXG4gKiBIaXZlLCBgbmFtZWAgaXMgYSBuZXcgcGFydGl0aW9uIGNvbHVtbiBhbmQgYHR5cGVgIGlzIGEgbm9ybWFsIHR5cGU7IGZvclxuICogSWNlYmVyZywgYG5hbWVgIGlzIGEgc291cmNlIGRhdGEgY29sdW1uIGFuZCBgdHlwZWAgaXMgYSB0cmFuc2Zvcm07IGZvclxuICogUG9zdGdyZXMsIGBuYW1lYCBpcyBhbiBleGlzdGluZyBrZXkgY29sdW1uIGFuZCBgdHlwZWAgaXMgdGhlIHN0cmF0ZWd5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRpdGlvbiB7XG4gICAgLyoqIEhpdmU6IG5ldyBwYXJ0aXRpb24gY29sdW1uIG5hbWUuIEljZWJlcmcgLyBQb3N0Z3JlczogZXhpc3RpbmcgZGF0YS9rZXkgY29sdW1uIG5hbWUuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEhpdmU6IGEgbm9ybWFsIHR5cGUuIEljZWJlcmc6IGEgdHJhbnNmb3JtIChlLmcuIGBkYXlgLCBgYnVja2V0WzE2XWApLiBQb3N0Z3JlczogYSBzdHJhdGVneSAoYHJhbmdlYCAvIGBsaXN0YCAvIGBoYXNoYCkuICovXG4gICAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgc29ydCBmaWVsZCBpbiBhbiBJY2ViZXJnIHRhYmxlJ3Mgc29ydCBvcmRlci4gYGNvbHVtbmAgaXMgYSBkYXRhXG4gKiBjb2x1bW47IGB0cmFuc2Zvcm1gIGlzIGFuIG9wdGlvbmFsIEljZWJlcmcgdHJhbnNmb3JtIGFwcGxpZWQgYmVmb3JlIHNvcnRpbmdcbiAqIChkZWZhdWx0cyB0byBpZGVudGl0eSk7IGBkaXJlY3Rpb25gIGFuZCBgbnVsbE9yZGVyYCBzZXQgdGhlIG9yZGVyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvcnRGaWVsZCB7XG4gICAgLyoqIFNvdXJjZSBkYXRhIGNvbHVtbiB0byBzb3J0IGJ5LiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIE9wdGlvbmFsIEljZWJlcmcgdHJhbnNmb3JtIGFwcGxpZWQgYmVmb3JlIHNvcnRpbmcgKGUuZy4gYGRheWAsIGBidWNrZXRbMTZdYCkuICovXG4gICAgcmVhZG9ubHkgdHJhbnNmb3JtPzogc3RyaW5nO1xuXG4gICAgLyoqIFNvcnQgZGlyZWN0aW9uIChgYXNjYCBvciBgZGVzY2ApLiAqL1xuICAgIHJlYWRvbmx5IGRpcmVjdGlvbjogc3RyaW5nO1xuXG4gICAgLyoqIE51bGwgb3JkZXJpbmcgKGBudWxscy1maXJzdGAgb3IgYG51bGxzLWxhc3RgKS4gKi9cbiAgICByZWFkb25seSBudWxsT3JkZXI6IHN0cmluZztcbn1cblxuLyoqIEEgc2luZ2xlIGtleSBjb2x1bW4gd2l0aGluIGFuIGluZGV4LCB3aXRoIG9wdGlvbmFsIG9yZGVyaW5nIG1vZGlmaWVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXhDb2x1bW4ge1xuICAgIC8qKiBJbmRleGVkIGNvbHVtbiBuYW1lLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBPcHRpb25hbCBzb3J0IG9yZGVyIChgYXNjYCBvciBgZGVzY2ApLiAqL1xuICAgIHJlYWRvbmx5IHNvcnQ/OiBzdHJpbmc7XG5cbiAgICAvKiogT3B0aW9uYWwgbnVsbCBvcmRlcmluZyAoYGZpcnN0YCBvciBgbGFzdGApLiAqL1xuICAgIHJlYWRvbmx5IG51bGxzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgc2Vjb25kYXJ5IGluZGV4IChlLmcuIFBvc3RncmVzKS4gYGNvbHVtbnNgIGFyZSB0aGUga2V5IGNvbHVtbnM7IGBpbmNsdWRlYFxuICogYXJlIG5vbi1rZXkgY292ZXJpbmcgY29sdW1uczsgYHdoZXJlYCBpcyBhbiBvcGFxdWUgcGFydGlhbC1pbmRleCBwcmVkaWNhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kZXgge1xuICAgIC8qKiBJbmRleCBuYW1lICh1bmlxdWUgd2l0aGluIHRoZSB0YWJsZSkuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEFjY2VzcyBtZXRob2QgKGUuZy4gYGJ0cmVlYCwgYGhhc2hgLCBgZ2luYCkuICovXG4gICAgcmVhZG9ubHkgbWV0aG9kOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGUgaW5kZXggZW5mb3JjZXMgdW5pcXVlbmVzcy4gKi9cbiAgICByZWFkb25seSB1bmlxdWU/OiBib29sZWFuO1xuXG4gICAgLyoqIEtleSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IEluZGV4Q29sdW1uW107XG5cbiAgICAvKiogTm9uLWtleSBjb3ZlcmluZyBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGluY2x1ZGU6IHN0cmluZ1tdO1xuXG4gICAgLyoqIE9wdGlvbmFsIHBhcnRpYWwtaW5kZXggcHJlZGljYXRlIChvcGFxdWUpLiAqL1xuICAgIHJlYWRvbmx5IHdoZXJlPzogc3RyaW5nO1xufVxuXG4vKiogQSB0YWJsZS1sZXZlbCBVTklRVUUgY29uc3RyYWludCBvdmVyIG9uZSBvciBtb3JlIGNvbHVtbnMgKFBvc3RncmVzKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7XG4gICAgLyoqIENvbnN0cmFpbnQgbmFtZSAodW5pcXVlIHdpdGhpbiB0aGUgdGFibGUpLiAqL1xuICAgIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW5zIHRoZSBjb25zdHJhaW50IHNwYW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIFdoZXRoZXIgbnVsbHMgYXJlIHRyZWF0ZWQgYXMgbm90IGRpc3RpbmN0IChgTlVMTFMgTk9UIERJU1RJTkNUYCkuICovXG4gICAgcmVhZG9ubHkgbnVsbHNOb3REaXN0aW5jdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBDSEVDSyBjb25zdHJhaW50IChQb3N0Z3JlcykuIGBleHByZXNzaW9uYCBpcyBhbiBvcGFxdWUgcHJlZGljYXRlOyBgY29sdW1uc2BcbiAqIGlzIHRoZSBleHBsaWNpdCBsaXN0IG9mIGNvbHVtbnMgaXQgcmVmZXJlbmNlcywgd2hpY2ggaXMgd2hhdCBnZXRzIHZhbGlkYXRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGVja0NvbnN0cmFpbnQge1xuICAgIC8qKiBDb25zdHJhaW50IG5hbWUgKHVuaXF1ZSB3aXRoaW4gdGhlIHRhYmxlKS4gKi9cbiAgICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgICAvKiogT3BhcXVlIGJvb2xlYW4gcHJlZGljYXRlLiAqL1xuICAgIHJlYWRvbmx5IGV4cHJlc3Npb246IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW5zIHRoZSBwcmVkaWNhdGUgcmVmZXJlbmNlcy4gKi9cbiAgICByZWFkb25seSBjb2x1bW5zOiBzdHJpbmdbXTtcbn1cblxuLyoqIEEgc29ydCBjb2x1bW4gd2l0aGluIGEgSGl2ZSBidWNrZXRpbmcgc3BlYy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0U29ydCB7XG4gICAgLyoqIENvbHVtbiB0byBzb3J0IGVhY2ggYnVja2V0IGJ5LiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIFNvcnQgZGlyZWN0aW9uIChgYXNjYCBvciBgZGVzY2AsIGNhc2UtaW5zZW5zaXRpdmUpLiAqL1xuICAgIHJlYWRvbmx5IGRpcmVjdGlvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhpdmUgYnVja2V0aW5nIChgQ0xVU1RFUkVEIEJZIOKApiBJTlRPIE4gQlVDS0VUUyBbU09SVEVEIEJZIOKApl1gKS4gYGNvbHVtbnNgIGFyZVxuICogdGhlIGJ1Y2tldC1rZXkgY29sdW1ucywgYGJ1Y2tldENvdW50YCB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMsIGFuZCBgc29ydGVkQnlgXG4gKiB0aGUgb3B0aW9uYWwgaW50cmEtYnVja2V0IHNvcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVja2V0aW5nIHtcbiAgICAvKiogQnVja2V0LWtleSBjb2x1bW5zLiAqL1xuICAgIHJlYWRvbmx5IGNvbHVtbnM6IHN0cmluZ1tdO1xuXG4gICAgLyoqIE51bWJlciBvZiBidWNrZXRzLiAqL1xuICAgIHJlYWRvbmx5IGJ1Y2tldENvdW50OiBudW1iZXI7XG5cbiAgICAvKiogT3B0aW9uYWwgaW50cmEtYnVja2V0IHNvcnQgY29sdW1ucy4gKi9cbiAgICByZWFkb25seSBzb3J0ZWRCeTogQnVja2V0U29ydFtdO1xufVxuXG4vKiogT25lIGVsZW1lbnQgb2YgYW4gZXhjbHVzaW9uIGNvbnN0cmFpbnQ6IGEgY29sdW1uIGFuZCBpdHMgb3BlcmF0b3IuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2x1c2lvbkVsZW1lbnQge1xuICAgIC8qKiBDb2x1bW4gdGhlIGVsZW1lbnQgYXBwbGllcyB0by4gKi9cbiAgICByZWFkb25seSBjb2x1bW46IHN0cmluZztcblxuICAgIC8qKiBPcGFxdWUgb3BlcmF0b3IgKGUuZy4gYCYmYCwgYD1gKS4gKi9cbiAgICByZWFkb25seSBvcGVyYXRvcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFuIGV4Y2x1c2lvbiBjb25zdHJhaW50IChQb3N0Z3Jlcyk6IG5vIHR3byByb3dzIG1heSBoYXZlIGFsbCBsaXN0ZWRcbiAqIGNvbHVtbi9vcGVyYXRvciBwYWlycyBldmFsdWF0ZSB0cnVlIHRvZ2V0aGVyIChnZW5lcmFsaXplZCB1bmlxdWVuZXNzKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGNsdXNpb25Db25zdHJhaW50IHtcbiAgICAvKiogQ29uc3RyYWludCBuYW1lICh1bmlxdWUgd2l0aGluIHRoZSB0YWJsZSkuICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqIEluZGV4IGFjY2VzcyBtZXRob2QgKGBnaXN0YCBvciBgc3BnaXN0YCkuICovXG4gICAgcmVhZG9ubHkgdXNpbmc6IHN0cmluZztcblxuICAgIC8qKiBDb2x1bW4vb3BlcmF0b3IgZWxlbWVudHMuICovXG4gICAgcmVhZG9ubHkgZWxlbWVudHM6IEV4Y2x1c2lvbkVsZW1lbnRbXTtcbn1cblxuLyoqIEEgZm9yZWlnbi1rZXkgcmVmZXJlbmNlIHRvIGEgY29sdW1uIGluIGFub3RoZXIgdGFibGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcmVpZ25LZXkge1xuICAgIC8qKiBSZWZlcmVuY2VkIHRhYmxlIGluIGBzY2hlbWEudGFibGVgIGZvcm1hdC4gKi9cbiAgICByZWFkb25seSBzb3VyY2VUYWJsZTogc3RyaW5nO1xuXG4gICAgLyoqIFJlZmVyZW5jZWQgY29sdW1uIGluIHRoZSBzb3VyY2UgdGFibGUuICovXG4gICAgcmVhZG9ubHkgc291cmNlQ29sdW1uOiBzdHJpbmc7XG5cbiAgICAvKiogTG9jYWwgY29sdW1uIHRoYXQgaG9sZHMgdGhlIHJlZmVyZW5jZS4gKi9cbiAgICByZWFkb25seSBsb2NhbENvbHVtbjogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGxvY2FsIGNvbHVtbiBtYXkgYmUgbnVsbC4gKi9cbiAgICByZWFkb25seSBhbGxvd051bGxzOiBib29sZWFuO1xufVxuXG4vKiogTm9ybWFsaXplZCB0YWJsZSBkZWZpbml0aW9uIChvcHRpb25hbCBhcnJheXMgZGVmYXVsdGVkIHRvIGVtcHR5KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVEZWZpbml0aW9uIHtcbiAgICAvKiogU3BlYyB2ZXJzaW9uIG9mIHRoZSBmaWxlLiAqL1xuICAgIHJlYWRvbmx5IHNwZWNWZXJzaW9uOiBzdHJpbmc7XG5cbiAgICAvKiogSHVtYW4gZGVzY3JpcHRpb24uICovXG4gICAgcmVhZG9ubHkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAgIC8qKiBFbmdpbmUuIE1heSBiZSBhbiB1bmtub3duIHN0cmluZyBpZiB0aGUgZmlsZSBmYWlsZWQgc3RydWN0dXJhbCBjaGVja3MuICovXG4gICAgcmVhZG9ubHkgdGFibGVUeXBlOiBzdHJpbmc7XG5cbiAgICAvKiogV2hldGhlciB0aGlzIHRhYmxlIGlzIHRoZSB0b3Agb2YgdGhlIHBpcGVsaW5lLiAqL1xuICAgIHJlYWRvbmx5IGlzUmF3RGF0YTogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEljZWJlcmcgdGFibGUgZm9ybWF0IHZlcnNpb24gKDEsIDIsIG9yIDMpLiBPcHRpb25hbCBhbmQgZW5naW5lLXNwZWNpZmljOlxuICAgICAqIG9ubHkgdGhlIEljZWJlcmcgZW5naW5lIHZhbGlkYXRlcyBpdC4gT3RoZXIgZW5naW5lcyBpZ25vcmUgaXQuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9ybWF0VmVyc2lvbj86IG51bWJlcjtcblxuICAgIC8qKiBEYXRhIGNvbHVtbnMuICovXG4gICAgcmVhZG9ubHkgY29sdW1uczogQ29sdW1uW107XG5cbiAgICAvKiogUHJpbWFyeS1rZXkgY29sdW1uIG5hbWVzLiAqL1xuICAgIHJlYWRvbmx5IHByaW1hcnlLZXk6IHN0cmluZ1tdO1xuXG4gICAgLyoqIFBhcnRpdGlvbiBlbnRyaWVzIChlbmdpbmUtc3BlY2lmaWMgc2VtYW50aWNzKS4gKi9cbiAgICByZWFkb25seSBwYXJ0aXRpb25zOiBQYXJ0aXRpb25bXTtcblxuICAgIC8qKiBJY2ViZXJnIHNvcnQgb3JkZXIgKG9yZGVyZWQgc29ydCBmaWVsZHMpLiBPcHRpb25hbDsgb3RoZXIgZW5naW5lcyBpZ25vcmUgaXQuICovXG4gICAgcmVhZG9ubHkgc29ydE9yZGVyOiBTb3J0RmllbGRbXTtcblxuICAgIC8qKiBTZWNvbmRhcnkgaW5kZXhlcyAoUG9zdGdyZXMpLiBPcHRpb25hbDsgb3RoZXIgZW5naW5lcyBpZ25vcmUgdGhlbS4gKi9cbiAgICByZWFkb25seSBpbmRleGVzOiBJbmRleFtdO1xuXG4gICAgLyoqIFVOSVFVRSBjb25zdHJhaW50cyAoUG9zdGdyZXMpLiBPcHRpb25hbDsgb3RoZXIgZW5naW5lcyBpZ25vcmUgdGhlbS4gKi9cbiAgICByZWFkb25seSB1bmlxdWVDb25zdHJhaW50czogVW5pcXVlQ29uc3RyYWludFtdO1xuXG4gICAgLyoqIENIRUNLIGNvbnN0cmFpbnRzIChQb3N0Z3JlcykuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSB0aGVtLiAqL1xuICAgIHJlYWRvbmx5IGNoZWNrQ29uc3RyYWludHM6IENoZWNrQ29uc3RyYWludFtdO1xuXG4gICAgLyoqIEV4Y2x1c2lvbiBjb25zdHJhaW50cyAoUG9zdGdyZXMpLiBPcHRpb25hbDsgb3RoZXIgZW5naW5lcyBpZ25vcmUgdGhlbS4gKi9cbiAgICByZWFkb25seSBleGNsdXNpb25Db25zdHJhaW50czogRXhjbHVzaW9uQ29uc3RyYWludFtdO1xuXG4gICAgLyoqIEhpdmUgYnVja2V0aW5nIHNwZWMuIE9wdGlvbmFsOyBvdGhlciBlbmdpbmVzIGlnbm9yZSBpdC4gKi9cbiAgICByZWFkb25seSBidWNrZXRpbmc/OiBCdWNrZXRpbmc7XG5cbiAgICAvKipcbiAgICAgKiBFbmdpbmUgdGFibGUgcHJvcGVydGllcyBhcyBhIHN0cmluZ+KGknN0cmluZyBtYXAgKGUuZy4gSWNlYmVyZ1xuICAgICAqIGB3cml0ZS50YXJnZXQtZmlsZS1zaXplLWJ5dGVzYCwgSGl2ZSBgcGFycXVldC5jb21wcmVzc2lvbmApLiBPcHRpb25hbC5cbiAgICAgKiBPbmx5IGtleXMgd2l0aCBhIGtub3duLCBjbG9zZWQgbGVnYWwgZG9tYWluIGFyZSB2YWxpZGF0ZWQgcGVyIGVuZ2luZTtcbiAgICAgKiB1bmtub3duIGtleXMgcGFzcyB0aHJvdWdoIHVudmFsaWRhdGVkLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRhYmxlUHJvcGVydGllczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAgIC8qKiBVcHN0cmVhbSB0YWJsZXMgaW4gYHNjaGVtYS50YWJsZWAgZm9ybWF0LiAqL1xuICAgIHJlYWRvbmx5IGRlcGVuZHNPbjogc3RyaW5nW107XG5cbiAgICAvKiogRm9yZWlnbiBrZXlzLiAqL1xuICAgIHJlYWRvbmx5IGZvcmVpZ25LZXlzOiBGb3JlaWduS2V5W107XG59XG5cbi8qKiBBIHNjaGVtYS1kZXNjcmlwdGlvbiBmaWxlJ3Mgbm9ybWFsaXplZCBjb250ZW50LiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlbWFEZXNjcmlwdGlvbiB7XG4gICAgLyoqIFNwZWMgdmVyc2lvbiBvZiB0aGUgZmlsZS4gKi9cbiAgICByZWFkb25seSBzcGVjVmVyc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqIEh1bWFuIGRlc2NyaXB0aW9uLiAqL1xuICAgIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKiBTZXZlcml0eSBvZiBhIHZpb2xhdGlvbi4gKi9cbmV4cG9ydCB0eXBlIFZpb2xhdGlvbkxldmVsID0gJ2Vycm9yJyB8ICd3YXJuaW5nJztcblxuLyoqIEEgc2luZ2xlIHZhbGlkYXRpb24gZmluZGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlvbGF0aW9uIHtcbiAgICAvKiogU2V2ZXJpdHkuIGBlcnJvcmAgZmFpbHMgdmFsaWRhdGlvbjsgYHdhcm5pbmdgIGRvZXMgbm90LiAqL1xuICAgIHJlYWRvbmx5IGxldmVsOiBWaW9sYXRpb25MZXZlbDtcblxuICAgIC8qKiBTdGFibGUgbWFjaGluZS1yZWFkYWJsZSBydWxlIGNvZGUgKGUuZy4gYFBLX0NPTFVNTlNfRVhJU1RgKS4gKi9cbiAgICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG5cbiAgICAvKiogT3duaW5nIHNjaGVtYSwgaWYgYXBwbGljYWJsZS4gKi9cbiAgICByZWFkb25seSBzY2hlbWE/OiBzdHJpbmc7XG5cbiAgICAvKiogT3duaW5nIHRhYmxlLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IHRhYmxlPzogc3RyaW5nO1xuXG4gICAgLyoqIEZpZWxkIHBhdGggd2l0aGluIHRoZSBmaWxlLCBpZiBhcHBsaWNhYmxlLiAqL1xuICAgIHJlYWRvbmx5IGZpZWxkPzogc3RyaW5nO1xuXG4gICAgLyoqIFNvdXJjZSBmaWxlIHBhdGgsIGlmIGFwcGxpY2FibGUuICovXG4gICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAgIC8qKiBIdW1hbi1yZWFkYWJsZSBtZXNzYWdlLiAqL1xuICAgIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcbn1cblxuLyoqIFRoZSBhZ2dyZWdhdGUgcmVzdWx0IG9mIHZhbGlkYXRpbmcgYSByb290LiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAvKiogVHJ1ZSB3aGVuIHRoZXJlIGFyZSBubyBgZXJyb3JgLWxldmVsIHZpb2xhdGlvbnMuICovXG4gICAgcmVhZG9ubHkgb2s6IGJvb2xlYW47XG5cbiAgICAvKiogQWxsIGZpbmRpbmdzLCBlcnJvcnMgYW5kIHdhcm5pbmdzLiAqL1xuICAgIHJlYWRvbmx5IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdO1xufVxuIl19
@@ -86,6 +86,12 @@
86
86
  "$ref": "#/definitions/checkConstraint"
87
87
  }
88
88
  },
89
+ "exclusionConstraints": {
90
+ "type": "array",
91
+ "items": {
92
+ "$ref": "#/definitions/exclusionConstraint"
93
+ }
94
+ },
89
95
  "bucketing": {
90
96
  "$ref": "#/definitions/bucketing"
91
97
  },
@@ -156,6 +162,18 @@
156
162
  "default": {
157
163
  "type": "string",
158
164
  "minLength": 1
165
+ },
166
+ "collation": {
167
+ "type": "string",
168
+ "minLength": 1
169
+ },
170
+ "compression": {
171
+ "type": "string",
172
+ "minLength": 1
173
+ },
174
+ "storage": {
175
+ "type": "string",
176
+ "minLength": 1
159
177
  }
160
178
  }
161
179
  },
@@ -199,6 +217,50 @@
199
217
  }
200
218
  }
201
219
  },
220
+ "exclusionConstraint": {
221
+ "type": "object",
222
+ "required": [
223
+ "name",
224
+ "using",
225
+ "elements"
226
+ ],
227
+ "additionalProperties": false,
228
+ "properties": {
229
+ "name": {
230
+ "type": "string",
231
+ "minLength": 1
232
+ },
233
+ "using": {
234
+ "type": "string",
235
+ "minLength": 1
236
+ },
237
+ "elements": {
238
+ "type": "array",
239
+ "minItems": 1,
240
+ "items": {
241
+ "$ref": "#/definitions/exclusionElement"
242
+ }
243
+ }
244
+ }
245
+ },
246
+ "exclusionElement": {
247
+ "type": "object",
248
+ "required": [
249
+ "column",
250
+ "operator"
251
+ ],
252
+ "additionalProperties": false,
253
+ "properties": {
254
+ "column": {
255
+ "type": "string",
256
+ "minLength": 1
257
+ },
258
+ "operator": {
259
+ "type": "string",
260
+ "minLength": 1
261
+ }
262
+ }
263
+ },
202
264
  "bucketing": {
203
265
  "type": "object",
204
266
  "required": [
@@ -37,11 +37,23 @@ export declare class Postgres18Table extends TableTypeBase {
37
37
  */
38
38
  engineSpecificViolations(): Violation[];
39
39
  /**
40
- * Validate identity columns, defaults, and the mutual exclusivity between a
41
- * column being generated, an identity column, and having a default.
40
+ * Validate exclusion constraints.
42
41
  *
43
- * Emits `POSTGRES_IDENTITY_VALID`, `POSTGRES_IDENTITY_TYPE_INTEGER`, and
44
- * `POSTGRES_COLUMN_GENERATION_EXCLUSIVE`.
42
+ * Emits `POSTGRES_EXCLUSION_NAME_UNIQUE`, `POSTGRES_EXCLUSION_METHOD_VALID`,
43
+ * `POSTGRES_EXCLUSION_COLUMN_EXISTS`, `POSTGRES_EXCLUSION_NO_DUPLICATE_COLUMNS`,
44
+ * and `POSTGRES_EXCLUSION_INCLUDES_PARTITION_KEYS`.
45
+ *
46
+ * @returns Every exclusion-constraint violation.
47
+ */
48
+ private exclusionConstraintViolations;
49
+ /**
50
+ * Validate Postgres column attributes: identity columns, the mutual
51
+ * exclusivity between being generated / an identity / having a default, and
52
+ * per-column collation, compression, and storage.
53
+ *
54
+ * Emits `POSTGRES_IDENTITY_VALID`, `POSTGRES_IDENTITY_TYPE_INTEGER`,
55
+ * `POSTGRES_COLUMN_GENERATION_EXCLUSIVE`, `POSTGRES_COLLATION_ON_TEXT_TYPE`,
56
+ * `POSTGRES_COMPRESSION_VALID`, and `POSTGRES_STORAGE_VALID`.
45
57
  *
46
58
  * @returns Every column-attribute violation.
47
59
  */
@@ -50,6 +50,21 @@ const INTEGER_TYPES = new Set([
50
50
  'bigint',
51
51
  'int8',
52
52
  ]);
53
+ const EXCLUSION_METHODS = new Set([
54
+ 'gist',
55
+ 'spgist',
56
+ ]);
57
+ const COMPRESSION_METHODS = new Set([
58
+ 'pglz',
59
+ 'lz4',
60
+ ]);
61
+ const STORAGE_STRATEGIES = new Set([
62
+ 'plain',
63
+ 'external',
64
+ 'extended',
65
+ 'main',
66
+ 'default',
67
+ ]);
53
68
  /** Postgres 18 table. */
54
69
  class Postgres18Table extends table_type_1.TableTypeBase {
55
70
  /**
@@ -139,16 +154,84 @@ class Postgres18Table extends table_type_1.TableTypeBase {
139
154
  ...this.indexViolations(),
140
155
  ...this.uniqueConstraintViolations(),
141
156
  ...this.checkConstraintViolations(),
157
+ ...this.exclusionConstraintViolations(),
142
158
  ...this.generatedColumnViolations(),
143
159
  ...this.columnAttributeViolations(),
144
160
  ];
145
161
  }
146
162
  /**
147
- * Validate identity columns, defaults, and the mutual exclusivity between a
148
- * column being generated, an identity column, and having a default.
163
+ * Validate exclusion constraints.
149
164
  *
150
- * Emits `POSTGRES_IDENTITY_VALID`, `POSTGRES_IDENTITY_TYPE_INTEGER`, and
151
- * `POSTGRES_COLUMN_GENERATION_EXCLUSIVE`.
165
+ * Emits `POSTGRES_EXCLUSION_NAME_UNIQUE`, `POSTGRES_EXCLUSION_METHOD_VALID`,
166
+ * `POSTGRES_EXCLUSION_COLUMN_EXISTS`, `POSTGRES_EXCLUSION_NO_DUPLICATE_COLUMNS`,
167
+ * and `POSTGRES_EXCLUSION_INCLUDES_PARTITION_KEYS`.
168
+ *
169
+ * @returns Every exclusion-constraint violation.
170
+ */
171
+ exclusionConstraintViolations() {
172
+ const violations = [];
173
+ const { exclusionConstraints, } = this.definition;
174
+ for (const duplicate of this.findDuplicates(exclusionConstraints.map((constraint) => constraint.name))) {
175
+ violations.push(this.violation({
176
+ level: 'error',
177
+ code: 'POSTGRES_EXCLUSION_NAME_UNIQUE',
178
+ field: 'exclusionConstraints',
179
+ message: `duplicate exclusion-constraint name "${duplicate}"`,
180
+ }));
181
+ }
182
+ const partitionKeys = this.definition.partitions
183
+ .map((partition) => partition.name)
184
+ .filter((name) => this.hasColumn(name));
185
+ exclusionConstraints.forEach((constraint, position) => {
186
+ const field = `exclusionConstraints[${position}]`;
187
+ const columns = constraint.elements.map((element) => element.column);
188
+ if (!EXCLUSION_METHODS.has(constraint.using.trim().toLowerCase())) {
189
+ violations.push(this.violation({
190
+ level: 'error',
191
+ code: 'POSTGRES_EXCLUSION_METHOD_VALID',
192
+ field: `${field}.using`,
193
+ message: `exclusion method "${constraint.using}" must be "gist" or "spgist"`,
194
+ }));
195
+ }
196
+ for (const duplicate of this.findDuplicates(columns)) {
197
+ violations.push(this.violation({
198
+ level: 'error',
199
+ code: 'POSTGRES_EXCLUSION_NO_DUPLICATE_COLUMNS',
200
+ field: `${field}.elements`,
201
+ message: `exclusion constraint "${constraint.name}" lists column "${duplicate}" more than once`,
202
+ }));
203
+ }
204
+ constraint.elements.forEach((element, elementIndex) => {
205
+ if (!this.hasColumn(element.column)) {
206
+ violations.push(this.violation({
207
+ level: 'error',
208
+ code: 'POSTGRES_EXCLUSION_COLUMN_EXISTS',
209
+ field: `${field}.elements[${elementIndex}].column`,
210
+ message: `exclusion-constraint column "${element.column}" is not defined in columns`,
211
+ }));
212
+ }
213
+ });
214
+ const missing = partitionKeys.filter((name) => !columns.includes(name));
215
+ if (missing.length > 0) {
216
+ violations.push(this.violation({
217
+ level: 'error',
218
+ code: 'POSTGRES_EXCLUSION_INCLUDES_PARTITION_KEYS',
219
+ field: `${field}.elements`,
220
+ message: `exclusion constraint "${constraint.name}" on a partitioned table must include `
221
+ + `every partition key column; missing: ${missing.join(', ')}`,
222
+ }));
223
+ }
224
+ });
225
+ return violations;
226
+ }
227
+ /**
228
+ * Validate Postgres column attributes: identity columns, the mutual
229
+ * exclusivity between being generated / an identity / having a default, and
230
+ * per-column collation, compression, and storage.
231
+ *
232
+ * Emits `POSTGRES_IDENTITY_VALID`, `POSTGRES_IDENTITY_TYPE_INTEGER`,
233
+ * `POSTGRES_COLUMN_GENERATION_EXCLUSIVE`, `POSTGRES_COLLATION_ON_TEXT_TYPE`,
234
+ * `POSTGRES_COMPRESSION_VALID`, and `POSTGRES_STORAGE_VALID`.
152
235
  *
153
236
  * @returns Every column-attribute violation.
154
237
  */
@@ -187,6 +270,32 @@ class Postgres18Table extends table_type_1.TableTypeBase {
187
270
  message: `column "${column.name}" may have only one of generated, identity, or default`,
188
271
  }));
189
272
  }
273
+ if (column.collation !== undefined && !(0, types_1.isPostgresCollatableType)(column.type)) {
274
+ violations.push(this.violation({
275
+ level: 'error',
276
+ code: 'POSTGRES_COLLATION_ON_TEXT_TYPE',
277
+ field: `${field}.collation`,
278
+ message: `collation is only legal on a text type, not "${column.type}"`,
279
+ }));
280
+ }
281
+ if (column.compression !== undefined && !COMPRESSION_METHODS.has(column.compression.trim().toLowerCase())) {
282
+ violations.push(this.violation({
283
+ level: 'error',
284
+ code: 'POSTGRES_COMPRESSION_VALID',
285
+ field: `${field}.compression`,
286
+ message: `compression "${column.compression}" must be "pglz" or "lz4"`,
287
+ }));
288
+ }
289
+ if (column.storage !== undefined && !STORAGE_STRATEGIES.has(column.storage.trim().toLowerCase())) {
290
+ violations.push(this.violation({
291
+ level: 'error',
292
+ code: 'POSTGRES_STORAGE_VALID',
293
+ field: `${field}.storage`,
294
+ message: `storage "${column.storage}" must be one of: ${[
295
+ ...STORAGE_STRATEGIES,
296
+ ].join(', ')}`,
297
+ }));
298
+ }
190
299
  });
191
300
  return violations;
192
301
  }
@@ -492,4 +601,4 @@ class Postgres18Table extends table_type_1.TableTypeBase {
492
601
  }
493
602
  }
494
603
  exports.Postgres18Table = Postgres18Table;
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtMTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcG9zdGdyZXMtMTgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7OztBQVNILDhDQUV1QjtBQUN2QixvQ0FFa0I7QUFFbEIsTUFBTSxVQUFVLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQzVDLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtDQUNULENBQUMsQ0FBQztBQUVILE1BQU0sYUFBYSxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUMvQyxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsT0FBTztJQUNQLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLGVBQWUsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDakQsUUFBUTtJQUNSLFNBQVM7Q0FDWixDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDaEQsUUFBUTtJQUNSLFdBQVc7Q0FDZCxDQUFDLENBQUM7QUFFSCxrREFBa0Q7QUFDbEQsTUFBTSxhQUFhLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQy9DLFVBQVU7SUFDVixNQUFNO0lBQ04sU0FBUztJQUNULEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCx5QkFBeUI7QUFDekIsTUFBYSxlQUFnQixTQUFRLDBCQUFhO0lBQzlDOzs7OztPQUtHO0lBQ0ksaUJBQWlCLENBQUMsSUFBWTtRQUNqQyxPQUFPLElBQUEsMkJBQW1CLEVBQUMsSUFB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U0FBUyxDQUFDO29CQUMzQixLQUFLLEVBQUUsT0FBTztvQkFDZCxJQUFJLEVBQUUsOEJBQThCO29CQUNwQyxLQUFLLEVBQUUsR0FBRyxLQUFLLFlBQVksWUFBWSxHQUFHO29CQUMxQyxPQUFPLEVBQUUseUJBQXlCLFFBQVEsNkJBQTZCO2lCQUMxRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSjtBQTNlRCwwQ0EyZUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvc3RncmVzIDE4IHRhYmxlIHR5cGUuXG4gKlxuICogUG9zdGdyZXMgdXNlcyBkZWNsYXJhdGl2ZSBwYXJ0aXRpb25pbmc6IGEgdGFibGUgaXMgcGFydGl0aW9uZWQgYnkgb25lIHN0cmF0ZWd5XG4gKiAoYHJhbmdlYCwgYGxpc3RgLCBvciBgaGFzaGApIG92ZXIgb25lIG9yIG1vcmUgZXhpc3Rpbmcga2V5IGNvbHVtbnMuIEVhY2hcbiAqIHBhcnRpdGlvbiBlbnRyeSBuYW1lcyBhIGtleSBjb2x1bW4gKGBuYW1lYCkgYW5kIHRoZSBzdHJhdGVneSAoYHR5cGVgKTsgYWxsXG4gKiBlbnRyaWVzIG9uIGEgdGFibGUgbXVzdCBzaGFyZSBvbmUgc3RyYXRlZ3kuXG4gKi9cblxuaW1wb3J0IHtcbiAgICBDaGVja0NvbnN0cmFpbnQsXG4gICAgSW5kZXgsXG4gICAgUGFydGl0aW9uLFxuICAgIFVuaXF1ZUNvbnN0cmFpbnQsXG4gICAgVmlvbGF0aW9uLFxufSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1xuICAgIFRhYmxlVHlwZUJhc2UsXG59IGZyb20gJy4uL3RhYmxlLXR5cGUnO1xuaW1wb3J0IHtcbiAgICBpc1ZhbGlkUG9zdGdyZXNUeXBlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmNvbnN0IFNUUkFURUdJRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAncmFuZ2UnLFxuICAgICdsaXN0JyxcbiAgICAnaGFzaCcsXG5dKTtcblxuY29uc3QgSU5ERVhfTUVUSE9EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdidHJlZScsXG4gICAgJ2hhc2gnLFxuICAgICdnaXN0JyxcbiAgICAnc3BnaXN0JyxcbiAgICAnZ2luJyxcbiAgICAnYnJpbicsXG5dKTtcblxuY29uc3QgSU5ERVhfU09SVFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnYXNjJyxcbiAgICAnZGVzYycsXG5dKTtcblxuY29uc3QgSU5ERVhfTlVMTFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnZmlyc3QnLFxuICAgICdsYXN0Jyxcbl0pO1xuXG5jb25zdCBHRU5FUkFURURfS0lORFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnc3RvcmVkJyxcbiAgICAndmlydHVhbCcsXG5dKTtcblxuY29uc3QgSURFTlRJVFlfS0lORFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnYWx3YXlzJyxcbiAgICAnYnlEZWZhdWx0Jyxcbl0pO1xuXG4vLy8gSW50ZWdlciBiYXNlIHR5cGVzIGFuIGlkZW50aXR5IGNvbHVtbiBtYXkgdXNlLlxuY29uc3QgSU5URUdFUl9UWVBFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdzbWFsbGludCcsXG4gICAgJ2ludDInLFxuICAgICdpbnRlZ2VyJyxcbiAgICAnaW50JyxcbiAgICAnaW50NCcsXG4gICAgJ2JpZ2ludCcsXG4gICAgJ2ludDgnLFxuXSk7XG5cbi8qKiBQb3N0Z3JlcyAxOCB0YWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3JlczE4VGFibGUgZXh0ZW5kcyBUYWJsZVR5cGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIFBvc3RncmVzIHR5cGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIHN0cmluZyBmcm9tIGEgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB0eXBlIGlzIGEgdmFsaWQgUG9zdGdyZXMgMTggdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkUG9zdGdyZXNUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvc3RncmVzIHBhcnRpdGlvbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEVtaXRzOiBgTk9fRFVQTElDQVRFX1BBUlRJVElPTlNgIChhIGtleSBjb2x1bW4gbGlzdGVkIHR3aWNlKSxcbiAgICAgKiBgUE9TVEdSRVNfUEFSVElUSU9OX0NPTFVNTl9FWElTVFNgICh0aGUga2V5IGNvbHVtbiBtdXN0IGJlIGEgZGF0YSBjb2x1bW4pLFxuICAgICAqIGBQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSURgICh0aGUgc3RyYXRlZ3kgbXVzdCBiZSByYW5nZSAvIGxpc3QgL1xuICAgICAqIGhhc2gpLCBhbmQgYFBPU1RHUkVTX1BBUlRJVElPTl9TSU5HTEVfU1RSQVRFR1lgIChhIHRhYmxlIHBhcnRpdGlvbnMgYnkgb25lXG4gICAgICogc3RyYXRlZ3kgb25seSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMocGFydGl0aW9ucy5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTk9fRFVQTElDQVRFX1BBUlRJVElPTlMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAncGFydGl0aW9ucycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb246IFBhcnRpdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1BBUlRJVElPTl9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHBhcnRpdGlvbiBrZXkgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleS5pbmNsdWRlcyhwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLy8gUG9zdGdyZXMgcmVxdWlyZXMgdGhlIHByaW1hcnkga2V5IHRvIGluY2x1ZGUgZXZlcnkgcGFydGl0aW9uLWtleVxuICAgICAgICAgICAgICAgIC8vLyBjb2x1bW4sIHNvIGEgcGFydGl0aW9uIGNvbHVtbiBvdXRzaWRlIHRoZSBwcmltYXJ5IGtleSBpcyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfUEFSVElUSU9OX0tFWV9JTl9QSycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgbXVzdCBiZSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdHJhdGVneSA9IHBhcnRpdGlvbi50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKFNUUkFURUdJRVMuaGFzKHN0cmF0ZWd5KSkge1xuICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMuYWRkKHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkIFBvc3RncmVzIHBhcnRpdGlvbiBzdHJhdGVneSAocmFuZ2UsIGxpc3QsIGhhc2gpYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdHJhdGVnaWVzLnNpemUgPiAxKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU0lOR0xFX1NUUkFURUdZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3BhcnRpdGlvbnMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBhIHBhcnRpdGlvbmVkIHRhYmxlIHVzZXMgb25lIHN0cmF0ZWd5OyBmb3VuZCAke1tcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RyYXRlZ2llcyxcbiAgICAgICAgICAgICAgICBdLnNvcnQoKS5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQb3N0Z3JlcyBlbmdpbmUtc3BlY2lmaWMgcnVsZXM6IGluZGV4ZXMsIHVuaXF1ZSBjb25zdHJhaW50cywgYW5kIGNoZWNrXG4gICAgICogY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBlbmdpbmUtc3BlY2lmaWMgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbmdpbmVTcGVjaWZpY1Zpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5pbmRleFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMudW5pcXVlQ29uc3RyYWludFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY2hlY2tDb25zdHJhaW50VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5nZW5lcmF0ZWRDb2x1bW5WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLmNvbHVtbkF0dHJpYnV0ZVZpb2xhdGlvbnMoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBpZGVudGl0eSBjb2x1bW5zLCBkZWZhdWx0cywgYW5kIHRoZSBtdXR1YWwgZXhjbHVzaXZpdHkgYmV0d2VlbiBhXG4gICAgICogY29sdW1uIGJlaW5nIGdlbmVyYXRlZCwgYW4gaWRlbnRpdHkgY29sdW1uLCBhbmQgaGF2aW5nIGEgZGVmYXVsdC5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBQT1NUR1JFU19JREVOVElUWV9WQUxJRGAsIGBQT1NUR1JFU19JREVOVElUWV9UWVBFX0lOVEVHRVJgLCBhbmRcbiAgICAgKiBgUE9TVEdSRVNfQ09MVU1OX0dFTkVSQVRJT05fRVhDTFVTSVZFYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGNvbHVtbi1hdHRyaWJ1dGUgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY29sdW1uQXR0cmlidXRlVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG5cbiAgICAgICAgdGhpcy5kZWZpbml0aW9uLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBgY29sdW1uc1ske2luZGV4fV1gO1xuXG4gICAgICAgICAgICBpZiAoY29sdW1uLmlkZW50aXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUlERU5USVRZX0tJTkRTLmhhcyhjb2x1bW4uaWRlbnRpdHkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JREVOVElUWV9WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmlkZW50aXR5YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpZGVudGl0eSBcIiR7Y29sdW1uLmlkZW50aXR5fVwiIG11c3QgYmUgXCJhbHdheXNcIiBvciBcImJ5RGVmYXVsdFwiYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIUlOVEVHRVJfVFlQRVMuaGFzKGNvbHVtbi50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSURFTlRJVFlfVFlQRV9JTlRFR0VSJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uaWRlbnRpdHlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlkZW50aXR5IGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgbXVzdCBiZSBhbiBpbnRlZ2VyIHR5cGUsIG5vdCBcIiR7Y29sdW1uLnR5cGV9XCJgLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gW1xuICAgICAgICAgICAgICAgIGNvbHVtbi5nZW5lcmF0ZWQsXG4gICAgICAgICAgICAgICAgY29sdW1uLmlkZW50aXR5LFxuICAgICAgICAgICAgICAgIGNvbHVtbi5kZWZhdWx0LFxuICAgICAgICAgICAgXS5maWx0ZXIoKGF0dHJpYnV0ZSkgPT4gYXR0cmlidXRlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfQ09MVU1OX0dFTkVSQVRJT05fRVhDTFVTSVZFJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIG1heSBoYXZlIG9ubHkgb25lIG9mIGdlbmVyYXRlZCwgaWRlbnRpdHksIG9yIGRlZmF1bHRgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgZ2VuZXJhdGVkIGNvbHVtbnMuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfR0VORVJBVEVEX0tJTkRfVkFMSURgLFxuICAgICAqIGBQT1NUR1JFU19HRU5FUkFURURfRVhQUkVTU0lPTl9DT0xVTU5fRVhJU1RTYCxcbiAgICAgKiBgUE9TVEdSRVNfR0VORVJBVEVEX05PX1NFTEZfUkVGRVJFTkNFYCxcbiAgICAgKiBgUE9TVEdSRVNfR0VORVJBVEVEX05PX0dFTkVSQVRFRF9SRUZFUkVOQ0VgLFxuICAgICAqIGBQT1NUR1JFU19HRU5FUkFURURfTk9UX0lOX1BBUlRJVElPTl9LRVlgLCBhbmRcbiAgICAgKiBgUE9TVEdSRVNfVklSVFVBTF9HRU5FUkFURURfTk9UX0lOX1BLYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGdlbmVyYXRlZC1jb2x1bW4gdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGVkQ29sdW1uVmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkTmFtZXMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9uLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5nZW5lcmF0ZWQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcGFydGl0aW9uTmFtZXMgPSBuZXcgU2V0KHRoaXMuZGVmaW5pdGlvbi5wYXJ0aXRpb25zLm1hcCgocGFydGl0aW9uKSA9PiBwYXJ0aXRpb24ubmFtZSkpO1xuXG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uZ2VuZXJhdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGBjb2x1bW5zWyR7aW5kZXh9XWA7XG5cbiAgICAgICAgICAgIGlmICghR0VORVJBVEVEX0tJTkRTLmhhcyhjb2x1bW4uZ2VuZXJhdGVkKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfR0VORVJBVEVEX0tJTkRfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmdlbmVyYXRlZGAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBnZW5lcmF0ZWQga2luZCBcIiR7Y29sdW1uLmdlbmVyYXRlZH1cIiBtdXN0IGJlIFwic3RvcmVkXCIgb3IgXCJ2aXJ0dWFsXCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgKGNvbHVtbi5leHByZXNzaW9uQ29sdW1ucyA/PyBbXSkuZm9yRWFjaCgocmVmZXJlbmNlLCByZWZlcmVuY2VJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZUZpZWxkID0gYCR7ZmllbGR9LmV4cHJlc3Npb25Db2x1bW5zWyR7cmVmZXJlbmNlSW5kZXh9XWA7XG4gICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZSA9PT0gY29sdW1uLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9OT19TRUxGX1JFRkVSRU5DRScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcmVmZXJlbmNlRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZ2VuZXJhdGVkIGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgY2Fubm90IHJlZmVyZW5jZSBpdHNlbGZgLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5oYXNDb2x1bW4ocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfR0VORVJBVEVEX0VYUFJFU1NJT05fQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcmVmZXJlbmNlRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZ2VuZXJhdGVkIGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgcmVmZXJlbmNlcyBcIiR7cmVmZXJlbmNlfVwiLCBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnd2hpY2ggaXMgbm90IGRlZmluZWQgaW4gY29sdW1ucycsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdlbmVyYXRlZE5hbWVzLmhhcyhyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19HRU5FUkFURURfTk9fR0VORVJBVEVEX1JFRkVSRU5DRScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogcmVmZXJlbmNlRmllbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZ2VuZXJhdGVkIGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgY2Fubm90IHJlZmVyZW5jZSBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBgZ2VuZXJhdGVkIGNvbHVtbiBcIiR7cmVmZXJlbmNlfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAocGFydGl0aW9uTmFtZXMuaGFzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfR0VORVJBVEVEX05PVF9JTl9QQVJUSVRJT05fS0VZJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5nZW5lcmF0ZWRgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZ2VuZXJhdGVkIGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgY2Fubm90IGJlIGEgcGFydGl0aW9uIGtleWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sdW1uLmdlbmVyYXRlZCA9PT0gJ3ZpcnR1YWwnICYmIHRoaXMuZGVmaW5pdGlvbi5wcmltYXJ5S2V5LmluY2x1ZGVzKGNvbHVtbi5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVklSVFVBTF9HRU5FUkFURURfTk9UX0lOX1BLJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5nZW5lcmF0ZWRgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBjYW5ub3QgYmUgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXlgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgVU5JUVVFIGNvbnN0cmFpbnRzLlxuICAgICAqXG4gICAgICogRW1pdHMgYFBPU1RHUkVTX1VOSVFVRV9OQU1FX1VOSVFVRWAsIGBQT1NUR1JFU19VTklRVUVfQ09MVU1OX0VYSVNUU2AsIGFuZFxuICAgICAqIGBQT1NUR1JFU19VTklRVUVfTk9fRFVQTElDQVRFX0NPTFVNTlNgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgdW5pcXVlLWNvbnN0cmFpbnQgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgdW5pcXVlQ29uc3RyYWludFZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB1bmlxdWVDb25zdHJhaW50cyxcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKHVuaXF1ZUNvbnN0cmFpbnRzLm1hcCgoY29uc3RyYWludCkgPT4gY29uc3RyYWludC5uYW1lKSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1VOSVFVRV9OQU1FX1VOSVFVRScsXG4gICAgICAgICAgICAgICAgZmllbGQ6ICd1bmlxdWVDb25zdHJhaW50cycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSB1bmlxdWUtY29uc3RyYWludCBuYW1lIFwiJHtkdXBsaWNhdGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdW5pcXVlQ29uc3RyYWludHMuZm9yRWFjaCgoY29uc3RyYWludDogVW5pcXVlQ29uc3RyYWludCwgcG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBgdW5pcXVlQ29uc3RyYWludHNbJHtwb3NpdGlvbn1dYDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoY29uc3RyYWludC5jb2x1bW5zKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX05PX0RVUExJQ0FURV9DT0xVTU5TJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHVuaXF1ZSBjb25zdHJhaW50IFwiJHtjb25zdHJhaW50Lm5hbWV9XCIgbGlzdHMgY29sdW1uIFwiJHtkdXBsaWNhdGV9XCIgbW9yZSB0aGFuIG9uY2VgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0cmFpbnQuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19VTklRVUVfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNbJHtjb2x1bW5JbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bmlxdWUtY29uc3RyYWludCBjb2x1bW4gXCIke2NvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goLi4udGhpcy51bmlxdWVDb25zdHJhaW50S2V5VmlvbGF0aW9ucyhjb25zdHJhaW50LCBmaWVsZCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvLy8gUmVsYXRpb25zaGlwIHJ1bGVzIGJldHdlZW4gYSB1bmlxdWUgY29uc3RyYWludCBhbmQgdGhlIHByaW1hcnkga2V5IC9cbiAgICAvLy8gcGFydGl0aW9uIGtleTogcmVkdW5kYW5jeSB3aXRoIHRoZSBQSywgYW5kIHRoZSBQb3N0Z3JlcyBydWxlIHRoYXQgYVxuICAgIC8vLyB1bmlxdWUgY29uc3RyYWludCBvbiBhIHBhcnRpdGlvbmVkIHRhYmxlIG11c3QgaW5jbHVkZSBldmVyeSBwYXJ0aXRpb24ga2V5LlxuICAgIHByaXZhdGUgdW5pcXVlQ29uc3RyYWludEtleVZpb2xhdGlvbnMoY29uc3RyYWludDogVW5pcXVlQ29uc3RyYWludCwgZmllbGQ6IHN0cmluZyk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcblxuICAgICAgICBjb25zdCBwcmltYXJ5S2V5ID0gdGhpcy5kZWZpbml0aW9uLnByaW1hcnlLZXk7XG4gICAgICAgIGNvbnN0IGNvbHVtblNldCA9IG5ldyBTZXQoY29uc3RyYWludC5jb2x1bW5zKTtcbiAgICAgICAgaWYgKHByaW1hcnlLZXkubGVuZ3RoID4gMCAmJiBwcmltYXJ5S2V5Lmxlbmd0aCA9PT0gY29sdW1uU2V0LnNpemVcbiAgICAgICAgICAgICYmIHByaW1hcnlLZXkuZXZlcnkoKGNvbHVtbikgPT4gY29sdW1uU2V0Lmhhcyhjb2x1bW4pKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19VTklRVUVfUkVEVU5EQU5UX1dJVEhfUEsnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYHVuaXF1ZSBjb25zdHJhaW50IFwiJHtjb25zdHJhaW50Lm5hbWV9XCIgZHVwbGljYXRlcyB0aGUgcHJpbWFyeSBrZXlgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFydGl0aW9uS2V5cyA9IHRoaXMuZGVmaW5pdGlvbi5wYXJ0aXRpb25zXG4gICAgICAgICAgICAubWFwKChwYXJ0aXRpb24pID0+IHBhcnRpdGlvbi5uYW1lKVxuICAgICAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gdGhpcy5oYXNDb2x1bW4obmFtZSkpO1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gcGFydGl0aW9uS2V5cy5maWx0ZXIoKG5hbWUpID0+ICFjb25zdHJhaW50LmNvbHVtbnMuaW5jbHVkZXMobmFtZSkpO1xuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19VTklRVUVfSU5DTFVERVNfUEFSVElUSU9OX0tFWVMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYHVuaXF1ZSBjb25zdHJhaW50IFwiJHtjb25zdHJhaW50Lm5hbWV9XCIgb24gYSBwYXJ0aXRpb25lZCB0YWJsZSBtdXN0IGluY2x1ZGUgYFxuICAgICAgICAgICAgICAgICAgICArIGBldmVyeSBwYXJ0aXRpb24ga2V5IGNvbHVtbjsgbWlzc2luZzogJHttaXNzaW5nLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIENIRUNLIGNvbnN0cmFpbnRzLiBPbmx5IHRoZSBleHBsaWNpdCByZWZlcmVuY2VkLWNvbHVtbiBsaXN0IGlzXG4gICAgICogY2hlY2tlZDsgdGhlIHByZWRpY2F0ZSBpdHNlbGYgc3RheXMgb3BhcXVlLlxuICAgICAqXG4gICAgICogRW1pdHMgYFBPU1RHUkVTX0NIRUNLX05BTUVfVU5JUVVFYCBhbmQgYFBPU1RHUkVTX0NIRUNLX0NPTFVNTl9FWElTVFNgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgY2hlY2stY29uc3RyYWludCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjaGVja0NvbnN0cmFpbnRWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY2hlY2tDb25zdHJhaW50cyxcbiAgICAgICAgfSA9IHRoaXMuZGVmaW5pdGlvbjtcblxuICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGNoZWNrQ29uc3RyYWludHMubWFwKChjb25zdHJhaW50KSA9PiBjb25zdHJhaW50Lm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfQ0hFQ0tfTkFNRV9VTklRVUUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnY2hlY2tDb25zdHJhaW50cycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBjaGVjay1jb25zdHJhaW50IG5hbWUgXCIke2R1cGxpY2F0ZX1cImAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGVja0NvbnN0cmFpbnRzLmZvckVhY2goKGNvbnN0cmFpbnQ6IENoZWNrQ29uc3RyYWludCwgcG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBgY2hlY2tDb25zdHJhaW50c1ske3Bvc2l0aW9ufV1gO1xuICAgICAgICAgICAgY29uc3RyYWludC5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGNvbHVtbikpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NIRUNLX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgY2hlY2stY29uc3RyYWludCBjb2x1bW4gXCIke2NvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBzZWNvbmRhcnkgaW5kZXhlcy5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBQT1NUR1JFU19JTkRFWF9OQU1FX1VOSVFVRWAsIGBQT1NUR1JFU19JTkRFWF9NRVRIT0RfVkFMSURgLFxuICAgICAqIGBQT1NUR1JFU19JTkRFWF9DT0xVTU5fRVhJU1RTYCwgYFBPU1RHUkVTX0lOREVYX05PX0RVUExJQ0FURV9DT0xVTU5TYCxcbiAgICAgKiBgUE9TVEdSRVNfSU5ERVhfVU5JUVVFX0JUUkVFX09OTFlgLCBgUE9TVEdSRVNfSU5ERVhfU09SVF9WQUxJRGAsIGFuZFxuICAgICAqIGBQT1NUR1JFU19JTkRFWF9OVUxMU19WQUxJRGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBpbmRleC1yZWxhdGVkIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGluZGV4VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGluZGV4ZXMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhpbmRleGVzLm1hcCgoaW5kZXgpID0+IGluZGV4Lm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTkFNRV9VTklRVUUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnaW5kZXhlcycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBpbmRleCBuYW1lIFwiJHtkdXBsaWNhdGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhlcy5mb3JFYWNoKChpbmRleCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCguLi50aGlzLnNpbmdsZUluZGV4VmlvbGF0aW9ucyhpbmRleCwgcG9zaXRpb24pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIENoZWNrcyBmb3Igb25lIGluZGV4IGVudHJ5LlxuICAgIHByaXZhdGUgc2luZ2xlSW5kZXhWaW9sYXRpb25zKGluZGV4OiBJbmRleCwgcG9zaXRpb246IG51bWJlcik6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBgaW5kZXhlc1ske3Bvc2l0aW9ufV1gO1xuXG4gICAgICAgIGlmICghSU5ERVhfTUVUSE9EUy5oYXMoaW5kZXgubWV0aG9kKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTUVUSE9EX1ZBTElEJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9Lm1ldGhvZGAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IG1ldGhvZCBcIiR7aW5kZXgubWV0aG9kfVwiIG11c3QgYmUgb25lIG9mOiAke1tcbiAgICAgICAgICAgICAgICAgICAgLi4uSU5ERVhfTUVUSE9EUyxcbiAgICAgICAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRleC51bmlxdWUgPT09IHRydWUgJiYgaW5kZXgubWV0aG9kICE9PSAnYnRyZWUnKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9VTklRVUVfQlRSRUVfT05MWScsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS51bmlxdWVgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBhIHVuaXF1ZSBpbmRleCBtdXN0IHVzZSB0aGUgYnRyZWUgbWV0aG9kLCBub3QgXCIke2luZGV4Lm1ldGhvZH1cImAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBrZXlOYW1lcyA9IGluZGV4LmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5uYW1lKTtcbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhrZXlOYW1lcykpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX05PX0RVUExJQ0FURV9DT0xVTU5TJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBcIiR7aW5kZXgubmFtZX1cIiBsaXN0cyBrZXkgY29sdW1uIFwiJHtkdXBsaWNhdGV9XCIgbW9yZSB0aGFuIG9uY2VgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhpbmRleC5pbmNsdWRlKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTk9fRFVQTElDQVRFX0NPTFVNTlMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uaW5jbHVkZWAsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IFwiJHtpbmRleC5uYW1lfVwiIGxpc3RzIGluY2x1ZGUgY29sdW1uIFwiJHtkdXBsaWNhdGV9XCIgbW9yZSB0aGFuIG9uY2VgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBpbmNsdWRlZCBvZiBpbmRleC5pbmNsdWRlKSB7XG4gICAgICAgICAgICBpZiAoa2V5TmFtZXMuaW5jbHVkZXMoaW5jbHVkZWQpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9OT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uaW5jbHVkZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBcIiR7aW5kZXgubmFtZX1cIiBpbmNsdWRlIGNvbHVtbiBcIiR7aW5jbHVkZWR9XCIgaXMgYWxzbyBhIGtleSBjb2x1bW5gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNbJHtjb2x1bW5JbmRleH1dLm5hbWVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXgga2V5IGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbi5zb3J0ICE9PSB1bmRlZmluZWQgJiYgIUlOREVYX1NPUlRTLmhhcyhjb2x1bW4uc29ydCkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX1NPUlRfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNbJHtjb2x1bW5JbmRleH1dLnNvcnRgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggc29ydCBcIiR7Y29sdW1uLnNvcnR9XCIgbXVzdCBiZSBcImFzY1wiIG9yIFwiZGVzY1wiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY29sdW1uLm51bGxzICE9PSB1bmRlZmluZWQgJiYgIUlOREVYX05VTExTLmhhcyhjb2x1bW4ubnVsbHMpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9OVUxMU19WQUxJRCcsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc1ske2NvbHVtbkluZGV4fV0ubnVsbHNgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggbnVsbHMgXCIke2NvbHVtbi5udWxsc31cIiBtdXN0IGJlIFwiZmlyc3RcIiBvciBcImxhc3RcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpbmRleC5pbmNsdWRlLmZvckVhY2goKGluY2x1ZGVkLCBpbmNsdWRlSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4oaW5jbHVkZWQpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5pbmNsdWRlWyR7aW5jbHVkZUluZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggaW5jbHVkZSBjb2x1bW4gXCIke2luY2x1ZGVkfVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxufVxuIl19
604
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGdyZXMtMTguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFibGUtdHlwZXMvcG9zdGdyZXMtMTgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7OztBQVVILDhDQUV1QjtBQUN2QixvQ0FHa0I7QUFFbEIsTUFBTSxVQUFVLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQzVDLE9BQU87SUFDUCxNQUFNO0lBQ04sTUFBTTtDQUNULENBQUMsQ0FBQztBQUVILE1BQU0sYUFBYSxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUMvQyxPQUFPO0lBQ1AsTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsS0FBSztJQUNMLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLFdBQVcsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDN0MsT0FBTztJQUNQLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLGVBQWUsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDakQsUUFBUTtJQUNSLFNBQVM7Q0FDWixDQUFDLENBQUM7QUFFSCxNQUFNLGNBQWMsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDaEQsUUFBUTtJQUNSLFdBQVc7Q0FDZCxDQUFDLENBQUM7QUFFSCxrREFBa0Q7QUFDbEQsTUFBTSxhQUFhLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQy9DLFVBQVU7SUFDVixNQUFNO0lBQ04sU0FBUztJQUNULEtBQUs7SUFDTCxNQUFNO0lBQ04sUUFBUTtJQUNSLE1BQU07Q0FDVCxDQUFDLENBQUM7QUFFSCxNQUFNLGlCQUFpQixHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNuRCxNQUFNO0lBQ04sUUFBUTtDQUNYLENBQUMsQ0FBQztBQUVILE1BQU0sbUJBQW1CLEdBQXdCLElBQUksR0FBRyxD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QUFHO29CQUMxQyxPQUFPLEVBQUUseUJBQXlCLFFBQVEsNkJBQTZCO2lCQUMxRSxDQUFDLENBQUMsQ0FBQztZQUNSLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7Q0FDSjtBQXZsQkQsMENBdWxCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUG9zdGdyZXMgMTggdGFibGUgdHlwZS5cbiAqXG4gKiBQb3N0Z3JlcyB1c2VzIGRlY2xhcmF0aXZlIHBhcnRpdGlvbmluZzogYSB0YWJsZSBpcyBwYXJ0aXRpb25lZCBieSBvbmUgc3RyYXRlZ3lcbiAqIChgcmFuZ2VgLCBgbGlzdGAsIG9yIGBoYXNoYCkgb3ZlciBvbmUgb3IgbW9yZSBleGlzdGluZyBrZXkgY29sdW1ucy4gRWFjaFxuICogcGFydGl0aW9uIGVudHJ5IG5hbWVzIGEga2V5IGNvbHVtbiAoYG5hbWVgKSBhbmQgdGhlIHN0cmF0ZWd5IChgdHlwZWApOyBhbGxcbiAqIGVudHJpZXMgb24gYSB0YWJsZSBtdXN0IHNoYXJlIG9uZSBzdHJhdGVneS5cbiAqL1xuXG5pbXBvcnQge1xuICAgIENoZWNrQ29uc3RyYWludCxcbiAgICBFeGNsdXNpb25Db25zdHJhaW50LFxuICAgIEluZGV4LFxuICAgIFBhcnRpdGlvbixcbiAgICBVbmlxdWVDb25zdHJhaW50LFxuICAgIFZpb2xhdGlvbixcbn0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtcbiAgICBUYWJsZVR5cGVCYXNlLFxufSBmcm9tICcuLi90YWJsZS10eXBlJztcbmltcG9ydCB7XG4gICAgaXNQb3N0Z3Jlc0NvbGxhdGFibGVUeXBlLFxuICAgIGlzVmFsaWRQb3N0Z3Jlc1R5cGUsXG59IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgU1RSQVRFR0lFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdyYW5nZScsXG4gICAgJ2xpc3QnLFxuICAgICdoYXNoJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9NRVRIT0RTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ2J0cmVlJyxcbiAgICAnaGFzaCcsXG4gICAgJ2dpc3QnLFxuICAgICdzcGdpc3QnLFxuICAgICdnaW4nLFxuICAgICdicmluJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9TT1JUUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdhc2MnLFxuICAgICdkZXNjJyxcbl0pO1xuXG5jb25zdCBJTkRFWF9OVUxMUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdmaXJzdCcsXG4gICAgJ2xhc3QnLFxuXSk7XG5cbmNvbnN0IEdFTkVSQVRFRF9LSU5EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdzdG9yZWQnLFxuICAgICd2aXJ0dWFsJyxcbl0pO1xuXG5jb25zdCBJREVOVElUWV9LSU5EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdhbHdheXMnLFxuICAgICdieURlZmF1bHQnLFxuXSk7XG5cbi8vLyBJbnRlZ2VyIGJhc2UgdHlwZXMgYW4gaWRlbnRpdHkgY29sdW1uIG1heSB1c2UuXG5jb25zdCBJTlRFR0VSX1RZUEVTOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ3NtYWxsaW50JyxcbiAgICAnaW50MicsXG4gICAgJ2ludGVnZXInLFxuICAgICdpbnQnLFxuICAgICdpbnQ0JyxcbiAgICAnYmlnaW50JyxcbiAgICAnaW50OCcsXG5dKTtcblxuY29uc3QgRVhDTFVTSU9OX01FVEhPRFM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAnZ2lzdCcsXG4gICAgJ3NwZ2lzdCcsXG5dKTtcblxuY29uc3QgQ09NUFJFU1NJT05fTUVUSE9EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdwZ2x6JyxcbiAgICAnbHo0Jyxcbl0pO1xuXG5jb25zdCBTVE9SQUdFX1NUUkFURUdJRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAncGxhaW4nLFxuICAgICdleHRlcm5hbCcsXG4gICAgJ2V4dGVuZGVkJyxcbiAgICAnbWFpbicsXG4gICAgJ2RlZmF1bHQnLFxuXSk7XG5cbi8qKiBQb3N0Z3JlcyAxOCB0YWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBQb3N0Z3JlczE4VGFibGUgZXh0ZW5kcyBUYWJsZVR5cGVCYXNlIHtcbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBhIGNvbHVtbiB0eXBlIGFnYWluc3QgdGhlIFBvc3RncmVzIHR5cGUgcmVnaXN0cnkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdHlwZSBUeXBlIHN0cmluZyBmcm9tIGEgY29sdW1uIGRlZmluaXRpb24uXG4gICAgICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSB0eXBlIGlzIGEgdmFsaWQgUG9zdGdyZXMgMTggdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgaXNWYWxpZENvbHVtblR5cGUodHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpc1ZhbGlkUG9zdGdyZXNUeXBlKHR5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBvc3RncmVzIHBhcnRpdGlvbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEVtaXRzOiBgTk9fRFVQTElDQVRFX1BBUlRJVElPTlNgIChhIGtleSBjb2x1bW4gbGlzdGVkIHR3aWNlKSxcbiAgICAgKiBgUE9TVEdSRVNfUEFSVElUSU9OX0NPTFVNTl9FWElTVFNgICh0aGUga2V5IGNvbHVtbiBtdXN0IGJlIGEgZGF0YSBjb2x1bW4pLFxuICAgICAqIGBQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSURgICh0aGUgc3RyYXRlZ3kgbXVzdCBiZSByYW5nZSAvIGxpc3QgL1xuICAgICAqIGhhc2gpLCBhbmQgYFBPU1RHUkVTX1BBUlRJVElPTl9TSU5HTEVfU1RSQVRFR1lgIChhIHRhYmxlIHBhcnRpdGlvbnMgYnkgb25lXG4gICAgICogc3RyYXRlZ3kgb25seSkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBwYXJ0aXRpb24tcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHBhcnRpdGlvblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBwYXJ0aXRpb25zLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMocGFydGl0aW9ucy5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpKSkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnTk9fRFVQTElDQVRFX1BBUlRJVElPTlMnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAncGFydGl0aW9ucycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogYGR1cGxpY2F0ZSBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmF0ZWdpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgcGFydGl0aW9ucy5mb3JFYWNoKChwYXJ0aXRpb246IFBhcnRpdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1BBUlRJVElPTl9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGBwYXJ0aXRpb25zWyR7aW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHBhcnRpdGlvbiBrZXkgY29sdW1uIFwiJHtwYXJ0aXRpb24ubmFtZX1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleS5pbmNsdWRlcyhwYXJ0aXRpb24ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLy8gUG9zdGdyZXMgcmVxdWlyZXMgdGhlIHByaW1hcnkga2V5IHRvIGluY2x1ZGUgZXZlcnkgcGFydGl0aW9uLWtleVxuICAgICAgICAgICAgICAgIC8vLyBjb2x1bW4sIHNvIGEgcGFydGl0aW9uIGNvbHVtbiBvdXRzaWRlIHRoZSBwcmltYXJ5IGtleSBpcyBpbnZhbGlkLlxuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfUEFSVElUSU9OX0tFWV9JTl9QSycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgcGFydGl0aW9uc1ske2luZGV4fV0ubmFtZWAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBwYXJ0aXRpb24ga2V5IGNvbHVtbiBcIiR7cGFydGl0aW9uLm5hbWV9XCIgbXVzdCBiZSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleWAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzdHJhdGVneSA9IHBhcnRpdGlvbi50eXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKFNUUkFURUdJRVMuaGFzKHN0cmF0ZWd5KSkge1xuICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMuYWRkKHN0cmF0ZWd5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU1RSQVRFR1lfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYHBhcnRpdGlvbnNbJHtpbmRleH1dLnR5cGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgXCIke3BhcnRpdGlvbi50eXBlfVwiIGlzIG5vdCBhIHZhbGlkIFBvc3RncmVzIHBhcnRpdGlvbiBzdHJhdGVneSAocmFuZ2UsIGxpc3QsIGhhc2gpYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChzdHJhdGVnaWVzLnNpemUgPiAxKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19QQVJUSVRJT05fU0lOR0xFX1NUUkFURUdZJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3BhcnRpdGlvbnMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBhIHBhcnRpdGlvbmVkIHRhYmxlIHVzZXMgb25lIHN0cmF0ZWd5OyBmb3VuZCAke1tcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RyYXRlZ2llcyxcbiAgICAgICAgICAgICAgICBdLnNvcnQoKS5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQb3N0Z3JlcyBlbmdpbmUtc3BlY2lmaWMgcnVsZXM6IGluZGV4ZXMsIHVuaXF1ZSBjb25zdHJhaW50cywgYW5kIGNoZWNrXG4gICAgICogY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBlbmdpbmUtc3BlY2lmaWMgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyBlbmdpbmVTcGVjaWZpY1Zpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgLi4udGhpcy5pbmRleFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMudW5pcXVlQ29uc3RyYWludFZpb2xhdGlvbnMoKSxcbiAgICAgICAgICAgIC4uLnRoaXMuY2hlY2tDb25zdHJhaW50VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5leGNsdXNpb25Db25zdHJhaW50VmlvbGF0aW9ucygpLFxuICAgICAgICAgICAgLi4udGhpcy5nZW5lcmF0ZWRDb2x1bW5WaW9sYXRpb25zKCksXG4gICAgICAgICAgICAuLi50aGlzLmNvbHVtbkF0dHJpYnV0ZVZpb2xhdGlvbnMoKSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBleGNsdXNpb24gY29uc3RyYWludHMuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfRVhDTFVTSU9OX05BTUVfVU5JUVVFYCwgYFBPU1RHUkVTX0VYQ0xVU0lPTl9NRVRIT0RfVkFMSURgLFxuICAgICAqIGBQT1NUR1JFU19FWENMVVNJT05fQ09MVU1OX0VYSVNUU2AsIGBQT1NUR1JFU19FWENMVVNJT05fTk9fRFVQTElDQVRFX0NPTFVNTlNgLFxuICAgICAqIGFuZCBgUE9TVEdSRVNfRVhDTFVTSU9OX0lOQ0xVREVTX1BBUlRJVElPTl9LRVlTYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGV4Y2x1c2lvbi1jb25zdHJhaW50IHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGV4Y2x1c2lvbkNvbnN0cmFpbnRWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZXhjbHVzaW9uQ29uc3RyYWludHMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhleGNsdXNpb25Db25zdHJhaW50cy5tYXAoKGNvbnN0cmFpbnQpID0+IGNvbnN0cmFpbnQubmFtZSkpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19FWENMVVNJT05fTkFNRV9VTklRVUUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAnZXhjbHVzaW9uQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgZXhjbHVzaW9uLWNvbnN0cmFpbnQgbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbktleXMgPSB0aGlzLmRlZmluaXRpb24ucGFydGl0aW9uc1xuICAgICAgICAgICAgLm1hcCgocGFydGl0aW9uKSA9PiBwYXJ0aXRpb24ubmFtZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKG5hbWUpID0+IHRoaXMuaGFzQ29sdW1uKG5hbWUpKTtcblxuICAgICAgICBleGNsdXNpb25Db25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50OiBFeGNsdXNpb25Db25zdHJhaW50LCBwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGBleGNsdXNpb25Db25zdHJhaW50c1ske3Bvc2l0aW9ufV1gO1xuICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IGNvbnN0cmFpbnQuZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmNvbHVtbik7XG5cbiAgICAgICAgICAgIGlmICghRVhDTFVTSU9OX01FVEhPRFMuaGFzKGNvbnN0cmFpbnQudXNpbmcudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19FWENMVVNJT05fTUVUSE9EX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS51c2luZ2AsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBleGNsdXNpb24gbWV0aG9kIFwiJHtjb25zdHJhaW50LnVzaW5nfVwiIG11c3QgYmUgXCJnaXN0XCIgb3IgXCJzcGdpc3RcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGNvbHVtbnMpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19FWENMVVNJT05fTk9fRFVQTElDQVRFX0NPTFVNTlMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmVsZW1lbnRzYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGV4Y2x1c2lvbiBjb25zdHJhaW50IFwiJHtjb25zdHJhaW50Lm5hbWV9XCIgbGlzdHMgY29sdW1uIFwiJHtkdXBsaWNhdGV9XCIgbW9yZSB0aGFuIG9uY2VgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3RyYWludC5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50LCBlbGVtZW50SW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGVsZW1lbnQuY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfRVhDTFVTSU9OX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5lbGVtZW50c1ske2VsZW1lbnRJbmRleH1dLmNvbHVtbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZXhjbHVzaW9uLWNvbnN0cmFpbnQgY29sdW1uIFwiJHtlbGVtZW50LmNvbHVtbn1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBtaXNzaW5nID0gcGFydGl0aW9uS2V5cy5maWx0ZXIoKG5hbWUpID0+ICFjb2x1bW5zLmluY2x1ZGVzKG5hbWUpKTtcbiAgICAgICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0VYQ0xVU0lPTl9JTkNMVURFU19QQVJUSVRJT05fS0VZUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uZWxlbWVudHNgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZXhjbHVzaW9uIGNvbnN0cmFpbnQgXCIke2NvbnN0cmFpbnQubmFtZX1cIiBvbiBhIHBhcnRpdGlvbmVkIHRhYmxlIG11c3QgaW5jbHVkZSBgXG4gICAgICAgICAgICAgICAgICAgICAgICArIGBldmVyeSBwYXJ0aXRpb24ga2V5IGNvbHVtbjsgbWlzc2luZzogJHttaXNzaW5nLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIFBvc3RncmVzIGNvbHVtbiBhdHRyaWJ1dGVzOiBpZGVudGl0eSBjb2x1bW5zLCB0aGUgbXV0dWFsXG4gICAgICogZXhjbHVzaXZpdHkgYmV0d2VlbiBiZWluZyBnZW5lcmF0ZWQgLyBhbiBpZGVudGl0eSAvIGhhdmluZyBhIGRlZmF1bHQsIGFuZFxuICAgICAqIHBlci1jb2x1bW4gY29sbGF0aW9uLCBjb21wcmVzc2lvbiwgYW5kIHN0b3JhZ2UuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfSURFTlRJVFlfVkFMSURgLCBgUE9TVEdSRVNfSURFTlRJVFlfVFlQRV9JTlRFR0VSYCxcbiAgICAgKiBgUE9TVEdSRVNfQ09MVU1OX0dFTkVSQVRJT05fRVhDTFVTSVZFYCwgYFBPU1RHUkVTX0NPTExBVElPTl9PTl9URVhUX1RZUEVgLFxuICAgICAqIGBQT1NUR1JFU19DT01QUkVTU0lPTl9WQUxJRGAsIGFuZCBgUE9TVEdSRVNfU1RPUkFHRV9WQUxJRGAuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBjb2x1bW4tYXR0cmlidXRlIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNvbHVtbkF0dHJpYnV0ZVZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYGNvbHVtbnNbJHtpbmRleH1dYDtcblxuICAgICAgICAgICAgaWYgKGNvbHVtbi5pZGVudGl0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFJREVOVElUWV9LSU5EUy5oYXMoY29sdW1uLmlkZW50aXR5KSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSURFTlRJVFlfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5pZGVudGl0eWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaWRlbnRpdHkgXCIke2NvbHVtbi5pZGVudGl0eX1cIiBtdXN0IGJlIFwiYWx3YXlzXCIgb3IgXCJieURlZmF1bHRcImAsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFJTlRFR0VSX1RZUEVTLmhhcyhjb2x1bW4udHlwZS50cmltKCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lERU5USVRZX1RZUEVfSU5URUdFUicsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmlkZW50aXR5YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpZGVudGl0eSBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIG11c3QgYmUgYW4gaW50ZWdlciB0eXBlLCBub3QgXCIke2NvbHVtbi50eXBlfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IFtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZ2VuZXJhdGVkLFxuICAgICAgICAgICAgICAgIGNvbHVtbi5pZGVudGl0eSxcbiAgICAgICAgICAgICAgICBjb2x1bW4uZGVmYXVsdCxcbiAgICAgICAgICAgIF0uZmlsdGVyKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NPTFVNTl9HRU5FUkFUSU9OX0VYQ0xVU0lWRScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgY29sdW1uIFwiJHtjb2x1bW4ubmFtZX1cIiBtYXkgaGF2ZSBvbmx5IG9uZSBvZiBnZW5lcmF0ZWQsIGlkZW50aXR5LCBvciBkZWZhdWx0YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4uY29sbGF0aW9uICE9PSB1bmRlZmluZWQgJiYgIWlzUG9zdGdyZXNDb2xsYXRhYmxlVHlwZShjb2x1bW4udHlwZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NPTExBVElPTl9PTl9URVhUX1RZUEUnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbGxhdGlvbmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBjb2xsYXRpb24gaXMgb25seSBsZWdhbCBvbiBhIHRleHQgdHlwZSwgbm90IFwiJHtjb2x1bW4udHlwZX1cImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sdW1uLmNvbXByZXNzaW9uICE9PSB1bmRlZmluZWQgJiYgIUNPTVBSRVNTSU9OX01FVEhPRFMuaGFzKGNvbHVtbi5jb21wcmVzc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NPTVBSRVNTSU9OX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb21wcmVzc2lvbmAsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBjb21wcmVzc2lvbiBcIiR7Y29sdW1uLmNvbXByZXNzaW9ufVwiIG11c3QgYmUgXCJwZ2x6XCIgb3IgXCJsejRcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29sdW1uLnN0b3JhZ2UgIT09IHVuZGVmaW5lZCAmJiAhU1RPUkFHRV9TVFJBVEVHSUVTLmhhcyhjb2x1bW4uc3RvcmFnZS50cmltKCkudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1NUT1JBR0VfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LnN0b3JhZ2VgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgc3RvcmFnZSBcIiR7Y29sdW1uLnN0b3JhZ2V9XCIgbXVzdCBiZSBvbmUgb2Y6ICR7W1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uU1RPUkFHRV9TVFJBVEVHSUVTLFxuICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIGdlbmVyYXRlZCBjb2x1bW5zLlxuICAgICAqXG4gICAgICogRW1pdHMgYFBPU1RHUkVTX0dFTkVSQVRFRF9LSU5EX1ZBTElEYCxcbiAgICAgKiBgUE9TVEdSRVNfR0VORVJBVEVEX0VYUFJFU1NJT05fQ09MVU1OX0VYSVNUU2AsXG4gICAgICogYFBPU1RHUkVTX0dFTkVSQVRFRF9OT19TRUxGX1JFRkVSRU5DRWAsXG4gICAgICogYFBPU1RHUkVTX0dFTkVSQVRFRF9OT19HRU5FUkFURURfUkVGRVJFTkNFYCxcbiAgICAgKiBgUE9TVEdSRVNfR0VORVJBVEVEX05PVF9JTl9QQVJUSVRJT05fS0VZYCwgYW5kXG4gICAgICogYFBPU1RHUkVTX1ZJUlRVQUxfR0VORVJBVEVEX05PVF9JTl9QS2AuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyBFdmVyeSBnZW5lcmF0ZWQtY29sdW1uIHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdlbmVyYXRlZENvbHVtblZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZE5hbWVzID0gbmV3IFNldChcbiAgICAgICAgICAgIHRoaXMuZGVmaW5pdGlvbi5jb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiBjb2x1bW4uZ2VuZXJhdGVkICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbk5hbWVzID0gbmV3IFNldCh0aGlzLmRlZmluaXRpb24ucGFydGl0aW9ucy5tYXAoKHBhcnRpdGlvbikgPT4gcGFydGl0aW9uLm5hbWUpKTtcblxuICAgICAgICB0aGlzLmRlZmluaXRpb24uY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmdlbmVyYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBgY29sdW1uc1ske2luZGV4fV1gO1xuXG4gICAgICAgICAgICBpZiAoIUdFTkVSQVRFRF9LSU5EUy5oYXMoY29sdW1uLmdlbmVyYXRlZCkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9LSU5EX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5nZW5lcmF0ZWRgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgZ2VuZXJhdGVkIGtpbmQgXCIke2NvbHVtbi5nZW5lcmF0ZWR9XCIgbXVzdCBiZSBcInN0b3JlZFwiIG9yIFwidmlydHVhbFwiYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIChjb2x1bW4uZXhwcmVzc2lvbkNvbHVtbnMgPz8gW10pLmZvckVhY2goKHJlZmVyZW5jZSwgcmVmZXJlbmNlSW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VGaWVsZCA9IGAke2ZpZWxkfS5leHByZXNzaW9uQ29sdW1uc1ske3JlZmVyZW5jZUluZGV4fV1gO1xuICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2UgPT09IGNvbHVtbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19HRU5FUkFURURfTk9fU0VMRl9SRUZFUkVOQ0UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlZmVyZW5jZUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGNhbm5vdCByZWZlcmVuY2UgaXRzZWxmYCxcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuaGFzQ29sdW1uKHJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9FWFBSRVNTSU9OX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlZmVyZW5jZUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIHJlZmVyZW5jZXMgXCIke3JlZmVyZW5jZX1cIiwgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJ3doaWNoIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnMnLFxuICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChnZW5lcmF0ZWROYW1lcy5oYXMocmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfR0VORVJBVEVEX05PX0dFTkVSQVRFRF9SRUZFUkVOQ0UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHJlZmVyZW5jZUZpZWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGNhbm5vdCByZWZlcmVuY2UgYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYGdlbmVyYXRlZCBjb2x1bW4gXCIke3JlZmVyZW5jZX1cImAsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHBhcnRpdGlvbk5hbWVzLmhhcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0dFTkVSQVRFRF9OT1RfSU5fUEFSVElUSU9OX0tFWScsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uZ2VuZXJhdGVkYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGdlbmVyYXRlZCBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGNhbm5vdCBiZSBhIHBhcnRpdGlvbiBrZXlgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbHVtbi5nZW5lcmF0ZWQgPT09ICd2aXJ0dWFsJyAmJiB0aGlzLmRlZmluaXRpb24ucHJpbWFyeUtleS5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1ZJUlRVQUxfR0VORVJBVEVEX05PVF9JTl9QSycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uZ2VuZXJhdGVkYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVtbiBcIiR7Y29sdW1uLm5hbWV9XCIgY2Fubm90IGJlIHBhcnQgb2YgdGhlIHByaW1hcnkga2V5YCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFZhbGlkYXRlIFVOSVFVRSBjb25zdHJhaW50cy5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBQT1NUR1JFU19VTklRVUVfTkFNRV9VTklRVUVgLCBgUE9TVEdSRVNfVU5JUVVFX0NPTFVNTl9FWElTVFNgLCBhbmRcbiAgICAgKiBgUE9TVEdSRVNfVU5JUVVFX05PX0RVUExJQ0FURV9DT0xVTU5TYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IHVuaXF1ZS1jb25zdHJhaW50IHZpb2xhdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVuaXF1ZUNvbnN0cmFpbnRWaW9sYXRpb25zKCk6IFZpb2xhdGlvbltdIHtcbiAgICAgICAgY29uc3QgdmlvbGF0aW9uczogVmlvbGF0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgdW5pcXVlQ29uc3RyYWludHMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyh1bmlxdWVDb25zdHJhaW50cy5tYXAoKGNvbnN0cmFpbnQpID0+IGNvbnN0cmFpbnQubmFtZSkpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19VTklRVUVfTkFNRV9VTklRVUUnLFxuICAgICAgICAgICAgICAgIGZpZWxkOiAndW5pcXVlQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgdW5pcXVlLWNvbnN0cmFpbnQgbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzLmZvckVhY2goKGNvbnN0cmFpbnQ6IFVuaXF1ZUNvbnN0cmFpbnQsIHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYHVuaXF1ZUNvbnN0cmFpbnRzWyR7cG9zaXRpb259XWA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGR1cGxpY2F0ZSBvZiB0aGlzLmZpbmREdXBsaWNhdGVzKGNvbnN0cmFpbnQuY29sdW1ucykpIHtcbiAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX1VOSVFVRV9OT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bmlxdWUgY29uc3RyYWludCBcIiR7Y29uc3RyYWludC5uYW1lfVwiIGxpc3RzIGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiIG1vcmUgdGhhbiBvbmNlYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdHJhaW50LmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBjb2x1bW5JbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4oY29sdW1uKSkge1xuICAgICAgICAgICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX0NPTFVNTl9FWElTVFMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgdW5pcXVlLWNvbnN0cmFpbnQgY29sdW1uIFwiJHtjb2x1bW59XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKC4uLnRoaXMudW5pcXVlQ29uc3RyYWludEtleVZpb2xhdGlvbnMoY29uc3RyYWludCwgZmllbGQpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLy8vIFJlbGF0aW9uc2hpcCBydWxlcyBiZXR3ZWVuIGEgdW5pcXVlIGNvbnN0cmFpbnQgYW5kIHRoZSBwcmltYXJ5IGtleSAvXG4gICAgLy8vIHBhcnRpdGlvbiBrZXk6IHJlZHVuZGFuY3kgd2l0aCB0aGUgUEssIGFuZCB0aGUgUG9zdGdyZXMgcnVsZSB0aGF0IGFcbiAgICAvLy8gdW5pcXVlIGNvbnN0cmFpbnQgb24gYSBwYXJ0aXRpb25lZCB0YWJsZSBtdXN0IGluY2x1ZGUgZXZlcnkgcGFydGl0aW9uIGtleS5cbiAgICBwcml2YXRlIHVuaXF1ZUNvbnN0cmFpbnRLZXlWaW9sYXRpb25zKGNvbnN0cmFpbnQ6IFVuaXF1ZUNvbnN0cmFpbnQsIGZpZWxkOiBzdHJpbmcpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG5cbiAgICAgICAgY29uc3QgcHJpbWFyeUtleSA9IHRoaXMuZGVmaW5pdGlvbi5wcmltYXJ5S2V5O1xuICAgICAgICBjb25zdCBjb2x1bW5TZXQgPSBuZXcgU2V0KGNvbnN0cmFpbnQuY29sdW1ucyk7XG4gICAgICAgIGlmIChwcmltYXJ5S2V5Lmxlbmd0aCA+IDAgJiYgcHJpbWFyeUtleS5sZW5ndGggPT09IGNvbHVtblNldC5zaXplXG4gICAgICAgICAgICAmJiBwcmltYXJ5S2V5LmV2ZXJ5KChjb2x1bW4pID0+IGNvbHVtblNldC5oYXMoY29sdW1uKSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX1JFRFVOREFOVF9XSVRIX1BLJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bmlxdWUgY29uc3RyYWludCBcIiR7Y29uc3RyYWludC5uYW1lfVwiIGR1cGxpY2F0ZXMgdGhlIHByaW1hcnkga2V5YCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnRpdGlvbktleXMgPSB0aGlzLmRlZmluaXRpb24ucGFydGl0aW9uc1xuICAgICAgICAgICAgLm1hcCgocGFydGl0aW9uKSA9PiBwYXJ0aXRpb24ubmFtZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKG5hbWUpID0+IHRoaXMuaGFzQ29sdW1uKG5hbWUpKTtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IHBhcnRpdGlvbktleXMuZmlsdGVyKChuYW1lKSA9PiAhY29uc3RyYWludC5jb2x1bW5zLmluY2x1ZGVzKG5hbWUpKTtcbiAgICAgICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfVU5JUVVFX0lOQ0xVREVTX1BBUlRJVElPTl9LRVlTJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGB1bmlxdWUgY29uc3RyYWludCBcIiR7Y29uc3RyYWludC5uYW1lfVwiIG9uIGEgcGFydGl0aW9uZWQgdGFibGUgbXVzdCBpbmNsdWRlIGBcbiAgICAgICAgICAgICAgICAgICAgKyBgZXZlcnkgcGFydGl0aW9uIGtleSBjb2x1bW47IG1pc3Npbmc6ICR7bWlzc2luZy5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmlvbGF0aW9ucztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGF0ZSBDSEVDSyBjb25zdHJhaW50cy4gT25seSB0aGUgZXhwbGljaXQgcmVmZXJlbmNlZC1jb2x1bW4gbGlzdCBpc1xuICAgICAqIGNoZWNrZWQ7IHRoZSBwcmVkaWNhdGUgaXRzZWxmIHN0YXlzIG9wYXF1ZS5cbiAgICAgKlxuICAgICAqIEVtaXRzIGBQT1NUR1JFU19DSEVDS19OQU1FX1VOSVFVRWAgYW5kIGBQT1NUR1JFU19DSEVDS19DT0xVTU5fRVhJU1RTYC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEV2ZXJ5IGNoZWNrLWNvbnN0cmFpbnQgdmlvbGF0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgY2hlY2tDb25zdHJhaW50VmlvbGF0aW9ucygpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNoZWNrQ29uc3RyYWludHMsXG4gICAgICAgIH0gPSB0aGlzLmRlZmluaXRpb247XG5cbiAgICAgICAgZm9yIChjb25zdCBkdXBsaWNhdGUgb2YgdGhpcy5maW5kRHVwbGljYXRlcyhjaGVja0NvbnN0cmFpbnRzLm1hcCgoY29uc3RyYWludCkgPT4gY29uc3RyYWludC5uYW1lKSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0NIRUNLX05BTUVfVU5JUVVFJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2NoZWNrQ29uc3RyYWludHMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgY2hlY2stY29uc3RyYWludCBuYW1lIFwiJHtkdXBsaWNhdGV9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2hlY2tDb25zdHJhaW50cy5mb3JFYWNoKChjb25zdHJhaW50OiBDaGVja0NvbnN0cmFpbnQsIHBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYGNoZWNrQ29uc3RyYWludHNbJHtwb3NpdGlvbn1dYDtcbiAgICAgICAgICAgIGNvbnN0cmFpbnQuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIGNvbHVtbkluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhhc0NvbHVtbihjb2x1bW4pKSB7XG4gICAgICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19DSEVDS19DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uY29sdW1uc1ske2NvbHVtbkluZGV4fV1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGNoZWNrLWNvbnN0cmFpbnQgY29sdW1uIFwiJHtjb2x1bW59XCIgaXMgbm90IGRlZmluZWQgaW4gY29sdW1uc2AsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHZpb2xhdGlvbnM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgc2Vjb25kYXJ5IGluZGV4ZXMuXG4gICAgICpcbiAgICAgKiBFbWl0cyBgUE9TVEdSRVNfSU5ERVhfTkFNRV9VTklRVUVgLCBgUE9TVEdSRVNfSU5ERVhfTUVUSE9EX1ZBTElEYCxcbiAgICAgKiBgUE9TVEdSRVNfSU5ERVhfQ09MVU1OX0VYSVNUU2AsIGBQT1NUR1JFU19JTkRFWF9OT19EVVBMSUNBVEVfQ09MVU1OU2AsXG4gICAgICogYFBPU1RHUkVTX0lOREVYX1VOSVFVRV9CVFJFRV9PTkxZYCwgYFBPU1RHUkVTX0lOREVYX1NPUlRfVkFMSURgLCBhbmRcbiAgICAgKiBgUE9TVEdSRVNfSU5ERVhfTlVMTFNfVkFMSURgLlxuICAgICAqXG4gICAgICogQHJldHVybnMgRXZlcnkgaW5kZXgtcmVsYXRlZCB2aW9sYXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBpbmRleFZpb2xhdGlvbnMoKTogVmlvbGF0aW9uW10ge1xuICAgICAgICBjb25zdCB2aW9sYXRpb25zOiBWaW9sYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBpbmRleGVzLFxuICAgICAgICB9ID0gdGhpcy5kZWZpbml0aW9uO1xuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoaW5kZXhlcy5tYXAoKGluZGV4KSA9PiBpbmRleC5uYW1lKSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX05BTUVfVU5JUVVFJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogJ2luZGV4ZXMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBkdXBsaWNhdGUgaW5kZXggbmFtZSBcIiR7ZHVwbGljYXRlfVwiYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ZXMuZm9yRWFjaCgoaW5kZXgsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2goLi4udGhpcy5zaW5nbGVJbmRleFZpb2xhdGlvbnMoaW5kZXgsIHBvc2l0aW9uKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cblxuICAgIC8vLyBDaGVja3MgZm9yIG9uZSBpbmRleCBlbnRyeS5cbiAgICBwcml2YXRlIHNpbmdsZUluZGV4VmlvbGF0aW9ucyhpbmRleDogSW5kZXgsIHBvc2l0aW9uOiBudW1iZXIpOiBWaW9sYXRpb25bXSB7XG4gICAgICAgIGNvbnN0IHZpb2xhdGlvbnM6IFZpb2xhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IGZpZWxkID0gYGluZGV4ZXNbJHtwb3NpdGlvbn1dYDtcblxuICAgICAgICBpZiAoIUlOREVYX01FVEhPRFMuaGFzKGluZGV4Lm1ldGhvZCkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX01FVEhPRF9WQUxJRCcsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5tZXRob2RgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBtZXRob2QgXCIke2luZGV4Lm1ldGhvZH1cIiBtdXN0IGJlIG9uZSBvZjogJHtbXG4gICAgICAgICAgICAgICAgICAgIC4uLklOREVYX01FVEhPRFMsXG4gICAgICAgICAgICAgICAgXS5qb2luKCcsICcpfWAsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5kZXgudW5pcXVlID09PSB0cnVlICYmIGluZGV4Lm1ldGhvZCAhPT0gJ2J0cmVlJykge1xuICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfVU5JUVVFX0JUUkVFX09OTFknLFxuICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0udW5pcXVlYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgYSB1bmlxdWUgaW5kZXggbXVzdCB1c2UgdGhlIGJ0cmVlIG1ldGhvZCwgbm90IFwiJHtpbmRleC5tZXRob2R9XCJgLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2V5TmFtZXMgPSBpbmRleC5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoa2V5TmFtZXMpKSB7XG4gICAgICAgICAgICB2aW9sYXRpb25zLnB1c2godGhpcy52aW9sYXRpb24oe1xuICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9OT19EVVBMSUNBVEVfQ09MVU1OUycsXG4gICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zYCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggXCIke2luZGV4Lm5hbWV9XCIgbGlzdHMga2V5IGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiIG1vcmUgdGhhbiBvbmNlYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZHVwbGljYXRlIG9mIHRoaXMuZmluZER1cGxpY2F0ZXMoaW5kZXguaW5jbHVkZSkpIHtcbiAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgY29kZTogJ1BPU1RHUkVTX0lOREVYX05PX0RVUExJQ0FURV9DT0xVTU5TJyxcbiAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmluY2x1ZGVgLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpbmRleCBcIiR7aW5kZXgubmFtZX1cIiBsaXN0cyBpbmNsdWRlIGNvbHVtbiBcIiR7ZHVwbGljYXRlfVwiIG1vcmUgdGhhbiBvbmNlYCxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgaW5jbHVkZWQgb2YgaW5kZXguaW5jbHVkZSkge1xuICAgICAgICAgICAgaWYgKGtleU5hbWVzLmluY2x1ZGVzKGluY2x1ZGVkKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTk9fRFVQTElDQVRFX0NPTFVNTlMnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmluY2x1ZGVgLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaW5kZXggXCIke2luZGV4Lm5hbWV9XCIgaW5jbHVkZSBjb2x1bW4gXCIke2luY2x1ZGVkfVwiIGlzIGFsc28gYSBrZXkgY29sdW1uYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbmRleC5jb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgY29sdW1uSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW4oY29sdW1uLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9DT0xVTU5fRVhJU1RTJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XS5uYW1lYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IGtleSBjb2x1bW4gXCIke2NvbHVtbi5uYW1lfVwiIGlzIG5vdCBkZWZpbmVkIGluIGNvbHVtbnNgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb2x1bW4uc29ydCAhPT0gdW5kZWZpbmVkICYmICFJTkRFWF9TT1JUUy5oYXMoY29sdW1uLnNvcnQpKSB7XG4gICAgICAgICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHRoaXMudmlvbGF0aW9uKHtcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWw6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgIGNvZGU6ICdQT1NUR1JFU19JTkRFWF9TT1JUX1ZBTElEJyxcbiAgICAgICAgICAgICAgICAgICAgZmllbGQ6IGAke2ZpZWxkfS5jb2x1bW5zWyR7Y29sdW1uSW5kZXh9XS5zb3J0YCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IHNvcnQgXCIke2NvbHVtbi5zb3J0fVwiIG11c3QgYmUgXCJhc2NcIiBvciBcImRlc2NcImAsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbHVtbi5udWxscyAhPT0gdW5kZWZpbmVkICYmICFJTkRFWF9OVUxMUy5oYXMoY29sdW1uLm51bGxzKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfTlVMTFNfVkFMSUQnLFxuICAgICAgICAgICAgICAgICAgICBmaWVsZDogYCR7ZmllbGR9LmNvbHVtbnNbJHtjb2x1bW5JbmRleH1dLm51bGxzYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IG51bGxzIFwiJHtjb2x1bW4ubnVsbHN9XCIgbXVzdCBiZSBcImZpcnN0XCIgb3IgXCJsYXN0XCJgLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5kZXguaW5jbHVkZS5mb3JFYWNoKChpbmNsdWRlZCwgaW5jbHVkZUluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uKGluY2x1ZGVkKSkge1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMucHVzaCh0aGlzLnZpb2xhdGlvbih7XG4gICAgICAgICAgICAgICAgICAgIGxldmVsOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjb2RlOiAnUE9TVEdSRVNfSU5ERVhfQ09MVU1OX0VYSVNUUycsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkOiBgJHtmaWVsZH0uaW5jbHVkZVske2luY2x1ZGVJbmRleH1dYCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGluZGV4IGluY2x1ZGUgY29sdW1uIFwiJHtpbmNsdWRlZH1cIiBpcyBub3QgZGVmaW5lZCBpbiBjb2x1bW5zYCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB2aW9sYXRpb25zO1xuICAgIH1cbn1cbiJdfQ==
@@ -7,5 +7,13 @@
7
7
  */
8
8
  /** Whether the string is a valid Hive (parquet) column type. */
9
9
  export declare function isValidHiveType(typeStr: string): boolean;
10
+ /**
11
+ * Whether a Postgres column type is collatable (a text/character type), so a
12
+ * `COLLATE` clause is legal on it. Array and length markers are stripped first.
13
+ *
14
+ * @param typeStr Column type string.
15
+ * @returns True when the base type is a collatable text type.
16
+ */
17
+ export declare function isPostgresCollatableType(typeStr: string): boolean;
10
18
  /** Whether the string is a valid Postgres 18 column type. */
11
19
  export declare function isValidPostgresType(typeStr: string): boolean;
package/dist/src/types.js CHANGED
@@ -8,6 +8,7 @@
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.isValidHiveType = isValidHiveType;
11
+ exports.isPostgresCollatableType = isPostgresCollatableType;
11
12
  exports.isValidPostgresType = isValidPostgresType;
12
13
  /// ////////////////////////////////////////////////////////////////////////////
13
14
  // Hive
@@ -166,6 +167,28 @@ const POSTGRES_PARAM_ALLOWED = new Set([
166
167
  'timestamptz',
167
168
  'interval',
168
169
  ]);
170
+ const POSTGRES_COLLATABLE = new Set([
171
+ 'text',
172
+ 'varchar',
173
+ 'character varying',
174
+ 'char',
175
+ 'character',
176
+ 'bpchar',
177
+ ]);
178
+ /**
179
+ * Whether a Postgres column type is collatable (a text/character type), so a
180
+ * `COLLATE` clause is legal on it. Array and length markers are stripped first.
181
+ *
182
+ * @param typeStr Column type string.
183
+ * @returns True when the base type is a collatable text type.
184
+ */
185
+ function isPostgresCollatableType(typeStr) {
186
+ let type = typeStr.trim().toLowerCase().replace(/\s+/g, ' ');
187
+ type = type.replace(/(\s*\[\s*\d*\s*\])+$/, '').trim();
188
+ const paramMatch = /^(.*?)\([^)]*\)$/.exec(type);
189
+ const base = paramMatch ? paramMatch[1].trim() : type;
190
+ return POSTGRES_COLLATABLE.has(base);
191
+ }
169
192
  /** Whether the string is a valid Postgres 18 column type. */
170
193
  function isValidPostgresType(typeStr) {
171
194
  let type = typeStr.trim().toLowerCase().replace(/\s+/g, ' ');
@@ -179,4 +202,4 @@ function isValidPostgresType(typeStr) {
179
202
  }
180
203
  return POSTGRES_EXACT.has(type);
181
204
  }
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7QUE2REgsMENBbUNDO0FBMkVELGtEQWNDO0FBdkxELGdGQUFnRjtBQUNoRixPQUFPO0FBRVAsTUFBTSxlQUFlLEdBQXdCLElBQUksR0FBRyxDQUFDO0lBQ2pELFNBQVM7SUFDVCxVQUFVO0lBQ1YsS0FBSztJQUNMLFNBQVM7SUFDVCxRQUFRO0lBQ1IsU0FBUztJQUNULE9BQU87SUFDUCxRQUFRO0lBQ1Isa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixRQUFRO0lBQ1IsV0FBVztJQUNYLE1BQU07SUFDTixVQUFVO0NBQ2IsQ0FBQyxDQUFDO0FBRUg7Ozs7OztHQU1HO0FBQ0gsU0FBUyxhQUFhLENBQUMsSUFBWTtJQUMvQixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDZixLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2YsQ0FBQzthQUFNLElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3RCLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLElBQUksSUFBSSxDQUFDO1FBQ3BCLENBQUM7SUFDTCxDQUFDO0lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENB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QUM7SUFDbkQsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDcEMsT0FBTyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVyLWVuZ2luZSBjb2x1bW4tdHlwZSByZWdpc3RyaWVzIGZvciBIaXZlIGFuZCBQb3N0Z3Jlcy5cbiAqXG4gKiBFYWNoIGZ1bmN0aW9uIGFuc3dlcnMgXCJpcyB0aGlzIHR5cGUgc3RyaW5nIHZhbGlkIGZvciB0aGlzIGVuZ2luZT9cIi4gVGhlXG4gKiBjb25jcmV0ZSBgVGFibGVUeXBlQmFzZWAgc3ViY2xhc3NlcyBkZWxlZ2F0ZSBgaXNWYWxpZENvbHVtblR5cGVgIGhlcmUgKGFuZFxuICogdGhlIEljZWJlcmcgc3ViY2xhc3MgZGVsZWdhdGVzIHRvIGAuL2ljZWJlcmdgKS5cbiAqL1xuXG4vLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gSGl2ZVxuXG5jb25zdCBISVZFX1BSSU1JVElWRVM6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAndGlueWludCcsXG4gICAgJ3NtYWxsaW50JyxcbiAgICAnaW50JyxcbiAgICAnaW50ZWdlcicsXG4gICAgJ2JpZ2ludCcsXG4gICAgJ2Jvb2xlYW4nLFxuICAgICdmbG9hdCcsXG4gICAgJ2RvdWJsZScsXG4gICAgJ2RvdWJsZSBwcmVjaXNpb24nLFxuICAgICdzdHJpbmcnLFxuICAgICdiaW5hcnknLFxuICAgICd0aW1lc3RhbXAnLFxuICAgICdkYXRlJyxcbiAgICAnaW50ZXJ2YWwnLFxuXSk7XG5cbi8qKlxuICogU3BsaXQgYSBnZW5lcmljLXR5cGUgYm9keSBvbiB0b3AtbGV2ZWwgY29tbWFzIChpZ25vcmluZyBjb21tYXMgbmVzdGVkIGluc2lkZVxuICogYDwuLi4+YCkuXG4gKlxuICogQHBhcmFtIGJvZHkgSW5uZXIgdGV4dCBvZiBhIGdlbmVyaWMgdHlwZS5cbiAqIEByZXR1cm5zIFRoZSB0b3AtbGV2ZWwgY29tbWEtc2VwYXJhdGVkIHBhcnRzLlxuICovXG5mdW5jdGlvbiBzcGxpdFRvcExldmVsKGJvZHk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBjdXJyZW50ID0gJyc7XG4gICAgZm9yIChjb25zdCBjaGFyIG9mIGJvZHkpIHtcbiAgICAgICAgaWYgKGNoYXIgPT09ICc8Jykge1xuICAgICAgICAgICAgZGVwdGggKz0gMTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnPicpIHtcbiAgICAgICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICcsJyAmJiBkZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgcGFydHMucHVzaChjdXJyZW50KTtcbiAgICAgICAgICAgIGN1cnJlbnQgPSAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnQgKz0gY2hhcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwYXJ0cy5wdXNoKGN1cnJlbnQpO1xuICAgIHJldHVybiBwYXJ0cy5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEhpdmVTdHJ1Y3RGaWVsZChmaWVsZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY29sb24gPSBmaWVsZC5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGNvbG9uIDw9IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gZmllbGQuc2xpY2UoMCwgY29sb24pLnRyaW0oKTtcbiAgICBjb25zdCB0eXBlID0gZmllbGQuc2xpY2UoY29sb24gKyAxKS50cmltKCk7XG4gICAgcmV0dXJuIG5hbWUubGVuZ3RoID4gMCAmJiBpc1ZhbGlkSGl2ZVR5cGUodHlwZSk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBIaXZlIChwYXJxdWV0KSBjb2x1bW4gdHlwZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkSGl2ZVR5cGUodHlwZVN0cjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVTdHIudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoSElWRV9QUklNSVRJVkVTLmhhcyh0eXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoL15kZWNpbWFsXFwoXFxkKygsXFxzKlxcZCspP1xcKSQvLnRlc3QodHlwZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKC9eKHZhcmNoYXJ8Y2hhcilcXChcXGQrXFwpJC8udGVzdCh0eXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBvcGVuID0gdHlwZS5pbmRleE9mKCc8Jyk7XG4gICAgaWYgKG9wZW4gPiAwICYmIHR5cGUuZW5kc1dpdGgoJz4nKSkge1xuICAgICAgICBjb25zdCBjdG9yID0gdHlwZS5zbGljZSgwLCBvcGVuKTtcbiAgICAgICAgY29uc3QgaW5uZXIgPSB0eXBlLnNsaWNlKG9wZW4gKyAxLCAtMSk7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gc3BsaXRUb3BMZXZlbChpbm5lcik7XG4gICAgICAgIHN3aXRjaCAoY3Rvcikge1xuICAgICAgICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDEgJiYgaXNWYWxpZEhpdmVUeXBlKHBhcnRzWzBdKTtcbiAgICAgICAgICAgIGNhc2UgJ21hcCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMiAmJiBwYXJ0cy5ldmVyeShpc1ZhbGlkSGl2ZVR5cGUpO1xuICAgICAgICAgICAgY2FzZSAndW5pb250eXBlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoID49IDEgJiYgcGFydHMuZXZlcnkoaXNWYWxpZEhpdmVUeXBlKTtcbiAgICAgICAgICAgIGNhc2UgJ3N0cnVjdCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA+PSAxICYmIHBhcnRzLmV2ZXJ5KGlzVmFsaWRIaXZlU3RydWN0RmllbGQpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBQb3N0Z3Jlc1xuXG5jb25zdCBQT1NUR1JFU19FWEFDVDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdzbWFsbGludCcsXG4gICAgJ2ludGVnZXInLFxuICAgICdpbnQnLFxuICAgICdpbnQyJyxcbiAgICAnaW50NCcsXG4gICAgJ2ludDgnLFxuICAgICdiaWdpbnQnLFxuICAgICdyZWFsJyxcbiAgICAnZmxvYXQ0JyxcbiAgICAnZmxvYXQ4JyxcbiAgICAnZG91YmxlIHByZWNpc2lvbicsXG4gICAgJ21vbmV5JyxcbiAgICAndGV4dCcsXG4gICAgJ2J5dGVhJyxcbiAgICAnYm9vbGVhbicsXG4gICAgJ2Jvb2wnLFxuICAgICdkYXRlJyxcbiAgICAndGltZXN0YW1wJyxcbiAgICAndGltZXN0YW1wdHonLFxuICAgICd0aW1lc3RhbXAgd2l0aCB0aW1lIHpvbmUnLFxuICAgICd0aW1lJyxcbiAgICAndGltZXR6JyxcbiAgICAndGltZSB3aXRoIHRpbWUgem9uZScsXG4gICAgJ2ludGVydmFsJyxcbiAgICAndXVpZCcsXG4gICAgJ2pzb24nLFxuICAgICdqc29uYicsXG4gICAgJ3htbCcsXG4gICAgJ2luZXQnLFxuICAgICdjaWRyJyxcbiAgICAnbWFjYWRkcicsXG4gICAgJ21hY2FkZHI4JyxcbiAgICAnc21hbGxzZXJpYWwnLFxuICAgICdzZXJpYWwnLFxuICAgICdiaWdzZXJpYWwnLFxuICAgICdzZXJpYWwyJyxcbiAgICAnc2VyaWFsNCcsXG4gICAgJ3NlcmlhbDgnLFxuICAgICd2YXJjaGFyJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXJhY3RlcicsXG4gICAgJ2NoYXJhY3RlciB2YXJ5aW5nJyxcbiAgICAnYnBjaGFyJyxcbiAgICAnbnVtZXJpYycsXG4gICAgJ2RlY2ltYWwnLFxuICAgICdiaXQnLFxuICAgICd2YXJiaXQnLFxuICAgICdiaXQgdmFyeWluZycsXG5dKTtcblxuY29uc3QgUE9TVEdSRVNfUEFSQU1fQUxMT1dFRDogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICd2YXJjaGFyJyxcbiAgICAnY2hhcicsXG4gICAgJ2NoYXJhY3RlcicsXG4gICAgJ2NoYXJhY3RlciB2YXJ5aW5nJyxcbiAgICAnYnBjaGFyJyxcbiAgICAnbnVtZXJpYycsXG4gICAgJ2RlY2ltYWwnLFxuICAgICdiaXQnLFxuICAgICd2YXJiaXQnLFxuICAgICdiaXQgdmFyeWluZycsXG4gICAgJ3RpbWUnLFxuICAgICd0aW1ldHonLFxuICAgICd0aW1lc3RhbXAnLFxuICAgICd0aW1lc3RhbXB0eicsXG4gICAgJ2ludGVydmFsJyxcbl0pO1xuXG4vKiogV2hldGhlciB0aGUgc3RyaW5nIGlzIGEgdmFsaWQgUG9zdGdyZXMgMTggY29sdW1uIHR5cGUuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFBvc3RncmVzVHlwZSh0eXBlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgdHlwZSA9IHR5cGVTdHIudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuXG4gICAgLy8vIFN0cmlwIG9uZSBvciBtb3JlIHRyYWlsaW5nIGFycmF5IG1hcmtlcnMgKGBbXWAsIGBbM11gKS5cbiAgICB0eXBlID0gdHlwZS5yZXBsYWNlKC8oXFxzKlxcW1xccypcXGQqXFxzKlxcXSkrJC8sICcnKS50cmltKCk7XG5cbiAgICBjb25zdCBwYXJhbU1hdGNoID0gL14oLio/KVxcKChbXildKilcXCkkLy5leGVjKHR5cGUpO1xuICAgIGlmIChwYXJhbU1hdGNoKSB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBwYXJhbU1hdGNoWzFdLnRyaW0oKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gcGFyYW1NYXRjaFsyXS50cmltKCk7XG4gICAgICAgIHJldHVybiBQT1NUR1JFU19QQVJBTV9BTExPV0VELmhhcyhiYXNlKSAmJiAvXlxcZCsoXFxzKixcXHMqXFxkKyk/JC8udGVzdChwYXJhbXMpO1xuICAgIH1cblxuICAgIHJldHVybiBQT1NUR1JFU19FWEFDVC5oYXModHlwZSk7XG59XG4iXX0=
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7QUE2REgsMENBbUNDO0FBMEZELDREQU1DO0FBR0Qsa0RBY0M7QUEvTUQsZ0ZBQWdGO0FBQ2hGLE9BQU87QUFFUCxNQUFNLGVBQWUsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDakQsU0FBUztJQUNULFVBQVU7SUFDVixLQUFLO0lBQ0wsU0FBUztJQUNULFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixrQkFBa0I7SUFDbEIsUUFBUTtJQUNSLFFBQVE7SUFDUixXQUFXO0lBQ1gsTUFBTTtJQUNOLFVBQVU7Q0FDYixDQUFDLENBQUM7QUFFSDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFZO0lBQy9CLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDakIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNmLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDZixDQUFDO2FBQU0sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDdEIsS0FBSyxJQUFJLENBQUMsQ0FBQztRQUNmLENBQUM7UUFDRCxJQUFJLElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEIsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sSUFBSSxJQUFJLENBQUM7UUFDcEIsQ0FBQztJQUNMLENBQUM7SUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJQUN6QyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2IsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztJQUNELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BELENBQUM7QUFFRCxnRUFBZ0U7QUFDaEUsU0FBZ0IsZUFBZSxDQUFDLE9BQWU7SUFDM0MsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBRTFDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLDRCQUE0QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9CLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkMsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDWCxLQUFLLE9BQU87Z0JBQ1IsT0FBTyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsS0FBSyxLQUFLO2dCQUNOLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM5RCxLQUFLLFdBQVc7Z0JBQ1osT0FBTyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdELEtBQUssUUFBUTtnQkFDVCxPQUFPLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztZQUNwRTtnQkFDSSxPQUFPLEtBQUssQ0FBQztRQUNyQixDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsV0FBVztBQUVYLE1BQU0sY0FBYyxHQUF3QixJQUFJLEdBQUcsQ0FBQztJQUNoRCxVQUFVO0lBQ1YsU0FBUztJQUNULEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07SUFDTixRQUFRO0lBQ1IsTUFBTTtJQUNOLFFBQVE7SUFDUixRQUFRO0lBQ1Isa0JBQWtCO0lBQ2xCLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUNQLFNBQVM7SUFDVCxNQUFNO0lBQ04sTUFBTTtJQUNOLFdBQVc7SUFDWCxhQUFhO0lBQ2IsMEJBQTBCO0lBQzFCLE1BQU07SUFDTixRQUFRO0lBQ1IscUJBQXFCO0lBQ3JCLFVBQVU7SUFDVixNQUFNO0lBQ04sTUFBTTtJQUNOLE9BQU87SUFDUCxLQUFLO0lBQ0wsTUFBTTtJQUNOLE1BQU07SUFDTixTQUFTO0lBQ1QsVUFBVTtJQUNWLGFBQWE7SUFDYixRQUFRO0lBQ1IsV0FBVztJQUNYLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxNQUFNO0lBQ04sV0FBVztJQUNYLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsU0FBUztJQUNULFNBQVM7SUFDVCxLQUFLO0lBQ0wsUUFBUTtJQUNSLGFBQWE7Q0FDaEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxzQkFBc0IsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDeEQsU0FBUztJQUNULE1BQU07SUFDTixXQUFXO0lBQ1gsbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixTQUFTO0lBQ1QsU0FBUztJQUNULEtBQUs7SUFDTCxRQUFRO0lBQ1IsYUFBYTtJQUNiLE1BQU07SUFDTixRQUFRO0lBQ1IsV0FBVztJQUNYLGFBQWE7SUFDYixVQUFVO0NBQ2IsQ0FBQyxDQUFDO0FBRUgsTUFBTSxtQkFBbUIsR0FBd0IsSUFBSSxHQUFHLENBQUM7SUFDckQsTUFBTTtJQUNOLFNBQVM7SUFDVCxtQkFBbUI7SUFDbkIsTUFBTTtJQUNOLFdBQVc7SUFDWCxRQUFRO0NBQ1gsQ0FBQyxDQUFDO0FBRUg7Ozs7OztHQU1HO0FBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsT0FBZTtJQUNwRCxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2RCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUN0RCxPQUFPLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsNkRBQTZEO0FBQzdELFNBQWdCLG1CQUFtQixDQUFDLE9BQWU7SUFDL0MsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFN0QsMkRBQTJEO0lBQzNELElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRXZELE1BQU0sVUFBVSxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuRCxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2IsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNwQyxPQUFPLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakYsQ0FBQztJQUVELE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQZXItZW5naW5lIGNvbHVtbi10eXBlIHJlZ2lzdHJpZXMgZm9yIEhpdmUgYW5kIFBvc3RncmVzLlxuICpcbiAqIEVhY2ggZnVuY3Rpb24gYW5zd2VycyBcImlzIHRoaXMgdHlwZSBzdHJpbmcgdmFsaWQgZm9yIHRoaXMgZW5naW5lP1wiLiBUaGVcbiAqIGNvbmNyZXRlIGBUYWJsZVR5cGVCYXNlYCBzdWJjbGFzc2VzIGRlbGVnYXRlIGBpc1ZhbGlkQ29sdW1uVHlwZWAgaGVyZSAoYW5kXG4gKiB0aGUgSWNlYmVyZyBzdWJjbGFzcyBkZWxlZ2F0ZXMgdG8gYC4vaWNlYmVyZ2ApLlxuICovXG5cbi8vLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyBIaXZlXG5cbmNvbnN0IEhJVkVfUFJJTUlUSVZFUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICd0aW55aW50JyxcbiAgICAnc21hbGxpbnQnLFxuICAgICdpbnQnLFxuICAgICdpbnRlZ2VyJyxcbiAgICAnYmlnaW50JyxcbiAgICAnYm9vbGVhbicsXG4gICAgJ2Zsb2F0JyxcbiAgICAnZG91YmxlJyxcbiAgICAnZG91YmxlIHByZWNpc2lvbicsXG4gICAgJ3N0cmluZycsXG4gICAgJ2JpbmFyeScsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ2RhdGUnLFxuICAgICdpbnRlcnZhbCcsXG5dKTtcblxuLyoqXG4gKiBTcGxpdCBhIGdlbmVyaWMtdHlwZSBib2R5IG9uIHRvcC1sZXZlbCBjb21tYXMgKGlnbm9yaW5nIGNvbW1hcyBuZXN0ZWQgaW5zaWRlXG4gKiBgPC4uLj5gKS5cbiAqXG4gKiBAcGFyYW0gYm9keSBJbm5lciB0ZXh0IG9mIGEgZ2VuZXJpYyB0eXBlLlxuICogQHJldHVybnMgVGhlIHRvcC1sZXZlbCBjb21tYS1zZXBhcmF0ZWQgcGFydHMuXG4gKi9cbmZ1bmN0aW9uIHNwbGl0VG9wTGV2ZWwoYm9keTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IGN1cnJlbnQgPSAnJztcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgYm9keSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gJzwnKSB7XG4gICAgICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICc+Jykge1xuICAgICAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhciA9PT0gJywnICYmIGRlcHRoID09PSAwKSB7XG4gICAgICAgICAgICBwYXJ0cy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgY3VycmVudCA9ICcnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudCArPSBjaGFyO1xuICAgICAgICB9XG4gICAgfVxuICAgIHBhcnRzLnB1c2goY3VycmVudCk7XG4gICAgcmV0dXJuIHBhcnRzLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkSGl2ZVN0cnVjdEZpZWxkKGZpZWxkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjb2xvbiA9IGZpZWxkLmluZGV4T2YoJzonKTtcbiAgICBpZiAoY29sb24gPD0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBmaWVsZC5zbGljZSgwLCBjb2xvbikudHJpbSgpO1xuICAgIGNvbnN0IHR5cGUgPSBmaWVsZC5zbGljZShjb2xvbiArIDEpLnRyaW0oKTtcbiAgICByZXR1cm4gbmFtZS5sZW5ndGggPiAwICYmIGlzVmFsaWRIaXZlVHlwZSh0eXBlKTtcbn1cblxuLyoqIFdoZXRoZXIgdGhlIHN0cmluZyBpcyBhIHZhbGlkIEhpdmUgKHBhcnF1ZXQpIGNvbHVtbiB0eXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRIaXZlVHlwZSh0eXBlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCB0eXBlID0gdHlwZVN0ci50cmltKCkudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmIChISVZFX1BSSU1JVElWRVMuaGFzKHR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICgvXmRlY2ltYWxcXChcXGQrKCxcXHMqXFxkKyk/XFwpJC8udGVzdCh0eXBlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoL14odmFyY2hhcnxjaGFyKVxcKFxcZCtcXCkkLy50ZXN0KHR5cGUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG9wZW4gPSB0eXBlLmluZGV4T2YoJzwnKTtcbiAgICBpZiAob3BlbiA+IDAgJiYgdHlwZS5lbmRzV2l0aCgnPicpKSB7XG4gICAgICAgIGNvbnN0IGN0b3IgPSB0eXBlLnNsaWNlKDAsIG9wZW4pO1xuICAgICAgICBjb25zdCBpbm5lciA9IHR5cGUuc2xpY2Uob3BlbiArIDEsIC0xKTtcbiAgICAgICAgY29uc3QgcGFydHMgPSBzcGxpdFRvcExldmVsKGlubmVyKTtcbiAgICAgICAgc3dpdGNoIChjdG9yKSB7XG4gICAgICAgICAgICBjYXNlICdhcnJheSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiBpc1ZhbGlkSGl2ZVR5cGUocGFydHNbMF0pO1xuICAgICAgICAgICAgY2FzZSAnbWFwJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAyICYmIHBhcnRzLmV2ZXJ5KGlzVmFsaWRIaXZlVHlwZSk7XG4gICAgICAgICAgICBjYXNlICd1bmlvbnR5cGUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0cy5sZW5ndGggPj0gMSAmJiBwYXJ0cy5ldmVyeShpc1ZhbGlkSGl2ZVR5cGUpO1xuICAgICAgICAgICAgY2FzZSAnc3RydWN0JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFydHMubGVuZ3RoID49IDEgJiYgcGFydHMuZXZlcnkoaXNWYWxpZEhpdmVTdHJ1Y3RGaWVsZCk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuLy8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFBvc3RncmVzXG5cbmNvbnN0IFBPU1RHUkVTX0VYQUNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ3NtYWxsaW50JyxcbiAgICAnaW50ZWdlcicsXG4gICAgJ2ludCcsXG4gICAgJ2ludDInLFxuICAgICdpbnQ0JyxcbiAgICAnaW50OCcsXG4gICAgJ2JpZ2ludCcsXG4gICAgJ3JlYWwnLFxuICAgICdmbG9hdDQnLFxuICAgICdmbG9hdDgnLFxuICAgICdkb3VibGUgcHJlY2lzaW9uJyxcbiAgICAnbW9uZXknLFxuICAgICd0ZXh0JyxcbiAgICAnYnl0ZWEnLFxuICAgICdib29sZWFuJyxcbiAgICAnYm9vbCcsXG4gICAgJ2RhdGUnLFxuICAgICd0aW1lc3RhbXAnLFxuICAgICd0aW1lc3RhbXB0eicsXG4gICAgJ3RpbWVzdGFtcCB3aXRoIHRpbWUgem9uZScsXG4gICAgJ3RpbWUnLFxuICAgICd0aW1ldHonLFxuICAgICd0aW1lIHdpdGggdGltZSB6b25lJyxcbiAgICAnaW50ZXJ2YWwnLFxuICAgICd1dWlkJyxcbiAgICAnanNvbicsXG4gICAgJ2pzb25iJyxcbiAgICAneG1sJyxcbiAgICAnaW5ldCcsXG4gICAgJ2NpZHInLFxuICAgICdtYWNhZGRyJyxcbiAgICAnbWFjYWRkcjgnLFxuICAgICdzbWFsbHNlcmlhbCcsXG4gICAgJ3NlcmlhbCcsXG4gICAgJ2JpZ3NlcmlhbCcsXG4gICAgJ3NlcmlhbDInLFxuICAgICdzZXJpYWw0JyxcbiAgICAnc2VyaWFsOCcsXG4gICAgJ3ZhcmNoYXInLFxuICAgICdjaGFyJyxcbiAgICAnY2hhcmFjdGVyJyxcbiAgICAnY2hhcmFjdGVyIHZhcnlpbmcnLFxuICAgICdicGNoYXInLFxuICAgICdudW1lcmljJyxcbiAgICAnZGVjaW1hbCcsXG4gICAgJ2JpdCcsXG4gICAgJ3ZhcmJpdCcsXG4gICAgJ2JpdCB2YXJ5aW5nJyxcbl0pO1xuXG5jb25zdCBQT1NUR1JFU19QQVJBTV9BTExPV0VEOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ3ZhcmNoYXInLFxuICAgICdjaGFyJyxcbiAgICAnY2hhcmFjdGVyJyxcbiAgICAnY2hhcmFjdGVyIHZhcnlpbmcnLFxuICAgICdicGNoYXInLFxuICAgICdudW1lcmljJyxcbiAgICAnZGVjaW1hbCcsXG4gICAgJ2JpdCcsXG4gICAgJ3ZhcmJpdCcsXG4gICAgJ2JpdCB2YXJ5aW5nJyxcbiAgICAndGltZScsXG4gICAgJ3RpbWV0eicsXG4gICAgJ3RpbWVzdGFtcCcsXG4gICAgJ3RpbWVzdGFtcHR6JyxcbiAgICAnaW50ZXJ2YWwnLFxuXSk7XG5cbmNvbnN0IFBPU1RHUkVTX0NPTExBVEFCTEU6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0KFtcbiAgICAndGV4dCcsXG4gICAgJ3ZhcmNoYXInLFxuICAgICdjaGFyYWN0ZXIgdmFyeWluZycsXG4gICAgJ2NoYXInLFxuICAgICdjaGFyYWN0ZXInLFxuICAgICdicGNoYXInLFxuXSk7XG5cbi8qKlxuICogV2hldGhlciBhIFBvc3RncmVzIGNvbHVtbiB0eXBlIGlzIGNvbGxhdGFibGUgKGEgdGV4dC9jaGFyYWN0ZXIgdHlwZSksIHNvIGFcbiAqIGBDT0xMQVRFYCBjbGF1c2UgaXMgbGVnYWwgb24gaXQuIEFycmF5IGFuZCBsZW5ndGggbWFya2VycyBhcmUgc3RyaXBwZWQgZmlyc3QuXG4gKlxuICogQHBhcmFtIHR5cGVTdHIgQ29sdW1uIHR5cGUgc3RyaW5nLlxuICogQHJldHVybnMgVHJ1ZSB3aGVuIHRoZSBiYXNlIHR5cGUgaXMgYSBjb2xsYXRhYmxlIHRleHQgdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUG9zdGdyZXNDb2xsYXRhYmxlVHlwZSh0eXBlU3RyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgdHlwZSA9IHR5cGVTdHIudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIHR5cGUgPSB0eXBlLnJlcGxhY2UoLyhcXHMqXFxbXFxzKlxcZCpcXHMqXFxdKSskLywgJycpLnRyaW0oKTtcbiAgICBjb25zdCBwYXJhbU1hdGNoID0gL14oLio/KVxcKFteKV0qXFwpJC8uZXhlYyh0eXBlKTtcbiAgICBjb25zdCBiYXNlID0gcGFyYW1NYXRjaCA/IHBhcmFtTWF0Y2hbMV0udHJpbSgpIDogdHlwZTtcbiAgICByZXR1cm4gUE9TVEdSRVNfQ09MTEFUQUJMRS5oYXMoYmFzZSk7XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBzdHJpbmcgaXMgYSB2YWxpZCBQb3N0Z3JlcyAxOCBjb2x1bW4gdHlwZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUG9zdGdyZXNUeXBlKHR5cGVTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGxldCB0eXBlID0gdHlwZVN0ci50cmltKCkudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG5cbiAgICAvLy8gU3RyaXAgb25lIG9yIG1vcmUgdHJhaWxpbmcgYXJyYXkgbWFya2VycyAoYFtdYCwgYFszXWApLlxuICAgIHR5cGUgPSB0eXBlLnJlcGxhY2UoLyhcXHMqXFxbXFxzKlxcZCpcXHMqXFxdKSskLywgJycpLnRyaW0oKTtcblxuICAgIGNvbnN0IHBhcmFtTWF0Y2ggPSAvXiguKj8pXFwoKFteKV0qKVxcKSQvLmV4ZWModHlwZSk7XG4gICAgaWYgKHBhcmFtTWF0Y2gpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhcmFtTWF0Y2hbMV0udHJpbSgpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBwYXJhbU1hdGNoWzJdLnRyaW0oKTtcbiAgICAgICAgcmV0dXJuIFBPU1RHUkVTX1BBUkFNX0FMTE9XRUQuaGFzKGJhc2UpICYmIC9eXFxkKyhcXHMqLFxccypcXGQrKT8kLy50ZXN0KHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFBPU1RHUkVTX0VYQUNULmhhcyh0eXBlKTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flexdataset",
3
- "version": "0.15.0",
3
+ "version": "0.17.0",
4
4
  "license": "Apache-2.0",
5
5
  "description": "Flexible Dataset Definition (FDD) — validator and tooling for the FDD dataset standard.",
6
6
  "author": "Rodrigo Carvajal",