css-to-tailwind-react 0.1.2 → 0.2.1

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.
@@ -13,6 +13,8 @@ const fileWriter_1 = require("./fileWriter");
13
13
  const logger_1 = require("./utils/logger");
14
14
  const breakpointResolver_1 = require("./utils/breakpointResolver");
15
15
  const variantAssembler_1 = require("./utils/variantAssembler");
16
+ const jsxDescendantTransformer_1 = require("./jsxDescendantTransformer");
17
+ const conflictResolver_1 = require("./utils/conflictResolver");
16
18
  async function transformFiles(files, options) {
17
19
  const results = {
18
20
  filesScanned: files.length,
@@ -28,6 +30,7 @@ async function transformFiles(files, options) {
28
30
  const fileWriter = new fileWriter_1.FileWriter({ dryRun: options.dryRun });
29
31
  (0, breakpointResolver_1.clearBreakpointCache)();
30
32
  const cssClassMap = {};
33
+ const allDescendantRules = [];
31
34
  const cssFileResults = new Map();
32
35
  logger_1.logger.info('\nšŸ” Phase 1: Analyzing files...');
33
36
  if (!options.skipExternal) {
@@ -40,7 +43,13 @@ async function transformFiles(files, options) {
40
43
  const partiallyConvertedRules = result.rules.filter(r => r.partialConversion).length;
41
44
  const fullyConvertible = totalRules > 0 && totalRules === fullyConvertedRules && partiallyConvertedRules === 0;
42
45
  result.rules.forEach(rule => {
43
- if (rule.fullyConverted) {
46
+ if (rule.isDescendant) {
47
+ if (rule.convertedClasses.length > 0) {
48
+ allDescendantRules.push(rule);
49
+ results.stylesConverted += rule.declarations.length;
50
+ }
51
+ }
52
+ else if (rule.fullyConverted && rule.className) {
44
53
  const existing = cssClassMap[rule.className];
45
54
  if (existing) {
46
55
  mergeRuleIntoClassInfo(existing, rule);
@@ -109,7 +118,13 @@ async function transformFiles(files, options) {
109
118
  content = internalResult.html;
110
119
  hasChanges = true;
111
120
  internalResult.rules.forEach(rule => {
112
- if (rule.convertedClasses.length > 0) {
121
+ if (rule.isDescendant) {
122
+ if (rule.convertedClasses.length > 0) {
123
+ allDescendantRules.push(rule);
124
+ results.stylesConverted += rule.declarations.length;
125
+ }
126
+ }
127
+ else if (rule.convertedClasses.length > 0 && rule.className) {
113
128
  const existing = cssClassMap[rule.className];
114
129
  if (existing) {
115
130
  mergeRuleIntoClassInfo(existing, rule);
@@ -162,6 +177,31 @@ async function transformFiles(files, options) {
162
177
  });
163
178
  }
164
179
  }
180
+ if (allDescendantRules.length > 0) {
181
+ logger_1.logger.info('\n🌳 Phase 3.5: Applying descendant selector rules...');
182
+ for (const [filePath, fileResult] of jsxFileResults) {
183
+ let content = fileResult.newContent;
184
+ let hasChanges = fileResult.hasChanges;
185
+ const descendantResult = (0, jsxDescendantTransformer_1.transformDescendantSelectors)(content, allDescendantRules);
186
+ if (descendantResult.hasChanges) {
187
+ content = descendantResult.code;
188
+ hasChanges = true;
189
+ results.classesReplaced += descendantResult.transformations;
190
+ logger_1.logger.verbose(`Applied ${descendantResult.transformations} descendant transformations in ${path_1.default.basename(filePath)}`);
191
+ }
192
+ if (descendantResult.warnings.length > 0) {
193
+ results.warnings += descendantResult.warnings.length;
194
+ descendantResult.warnings.forEach(warning => {
195
+ logger_1.logger.verbose(`āš ļø ${filePath}: ${warning}`);
196
+ });
197
+ }
198
+ jsxFileResults.set(filePath, {
199
+ ...fileResult,
200
+ newContent: content,
201
+ hasChanges
202
+ });
203
+ }
204
+ }
165
205
  logger_1.logger.info('\nšŸ’¾ Phase 4: Writing changes...');
166
206
  for (const [filePath, fileResult] of jsxFileResults) {
167
207
  if (fileResult.hasChanges) {
@@ -204,7 +244,11 @@ function buildClassInfoFromRule(rule, sourceFile) {
204
244
  return {
205
245
  utilities: rule.utilities.map(u => ({
206
246
  value: u.value,
207
- variants: (0, variantAssembler_1.normalizeVariantOrder)([...u.variants])
247
+ variants: (0, variantAssembler_1.normalizeVariantOrder)([...u.variants]),
248
+ cssProperty: u.cssProperty,
249
+ specificity: u.specificity,
250
+ sourceOrder: u.sourceOrder,
251
+ originalSelector: rule.selector
208
252
  })),
209
253
  sourceFile,
210
254
  fullyConvertible: true
@@ -212,26 +256,20 @@ function buildClassInfoFromRule(rule, sourceFile) {
212
256
  }
213
257
  function mergeRuleIntoClassInfo(info, rule) {
214
258
  for (const utility of rule.utilities) {
215
- const existing = info.utilities.find(u => u.value === utility.value);
216
- if (existing) {
217
- for (const variant of utility.variants) {
218
- if (!existing.variants.includes(variant)) {
219
- existing.variants.push(variant);
220
- }
221
- }
222
- existing.variants = (0, variantAssembler_1.normalizeVariantOrder)(existing.variants);
223
- }
224
- else {
225
- info.utilities.push({
226
- value: utility.value,
227
- variants: (0, variantAssembler_1.normalizeVariantOrder)([...utility.variants])
228
- });
229
- }
259
+ const utilityWithMeta = {
260
+ value: utility.value,
261
+ variants: (0, variantAssembler_1.normalizeVariantOrder)([...utility.variants]),
262
+ cssProperty: utility.cssProperty,
263
+ specificity: utility.specificity,
264
+ sourceOrder: utility.sourceOrder,
265
+ originalSelector: rule.selector
266
+ };
267
+ info.utilities.push(utilityWithMeta);
230
268
  }
231
269
  }
232
270
  function assembleTailwindClasses(info) {
233
- const merged = (0, variantAssembler_1.mergeUtilities)(info.utilities);
234
- return (0, variantAssembler_1.assembleUtilities)(merged).join(' ');
271
+ const { resolved } = (0, conflictResolver_1.resolveConflicts)(info.utilities, false);
272
+ return (0, conflictResolver_1.resolvedUtilitiesToStrings)(resolved).join(' ');
235
273
  }
236
274
  function replaceClassNameReferences(code, classMap) {
237
275
  let hasChanges = false;
@@ -266,4 +304,4 @@ function replaceClassNameReferences(code, classMap) {
266
304
  });
267
305
  return { code: modifiedCode, hasChanges, replacements };
268
306
  }
269
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE0Q0Esd0NBb09DO0FBaFJELDRDQUFvQjtBQUNwQixnREFBd0I7QUFFeEIscURBQWtEO0FBQ2xELDJDQUF3QztBQUN4QywyQ0FBcUU7QUFDckUsNkNBQTBDO0FBRTFDLDJDQUF3QztBQUN4QyxtRUFBa0U7QUFDbEUsK0RBSWtDO0FBOEIzQixLQUFLLFVBQVUsY0FBYyxDQUNsQyxLQUFvQixFQUNwQixPQUF5QjtJQUV6QixNQUFNLE9BQU8sR0FBcUI7UUFDaEMsWUFBWSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQzFCLGFBQWEsRUFBRSxDQUFDO1FBQ2hCLGVBQWUsRUFBRSxDQUFDO1FBQ2xCLGVBQWUsRUFBRSxDQUFDO1FBQ2xCLFFBQVEsRUFBRSxDQUFDO0tBQ1osQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFHLElBQUksK0JBQWMsQ0FBQyxPQUFPLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUkscUJBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUM7SUFDdkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUFJLHVCQUFVLENBQUMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFOUQsSUFBQSx5Q0FBb0IsR0FBRSxDQUFDO0lBRXZCLE1BQU0sV0FBVyxHQUFnQixFQUFFLENBQUM7SUFDcEMsTUFBTSxjQUFjLEdBT2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUVmLGVBQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtD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QzVFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjLG1CQUFtQixHQUFHLENBQUMsQ0FBQztZQUNwRixVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLFlBQVksRUFBRSxDQUFDO1lBQ2YsZUFBTSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsUUFBUSxhQUFhLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNjYW5uZWRGaWxlIH0gZnJvbSAnLi9zY2FubmVyJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyIH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5pbXBvcnQgeyBKU1hQYXJzZXIgfSBmcm9tICcuL2pzeFBhcnNlcic7XG5pbXBvcnQgeyBDU1NQYXJzZXIsIENTU1J1bGUsIFV0aWxpdHlXaXRoVmFyaWFudCB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmltcG9ydCB7IEZpbGVXcml0ZXIgfSBmcm9tICcuL2ZpbGVXcml0ZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBjbGVhckJyZWFrcG9pbnRDYWNoZSB9IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcbmltcG9ydCB7IFxuICBhc3NlbWJsZVV0aWxpdGllcywgXG4gIG1lcmdlVXRpbGl0aWVzLFxuICBub3JtYWxpemVWYXJpYW50T3JkZXIgXG59IGZyb20gJy4vdXRpbHMvdmFyaWFudEFzc2VtYmxlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtT3B0aW9ucyB7XG4gIGRyeVJ1bjogYm9vbGVhbjtcbiAgZGVsZXRlQ3NzOiBib29sZWFuO1xuICBza2lwRXh0ZXJuYWw6IGJvb2xlYW47XG4gIHNraXBJbmxpbmU6IGJvb2xlYW47XG4gIHNraXBJbnRlcm5hbDogYm9vbGVhbjtcbiAgdGFpbHdpbmRDb25maWc6IFRhaWx3aW5kQ29uZmlnIHwgbnVsbDtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1SZXN1bHRzIHtcbiAgZmlsZXNTY2FubmVkOiBudW1iZXI7XG4gIGZpbGVzTW9kaWZpZWQ6IG51bWJlcjtcbiAgc3R5bGVzQ29udmVydGVkOiBudW1iZXI7XG4gIGNsYXNzZXNSZXBsYWNlZDogbnVtYmVyO1xuICB3YXJuaW5nczogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQ2xhc3NJbmZvIHtcbiAgdXRpbGl0aWVzOiBBcnJheTx7IHZhbHVlOiBzdHJpbmc7IHZhcmlhbnRzOiBzdHJpbmdbXSB9PjtcbiAgc291cmNlRmlsZTogc3RyaW5nO1xuICBmdWxseUNvbnZlcnRpYmxlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQ1NTQ2xhc3NNYXAge1xuICBbY2xhc3NOYW1lOiBzdHJpbmddOiBDbGFzc0luZm87XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmFuc2Zvcm1GaWxlcyhcbiAgZmlsZXM6IFNjYW5uZWRGaWxlW10sXG4gIG9wdGlvbnM6IFRyYW5zZm9ybU9wdGlvbnNcbik6IFByb21pc2U8VHJhbnNmb3JtUmVzdWx0cz4ge1xuICBjb25zdCByZXN1bHRzOiBUcmFuc2Zvcm1SZXN1bHRzID0ge1xuICAgIGZpbGVzU2Nhbm5lZDogZmlsZXMubGVuZ3RoLFxuICAgIGZpbGVzTW9kaWZpZWQ6IDAsXG4gICAgc3R5bGVzQ29udmVydGVkOiAwLFxuICAgIGNsYXNzZXNSZXBsYWNlZDogMCxcbiAgICB3YXJuaW5nczogMFxuICB9O1xuXG4gIGNvbnN0IG1hcHBlciA9IG5ldyBUYWlsd2luZE1hcHBlcihvcHRpb25zLnRhaWx3aW5kQ29uZmlnIHx8IHt9KTtcbiAgY29uc3QganN4UGFyc2VyID0gbmV3IEpTWFBhcnNlcihtYXBwZXIpO1xuICBjb25zdCBzY3JlZW5zID0gb3B0aW9ucy50YWlsd2luZENvbmZpZz8udGhlbWU/LnNjcmVlbnM7XG4gIGNvbnN0IGNzc1BhcnNlciA9IG5ldyBDU1NQYXJzZXIobWFwcGVyLCBzY3JlZW5zKTtcbiAgY29uc3QgZmlsZVdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKHsgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1biB9KTtcblxuICBjbGVhckJyZWFrcG9pbnRDYWNoZSgpO1xuXG4gIGNvbnN0IGNzc0NsYXNzTWFwOiBDU1NDbGFzc01hcCA9IHt9O1xuICBjb25zdCBjc3NGaWxlUmVzdWx0czogTWFwPHN0cmluZywge1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBuZXdDb250ZW50OiBzdHJpbmc7XG4gICAgcnVsZXM6IENTU1J1bGVbXTtcbiAgICBjYW5EZWxldGU6IGJvb2xlYW47XG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgICBmdWxseUNvbnZlcnRpYmxlOiBib29sZWFuO1xuICB9PiA9IG5ldyBNYXAoKTtcblxuICBsb2dnZXIuaW5mbygnXFxu8J+UjSBQaGFzZSAxOiBBbmFseXppbmcgZmlsZXMuLi4nKTtcblxuICBpZiAoIW9wdGlvbnMuc2tpcEV4dGVybmFsKSB7XG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzLmZpbHRlcihmID0+IGYudHlwZSA9PT0gJ2NzcycpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUucGF0aCwgJ3V0Zi04Jyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNzc1BhcnNlci5wYXJzZShjb250ZW50LCBmaWxlLnBhdGgpO1xuXG4gICAgICAgIGNvbnN0IHRvdGFsUnVsZXMgPSByZXN1bHQucnVsZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmdWxseUNvbnZlcnRlZFJ1bGVzID0gcmVzdWx0LnJ1bGVzLmZpbHRlcihyID0+IHIuZnVsbHlDb252ZXJ0ZWQpLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcGFydGlhbGx5Q29udmVydGVkUnVsZXMgPSByZXN1bHQucnVsZXMuZmlsdGVyKHIgPT4gci5wYXJ0aWFsQ29udmVyc2lvbikubGVuZ3RoO1xuICAgICAgICBjb25zdCBmdWxseUNvbnZlcnRpYmxlID0gdG90YWxSdWxlcyA+IDAgJiYgdG90YWxSdWxlcyA9PT0gZnVsbHlDb252ZXJ0ZWRSdWxlcyAmJiBwYXJ0aWFsbHlDb252ZXJ0ZWRSdWxlcyA9PT0gMDtcblxuICAgICAgICByZXN1bHQucnVsZXMuZm9yRWFjaChydWxlID0+IHtcbiAgICAgICAgICBpZiAocnVsZS5mdWxseUNvbnZlcnRlZCkge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV07XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgbWVyZ2VSdWxlSW50b0NsYXNzSW5mbyhleGlzdGluZywgcnVsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV0gPSBidWlsZENsYXNzSW5mb0Zyb21SdWxlKHJ1bGUsIGZpbGUucGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgfSBlbHNlIGlmIChydWxlLnBhcnRpYWxDb252ZXJzaW9uKSB7XG4gICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoO1xuICAgICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgUnVsZSAuJHtydWxlLmNsYXNzTmFtZX06IHBhcnRpYWwgY29udmVyc2lvbiAoJHtydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RofS8ke3J1bGUuZGVjbGFyYXRpb25zLmxlbmd0aH0gZGVjbGFyYXRpb25zKWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY3NzRmlsZVJlc3VsdHMuc2V0KGZpbGUucGF0aCwge1xuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgICAgbmV3Q29udGVudDogcmVzdWx0LmNzcyxcbiAgICAgICAgICBydWxlczogcmVzdWx0LnJ1bGVzLFxuICAgICAgICAgIGNhbkRlbGV0ZTogcmVzdWx0LmNhbkRlbGV0ZSxcbiAgICAgICAgICBoYXNDaGFuZ2VzOiByZXN1bHQuaGFzQ2hhbmdlcyxcbiAgICAgICAgICBmdWxseUNvbnZlcnRpYmxlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3VsdHMud2FybmluZ3MgKz0gcmVzdWx0Lndhcm5pbmdzLmxlbmd0aDtcblxuICAgICAgICBsb2dnZXIudmVyYm9zZShgQW5hbHl6ZWQgJHtmaWxlLnBhdGh9OmApO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgICAtIFRvdGFsIHJ1bGVzOiAke3RvdGFsUnVsZXN9YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGAgIC0gRnVsbHkgY29udmVydGVkIHJ1bGVzOiAke2Z1bGx5Q29udmVydGVkUnVsZXN9YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGAgIC0gUGFydGlhbGx5IGNvbnZlcnRlZCBydWxlczogJHtwYXJ0aWFsbHlDb252ZXJ0ZWRSdWxlc31gKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgLSBGdWxseSBjb252ZXJ0aWJsZTogJHtmdWxseUNvbnZlcnRpYmxlfWApO1xuXG4gICAgICAgIHJlc3VsdC53YXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGDimqDvuI8gICR7ZmlsZS5wYXRofTogJHt3YXJuaW5nfWApO1xuICAgICAgICB9KTtcblxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gYW5hbHl6ZSAke2ZpbGUucGF0aH06YCwgZXJyb3IpO1xuICAgICAgICByZXN1bHRzLndhcm5pbmdzKys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oJ1xcbuKam++4jyAgUGhhc2UgMjogVHJhbnNmb3JtaW5nIFJlYWN0IGNvbXBvbmVudHMuLi4nKTtcblxuICBjb25zdCBqc3hGaWxlUmVzdWx0czogTWFwPHN0cmluZywge1xuICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICBuZXdDb250ZW50OiBzdHJpbmc7XG4gICAgaGFzQ2hhbmdlczogYm9vbGVhbjtcbiAgfT4gPSBuZXcgTWFwKCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzLmZpbHRlcihmID0+IGYudHlwZSA9PT0gJ2pzeCcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUucGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCBvcmlnaW5hbENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgICAgIGxldCBmaWxlV2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGlmICghb3B0aW9ucy5za2lwSW5saW5lKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QganN4UmVzdWx0ID0ganN4UGFyc2VyLnBhcnNlKGNvbnRlbnQsIGZpbGUucGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGpzeFJlc3VsdC5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgICBjb250ZW50ID0ganN4UmVzdWx0LmNvZGU7XG4gICAgICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc3VsdHMuc3R5bGVzQ29udmVydGVkICs9IGpzeFJlc3VsdC50cmFuc2Zvcm1hdGlvbnMucmVkdWNlKFxuICAgICAgICAgICAgICAoc3VtLCB0KSA9PiBzdW0gKyB0LmNsYXNzZXMubGVuZ3RoLCAwXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZmlsZVdhcm5pbmdzLnB1c2goLi4uanN4UmVzdWx0Lndhcm5pbmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBKU1ggaW5saW5lIHN0eWxlcyBpbiAke2ZpbGUucGF0aH06ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgZmlsZVdhcm5pbmdzLnB1c2goYEpTWCBwYXJzZSBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIW9wdGlvbnMuc2tpcEludGVybmFsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaW50ZXJuYWxSZXN1bHQgPSBhd2FpdCBjc3NQYXJzZXIucGFyc2VJbnRlcm5hbENTUyhjb250ZW50LCBmaWxlLnBhdGgpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChpbnRlcm5hbFJlc3VsdC5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgICBjb250ZW50ID0gaW50ZXJuYWxSZXN1bHQuaHRtbDtcbiAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpbnRlcm5hbFJlc3VsdC5ydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgICAgICBpZiAocnVsZS5jb252ZXJ0ZWRDbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGNzc0NsYXNzTWFwW3J1bGUuY2xhc3NOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgICAgICAgICAgICAgIG1lcmdlUnVsZUludG9DbGFzc0luZm8oZXhpc3RpbmcsIHJ1bGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV0gPSBidWlsZENsYXNzSW5mb0Zyb21SdWxlKHJ1bGUsIGZpbGUucGF0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdHMuc3R5bGVzQ29udmVydGVkICs9IHJ1bGUuZGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGZpbGVXYXJuaW5ncy5wdXNoKC4uLmludGVybmFsUmVzdWx0Lndhcm5pbmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oYEZhaWxlZCB0byBwYXJzZSBpbnRlcm5hbCBDU1MgaW4gJHtmaWxlLnBhdGh9OiAke2Vycm9yfWApO1xuICAgICAgICAgIGZpbGVXYXJuaW5ncy5wdXNoKGBJbnRlcm5hbCBDU1MgcGFyc2UgZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGUucGF0aCwge1xuICAgICAgICBjb250ZW50OiBvcmlnaW5hbENvbnRlbnQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuXG4gICAgICByZXN1bHRzLndhcm5pbmdzICs9IGZpbGVXYXJuaW5ncy5sZW5ndGg7XG5cbiAgICAgIGZpbGVXYXJuaW5ncy5mb3JFYWNoKHdhcm5pbmcgPT4ge1xuICAgICAgICBsb2dnZXIudmVyYm9zZShg4pqg77iPICAke2ZpbGUucGF0aH06ICR7d2FybmluZ31gKTtcbiAgICAgIH0pO1xuXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRmFpbGVkIHRvIHByb2Nlc3MgJHtmaWxlLnBhdGh9OmAsIGVycm9yKTtcbiAgICAgIHJlc3VsdHMud2FybmluZ3MrKztcbiAgICB9XG4gIH1cblxuICBpZiAoT2JqZWN0LmtleXMoY3NzQ2xhc3NNYXApLmxlbmd0aCA+IDApIHtcbiAgICBsb2dnZXIuaW5mbygnXFxu8J+UhCBQaGFzZSAzOiBSZXBsYWNpbmcgY2xhc3NOYW1lIHJlZmVyZW5jZXMuLi4nKTtcblxuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBqc3hGaWxlUmVzdWx0cykge1xuICAgICAgbGV0IGNvbnRlbnQgPSBmaWxlUmVzdWx0Lm5ld0NvbnRlbnQ7XG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IGZpbGVSZXN1bHQuaGFzQ2hhbmdlcztcblxuICAgICAgY29uc3QgcmVwbGFjZW1lbnRSZXN1bHQgPSByZXBsYWNlQ2xhc3NOYW1lUmVmZXJlbmNlcyhjb250ZW50LCBjc3NDbGFzc01hcCk7XG4gICAgICBpZiAocmVwbGFjZW1lbnRSZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICBjb250ZW50ID0gcmVwbGFjZW1lbnRSZXN1bHQuY29kZTtcbiAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgIHJlc3VsdHMuY2xhc3Nlc1JlcGxhY2VkICs9IHJlcGxhY2VtZW50UmVzdWx0LnJlcGxhY2VtZW50cztcbiAgICAgICAgXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCAke3JlcGxhY2VtZW50UmVzdWx0LnJlcGxhY2VtZW50c30gY2xhc3MgcmVmZXJlbmNlcyBpbiAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfWApO1xuICAgICAgfVxuXG4gICAgICBqc3hGaWxlUmVzdWx0cy5zZXQoZmlsZVBhdGgsIHtcbiAgICAgICAgLi4uZmlsZVJlc3VsdCxcbiAgICAgICAgbmV3Q29udGVudDogY29udGVudCxcbiAgICAgICAgaGFzQ2hhbmdlc1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oJ1xcbvCfkr4gUGhhc2UgNDogV3JpdGluZyBjaGFuZ2VzLi4uJyk7XG5cbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGpzeEZpbGVSZXN1bHRzKSB7XG4gICAgaWYgKGZpbGVSZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZpbGVXcml0ZXIud3JpdGVGaWxlKGZpbGVQYXRoLCBmaWxlUmVzdWx0Lm5ld0NvbnRlbnQsIGZpbGVSZXN1bHQuY29udGVudCk7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICByZXN1bHRzLmZpbGVzTW9kaWZpZWQrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIW9wdGlvbnMuc2tpcEV4dGVybmFsKSB7XG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGNzc0ZpbGVSZXN1bHRzKSB7XG4gICAgICBpZiAoIWZpbGVSZXN1bHQuaGFzQ2hhbmdlcykgY29udGludWU7XG5cbiAgICAgIGlmICghZmlsZVJlc3VsdC5mdWxseUNvbnZlcnRpYmxlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKGDij63vuI8gIFNraXBwaW5nICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9IC0gbm90IGZ1bGx5IGNvbnZlcnRpYmxlICh3b3VsZCBicmVhayBzdHlsZXMpYCk7XG4gICAgICAgIGxvZ2dlci53YXJuKGAgICBDb252ZXJ0aWJsZTogJHtmaWxlUmVzdWx0LnJ1bGVzLmZpbHRlcihyID0+IHIuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKS5sZW5ndGh9LyR7ZmlsZVJlc3VsdC5ydWxlcy5sZW5ndGh9IHJ1bGVzYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZmlsZVJlc3VsdC5jYW5EZWxldGUgJiYgb3B0aW9ucy5kZWxldGVDc3MpIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZpbGVXcml0ZXIuZGVsZXRlRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5maWxlc01vZGlmaWVkKys7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYPCfl5HvuI8gIERlbGV0ZWQgJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX0gKGFsbCBydWxlcyBjb252ZXJ0ZWQpYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZmlsZVJlc3VsdC5jYW5EZWxldGUgJiYgIW9wdGlvbnMuZGVsZXRlQ3NzKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGDihLnvuI8gICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9IGlzIG5vdyBlbXB0eSAodXNlIC0tZGVsZXRlLWNzcyB0byByZW1vdmUpYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgZmlsZVdyaXRlci53cml0ZUZpbGUoZmlsZVBhdGgsIGZpbGVSZXN1bHQubmV3Q29udGVudCwgZmlsZVJlc3VsdC5jb250ZW50KTtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXN1bHRzLmZpbGVzTW9kaWZpZWQrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBidWlsZENsYXNzSW5mb0Zyb21SdWxlKHJ1bGU6IENTU1J1bGUsIHNvdXJjZUZpbGU6IHN0cmluZyk6IENsYXNzSW5mbyB7XG4gIHJldHVybiB7XG4gICAgdXRpbGl0aWVzOiBydWxlLnV0aWxpdGllcy5tYXAodSA9PiAoe1xuICAgICAgdmFsdWU6IHUudmFsdWUsXG4gICAgICB2YXJpYW50czogbm9ybWFsaXplVmFyaWFudE9yZGVyKFsuLi51LnZhcmlhbnRzXSlcbiAgICB9KSksXG4gICAgc291cmNlRmlsZSxcbiAgICBmdWxseUNvbnZlcnRpYmxlOiB0cnVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUnVsZUludG9DbGFzc0luZm8oaW5mbzogQ2xhc3NJbmZvLCBydWxlOiBDU1NSdWxlKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdXRpbGl0eSBvZiBydWxlLnV0aWxpdGllcykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gaW5mby51dGlsaXRpZXMuZmluZCh1ID0+IHUudmFsdWUgPT09IHV0aWxpdHkudmFsdWUpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIHV0aWxpdHkudmFyaWFudHMpIHtcbiAgICAgICAgaWYgKCFleGlzdGluZy52YXJpYW50cy5pbmNsdWRlcyh2YXJpYW50KSkge1xuICAgICAgICAgIGV4aXN0aW5nLnZhcmlhbnRzLnB1c2godmFyaWFudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV4aXN0aW5nLnZhcmlhbnRzID0gbm9ybWFsaXplVmFyaWFudE9yZGVyKGV4aXN0aW5nLnZhcmlhbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5mby51dGlsaXRpZXMucHVzaCh7XG4gICAgICAgIHZhbHVlOiB1dGlsaXR5LnZhbHVlLFxuICAgICAgICB2YXJpYW50czogbm9ybWFsaXplVmFyaWFudE9yZGVyKFsuLi51dGlsaXR5LnZhcmlhbnRzXSlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlbWJsZVRhaWx3aW5kQ2xhc3NlcyhpbmZvOiBDbGFzc0luZm8pOiBzdHJpbmcge1xuICBjb25zdCBtZXJnZWQgPSBtZXJnZVV0aWxpdGllcyhpbmZvLnV0aWxpdGllcyk7XG4gIHJldHVybiBhc3NlbWJsZVV0aWxpdGllcyhtZXJnZWQpLmpvaW4oJyAnKTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZUNsYXNzTmFtZVJlZmVyZW5jZXMoXG4gIGNvZGU6IHN0cmluZywgXG4gIGNsYXNzTWFwOiBDU1NDbGFzc01hcFxuKTogeyBcbiAgY29kZTogc3RyaW5nOyBcbiAgaGFzQ2hhbmdlczogYm9vbGVhbjsgXG4gIHJlcGxhY2VtZW50czogbnVtYmVyIFxufSB7XG4gIGxldCBoYXNDaGFuZ2VzID0gZmFsc2U7XG4gIGxldCByZXBsYWNlbWVudHMgPSAwO1xuICBsZXQgbW9kaWZpZWRDb2RlID0gY29kZTtcblxuICBPYmplY3QuZW50cmllcyhjbGFzc01hcCkuZm9yRWFjaCgoW29sZENsYXNzLCBpbmZvXSkgPT4ge1xuICAgIGlmICghaW5mby5mdWxseUNvbnZlcnRpYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFpbHdpbmRDbGFzc1N0cmluZyA9IGFzc2VtYmxlVGFpbHdpbmRDbGFzc2VzKGluZm8pO1xuICAgIFxuICAgIGNvbnN0IHBhdHRlcm4xID0gbmV3IFJlZ0V4cChgY2xhc3NOYW1lPVwiJHtvbGRDbGFzc31cImAsICdnJyk7XG4gICAgaWYgKHBhdHRlcm4xLnRlc3QobW9kaWZpZWRDb2RlKSkge1xuICAgICAgbW9kaWZpZWRDb2RlID0gbW9kaWZpZWRDb2RlLnJlcGxhY2UocGF0dGVybjEsIGBjbGFzc05hbWU9XCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgcmVwbGFjZW1lbnRzKys7XG4gICAgICBsb2dnZXIudmVyYm9zZShgUmVwbGFjZWQgY2xhc3NOYW1lPVwiJHtvbGRDbGFzc31cIiB3aXRoIFwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybjIgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XFxcXHtcIiR7b2xkQ2xhc3N9XCJcXFxcfWAsICdnJyk7XG4gICAgaWYgKHBhdHRlcm4yLnRlc3QobW9kaWZpZWRDb2RlKSkge1xuICAgICAgbW9kaWZpZWRDb2RlID0gbW9kaWZpZWRDb2RlLnJlcGxhY2UocGF0dGVybjIsIGBjbGFzc05hbWU9XCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgcmVwbGFjZW1lbnRzKys7XG4gICAgICBsb2dnZXIudmVyYm9zZShgUmVwbGFjZWQgY2xhc3NOYW1lPXtcIiR7b2xkQ2xhc3N9XCJ9IHdpdGggXCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuMyA9IG5ldyBSZWdFeHAoYGNsYXNzTmFtZT1cXFxce1xcYFxcXFxzKiR7b2xkQ2xhc3N9XFxcXHMqXFxgXFxcXH1gLCAnZycpO1xuICAgIGlmIChwYXR0ZXJuMy50ZXN0KG1vZGlmaWVkQ29kZSkpIHtcbiAgICAgIG1vZGlmaWVkQ29kZSA9IG1vZGlmaWVkQ29kZS5yZXBsYWNlKHBhdHRlcm4zLCBgY2xhc3NOYW1lPVwiJHt0YWlsd2luZENsYXNzU3RyaW5nfVwiYCk7XG4gICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgIHJlcGxhY2VtZW50cysrO1xuICAgICAgbG9nZ2VyLnZlcmJvc2UoYFJlcGxhY2VkIGNsYXNzTmFtZT17XFxgJHtvbGRDbGFzc31cXGB9IHdpdGggXCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB7IGNvZGU6IG1vZGlmaWVkQ29kZSwgaGFzQ2hhbmdlcywgcmVwbGFjZW1lbnRzIH07XG59Il19
307
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhbnNmb3JtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUF5REEsd0NBOFFDO0FBdlVELDRDQUFvQjtBQUNwQixnREFBd0I7QUFFeEIscURBQWtEO0FBQ2xELDJDQUF3QztBQUN4QywyQ0FBcUU7QUFDckUsNkNBQTBDO0FBRTFDLDJDQUF3QztBQUN4QyxtRUFBa0U7QUFDbEUsK0RBSWtDO0FBQ2xDLHlFQUEwRTtBQUMxRSwrREFLa0M7QUFvQzNCLEtBQUssVUFBVSxjQUFjLENBQ2xDLEtBQW9CLEVBQ3BCLE9BQXlCO0lBRXpCLE1BQU0sT0FBTyxHQUFxQjtRQUNoQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE1BQU07UUFDMUIsYUFBYSxFQUFFLENBQUM7UUFDaEIsZUFBZSxFQUFFLENBQUM7UUFDbEIsZUFBZSxFQUFFLENBQUM7UUFDbEIsUUFBUSxFQUFFLENBQUM7S0FDWixDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSwrQkFBYyxDQUFDLE9BQU8sQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQztJQUN2RCxNQUFNLFNBQVMsR0FBRyxJQUFJLHFCQUFTLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksdUJBQVUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUU5RCxJQUFBLHlDQUFvQixHQUFFLENBQUM7SUFFdkIsTUFBTSxXQUFXLEdBQWdCLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGtCQUFrQixHQUFjLEVBQUUsQ0FBQztJQUN6QyxNQUFNLGNB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TSxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsUUFBUSxXQUFXLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUNuRixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsaUJBQWlCLFFBQVEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjLG1CQUFtQixHQUFHLENBQUMsQ0FBQztZQUNwRixVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLFlBQVksRUFBRSxDQUFDO1lBQ2YsZUFBTSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsUUFBUSxZQUFZLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUNyRixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsc0JBQXNCLFFBQVEsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzVFLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1lBQ2hDLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjLG1CQUFtQixHQUFHLENBQUMsQ0FBQztZQUNwRixVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLFlBQVksRUFBRSxDQUFDO1lBQ2YsZUFBTSxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsUUFBUSxhQUFhLG1CQUFtQixHQUFHLENBQUMsQ0FBQztRQUN2RixDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUM7QUFDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFNjYW5uZWRGaWxlIH0gZnJvbSAnLi9zY2FubmVyJztcbmltcG9ydCB7IFRhaWx3aW5kTWFwcGVyIH0gZnJvbSAnLi90YWlsd2luZE1hcHBlcic7XG5pbXBvcnQgeyBKU1hQYXJzZXIgfSBmcm9tICcuL2pzeFBhcnNlcic7XG5pbXBvcnQgeyBDU1NQYXJzZXIsIENTU1J1bGUsIFV0aWxpdHlXaXRoVmFyaWFudCB9IGZyb20gJy4vY3NzUGFyc2VyJztcbmltcG9ydCB7IEZpbGVXcml0ZXIgfSBmcm9tICcuL2ZpbGVXcml0ZXInO1xuaW1wb3J0IHsgVGFpbHdpbmRDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgeyBjbGVhckJyZWFrcG9pbnRDYWNoZSB9IGZyb20gJy4vdXRpbHMvYnJlYWtwb2ludFJlc29sdmVyJztcbmltcG9ydCB7IFxuICBhc3NlbWJsZVV0aWxpdGllcywgXG4gIG1lcmdlVXRpbGl0aWVzLFxuICBub3JtYWxpemVWYXJpYW50T3JkZXIgXG59IGZyb20gJy4vdXRpbHMvdmFyaWFudEFzc2VtYmxlcic7XG5pbXBvcnQgeyB0cmFuc2Zvcm1EZXNjZW5kYW50U2VsZWN0b3JzIH0gZnJvbSAnLi9qc3hEZXNjZW5kYW50VHJhbnNmb3JtZXInO1xuaW1wb3J0IHsgXG4gIFV0aWxpdHlXaXRoTWV0YSwgXG4gIFJlc29sdmVkVXRpbGl0eSwgXG4gIHJlc29sdmVDb25mbGljdHMsIFxuICByZXNvbHZlZFV0aWxpdGllc1RvU3RyaW5ncyBcbn0gZnJvbSAnLi91dGlscy9jb25mbGljdFJlc29sdmVyJztcbmltcG9ydCB7IFNwZWNpZmljaXR5LCBaRVJPX1NQRUNJRklDSVRZIH0gZnJvbSAnLi91dGlscy9zcGVjaWZpY2l0eUNhbGN1bGF0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZm9ybU9wdGlvbnMge1xuICBkcnlSdW46IGJvb2xlYW47XG4gIGRlbGV0ZUNzczogYm9vbGVhbjtcbiAgc2tpcEV4dGVybmFsOiBib29sZWFuO1xuICBza2lwSW5saW5lOiBib29sZWFuO1xuICBza2lwSW50ZXJuYWw6IGJvb2xlYW47XG4gIHRhaWx3aW5kQ29uZmlnOiBUYWlsd2luZENvbmZpZyB8IG51bGw7XG4gIHByb2plY3RSb290OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmb3JtUmVzdWx0cyB7XG4gIGZpbGVzU2Nhbm5lZDogbnVtYmVyO1xuICBmaWxlc01vZGlmaWVkOiBudW1iZXI7XG4gIHN0eWxlc0NvbnZlcnRlZDogbnVtYmVyO1xuICBjbGFzc2VzUmVwbGFjZWQ6IG51bWJlcjtcbiAgd2FybmluZ3M6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIENsYXNzSW5mbyB7XG4gIHV0aWxpdGllczogVXRpbGl0eVdpdGhNZXRhW107XG4gIHNvdXJjZUZpbGU6IHN0cmluZztcbiAgZnVsbHlDb252ZXJ0aWJsZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIENTU0NsYXNzTWFwIHtcbiAgW2NsYXNzTmFtZTogc3RyaW5nXTogQ2xhc3NJbmZvO1xufVxuXG5pbnRlcmZhY2UgQ29sbGVjdGVkUnVsZXMge1xuICBzaW1wbGVSdWxlczogQ1NTUnVsZVtdO1xuICBkZXNjZW5kYW50UnVsZXM6IENTU1J1bGVbXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYW5zZm9ybUZpbGVzKFxuICBmaWxlczogU2Nhbm5lZEZpbGVbXSxcbiAgb3B0aW9uczogVHJhbnNmb3JtT3B0aW9uc1xuKTogUHJvbWlzZTxUcmFuc2Zvcm1SZXN1bHRzPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFRyYW5zZm9ybVJlc3VsdHMgPSB7XG4gICAgZmlsZXNTY2FubmVkOiBmaWxlcy5sZW5ndGgsXG4gICAgZmlsZXNNb2RpZmllZDogMCxcbiAgICBzdHlsZXNDb252ZXJ0ZWQ6IDAsXG4gICAgY2xhc3Nlc1JlcGxhY2VkOiAwLFxuICAgIHdhcm5pbmdzOiAwXG4gIH07XG5cbiAgY29uc3QgbWFwcGVyID0gbmV3IFRhaWx3aW5kTWFwcGVyKG9wdGlvbnMudGFpbHdpbmRDb25maWcgfHwge30pO1xuICBjb25zdCBqc3hQYXJzZXIgPSBuZXcgSlNYUGFyc2VyKG1hcHBlcik7XG4gIGNvbnN0IHNjcmVlbnMgPSBvcHRpb25zLnRhaWx3aW5kQ29uZmlnPy50aGVtZT8uc2NyZWVucztcbiAgY29uc3QgY3NzUGFyc2VyID0gbmV3IENTU1BhcnNlcihtYXBwZXIsIHNjcmVlbnMpO1xuICBjb25zdCBmaWxlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoeyBkcnlSdW46IG9wdGlvbnMuZHJ5UnVuIH0pO1xuXG4gIGNsZWFyQnJlYWtwb2ludENhY2hlKCk7XG5cbiAgY29uc3QgY3NzQ2xhc3NNYXA6IENTU0NsYXNzTWFwID0ge307XG4gIGNvbnN0IGFsbERlc2NlbmRhbnRSdWxlczogQ1NTUnVsZVtdID0gW107XG4gIGNvbnN0IGNzc0ZpbGVSZXN1bHRzOiBNYXA8c3RyaW5nLCB7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5ld0NvbnRlbnQ6IHN0cmluZztcbiAgICBydWxlczogQ1NTUnVsZVtdO1xuICAgIGNhbkRlbGV0ZTogYm9vbGVhbjtcbiAgICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICAgIGZ1bGx5Q29udmVydGlibGU6IGJvb2xlYW47XG4gIH0+ID0gbmV3IE1hcCgpO1xuXG4gIGxvZ2dlci5pbmZvKCdcXG7wn5SNIFBoYXNlIDE6IEFuYWx5emluZyBmaWxlcy4uLicpO1xuXG4gIGlmICghb3B0aW9ucy5za2lwRXh0ZXJuYWwpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnY3NzJykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3NzUGFyc2VyLnBhcnNlKGNvbnRlbnQsIGZpbGUucGF0aCk7XG5cbiAgICAgICAgY29uc3QgdG90YWxSdWxlcyA9IHJlc3VsdC5ydWxlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZ1bGx5Q29udmVydGVkUnVsZXMgPSByZXN1bHQucnVsZXMuZmlsdGVyKHIgPT4gci5mdWxseUNvbnZlcnRlZCkubGVuZ3RoO1xuICAgICAgICBjb25zdCBwYXJ0aWFsbHlDb252ZXJ0ZWRSdWxlcyA9IHJlc3VsdC5ydWxlcy5maWx0ZXIociA9PiByLnBhcnRpYWxDb252ZXJzaW9uKS5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZ1bGx5Q29udmVydGlibGUgPSB0b3RhbFJ1bGVzID4gMCAmJiB0b3RhbFJ1bGVzID09PSBmdWxseUNvbnZlcnRlZFJ1bGVzICYmIHBhcnRpYWxseUNvbnZlcnRlZFJ1bGVzID09PSAwO1xuXG4gICAgICAgIHJlc3VsdC5ydWxlcy5mb3JFYWNoKHJ1bGUgPT4ge1xuICAgICAgICAgIGlmIChydWxlLmlzRGVzY2VuZGFudCkge1xuICAgICAgICAgICAgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGFsbERlc2NlbmRhbnRSdWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChydWxlLmZ1bGx5Q29udmVydGVkICYmIHJ1bGUuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGNzc0NsYXNzTWFwW3J1bGUuY2xhc3NOYW1lXTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgICBtZXJnZVJ1bGVJbnRvQ2xhc3NJbmZvKGV4aXN0aW5nLCBydWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNzc0NsYXNzTWFwW3J1bGUuY2xhc3NOYW1lXSA9IGJ1aWxkQ2xhc3NJbmZvRnJvbVJ1bGUocnVsZSwgZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdHMuc3R5bGVzQ29udmVydGVkICs9IHJ1bGUuZGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGUucGFydGlhbENvbnZlcnNpb24pIHtcbiAgICAgICAgICAgIHJlc3VsdHMuc3R5bGVzQ29udmVydGVkICs9IHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGg7XG4gICAgICAgICAgICBsb2dnZXIudmVyYm9zZShgICBSdWxlIC4ke3J1bGUuY2xhc3NOYW1lfTogcGFydGlhbCBjb252ZXJzaW9uICgke3J1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGh9LyR7cnVsZS5kZWNsYXJhdGlvbnMubGVuZ3RofSBkZWNsYXJhdGlvbnMpYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjc3NGaWxlUmVzdWx0cy5zZXQoZmlsZS5wYXRoLCB7XG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICBuZXdDb250ZW50OiByZXN1bHQuY3NzLFxuICAgICAgICAgIHJ1bGVzOiByZXN1bHQucnVsZXMsXG4gICAgICAgICAgY2FuRGVsZXRlOiByZXN1bHQuY2FuRGVsZXRlLFxuICAgICAgICAgIGhhc0NoYW5nZXM6IHJlc3VsdC5oYXNDaGFuZ2VzLFxuICAgICAgICAgIGZ1bGx5Q29udmVydGlibGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVzdWx0cy53YXJuaW5ncyArPSByZXN1bHQud2FybmluZ3MubGVuZ3RoO1xuXG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGBBbmFseXplZCAke2ZpbGUucGF0aH06YCk7XG4gICAgICAgIGxvZ2dlci52ZXJib3NlKGAgIC0gVG90YWwgcnVsZXM6ICR7dG90YWxSdWxlc31gKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgLSBGdWxseSBjb252ZXJ0ZWQgcnVsZXM6ICR7ZnVsbHlDb252ZXJ0ZWRSdWxlc31gKTtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYCAgLSBQYXJ0aWFsbHkgY29udmVydGVkIHJ1bGVzOiAke3BhcnRpYWxseUNvbnZlcnRlZFJ1bGVzfWApO1xuICAgICAgICBsb2dnZXIudmVyYm9zZShgICAtIEZ1bGx5IGNvbnZlcnRpYmxlOiAke2Z1bGx5Q29udmVydGlibGV9YCk7XG5cbiAgICAgICAgcmVzdWx0Lndhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYOKaoO+4jyAgJHtmaWxlLnBhdGh9OiAke3dhcm5pbmd9YCk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBhbmFseXplICR7ZmlsZS5wYXRofTpgLCBlcnJvcik7XG4gICAgICAgIHJlc3VsdHMud2FybmluZ3MrKztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbygnXFxu4pqb77iPICBQaGFzZSAyOiBUcmFuc2Zvcm1pbmcgUmVhY3QgY29tcG9uZW50cy4uLicpO1xuXG4gIGNvbnN0IGpzeEZpbGVSZXN1bHRzOiBNYXA8c3RyaW5nLCB7XG4gICAgY29udGVudDogc3RyaW5nO1xuICAgIG5ld0NvbnRlbnQ6IHN0cmluZztcbiAgICBoYXNDaGFuZ2VzOiBib29sZWFuO1xuICB9PiA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMuZmlsdGVyKGYgPT4gZi50eXBlID09PSAnanN4JykpIHtcbiAgICB0cnkge1xuICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZS5wYXRoLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGNvbnRlbnQ7XG4gICAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuICAgICAgbGV0IGZpbGVXYXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKCFvcHRpb25zLnNraXBJbmxpbmUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBqc3hSZXN1bHQgPSBqc3hQYXJzZXIucGFyc2UoY29udGVudCwgZmlsZS5wYXRoKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAoanN4UmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBqc3hSZXN1bHQuY29kZTtcbiAgICAgICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICAgICAgcmVzdWx0cy5zdHlsZXNDb252ZXJ0ZWQgKz0ganN4UmVzdWx0LnRyYW5zZm9ybWF0aW9ucy5yZWR1Y2UoXG4gICAgICAgICAgICAgIChzdW0sIHQpID0+IHN1bSArIHQuY2xhc3Nlcy5sZW5ndGgsIDBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaCguLi5qc3hSZXN1bHQud2FybmluZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgRmFpbGVkIHRvIHBhcnNlIEpTWCBpbmxpbmUgc3R5bGVzIGluICR7ZmlsZS5wYXRofTogJHtlcnJvcn1gKTtcbiAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaChgSlNYIHBhcnNlIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghb3B0aW9ucy5za2lwSW50ZXJuYWwpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBpbnRlcm5hbFJlc3VsdCA9IGF3YWl0IGNzc1BhcnNlci5wYXJzZUludGVybmFsQ1NTKGNvbnRlbnQsIGZpbGUucGF0aCk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKGludGVybmFsUmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBpbnRlcm5hbFJlc3VsdC5odG1sO1xuICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGludGVybmFsUmVzdWx0LnJ1bGVzLmZvckVhY2gocnVsZSA9PiB7XG4gICAgICAgICAgICAgIGlmIChydWxlLmlzRGVzY2VuZGFudCkge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgYWxsRGVzY2VuZGFudFJ1bGVzLnB1c2gocnVsZSk7XG4gICAgICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuY29udmVydGVkQ2xhc3Nlcy5sZW5ndGggPiAwICYmIHJ1bGUuY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBjc3NDbGFzc01hcFtydWxlLmNsYXNzTmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICBtZXJnZVJ1bGVJbnRvQ2xhc3NJbmZvKGV4aXN0aW5nLCBydWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY3NzQ2xhc3NNYXBbcnVsZS5jbGFzc05hbWVdID0gYnVpbGRDbGFzc0luZm9Gcm9tUnVsZShydWxlLCBmaWxlLnBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRzLnN0eWxlc0NvbnZlcnRlZCArPSBydWxlLmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaCguLi5pbnRlcm5hbFJlc3VsdC53YXJuaW5ncyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci53YXJuKGBGYWlsZWQgdG8gcGFyc2UgaW50ZXJuYWwgQ1NTIGluICR7ZmlsZS5wYXRofTogJHtlcnJvcn1gKTtcbiAgICAgICAgICBmaWxlV2FybmluZ3MucHVzaChgSW50ZXJuYWwgQ1NTIHBhcnNlIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGpzeEZpbGVSZXN1bHRzLnNldChmaWxlLnBhdGgsIHtcbiAgICAgICAgY29udGVudDogb3JpZ2luYWxDb250ZW50LFxuICAgICAgICBuZXdDb250ZW50OiBjb250ZW50LFxuICAgICAgICBoYXNDaGFuZ2VzXG4gICAgICB9KTtcblxuICAgICAgcmVzdWx0cy53YXJuaW5ncyArPSBmaWxlV2FybmluZ3MubGVuZ3RoO1xuXG4gICAgICBmaWxlV2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYOKaoO+4jyAgJHtmaWxlLnBhdGh9OiAke3dhcm5pbmd9YCk7XG4gICAgICB9KTtcblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEZhaWxlZCB0byBwcm9jZXNzICR7ZmlsZS5wYXRofTpgLCBlcnJvcik7XG4gICAgICByZXN1bHRzLndhcm5pbmdzKys7XG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGNzc0NsYXNzTWFwKS5sZW5ndGggPiAwKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1xcbvCflIQgUGhhc2UgMzogUmVwbGFjaW5nIGNsYXNzTmFtZSByZWZlcmVuY2VzLi4uJyk7XG5cbiAgICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgZmlsZVJlc3VsdF0gb2YganN4RmlsZVJlc3VsdHMpIHtcbiAgICAgIGxldCBjb250ZW50ID0gZmlsZVJlc3VsdC5uZXdDb250ZW50O1xuICAgICAgbGV0IGhhc0NoYW5nZXMgPSBmaWxlUmVzdWx0Lmhhc0NoYW5nZXM7XG5cbiAgICAgIGNvbnN0IHJlcGxhY2VtZW50UmVzdWx0ID0gcmVwbGFjZUNsYXNzTmFtZVJlZmVyZW5jZXMoY29udGVudCwgY3NzQ2xhc3NNYXApO1xuICAgICAgaWYgKHJlcGxhY2VtZW50UmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgICAgY29udGVudCA9IHJlcGxhY2VtZW50UmVzdWx0LmNvZGU7XG4gICAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgICByZXN1bHRzLmNsYXNzZXNSZXBsYWNlZCArPSByZXBsYWNlbWVudFJlc3VsdC5yZXBsYWNlbWVudHM7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIudmVyYm9zZShgUmVwbGFjZWQgJHtyZXBsYWNlbWVudFJlc3VsdC5yZXBsYWNlbWVudHN9IGNsYXNzIHJlZmVyZW5jZXMgaW4gJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX1gKTtcbiAgICAgIH1cblxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGVQYXRoLCB7XG4gICAgICAgIC4uLmZpbGVSZXN1bHQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhbGxEZXNjZW5kYW50UnVsZXMubGVuZ3RoID4gMCkge1xuICAgIGxvZ2dlci5pbmZvKCdcXG7wn4yzIFBoYXNlIDMuNTogQXBwbHlpbmcgZGVzY2VuZGFudCBzZWxlY3RvciBydWxlcy4uLicpO1xuXG4gICAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGZpbGVSZXN1bHRdIG9mIGpzeEZpbGVSZXN1bHRzKSB7XG4gICAgICBsZXQgY29udGVudCA9IGZpbGVSZXN1bHQubmV3Q29udGVudDtcbiAgICAgIGxldCBoYXNDaGFuZ2VzID0gZmlsZVJlc3VsdC5oYXNDaGFuZ2VzO1xuXG4gICAgICBjb25zdCBkZXNjZW5kYW50UmVzdWx0ID0gdHJhbnNmb3JtRGVzY2VuZGFudFNlbGVjdG9ycyhjb250ZW50LCBhbGxEZXNjZW5kYW50UnVsZXMpO1xuICAgICAgaWYgKGRlc2NlbmRhbnRSZXN1bHQuaGFzQ2hhbmdlcykge1xuICAgICAgICBjb250ZW50ID0gZGVzY2VuZGFudFJlc3VsdC5jb2RlO1xuICAgICAgICBoYXNDaGFuZ2VzID0gdHJ1ZTtcbiAgICAgICAgcmVzdWx0cy5jbGFzc2VzUmVwbGFjZWQgKz0gZGVzY2VuZGFudFJlc3VsdC50cmFuc2Zvcm1hdGlvbnM7XG4gICAgICAgIFxuICAgICAgICBsb2dnZXIudmVyYm9zZShgQXBwbGllZCAke2Rlc2NlbmRhbnRSZXN1bHQudHJhbnNmb3JtYXRpb25zfSBkZXNjZW5kYW50IHRyYW5zZm9ybWF0aW9ucyBpbiAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfWApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGVzY2VuZGFudFJlc3VsdC53YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlc3VsdHMud2FybmluZ3MgKz0gZGVzY2VuZGFudFJlc3VsdC53YXJuaW5ncy5sZW5ndGg7XG4gICAgICAgIGRlc2NlbmRhbnRSZXN1bHQud2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShg4pqg77iPICAke2ZpbGVQYXRofTogJHt3YXJuaW5nfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAganN4RmlsZVJlc3VsdHMuc2V0KGZpbGVQYXRoLCB7XG4gICAgICAgIC4uLmZpbGVSZXN1bHQsXG4gICAgICAgIG5ld0NvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgIGhhc0NoYW5nZXNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5pbmZvKCdcXG7wn5K+IFBoYXNlIDQ6IFdyaXRpbmcgY2hhbmdlcy4uLicpO1xuXG4gIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBqc3hGaWxlUmVzdWx0cykge1xuICAgIGlmIChmaWxlUmVzdWx0Lmhhc0NoYW5nZXMpIHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaWxlV3JpdGVyLndyaXRlRmlsZShmaWxlUGF0aCwgZmlsZVJlc3VsdC5uZXdDb250ZW50LCBmaWxlUmVzdWx0LmNvbnRlbnQpO1xuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgcmVzdWx0cy5maWxlc01vZGlmaWVkKys7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFvcHRpb25zLnNraXBFeHRlcm5hbCkge1xuICAgIGZvciAoY29uc3QgW2ZpbGVQYXRoLCBmaWxlUmVzdWx0XSBvZiBjc3NGaWxlUmVzdWx0cykge1xuICAgICAgaWYgKCFmaWxlUmVzdWx0Lmhhc0NoYW5nZXMpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoIWZpbGVSZXN1bHQuZnVsbHlDb252ZXJ0aWJsZSkge1xuICAgICAgICBsb2dnZXIud2Fybihg4o+t77iPICBTa2lwcGluZyAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfSAtIG5vdCBmdWxseSBjb252ZXJ0aWJsZSAod291bGQgYnJlYWsgc3R5bGVzKWApO1xuICAgICAgICBsb2dnZXIud2FybihgICAgQ29udmVydGlibGU6ICR7ZmlsZVJlc3VsdC5ydWxlcy5maWx0ZXIociA9PiByLmNvbnZlcnRlZENsYXNzZXMubGVuZ3RoID4gMCkubGVuZ3RofS8ke2ZpbGVSZXN1bHQucnVsZXMubGVuZ3RofSBydWxlc2ApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpbGVSZXN1bHQuY2FuRGVsZXRlICYmIG9wdGlvbnMuZGVsZXRlQ3NzKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCBmaWxlV3JpdGVyLmRlbGV0ZUZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICAgIHJlc3VsdHMuZmlsZXNNb2RpZmllZCsrO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKGDwn5eR77iPICBEZWxldGVkICR7cGF0aC5iYXNlbmFtZShmaWxlUGF0aCl9IChhbGwgcnVsZXMgY29udmVydGVkKWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGZpbGVSZXN1bHQuY2FuRGVsZXRlICYmICFvcHRpb25zLmRlbGV0ZUNzcykge1xuICAgICAgICBsb2dnZXIuaW5mbyhg4oS577iPICAke3BhdGguYmFzZW5hbWUoZmlsZVBhdGgpfSBpcyBub3cgZW1wdHkgKHVzZSAtLWRlbGV0ZS1jc3MgdG8gcmVtb3ZlKWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZpbGVXcml0ZXIud3JpdGVGaWxlKGZpbGVQYXRoLCBmaWxlUmVzdWx0Lm5ld0NvbnRlbnQsIGZpbGVSZXN1bHQuY29udGVudCk7XG4gICAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgICAgcmVzdWx0cy5maWxlc01vZGlmaWVkKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gYnVpbGRDbGFzc0luZm9Gcm9tUnVsZShydWxlOiBDU1NSdWxlLCBzb3VyY2VGaWxlOiBzdHJpbmcpOiBDbGFzc0luZm8ge1xuICByZXR1cm4ge1xuICAgIHV0aWxpdGllczogcnVsZS51dGlsaXRpZXMubWFwKHUgPT4gKHtcbiAgICAgIHZhbHVlOiB1LnZhbHVlLFxuICAgICAgdmFyaWFudHM6IG5vcm1hbGl6ZVZhcmlhbnRPcmRlcihbLi4udS52YXJpYW50c10pLFxuICAgICAgY3NzUHJvcGVydHk6IHUuY3NzUHJvcGVydHksXG4gICAgICBzcGVjaWZpY2l0eTogdS5zcGVjaWZpY2l0eSxcbiAgICAgIHNvdXJjZU9yZGVyOiB1LnNvdXJjZU9yZGVyLFxuICAgICAgb3JpZ2luYWxTZWxlY3RvcjogcnVsZS5zZWxlY3RvclxuICAgIH0pKSxcbiAgICBzb3VyY2VGaWxlLFxuICAgIGZ1bGx5Q29udmVydGlibGU6IHRydWVcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VSdWxlSW50b0NsYXNzSW5mbyhpbmZvOiBDbGFzc0luZm8sIHJ1bGU6IENTU1J1bGUpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1dGlsaXR5IG9mIHJ1bGUudXRpbGl0aWVzKSB7XG4gICAgY29uc3QgdXRpbGl0eVdpdGhNZXRhOiBVdGlsaXR5V2l0aE1ldGEgPSB7XG4gICAgICB2YWx1ZTogdXRpbGl0eS52YWx1ZSxcbiAgICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIoWy4uLnV0aWxpdHkudmFyaWFudHNdKSxcbiAgICAgIGNzc1Byb3BlcnR5OiB1dGlsaXR5LmNzc1Byb3BlcnR5LFxuICAgICAgc3BlY2lmaWNpdHk6IHV0aWxpdHkuc3BlY2lmaWNpdHksXG4gICAgICBzb3VyY2VPcmRlcjogdXRpbGl0eS5zb3VyY2VPcmRlcixcbiAgICAgIG9yaWdpbmFsU2VsZWN0b3I6IHJ1bGUuc2VsZWN0b3JcbiAgICB9O1xuICAgIFxuICAgIGluZm8udXRpbGl0aWVzLnB1c2godXRpbGl0eVdpdGhNZXRhKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlbWJsZVRhaWx3aW5kQ2xhc3NlcyhpbmZvOiBDbGFzc0luZm8pOiBzdHJpbmcge1xuICBjb25zdCB7IHJlc29sdmVkIH0gPSByZXNvbHZlQ29uZmxpY3RzKGluZm8udXRpbGl0aWVzLCBmYWxzZSk7XG4gIHJldHVybiByZXNvbHZlZFV0aWxpdGllc1RvU3RyaW5ncyhyZXNvbHZlZCkuam9pbignICcpO1xufVxuXG5mdW5jdGlvbiByZXBsYWNlQ2xhc3NOYW1lUmVmZXJlbmNlcyhcbiAgY29kZTogc3RyaW5nLCBcbiAgY2xhc3NNYXA6IENTU0NsYXNzTWFwXG4pOiB7IFxuICBjb2RlOiBzdHJpbmc7IFxuICBoYXNDaGFuZ2VzOiBib29sZWFuOyBcbiAgcmVwbGFjZW1lbnRzOiBudW1iZXIgXG59IHtcbiAgbGV0IGhhc0NoYW5nZXMgPSBmYWxzZTtcbiAgbGV0IHJlcGxhY2VtZW50cyA9IDA7XG4gIGxldCBtb2RpZmllZENvZGUgPSBjb2RlO1xuXG4gIE9iamVjdC5lbnRyaWVzKGNsYXNzTWFwKS5mb3JFYWNoKChbb2xkQ2xhc3MsIGluZm9dKSA9PiB7XG4gICAgaWYgKCFpbmZvLmZ1bGx5Q29udmVydGlibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB0YWlsd2luZENsYXNzU3RyaW5nID0gYXNzZW1ibGVUYWlsd2luZENsYXNzZXMoaW5mbyk7XG4gICAgXG4gICAgY29uc3QgcGF0dGVybjEgPSBuZXcgUmVnRXhwKGBjbGFzc05hbWU9XCIke29sZENsYXNzfVwiYCwgJ2cnKTtcbiAgICBpZiAocGF0dGVybjEudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMSwgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9XCIke29sZENsYXNzfVwiIHdpdGggXCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJuMiA9IG5ldyBSZWdFeHAoYGNsYXNzTmFtZT1cXFxce1wiJHtvbGRDbGFzc31cIlxcXFx9YCwgJ2cnKTtcbiAgICBpZiAocGF0dGVybjIudGVzdChtb2RpZmllZENvZGUpKSB7XG4gICAgICBtb2RpZmllZENvZGUgPSBtb2RpZmllZENvZGUucmVwbGFjZShwYXR0ZXJuMiwgYGNsYXNzTmFtZT1cIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7XG4gICAgICByZXBsYWNlbWVudHMrKztcbiAgICAgIGxvZ2dlci52ZXJib3NlKGBSZXBsYWNlZCBjbGFzc05hbWU9e1wiJHtvbGRDbGFzc31cIn0gd2l0aCBcIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm4zID0gbmV3IFJlZ0V4cChgY2xhc3NOYW1lPVxcXFx7XFxgXFxcXHMqJHtvbGRDbGFzc31cXFxccypcXGBcXFxcfWAsICdnJyk7XG4gICAgaWYgKHBhdHRlcm4zLnRlc3QobW9kaWZpZWRDb2RlKSkge1xuICAgICAgbW9kaWZpZWRDb2RlID0gbW9kaWZpZWRDb2RlLnJlcGxhY2UocGF0dGVybjMsIGBjbGFzc05hbWU9XCIke3RhaWx3aW5kQ2xhc3NTdHJpbmd9XCJgKTtcbiAgICAgIGhhc0NoYW5nZXMgPSB0cnVlO1xuICAgICAgcmVwbGFjZW1lbnRzKys7XG4gICAgICBsb2dnZXIudmVyYm9zZShgUmVwbGFjZWQgY2xhc3NOYW1lPXtcXGAke29sZENsYXNzfVxcYH0gd2l0aCBcIiR7dGFpbHdpbmRDbGFzc1N0cmluZ31cImApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogbW9kaWZpZWRDb2RlLCBoYXNDaGFuZ2VzLCByZXBsYWNlbWVudHMgfTtcbn0iXX0=
@@ -0,0 +1,39 @@
1
+ import { Specificity } from './specificityCalculator';
2
+ export interface UtilityWithMeta {
3
+ value: string;
4
+ variants: string[];
5
+ cssProperty: string;
6
+ specificity: Specificity;
7
+ sourceOrder: number;
8
+ originalSelector: string;
9
+ }
10
+ export interface ResolvedUtility {
11
+ value: string;
12
+ variants: string[];
13
+ cssProperty: string;
14
+ }
15
+ export interface ConflictInfo {
16
+ winner: UtilityWithMeta;
17
+ losers: UtilityWithMeta[];
18
+ property: string;
19
+ variantKey: string;
20
+ }
21
+ export declare function groupUtilitiesByPropertyAndVariant(utilities: UtilityWithMeta[]): Map<string, Map<string, UtilityWithMeta[]>>;
22
+ export declare function resolveConflicts(utilities: UtilityWithMeta[], verbose?: boolean): {
23
+ resolved: ResolvedUtility[];
24
+ conflicts: ConflictInfo[];
25
+ };
26
+ export declare function resolveConflictsForElement(utilities: UtilityWithMeta[], verbose?: boolean): ResolvedUtility[];
27
+ export declare function mergeAndResolveUtilities(existingUtilities: UtilityWithMeta[], newUtilities: UtilityWithMeta[], verbose?: boolean): {
28
+ utilities: UtilityWithMeta[];
29
+ conflicts: ConflictInfo[];
30
+ };
31
+ export declare function buildUtilityWithMeta(value: string, variants: string[], cssProperty: string, specificity: Specificity, sourceOrder: number, originalSelector: string): UtilityWithMeta;
32
+ export declare function groupUtilitiesByElement(utilities: Array<{
33
+ utility: UtilityWithMeta;
34
+ elementKey: string;
35
+ }>): Map<string, UtilityWithMeta[]>;
36
+ export declare function resolveConflictsForAllElements(utilitiesByElement: Map<string, UtilityWithMeta[]>, verbose?: boolean): Map<string, ResolvedUtility[]>;
37
+ export declare function sortUtilitiesForOutput(utilities: ResolvedUtility[]): ResolvedUtility[];
38
+ export declare function resolvedUtilityToString(utility: ResolvedUtility): string;
39
+ export declare function resolvedUtilitiesToStrings(utilities: ResolvedUtility[]): string[];
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.groupUtilitiesByPropertyAndVariant = groupUtilitiesByPropertyAndVariant;
4
+ exports.resolveConflicts = resolveConflicts;
5
+ exports.resolveConflictsForElement = resolveConflictsForElement;
6
+ exports.mergeAndResolveUtilities = mergeAndResolveUtilities;
7
+ exports.buildUtilityWithMeta = buildUtilityWithMeta;
8
+ exports.groupUtilitiesByElement = groupUtilitiesByElement;
9
+ exports.resolveConflictsForAllElements = resolveConflictsForAllElements;
10
+ exports.sortUtilitiesForOutput = sortUtilitiesForOutput;
11
+ exports.resolvedUtilityToString = resolvedUtilityToString;
12
+ exports.resolvedUtilitiesToStrings = resolvedUtilitiesToStrings;
13
+ const logger_1 = require("./logger");
14
+ const specificityCalculator_1 = require("./specificityCalculator");
15
+ const variantAssembler_1 = require("./variantAssembler");
16
+ const VARIANT_SEPARATOR = '\x00';
17
+ function createVariantKey(variants) {
18
+ const normalized = (0, variantAssembler_1.normalizeVariantOrder)(variants);
19
+ return normalized.length > 0 ? normalized.join(':') : VARIANT_SEPARATOR;
20
+ }
21
+ function groupUtilitiesByPropertyAndVariant(utilities) {
22
+ const groups = new Map();
23
+ for (const utility of utilities) {
24
+ const property = utility.cssProperty;
25
+ const variantKey = createVariantKey(utility.variants);
26
+ if (!groups.has(property)) {
27
+ groups.set(property, new Map());
28
+ }
29
+ const propertyGroup = groups.get(property);
30
+ if (!propertyGroup.has(variantKey)) {
31
+ propertyGroup.set(variantKey, []);
32
+ }
33
+ propertyGroup.get(variantKey).push(utility);
34
+ }
35
+ return groups;
36
+ }
37
+ function resolveConflicts(utilities, verbose = false) {
38
+ const groups = groupUtilitiesByPropertyAndVariant(utilities);
39
+ const resolved = [];
40
+ const conflicts = [];
41
+ for (const [property, variantGroups] of groups) {
42
+ for (const [variantKey, utilitiesInGroup] of variantGroups) {
43
+ if (utilitiesInGroup.length === 1) {
44
+ const util = utilitiesInGroup[0];
45
+ resolved.push({
46
+ value: util.value,
47
+ variants: util.variants,
48
+ cssProperty: util.cssProperty
49
+ });
50
+ continue;
51
+ }
52
+ const sorted = [...utilitiesInGroup].sort((a, b) => {
53
+ const specCompare = (0, specificityCalculator_1.compareSpecificity)(b.specificity, a.specificity);
54
+ if (specCompare !== 0)
55
+ return specCompare;
56
+ return b.sourceOrder - a.sourceOrder;
57
+ });
58
+ const winner = sorted[0];
59
+ const losers = sorted.slice(1);
60
+ resolved.push({
61
+ value: winner.value,
62
+ variants: winner.variants,
63
+ cssProperty: winner.cssProperty
64
+ });
65
+ if (losers.length > 0) {
66
+ conflicts.push({
67
+ winner,
68
+ losers,
69
+ property,
70
+ variantKey: variantKey === VARIANT_SEPARATOR ? '(base)' : variantKey
71
+ });
72
+ if (verbose) {
73
+ const loserNames = losers.map(l => l.value).join(', ');
74
+ logger_1.logger.verbose(`Conflict in ${property} (${variantKey === VARIANT_SEPARATOR ? 'base' : variantKey}):`);
75
+ logger_1.logger.verbose(` Winner: ${winner.value} (specificity: ${winner.specificity.id}/${winner.specificity.class}/${winner.specificity.element}, order: ${winner.sourceOrder})`);
76
+ logger_1.logger.verbose(` Discarded: ${loserNames}`);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ return { resolved, conflicts };
82
+ }
83
+ function resolveConflictsForElement(utilities, verbose = false) {
84
+ const { resolved, conflicts } = resolveConflicts(utilities, verbose);
85
+ return resolved;
86
+ }
87
+ function mergeAndResolveUtilities(existingUtilities, newUtilities, verbose = false) {
88
+ const allUtilities = [...existingUtilities, ...newUtilities];
89
+ const { resolved, conflicts } = resolveConflicts(allUtilities, verbose);
90
+ return { utilities: allUtilities, conflicts };
91
+ }
92
+ function buildUtilityWithMeta(value, variants, cssProperty, specificity, sourceOrder, originalSelector) {
93
+ return {
94
+ value,
95
+ variants: (0, variantAssembler_1.normalizeVariantOrder)(variants),
96
+ cssProperty,
97
+ specificity,
98
+ sourceOrder,
99
+ originalSelector
100
+ };
101
+ }
102
+ function groupUtilitiesByElement(utilities) {
103
+ const groups = new Map();
104
+ for (const { utility, elementKey } of utilities) {
105
+ if (!groups.has(elementKey)) {
106
+ groups.set(elementKey, []);
107
+ }
108
+ groups.get(elementKey).push(utility);
109
+ }
110
+ return groups;
111
+ }
112
+ function resolveConflictsForAllElements(utilitiesByElement, verbose = false) {
113
+ const results = new Map();
114
+ for (const [elementKey, utilities] of utilitiesByElement) {
115
+ const resolved = resolveConflictsForElement(utilities, verbose);
116
+ results.set(elementKey, resolved);
117
+ }
118
+ return results;
119
+ }
120
+ function sortUtilitiesForOutput(utilities) {
121
+ return [...utilities].sort((a, b) => {
122
+ const aVariantKey = createVariantKey(a.variants);
123
+ const bVariantKey = createVariantKey(b.variants);
124
+ if (aVariantKey !== bVariantKey) {
125
+ return aVariantKey.localeCompare(bVariantKey);
126
+ }
127
+ return a.value.localeCompare(b.value);
128
+ });
129
+ }
130
+ function resolvedUtilityToString(utility) {
131
+ if (utility.variants.length === 0) {
132
+ return utility.value;
133
+ }
134
+ const prefix = utility.variants.join(':');
135
+ return `${prefix}:${utility.value}`;
136
+ }
137
+ function resolvedUtilitiesToStrings(utilities) {
138
+ return sortUtilitiesForOutput(utilities).map(resolvedUtilityToString);
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmxpY3RSZXNvbHZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9jb25mbGljdFJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0NBLGdGQXVCQztBQUVELDRDQXNEQztBQUVELGdFQU9DO0FBRUQsNERBU0M7QUFFRCxvREFnQkM7QUFFRCwwREFnQkM7QUFFRCx3RUFZQztBQUVELHdEQVdDO0FBRUQsMERBT0M7QUFFRCxnRUFFQztBQWpORCxxQ0FBa0M7QUFDbEMsbUVBQTRGO0FBRTVGLHlEQUEyRDtBQXdCM0QsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLENBQUM7QUFFakMsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFrQjtJQUMxQyxNQUFNLFVBQVUsR0FBRyxJQUFBLHdDQUFxQixFQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFnQixrQ0FBa0MsQ0FDaEQsU0FBNEI7SUFFNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQTBDLENBQUM7SUFFakUsS0FBSyxNQUFNLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ3JDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUV0RCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FB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QUMsQ0FBQztRQUVqRCxJQUFJLFdBQVcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxPQUFPLFdBQVcsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE9BQXdCO0lBQzlELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEMsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxPQUFPLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBZ0IsMEJBQTBCLENBQUMsU0FBNEI7SUFDckUsT0FBTyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLENBQUMsQ0FBQztBQUN4RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgU3BlY2lmaWNpdHksIGNvbXBhcmVTcGVjaWZpY2l0eSwgWkVST19TUEVDSUZJQ0lUWSB9IGZyb20gJy4vc3BlY2lmaWNpdHlDYWxjdWxhdG9yJztcbmltcG9ydCB7IGdldFByb3BlcnR5Rm9yVXRpbGl0eSwgcHJvcGVydGllc0NvbmZsaWN0LCBnZXRDb25mbGljdEdyb3VwIH0gZnJvbSAnLi9wcm9wZXJ0eU1hcHBlcic7XG5pbXBvcnQgeyBub3JtYWxpemVWYXJpYW50T3JkZXIgfSBmcm9tICcuL3ZhcmlhbnRBc3NlbWJsZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFV0aWxpdHlXaXRoTWV0YSB7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHZhcmlhbnRzOiBzdHJpbmdbXTtcbiAgY3NzUHJvcGVydHk6IHN0cmluZztcbiAgc3BlY2lmaWNpdHk6IFNwZWNpZmljaXR5O1xuICBzb3VyY2VPcmRlcjogbnVtYmVyO1xuICBvcmlnaW5hbFNlbGVjdG9yOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRVdGlsaXR5IHtcbiAgdmFsdWU6IHN0cmluZztcbiAgdmFyaWFudHM6IHN0cmluZ1tdO1xuICBjc3NQcm9wZXJ0eTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZsaWN0SW5mbyB7XG4gIHdpbm5lcjogVXRpbGl0eVdpdGhNZXRhO1xuICBsb3NlcnM6IFV0aWxpdHlXaXRoTWV0YVtdO1xuICBwcm9wZXJ0eTogc3RyaW5nO1xuICB2YXJpYW50S2V5OiBzdHJpbmc7XG59XG5cbmNvbnN0IFZBUklBTlRfU0VQQVJBVE9SID0gJ1xceDAwJztcblxuZnVuY3Rpb24gY3JlYXRlVmFyaWFudEtleSh2YXJpYW50czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVmFyaWFudE9yZGVyKHZhcmlhbnRzKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQubGVuZ3RoID4gMCA/IG5vcm1hbGl6ZWQuam9pbignOicpIDogVkFSSUFOVF9TRVBBUkFUT1I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFV0aWxpdGllc0J5UHJvcGVydHlBbmRWYXJpYW50KFxuICB1dGlsaXRpZXM6IFV0aWxpdHlXaXRoTWV0YVtdXG4pOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBVdGlsaXR5V2l0aE1ldGFbXT4+IHtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFV0aWxpdHlXaXRoTWV0YVtdPj4oKTtcbiAgXG4gIGZvciAoY29uc3QgdXRpbGl0eSBvZiB1dGlsaXRpZXMpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHV0aWxpdHkuY3NzUHJvcGVydHk7XG4gICAgY29uc3QgdmFyaWFudEtleSA9IGNyZWF0ZVZhcmlhbnRLZXkodXRpbGl0eS52YXJpYW50cyk7XG4gICAgXG4gICAgaWYgKCFncm91cHMuaGFzKHByb3BlcnR5KSkge1xuICAgICAgZ3JvdXBzLnNldChwcm9wZXJ0eSwgbmV3IE1hcCgpKTtcbiAgICB9XG4gICAgXG4gICAgY29uc3QgcHJvcGVydHlHcm91cCA9IGdyb3Vwcy5nZXQocHJvcGVydHkpITtcbiAgICBcbiAgICBpZiAoIXByb3BlcnR5R3JvdXAuaGFzKHZhcmlhbnRLZXkpKSB7XG4gICAgICBwcm9wZXJ0eUdyb3VwLnNldCh2YXJpYW50S2V5LCBbXSk7XG4gICAgfVxuICAgIFxuICAgIHByb3BlcnR5R3JvdXAuZ2V0KHZhcmlhbnRLZXkpIS5wdXNoKHV0aWxpdHkpO1xuICB9XG4gIFxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbmZsaWN0cyhcbiAgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aE1ldGFbXSxcbiAgdmVyYm9zZSA9IGZhbHNlXG4pOiB7IHJlc29sdmVkOiBSZXNvbHZlZFV0aWxpdHlbXTsgY29uZmxpY3RzOiBDb25mbGljdEluZm9bXSB9IHtcbiAgY29uc3QgZ3JvdXBzID0gZ3JvdXBVdGlsaXRpZXNCeVByb3BlcnR5QW5kVmFyaWFudCh1dGlsaXRpZXMpO1xuICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRVdGlsaXR5W10gPSBbXTtcbiAgY29uc3QgY29uZmxpY3RzOiBDb25mbGljdEluZm9bXSA9IFtdO1xuICBcbiAgZm9yIChjb25zdCBbcHJvcGVydHksIHZhcmlhbnRHcm91cHNdIG9mIGdyb3Vwcykge1xuICAgIGZvciAoY29uc3QgW3ZhcmlhbnRLZXksIHV0aWxpdGllc0luR3JvdXBdIG9mIHZhcmlhbnRHcm91cHMpIHtcbiAgICAgIGlmICh1dGlsaXRpZXNJbkdyb3VwLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB1dGlsID0gdXRpbGl0aWVzSW5Hcm91cFswXTtcbiAgICAgICAgcmVzb2x2ZWQucHVzaCh7XG4gICAgICAgICAgdmFsdWU6IHV0aWwudmFsdWUsXG4gICAgICAgICAgdmFyaWFudHM6IHV0aWwudmFyaWFudHMsXG4gICAgICAgICAgY3NzUHJvcGVydHk6IHV0aWwuY3NzUHJvcGVydHlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICBjb25zdCBzb3J0ZWQgPSBbLi4udXRpbGl0aWVzSW5Hcm91cF0uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBzcGVjQ29tcGFyZSA9IGNvbXBhcmVTcGVjaWZpY2l0eShiLnNwZWNpZmljaXR5LCBhLnNwZWNpZmljaXR5KTtcbiAgICAgICAgaWYgKHNwZWNDb21wYXJlICE9PSAwKSByZXR1cm4gc3BlY0NvbXBhcmU7XG4gICAgICAgIHJldHVybiBiLnNvdXJjZU9yZGVyIC0gYS5zb3VyY2VPcmRlcjtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBjb25zdCB3aW5uZXIgPSBzb3J0ZWRbMF07XG4gICAgICBjb25zdCBsb3NlcnMgPSBzb3J0ZWQuc2xpY2UoMSk7XG4gICAgICBcbiAgICAgIHJlc29sdmVkLnB1c2goe1xuICAgICAgICB2YWx1ZTogd2lubmVyLnZhbHVlLFxuICAgICAgICB2YXJpYW50czogd2lubmVyLnZhcmlhbnRzLFxuICAgICAgICBjc3NQcm9wZXJ0eTogd2lubmVyLmNzc1Byb3BlcnR5XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgaWYgKGxvc2Vycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbmZsaWN0cy5wdXNoKHtcbiAgICAgICAgICB3aW5uZXIsXG4gICAgICAgICAgbG9zZXJzLFxuICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgIHZhcmlhbnRLZXk6IHZhcmlhbnRLZXkgPT09IFZBUklBTlRfU0VQQVJBVE9SID8gJyhiYXNlKScgOiB2YXJpYW50S2V5XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBjb25zdCBsb3Nlck5hbWVzID0gbG9zZXJzLm1hcChsID0+IGwudmFsdWUpLmpvaW4oJywgJyk7XG4gICAgICAgICAgbG9nZ2VyLnZlcmJvc2UoYENvbmZsaWN0IGluICR7cHJvcGVydHl9ICgke3ZhcmlhbnRLZXkgPT09IFZBUklBTlRfU0VQQVJBVE9SID8gJ2Jhc2UnIDogdmFyaWFudEtleX0pOmApO1xuICAgICAgICAgIGxvZ2dlci52ZXJib3NlKGAgIFdpbm5lcjogJHt3aW5uZXIudmFsdWV9IChzcGVjaWZpY2l0eTogJHt3aW5uZXIuc3BlY2lmaWNpdHkuaWR9LyR7d2lubmVyLnNwZWNpZmljaXR5LmNsYXNzfS8ke3dpbm5lci5zcGVjaWZpY2l0eS5lbGVtZW50fSwgb3JkZXI6ICR7d2lubmVyLnNvdXJjZU9yZGVyfSlgKTtcbiAgICAgICAgICBsb2dnZXIudmVyYm9zZShgICBEaXNjYXJkZWQ6ICR7bG9zZXJOYW1lc31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIHsgcmVzb2x2ZWQsIGNvbmZsaWN0cyB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbmZsaWN0c0ZvckVsZW1lbnQoXG4gIHV0aWxpdGllczogVXRpbGl0eVdpdGhNZXRhW10sXG4gIHZlcmJvc2UgPSBmYWxzZVxuKTogUmVzb2x2ZWRVdGlsaXR5W10ge1xuICBjb25zdCB7IHJlc29sdmVkLCBjb25mbGljdHMgfSA9IHJlc29sdmVDb25mbGljdHModXRpbGl0aWVzLCB2ZXJib3NlKTtcbiAgXG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQW5kUmVzb2x2ZVV0aWxpdGllcyhcbiAgZXhpc3RpbmdVdGlsaXRpZXM6IFV0aWxpdHlXaXRoTWV0YVtdLFxuICBuZXdVdGlsaXRpZXM6IFV0aWxpdHlXaXRoTWV0YVtdLFxuICB2ZXJib3NlID0gZmFsc2Vcbik6IHsgdXRpbGl0aWVzOiBVdGlsaXR5V2l0aE1ldGFbXTsgY29uZmxpY3RzOiBDb25mbGljdEluZm9bXSB9IHtcbiAgY29uc3QgYWxsVXRpbGl0aWVzID0gWy4uLmV4aXN0aW5nVXRpbGl0aWVzLCAuLi5uZXdVdGlsaXRpZXNdO1xuICBjb25zdCB7IHJlc29sdmVkLCBjb25mbGljdHMgfSA9IHJlc29sdmVDb25mbGljdHMoYWxsVXRpbGl0aWVzLCB2ZXJib3NlKTtcbiAgXG4gIHJldHVybiB7IHV0aWxpdGllczogYWxsVXRpbGl0aWVzLCBjb25mbGljdHMgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVXRpbGl0eVdpdGhNZXRhKFxuICB2YWx1ZTogc3RyaW5nLFxuICB2YXJpYW50czogc3RyaW5nW10sXG4gIGNzc1Byb3BlcnR5OiBzdHJpbmcsXG4gIHNwZWNpZmljaXR5OiBTcGVjaWZpY2l0eSxcbiAgc291cmNlT3JkZXI6IG51bWJlcixcbiAgb3JpZ2luYWxTZWxlY3Rvcjogc3RyaW5nXG4pOiBVdGlsaXR5V2l0aE1ldGEge1xuICByZXR1cm4ge1xuICAgIHZhbHVlLFxuICAgIHZhcmlhbnRzOiBub3JtYWxpemVWYXJpYW50T3JkZXIodmFyaWFudHMpLFxuICAgIGNzc1Byb3BlcnR5LFxuICAgIHNwZWNpZmljaXR5LFxuICAgIHNvdXJjZU9yZGVyLFxuICAgIG9yaWdpbmFsU2VsZWN0b3JcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwVXRpbGl0aWVzQnlFbGVtZW50KFxuICB1dGlsaXRpZXM6IEFycmF5PHtcbiAgICB1dGlsaXR5OiBVdGlsaXR5V2l0aE1ldGE7XG4gICAgZWxlbWVudEtleTogc3RyaW5nO1xuICB9PlxuKTogTWFwPHN0cmluZywgVXRpbGl0eVdpdGhNZXRhW10+IHtcbiAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFV0aWxpdHlXaXRoTWV0YVtdPigpO1xuICBcbiAgZm9yIChjb25zdCB7IHV0aWxpdHksIGVsZW1lbnRLZXkgfSBvZiB1dGlsaXRpZXMpIHtcbiAgICBpZiAoIWdyb3Vwcy5oYXMoZWxlbWVudEtleSkpIHtcbiAgICAgIGdyb3Vwcy5zZXQoZWxlbWVudEtleSwgW10pO1xuICAgIH1cbiAgICBncm91cHMuZ2V0KGVsZW1lbnRLZXkpIS5wdXNoKHV0aWxpdHkpO1xuICB9XG4gIFxuICByZXR1cm4gZ3JvdXBzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUNvbmZsaWN0c0ZvckFsbEVsZW1lbnRzKFxuICB1dGlsaXRpZXNCeUVsZW1lbnQ6IE1hcDxzdHJpbmcsIFV0aWxpdHlXaXRoTWV0YVtdPixcbiAgdmVyYm9zZSA9IGZhbHNlXG4pOiBNYXA8c3RyaW5nLCBSZXNvbHZlZFV0aWxpdHlbXT4ge1xuICBjb25zdCByZXN1bHRzID0gbmV3IE1hcDxzdHJpbmcsIFJlc29sdmVkVXRpbGl0eVtdPigpO1xuICBcbiAgZm9yIChjb25zdCBbZWxlbWVudEtleSwgdXRpbGl0aWVzXSBvZiB1dGlsaXRpZXNCeUVsZW1lbnQpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVDb25mbGljdHNGb3JFbGVtZW50KHV0aWxpdGllcywgdmVyYm9zZSk7XG4gICAgcmVzdWx0cy5zZXQoZWxlbWVudEtleSwgcmVzb2x2ZWQpO1xuICB9XG4gIFxuICByZXR1cm4gcmVzdWx0cztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnRVdGlsaXRpZXNGb3JPdXRwdXQodXRpbGl0aWVzOiBSZXNvbHZlZFV0aWxpdHlbXSk6IFJlc29sdmVkVXRpbGl0eVtdIHtcbiAgcmV0dXJuIFsuLi51dGlsaXRpZXNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICBjb25zdCBhVmFyaWFudEtleSA9IGNyZWF0ZVZhcmlhbnRLZXkoYS52YXJpYW50cyk7XG4gICAgY29uc3QgYlZhcmlhbnRLZXkgPSBjcmVhdGVWYXJpYW50S2V5KGIudmFyaWFudHMpO1xuICAgIFxuICAgIGlmIChhVmFyaWFudEtleSAhPT0gYlZhcmlhbnRLZXkpIHtcbiAgICAgIHJldHVybiBhVmFyaWFudEtleS5sb2NhbGVDb21wYXJlKGJWYXJpYW50S2V5KTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIGEudmFsdWUubG9jYWxlQ29tcGFyZShiLnZhbHVlKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlZFV0aWxpdHlUb1N0cmluZyh1dGlsaXR5OiBSZXNvbHZlZFV0aWxpdHkpOiBzdHJpbmcge1xuICBpZiAodXRpbGl0eS52YXJpYW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdXRpbGl0eS52YWx1ZTtcbiAgfVxuICBcbiAgY29uc3QgcHJlZml4ID0gdXRpbGl0eS52YXJpYW50cy5qb2luKCc6Jyk7XG4gIHJldHVybiBgJHtwcmVmaXh9OiR7dXRpbGl0eS52YWx1ZX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZWRVdGlsaXRpZXNUb1N0cmluZ3ModXRpbGl0aWVzOiBSZXNvbHZlZFV0aWxpdHlbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHNvcnRVdGlsaXRpZXNGb3JPdXRwdXQodXRpbGl0aWVzKS5tYXAocmVzb2x2ZWRVdGlsaXR5VG9TdHJpbmcpO1xufSJdfQ==
@@ -0,0 +1,20 @@
1
+ export type SelectorType = 'class' | 'element';
2
+ export interface SelectorPart {
3
+ type: SelectorType;
4
+ name: string;
5
+ }
6
+ export interface DescendantSelector {
7
+ parent?: SelectorPart;
8
+ target: SelectorPart;
9
+ isComplex: boolean;
10
+ reason?: string;
11
+ }
12
+ export declare function isHtmlElement(name: string): boolean;
13
+ export declare function parseDescendantSelector(selector: string): DescendantSelector;
14
+ export declare function isDescendantSelector(selector: string): boolean;
15
+ export declare function isSimpleSelector(selector: string): boolean;
16
+ export declare function processDescendantSelector(selector: string): {
17
+ parsed: DescendantSelector | null;
18
+ skipped: boolean;
19
+ reason?: string;
20
+ };