@knighted/css 1.0.9 → 1.1.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
  [![codecov](https://codecov.io/gh/knightedcodemonkey/css/graph/badge.svg?token=q93Qqwvq6l)](https://codecov.io/gh/knightedcodemonkey/css)
5
5
  [![NPM version](https://img.shields.io/npm/v/@knighted/css.svg)](https://www.npmjs.com/package/@knighted/css)
6
6
 
7
- `@knighted/css` walks your JavaScript/TypeScript module graph, compiles every CSS-like dependency (plain CSS, Sass/SCSS, Less, vanilla-extract), and ships both the concatenated stylesheet string and optional `.knighted-css.*` imports that keep selectors typed. Use it when you need fully materialized styles ahead of runtime—Shadow DOM surfaces, server-rendered routes, static site builds, or any entry point that should inline CSS without spinning up a full bundler.
7
+ `@knighted/css` walks your module graph, compiles every CSS-like dependency (plain CSS, Sass/SCSS, Less, vanilla-extract), and ships both the concatenated stylesheet string and optional `.knighted-css.*` imports that keep selectors typed. Use it with or without a bundler: run the `css()` API in scripts/SSR pipelines, or lean on the `?knighted-css` loader query so bundlers import compiled CSS alongside modules. Either path yields fully materialized styles for Shadow DOM surfaces, server-rendered routes, static site builds, or any entry point that should inline CSS.
8
8
 
9
9
  ## Why
10
10
 
@@ -23,10 +23,11 @@ I needed a single source of truth for UI components that could drop into both li
23
23
 
24
24
  ## Features
25
25
 
26
- - Traverses module graphs with a built-in walker to find transitive style imports (no bundler required).
26
+ - Traverses module graphs with a built-in walker to find transitive style imports (bundler optional—works standalone or through bundler loaders), including static import attributes (`with { type: "css" }`) for extensionless or aliased specifiers.
27
27
  - Resolution parity via [`oxc-resolver`](https://github.com/oxc-project/oxc-resolver): tsconfig `paths`, package `exports` + `imports`, and extension aliasing (e.g., `.css.js` → `.css.ts`) are honored without wiring up a bundler.
28
28
  - Compiles `*.css`, `*.scss`, `*.sass`, `*.less`, and `*.css.ts` (vanilla-extract) files out of the box.
29
29
  - Optional post-processing via [`lightningcss`](https://github.com/parcel-bundler/lightningcss) for minification, prefixing, media query optimizations, or specificity boosts.
30
+ - Deterministic selector duplication via `autoStable`: duplicate matching class selectors with a stable namespace (default `knighted-`) in both plain CSS and CSS Modules exports.
30
31
  - Pluggable resolver/filter hooks for custom module resolution (e.g., Rspack/Vite/webpack aliases) or selective inclusion.
31
32
  - First-class loader (`@knighted/css/loader`) so bundlers can import compiled CSS alongside their modules via `?knighted-css`.
32
33
  - Built-in type generation CLI (`knighted-css-generate-types`) that emits `.knighted-css.*` selector manifests so TypeScript gets literal tokens in lockstep with the loader exports.
@@ -68,6 +69,13 @@ type CssOptions = {
68
69
  extensions?: string[] // customize file extensions to scan
69
70
  cwd?: string // working directory (defaults to process.cwd())
70
71
  filter?: (filePath: string) => boolean
72
+ autoStable?:
73
+ | boolean
74
+ | {
75
+ namespace?: string
76
+ include?: RegExp
77
+ exclude?: RegExp
78
+ }
71
79
  lightningcss?: boolean | LightningTransformOptions
72
80
  specificityBoost?: {
73
81
  visitor?: LightningTransformOptions<never>['visitor']
@@ -0,0 +1,10 @@
1
+ import type { LightningVisitor } from './helpers.js';
2
+ export interface AutoStableConfig {
3
+ namespace?: string;
4
+ include?: RegExp;
5
+ exclude?: RegExp;
6
+ }
7
+ export type AutoStableOption = boolean | AutoStableConfig;
8
+ export type AutoStableVisitor = LightningVisitor;
9
+ export declare function normalizeAutoStableOption(option?: AutoStableOption): AutoStableConfig | undefined;
10
+ export declare function buildAutoStableVisitor(option?: AutoStableOption): import("lightningcss").Visitor<Record<string, never>> | undefined;
@@ -0,0 +1,118 @@
1
+ import { serializeSelector } from './helpers.js';
2
+ import { stableClass } from './stableSelectors.js';
3
+ function isSelectorList(value) {
4
+ return Array.isArray(value);
5
+ }
6
+ function isRuleWithSelectors(rule) {
7
+ return typeof rule === 'object' && rule !== null;
8
+ }
9
+ function hasSelectorList(rule) {
10
+ return isSelectorList(rule.selectors);
11
+ }
12
+ function hasValueSelectorList(rule) {
13
+ return isSelectorList(rule.value?.selectors);
14
+ }
15
+ function getSelectors(rule) {
16
+ if (rule && hasSelectorList(rule))
17
+ return rule.selectors;
18
+ if (rule && hasValueSelectorList(rule))
19
+ return rule.value.selectors;
20
+ return undefined;
21
+ }
22
+ function setSelectors(rule, selectors) {
23
+ if (hasSelectorList(rule)) {
24
+ rule.selectors = selectors;
25
+ return rule;
26
+ }
27
+ if (hasValueSelectorList(rule)) {
28
+ rule.value.selectors = selectors;
29
+ return rule;
30
+ }
31
+ return rule;
32
+ }
33
+ export function normalizeAutoStableOption(option) {
34
+ if (!option)
35
+ return undefined;
36
+ if (option === true)
37
+ return {};
38
+ return option;
39
+ }
40
+ export function buildAutoStableVisitor(option) {
41
+ const config = normalizeAutoStableOption(option);
42
+ if (!config)
43
+ return undefined;
44
+ const visitor = {
45
+ Rule: {
46
+ style(rule) {
47
+ if (!isRuleWithSelectors(rule))
48
+ return rule;
49
+ const baseSelectors = getSelectors(rule);
50
+ if (!baseSelectors)
51
+ return rule;
52
+ const seen = new Set(baseSelectors.map(sel => serializeSelector(sel)));
53
+ const augmented = [...baseSelectors];
54
+ for (const selector of baseSelectors) {
55
+ const { selector: stableSelector, changed } = transformSelector(selector, config);
56
+ if (!changed)
57
+ continue;
58
+ const key = serializeSelector(stableSelector);
59
+ if (seen.has(key))
60
+ continue;
61
+ seen.add(key);
62
+ augmented.push(stableSelector);
63
+ }
64
+ return setSelectors(rule, augmented);
65
+ },
66
+ },
67
+ };
68
+ return visitor;
69
+ }
70
+ function transformSelector(selector, config) {
71
+ let changed = false;
72
+ const next = selector.map(node => transformNode(node, config, () => (changed = true)));
73
+ return { selector: next, changed };
74
+ }
75
+ function transformNode(node, config, markChanged) {
76
+ if (!node || typeof node !== 'object')
77
+ return node;
78
+ // Respect :global(...) scopes by leaving them untouched.
79
+ if (node.type === 'pseudo-class' && node.kind === 'global') {
80
+ return node;
81
+ }
82
+ if (node.type === 'class') {
83
+ const value = node.value ?? node.name ?? '';
84
+ if (!shouldTransform(value, config)) {
85
+ return node;
86
+ }
87
+ const stable = stableClass(value, { namespace: config.namespace });
88
+ if (!stable || stable === value) {
89
+ return node;
90
+ }
91
+ markChanged();
92
+ return { ...node, value: stable, name: stable };
93
+ }
94
+ if (hasSelectors(node)) {
95
+ const nestedSelectors = node.selectors.map(sel => {
96
+ const nested = transformSelector(sel, config);
97
+ if (nested.changed) {
98
+ markChanged();
99
+ }
100
+ return nested.selector;
101
+ });
102
+ return { ...node, selectors: nestedSelectors };
103
+ }
104
+ return node;
105
+ }
106
+ function hasSelectors(node) {
107
+ return Array.isArray(node.selectors);
108
+ }
109
+ function shouldTransform(token, config) {
110
+ if (config.exclude && config.exclude.test(token)) {
111
+ return false;
112
+ }
113
+ if (config.include && !config.include.test(token)) {
114
+ return false;
115
+ }
116
+ return true;
117
+ }
118
+ //# sourceMappingURL=autoStableSelectors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoStableSelectors.js","sourceRoot":"","sources":["../src/autoStableSelectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeAutoStableOption = normalizeAutoStableOption;
4
+ exports.buildAutoStableVisitor = buildAutoStableVisitor;
5
+ const helpers_js_1 = require("./helpers.cjs");
6
+ const stableSelectors_js_1 = require("./stableSelectors.cjs");
7
+ function isSelectorList(value) {
8
+ return Array.isArray(value);
9
+ }
10
+ function isRuleWithSelectors(rule) {
11
+ return typeof rule === 'object' && rule !== null;
12
+ }
13
+ function hasSelectorList(rule) {
14
+ return isSelectorList(rule.selectors);
15
+ }
16
+ function hasValueSelectorList(rule) {
17
+ return isSelectorList(rule.value?.selectors);
18
+ }
19
+ function getSelectors(rule) {
20
+ if (rule && hasSelectorList(rule))
21
+ return rule.selectors;
22
+ if (rule && hasValueSelectorList(rule))
23
+ return rule.value.selectors;
24
+ return undefined;
25
+ }
26
+ function setSelectors(rule, selectors) {
27
+ if (hasSelectorList(rule)) {
28
+ rule.selectors = selectors;
29
+ return rule;
30
+ }
31
+ if (hasValueSelectorList(rule)) {
32
+ rule.value.selectors = selectors;
33
+ return rule;
34
+ }
35
+ return rule;
36
+ }
37
+ function normalizeAutoStableOption(option) {
38
+ if (!option)
39
+ return undefined;
40
+ if (option === true)
41
+ return {};
42
+ return option;
43
+ }
44
+ function buildAutoStableVisitor(option) {
45
+ const config = normalizeAutoStableOption(option);
46
+ if (!config)
47
+ return undefined;
48
+ const visitor = {
49
+ Rule: {
50
+ style(rule) {
51
+ if (!isRuleWithSelectors(rule))
52
+ return rule;
53
+ const baseSelectors = getSelectors(rule);
54
+ if (!baseSelectors)
55
+ return rule;
56
+ const seen = new Set(baseSelectors.map(sel => (0, helpers_js_1.serializeSelector)(sel)));
57
+ const augmented = [...baseSelectors];
58
+ for (const selector of baseSelectors) {
59
+ const { selector: stableSelector, changed } = transformSelector(selector, config);
60
+ if (!changed)
61
+ continue;
62
+ const key = (0, helpers_js_1.serializeSelector)(stableSelector);
63
+ if (seen.has(key))
64
+ continue;
65
+ seen.add(key);
66
+ augmented.push(stableSelector);
67
+ }
68
+ return setSelectors(rule, augmented);
69
+ },
70
+ },
71
+ };
72
+ return visitor;
73
+ }
74
+ function transformSelector(selector, config) {
75
+ let changed = false;
76
+ const next = selector.map(node => transformNode(node, config, () => (changed = true)));
77
+ return { selector: next, changed };
78
+ }
79
+ function transformNode(node, config, markChanged) {
80
+ if (!node || typeof node !== 'object')
81
+ return node;
82
+ // Respect :global(...) scopes by leaving them untouched.
83
+ if (node.type === 'pseudo-class' && node.kind === 'global') {
84
+ return node;
85
+ }
86
+ if (node.type === 'class') {
87
+ const value = node.value ?? node.name ?? '';
88
+ if (!shouldTransform(value, config)) {
89
+ return node;
90
+ }
91
+ const stable = (0, stableSelectors_js_1.stableClass)(value, { namespace: config.namespace });
92
+ if (!stable || stable === value) {
93
+ return node;
94
+ }
95
+ markChanged();
96
+ return { ...node, value: stable, name: stable };
97
+ }
98
+ if (hasSelectors(node)) {
99
+ const nestedSelectors = node.selectors.map(sel => {
100
+ const nested = transformSelector(sel, config);
101
+ if (nested.changed) {
102
+ markChanged();
103
+ }
104
+ return nested.selector;
105
+ });
106
+ return { ...node, selectors: nestedSelectors };
107
+ }
108
+ return node;
109
+ }
110
+ function hasSelectors(node) {
111
+ return Array.isArray(node.selectors);
112
+ }
113
+ function shouldTransform(token, config) {
114
+ if (config.exclude && config.exclude.test(token)) {
115
+ return false;
116
+ }
117
+ if (config.include && !config.include.test(token)) {
118
+ return false;
119
+ }
120
+ return true;
121
+ }
122
+ //# sourceMappingURL=autoStableSelectors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autoStableSelectors.cjs","names":[],"sources":["../../src/autoStableSelectors.ts"],"sourcesContent":[null],"mappings":[[],[],[[0,0,70,0],[1,0,70,0],[2,0,70,0],[3,0,70,0],[4,0,70,0],[5,0,70,0],[6,0,70,0],[7,0,70,0],[8,0,70,0],[9,0,70,0],[10,0,70,0],[11,0,70,0],[12,0,70,0],[13,0,70,0],[14,0,70,0],[15,0,70,0],[16,0,70,0],[17,0,70,0],[18,0,70,0],[19,0,70,0],[20,0,70,0],[21,0,70,0],[22,0,70,0],[23,0,70,0],[24,0,70,0],[25,0,70,0],[26,0,70,0],[27,0,70,0],[28,0,70,0],[29,0,70,0],[30,0,70,0],[31,0,70,0],[32,0,70,0],[33,0,70,0],[34,0,70,0],[35,0,70,0],[36,0,70,0],[37,0,70,0],[38,0,70,0],[39,0,70,0],[40,0,70,0],[41,0,70,0],[42,0,70,0],[43,0,70,0],[44,0,70,0],[45,0,70,0],[46,0,70,0],[47,0,70,0],[48,0,70,0],[49,0,70,0],[50,0,70,0],[51,0,70,0],[52,0,70,0],[53,0,70,0],[54,0,70,0],[55,0,70,0],[56,0,70,0],[57,0,70,0],[58,0,70,0],[59,0,70,0],[60,0,70,0],[61,0,70,0]],[[0,0,76,0],[1,0,76,0],[2,0,76,0],[3,0,76,0],[4,0,76,0],[5,0,76,0],[6,0,76,0],[7,0,76,0],[8,0,76,0],[9,0,76,0],[10,0,76,0],[11,0,76,0],[12,0,76,0],[13,0,76,0],[14,0,76,0],[15,0,76,0],[16,0,76,0],[17,0,76,0],[18,0,76,0],[19,0,76,0],[20,0,76,0],[21,0,76,0],[22,0,76,0],[23,0,76,0],[24,0,76,0],[25,0,76,0],[26,0,76,0],[27,0,76,0],[28,0,76,0],[29,0,76,0],[30,0,76,0],[31,0,76,0],[32,0,76,0],[33,0,76,0],[34,0,76,0],[35,0,76,0],[36,0,76,0],[37,0,76,0],[38,0,76,0],[39,0,76,0],[40,0,76,0],[41,0,76,0],[42,0,76,0],[43,0,76,0],[44,0,76,0],[45,0,76,0],[46,0,76,0],[47,0,76,0],[48,0,76,0],[49,0,76,0],[50,0,76,0],[51,0,76,0],[52,0,76,0],[53,0,76,0],[54,0,76,0],[55,0,76,0]],[[0,0,1,0],[1,0,1,0],[2,0,1,0],[3,0,1,0],[4,0,1,0],[5,0,1,0],[6,0,1,0],[7,0,1,0],[8,0,1,0],[9,0,1,0],[10,0,1,0],[11,0,1,0],[12,0,1,0],[13,0,1,0],[14,0,1,0],[15,0,1,0],[16,0,1,0],[17,0,1,0],[18,0,1,0],[19,0,1,0],[20,0,1,0],[21,0,1,0],[22,0,1,0],[23,0,1,0],[24,0,1,0],[25,0,1,0],[26,0,1,0],[27,0,1,0],[28,0,1,0],[29,0,1,0],[30,0,1,0],[43,0,1,0],[44,0,1,0],[45,0,1,0]],[[0,0,2,0],[1,0,2,0],[2,0,2,0],[3,0,2,0],[4,0,2,0],[5,0,2,0],[6,0,2,0],[7,0,2,0],[8,0,2,0],[9,0,2,0],[10,0,2,0],[11,0,2,0],[12,0,2,0],[13,0,2,0],[14,0,2,0],[15,0,2,0],[16,0,2,0],[17,0,2,0],[18,0,2,0],[19,0,2,0],[20,0,2,0],[21,0,2,0],[22,0,2,0],[23,0,2,0],[24,0,2,0],[25,0,2,0],[26,0,2,0],[27,0,2,0],[28,0,2,0],[29,0,2,0],[30,0,2,0],[31,0,2,0],[32,0,2,0],[33,0,2,0],[34,0,2,0],[35,0,2,0],[36,0,2,0],[37,0,2,0],[38,0,2,0],[59,0,2,0],[60,0,2,0],[61,0,2,0]],[[0,0,32,0],[1,0,32,0],[2,0,32,0],[3,0,32,0],[4,0,32,0],[5,0,32,0],[6,0,32,0],[7,0,32,0],[8,0,32,0],[9,0,32,9],[10,0,32,9],[11,0,32,9],[12,0,32,9],[13,0,32,9],[14,0,32,9],[15,0,32,9],[16,0,32,9],[17,0,32,9],[18,0,32,9],[19,0,32,9],[20,0,32,9],[21,0,32,9],[22,0,32,9],[23,0,32,23],[24,0,32,24],[25,0,32,24],[26,0,32,24],[27,0,32,24],[28,0,32,24],[29,0,32,38],[30,0,32,38],[31,0,32,38]],[[4,0,33,2],[5,0,33,2],[6,0,33,2],[7,0,33,2],[8,0,33,2],[9,0,33,2],[10,0,33,2],[11,0,33,9],[12,0,33,9],[13,0,33,9],[14,0,33,9],[15,0,33,9],[16,0,33,14],[17,0,33,15],[18,0,33,15],[19,0,33,15],[20,0,33,15],[21,0,33,15],[22,0,33,15],[23,0,33,15],[24,0,33,22],[25,0,33,23],[26,0,33,23],[27,0,33,23],[28,0,33,23],[29,0,33,23],[30,0,33,28],[31,0,33,29]],[[0,0,34,0]],[[0,0,36,0],[1,0,36,0],[2,0,36,0],[3,0,36,0],[4,0,36,0],[5,0,36,0],[6,0,36,0],[7,0,36,0],[8,0,36,0],[9,0,36,9],[10,0,36,9],[11,0,36,9],[12,0,36,9],[13,0,36,9],[14,0,36,9],[15,0,36,9],[16,0,36,9],[17,0,36,9],[18,0,36,9],[19,0,36,9],[20,0,36,9],[21,0,36,9],[22,0,36,9],[23,0,36,9],[24,0,36,9],[25,0,36,9],[26,0,36,9],[27,0,36,9],[28,0,36,28],[29,0,36,29],[30,0,36,29],[31,0,36,29],[32,0,36,29],[33,0,36,42],[34,0,36,42],[35,0,36,42]],[[4,0,37,2],[5,0,37,2],[6,0,37,2],[7,0,37,2],[8,0,37,2],[9,0,37,2],[10,0,37,2],[11,0,37,9],[12,0,37,9],[13,0,37,9],[14,0,37,9],[15,0,37,9],[16,0,37,9],[17,0,37,9],[18,0,37,16],[19,0,37,16],[20,0,37,16],[21,0,37,16],[22,0,37,20],[23,0,37,20],[24,0,37,20],[25,0,37,20],[26,0,37,20],[27,0,37,25],[28,0,37,25],[29,0,37,25],[30,0,37,25],[31,0,37,25],[32,0,37,25],[33,0,37,25],[34,0,37,25],[35,0,37,33],[36,0,37,33],[37,0,37,33],[38,0,37,33],[39,0,37,37],[40,0,37,37],[41,0,37,37],[42,0,37,37],[43,0,37,41],[44,0,37,41],[45,0,37,41],[46,0,37,41],[47,0,37,41],[48,0,37,46],[49,0,37,46],[50,0,37,46],[51,0,37,46],[52,0,37,50]],[[0,0,38,0]],[[0,0,40,0],[1,0,40,0],[2,0,40,0],[3,0,40,0],[4,0,40,0],[5,0,40,0],[6,0,40,0],[7,0,40,0],[8,0,40,0],[9,0,40,9],[10,0,40,9],[11,0,40,9],[12,0,40,9],[13,0,40,9],[14,0,40,9],[15,0,40,9],[16,0,40,9],[17,0,40,9],[18,0,40,9],[19,0,40,9],[20,0,40,9],[21,0,40,9],[22,0,40,9],[23,0,40,9],[24,0,40,24],[25,0,41,2],[26,0,41,2],[27,0,41,2],[28,0,41,2],[29,0,41,25],[30,0,41,25],[31,0,41,25]],[[4,0,43,2],[5,0,43,2],[6,0,43,2],[7,0,43,2],[8,0,43,2],[9,0,43,2],[10,0,43,2],[11,0,43,9],[12,0,43,9],[13,0,43,9],[14,0,43,9],[15,0,43,9],[16,0,43,9],[17,0,43,9],[18,0,43,9],[19,0,43,9],[20,0,43,9],[21,0,43,9],[22,0,43,9],[23,0,43,9],[24,0,43,9],[25,0,43,23],[26,0,43,24],[27,0,43,24],[28,0,43,24],[29,0,43,24],[30,0,43,28],[31,0,43,29],[32,0,43,29],[33,0,43,29],[34,0,43,29],[35,0,43,29],[36,0,43,29],[37,0,43,29],[38,0,43,29],[39,0,43,29],[40,0,43,38],[41,0,43,39]],[[0,0,44,0]],[[0,0,46,0],[1,0,46,0],[2,0,46,0],[3,0,46,0],[4,0,46,0],[5,0,46,0],[6,0,46,0],[7,0,46,0],[8,0,46,0],[9,0,46,9],[10,0,46,9],[11,0,46,9],[12,0,46,9],[13,0,46,9],[14,0,46,9],[15,0,46,9],[16,0,46,9],[17,0,46,9],[18,0,46,9],[19,0,46,9],[20,0,46,9],[21,0,46,9],[22,0,46,9],[23,0,46,9],[24,0,46,9],[25,0,46,9],[26,0,46,9],[27,0,46,9],[28,0,46,9],[29,0,46,29],[30,0,47,2],[31,0,47,2],[32,0,47,2],[33,0,47,2],[34,0,47,25],[35,0,47,25],[36,0,47,25]],[[4,0,49,2],[5,0,49,2],[6,0,49,2],[7,0,49,2],[8,0,49,2],[9,0,49,2],[10,0,49,2],[11,0,49,9],[12,0,49,9],[13,0,49,9],[14,0,49,9],[15,0,49,9],[16,0,49,9],[17,0,49,9],[18,0,49,9],[19,0,49,9],[20,0,49,9],[21,0,49,9],[22,0,49,9],[23,0,49,9],[24,0,49,9],[25,0,49,23],[26,0,49,24],[27,0,49,24],[28,0,49,24],[29,0,49,24],[30,0,49,28],[31,0,49,29],[32,0,49,29],[33,0,49,29],[34,0,49,29],[35,0,49,29],[36,0,49,34],[37,0,49,34],[38,0,49,36],[39,0,49,36],[40,0,49,36],[41,0,49,36],[42,0,49,36],[43,0,49,36],[44,0,49,36],[45,0,49,36],[46,0,49,36],[47,0,49,45],[48,0,49,46]],[[0,0,50,0]],[[0,0,52,0],[1,0,52,0],[2,0,52,0],[3,0,52,0],[4,0,52,0],[5,0,52,0],[6,0,52,0],[7,0,52,0],[8,0,52,0],[9,0,52,9],[10,0,52,9],[11,0,52,9],[12,0,52,9],[13,0,52,9],[14,0,52,9],[15,0,52,9],[16,0,52,9],[17,0,52,9],[18,0,52,9],[19,0,52,9],[20,0,52,9],[21,0,52,21],[22,0,52,22],[23,0,52,22],[24,0,52,22],[25,0,52,22],[26,0,52,57],[27,0,52,57],[28,0,52,57]],[[4,0,53,2],[5,0,53,2],[6,0,53,2],[7,0,53,2],[8,0,53,6],[9,0,53,6],[10,0,53,6],[11,0,53,6],[12,0,53,10],[13,0,53,10],[14,0,53,10],[15,0,53,10],[16,0,53,14],[17,0,53,14],[18,0,53,14],[19,0,53,14],[20,0,53,14],[21,0,53,14],[22,0,53,14],[23,0,53,14],[24,0,53,14],[25,0,53,14],[26,0,53,14],[27,0,53,14],[28,0,53,14],[29,0,53,14],[30,0,53,14],[31,0,53,29],[32,0,53,30],[33,0,53,30],[34,0,53,30],[35,0,53,30],[36,0,53,34],[37,0,53,35]],[[8,0,53,37],[9,0,53,37],[10,0,53,37],[11,0,53,37],[12,0,53,37],[13,0,53,37],[14,0,53,37],[15,0,53,44],[16,0,53,44],[17,0,53,44],[18,0,53,44],[19,0,53,48],[20,0,53,49],[21,0,53,49],[22,0,53,49],[23,0,53,49],[24,0,53,49],[25,0,53,49],[26,0,53,49],[27,0,53,49],[28,0,53,49],[29,0,53,58]],[[4,0,54,2],[5,0,54,2],[6,0,54,2],[7,0,54,2],[8,0,54,6],[9,0,54,6],[10,0,54,6],[11,0,54,6],[12,0,54,10],[13,0,54,10],[14,0,54,10],[15,0,54,10],[16,0,54,14],[17,0,54,14],[18,0,54,14],[19,0,54,14],[20,0,54,14],[21,0,54,14],[22,0,54,14],[23,0,54,14],[24,0,54,14],[25,0,54,14],[26,0,54,14],[27,0,54,14],[28,0,54,14],[29,0,54,14],[30,0,54,14],[31,0,54,14],[32,0,54,14],[33,0,54,14],[34,0,54,14],[35,0,54,14],[36,0,54,34],[37,0,54,35],[38,0,54,35],[39,0,54,35],[40,0,54,35],[41,0,54,39],[42,0,54,40]],[[8,0,54,42],[9,0,54,42],[10,0,54,42],[11,0,54,42],[12,0,54,42],[13,0,54,42],[14,0,54,42],[15,0,54,49],[16,0,54,49],[17,0,54,49],[18,0,54,49],[19,0,54,53],[20,0,54,54],[21,0,54,54],[22,0,54,54],[23,0,54,54],[24,0,54,54],[25,0,54,59],[26,0,54,60],[27,0,54,60],[28,0,54,60],[29,0,54,60],[30,0,54,60],[31,0,54,60],[32,0,54,60],[33,0,54,60],[34,0,54,60],[35,0,54,69]],[[4,0,55,2],[5,0,55,2],[6,0,55,2],[7,0,55,2],[8,0,55,2],[9,0,55,2],[10,0,55,2],[11,0,55,9],[12,0,55,9],[13,0,55,9],[14,0,55,9],[15,0,55,9],[16,0,55,9],[17,0,55,9],[18,0,55,9],[19,0,55,9],[20,0,55,18]],[[0,0,56,0]],[[0,0,58,0],[1,0,58,0],[2,0,58,0],[3,0,58,0],[4,0,58,0],[5,0,58,0],[6,0,58,0],[7,0,58,0],[8,0,58,0],[9,0,58,9],[10,0,58,9],[11,0,58,9],[12,0,58,9],[13,0,58,9],[14,0,58,9],[15,0,58,9],[16,0,58,9],[17,0,58,9],[18,0,58,9],[19,0,58,9],[20,0,58,9],[21,0,58,21],[22,0,58,51],[23,0,58,51],[24,0,58,51],[25,0,58,51],[26,0,58,58],[27,0,58,58],[28,0,58,60],[29,0,58,60],[30,0,58,60],[31,0,58,60],[32,0,58,60],[33,0,58,60],[34,0,58,60],[35,0,58,60],[36,0,58,60],[37,0,58,81],[38,0,58,81],[39,0,58,81]],[[4,0,59,2],[5,0,59,2],[6,0,59,2],[7,0,59,2],[8,0,59,6],[9,0,59,6],[10,0,59,6],[11,0,59,6],[12,0,59,6],[13,0,59,6],[14,0,59,6],[15,0,59,6],[16,0,59,6],[17,0,59,6],[18,0,59,6],[19,0,59,6],[20,0,59,6],[21,0,59,6],[22,0,59,6],[23,0,59,21],[24,0,59,22],[25,0,59,22],[26,0,59,22],[27,0,59,22],[28,0,59,26],[29,0,59,27],[30,0,59,27],[31,0,59,29]],[[8,0,60,4],[9,0,60,4],[10,0,60,4],[11,0,60,4],[12,0,60,8],[13,0,60,9],[14,0,60,9],[15,0,60,9],[16,0,60,9],[17,0,60,9],[18,0,60,9],[19,0,60,9],[20,0,60,9],[21,0,60,9],[22,0,60,18],[23,0,60,18],[24,0,60,18],[25,0,60,21],[26,0,60,21],[27,0,60,21],[28,0,60,21],[29,0,60,21],[30,0,60,21],[31,0,60,21],[32,0,60,21],[33,0,60,21],[34,0,60,30]],[[8,0,61,4],[9,0,61,4],[10,0,61,4],[11,0,61,4],[12,0,61,4],[13,0,61,4],[14,0,61,4],[15,0,61,11],[16,0,61,11],[17,0,61,11],[18,0,61,11],[19,0,61,15]],[[4,0,62,2]],[[4,0,63,2],[5,0,63,2],[6,0,63,2],[7,0,63,2],[8,0,63,6],[9,0,63,6],[10,0,63,6],[11,0,63,6],[12,0,63,6],[13,0,63,6],[14,0,63,6],[15,0,63,6],[16,0,63,6],[17,0,63,6],[18,0,63,6],[19,0,63,6],[20,0,63,6],[21,0,63,6],[22,0,63,6],[23,0,63,6],[24,0,63,6],[25,0,63,6],[26,0,63,6],[27,0,63,6],[28,0,63,26],[29,0,63,27],[30,0,63,27],[31,0,63,27],[32,0,63,27],[33,0,63,31],[34,0,63,32],[35,0,63,32],[36,0,63,34]],[[8,0,64,4],[9,0,64,4],[10,0,64,4],[11,0,64,4],[12,0,64,8],[13,0,64,9],[14,0,64,9],[15,0,64,9],[16,0,64,9],[17,0,64,9],[18,0,64,14],[19,0,64,15],[20,0,64,15],[21,0,64,15],[22,0,64,15],[23,0,64,15],[24,0,64,15],[25,0,64,15],[26,0,64,15],[27,0,64,15],[28,0,64,24],[29,0,64,24],[30,0,64,24],[31,0,64,27],[32,0,64,27],[33,0,64,27],[34,0,64,27],[35,0,64,27],[36,0,64,27],[37,0,64,27],[38,0,64,27],[39,0,64,27],[40,0,64,36]],[[8,0,65,4],[9,0,65,4],[10,0,65,4],[11,0,65,4],[12,0,65,4],[13,0,65,4],[14,0,65,4],[15,0,65,11],[16,0,65,11],[17,0,65,11],[18,0,65,11],[19,0,65,15]],[[4,0,66,2]],[[4,0,67,2],[5,0,67,2],[6,0,67,2],[7,0,67,2],[8,0,67,2],[9,0,67,2],[10,0,67,2],[11,0,67,9],[12,0,67,9],[13,0,67,9],[14,0,67,9],[15,0,67,13]],[[0,0,68,0]],[[0,0,70,0],[1,0,70,0],[2,0,70,0],[3,0,70,0],[4,0,70,0],[5,0,70,0],[6,0,70,0],[7,0,70,0],[8,0,70,0],[9,0,70,16],[10,0,70,16],[11,0,70,16],[12,0,70,16],[13,0,70,16],[14,0,70,16],[15,0,70,16],[16,0,70,16],[17,0,70,16],[18,0,70,16],[19,0,70,16],[20,0,70,16],[21,0,70,16],[22,0,70,16],[23,0,70,16],[24,0,70,16],[25,0,70,16],[26,0,70,16],[27,0,70,16],[28,0,70,16],[29,0,70,16],[30,0,70,16],[31,0,70,16],[32,0,70,16],[33,0,70,16],[34,0,70,41],[35,0,70,42],[36,0,70,42],[37,0,70,42],[38,0,70,42],[39,0,70,42],[40,0,70,42],[41,0,70,67],[42,0,70,67],[43,0,70,67]],[[4,0,71,2],[5,0,71,2],[6,0,71,2],[7,0,71,2],[8,0,71,6],[9,0,71,7],[10,0,71,7],[11,0,71,7],[12,0,71,7],[13,0,71,7],[14,0,71,7],[15,0,71,13]],[[8,0,71,15],[9,0,71,15],[10,0,71,15],[11,0,71,15],[12,0,71,15],[13,0,71,15],[14,0,71,15],[15,0,71,22],[16,0,71,22],[17,0,71,22],[18,0,71,22],[19,0,71,22],[20,0,71,22],[21,0,71,22],[22,0,71,22],[23,0,71,22],[24,0,71,31]],[[4,0,72,2],[5,0,72,2],[6,0,72,2],[7,0,72,2],[8,0,72,6],[9,0,72,6],[10,0,72,6],[11,0,72,6],[12,0,72,6],[13,0,72,6],[14,0,72,12],[15,0,72,12],[16,0,72,12],[17,0,72,12],[18,0,72,12],[19,0,72,17],[20,0,72,17],[21,0,72,17],[22,0,72,17],[23,0,72,21]],[[8,0,72,23],[9,0,72,23],[10,0,72,23],[11,0,72,23],[12,0,72,23],[13,0,72,23],[14,0,72,23],[15,0,72,30],[16,0,72,30],[17,0,72,32]],[[4,0,73,2],[5,0,73,2],[6,0,73,2],[7,0,73,2],[8,0,73,2],[9,0,73,2],[10,0,73,2],[11,0,73,9],[12,0,73,9],[13,0,73,9],[14,0,73,9],[15,0,73,9],[16,0,73,9],[17,0,73,15]],[[0,0,74,0]],[[0,0,76,0],[1,0,76,0],[2,0,76,0],[3,0,76,0],[4,0,76,0],[5,0,76,0],[6,0,76,0],[7,0,76,0],[8,0,76,0],[9,0,76,16],[10,0,76,16],[11,0,76,16],[12,0,76,16],[13,0,76,16],[14,0,76,16],[15,0,76,16],[16,0,76,16],[17,0,76,16],[18,0,76,16],[19,0,76,16],[20,0,76,16],[21,0,76,16],[22,0,76,16],[23,0,76,16],[24,0,76,16],[25,0,76,16],[26,0,76,16],[27,0,76,16],[28,0,76,16],[29,0,76,16],[30,0,76,16],[31,0,76,38],[32,0,76,39],[33,0,76,39],[34,0,76,39],[35,0,76,39],[36,0,76,39],[37,0,76,39],[38,0,76,64],[39,0,76,64],[40,0,76,64]],[[4,0,77,2],[5,0,77,2],[6,0,77,2],[7,0,77,2],[8,0,77,2],[9,0,77,2],[10,0,77,8],[11,0,77,8],[12,0,77,8],[13,0,77,8],[14,0,77,8],[15,0,77,8],[16,0,77,14],[17,0,77,14],[18,0,77,14],[19,0,77,17],[20,0,77,17],[21,0,77,17],[22,0,77,17],[23,0,77,17],[24,0,77,17],[25,0,77,17],[26,0,77,17],[27,0,77,17],[28,0,77,17],[29,0,77,17],[30,0,77,17],[31,0,77,17],[32,0,77,17],[33,0,77,17],[34,0,77,17],[35,0,77,17],[36,0,77,17],[37,0,77,17],[38,0,77,17],[39,0,77,17],[40,0,77,17],[41,0,77,17],[42,0,77,17],[43,0,77,17],[44,0,77,42],[45,0,77,43],[46,0,77,43],[47,0,77,43],[48,0,77,43],[49,0,77,43],[50,0,77,43],[51,0,77,49],[52,0,77,50]],[[4,0,78,2],[5,0,78,2],[6,0,78,2],[7,0,78,2],[8,0,78,6],[9,0,78,7],[10,0,78,7],[11,0,78,7],[12,0,78,7],[13,0,78,7],[14,0,78,7],[15,0,78,13]],[[8,0,78,15],[9,0,78,15],[10,0,78,15],[11,0,78,15],[12,0,78,15],[13,0,78,15],[14,0,78,15],[15,0,78,22],[16,0,78,22],[17,0,78,22],[18,0,78,22],[19,0,78,22],[20,0,78,22],[21,0,78,22],[22,0,78,22],[23,0,78,22],[24,0,78,31]],[[4,0,80,2],[5,0,80,2],[6,0,80,2],[7,0,80,2],[8,0,80,2],[9,0,80,2],[10,0,80,8],[11,0,80,8],[12,0,80,8],[13,0,80,8],[14,0,80,8],[15,0,80,8],[16,0,80,8],[17,0,80,15],[18,0,80,15],[19,0,80,15],[20,0,80,36]],[[8,0,81,4],[9,0,81,4],[10,0,81,4],[11,0,81,4],[12,0,81,8],[13,0,81,8],[14,0,81,10]],[[12,0,82,6],[13,0,82,6],[14,0,82,6],[15,0,82,6],[16,0,82,6],[17,0,82,11],[18,0,82,12],[19,0,82,12],[20,0,82,12],[21,0,82,12],[22,0,82,16],[23,0,82,16],[24,0,82,16]],[[16,0,83,8],[17,0,83,8],[18,0,83,8],[19,0,83,8],[20,0,83,12],[21,0,83,13],[22,0,83,13],[23,0,83,13],[24,0,83,13],[25,0,83,13],[26,0,83,13],[27,0,83,13],[28,0,83,13],[29,0,83,13],[30,0,83,13],[31,0,83,13],[32,0,83,13],[33,0,83,13],[34,0,83,13],[35,0,83,13],[36,0,83,13],[37,0,83,13],[38,0,83,13],[39,0,83,13],[40,0,83,32],[41,0,83,33],[42,0,83,33],[43,0,83,33],[44,0,83,33],[45,0,83,37],[46,0,83,38]],[[20,0,83,40],[21,0,83,40],[22,0,83,40],[23,0,83,40],[24,0,83,40],[25,0,83,40],[26,0,83,40],[27,0,83,47],[28,0,83,47],[29,0,83,47],[30,0,83,47],[31,0,83,51]],[[16,0,84,8],[17,0,84,8],[18,0,84,8],[19,0,84,8],[20,0,84,8],[21,0,84,8],[22,0,84,14],[23,0,84,14],[24,0,84,14],[25,0,84,14],[26,0,84,14],[27,0,84,14],[28,0,84,14],[29,0,84,14],[30,0,84,14],[31,0,84,14],[32,0,84,14],[33,0,84,14],[34,0,84,14],[35,0,84,27],[36,0,84,27],[37,0,84,27],[38,0,84,30],[39,0,84,30],[40,0,84,30],[41,0,84,30],[42,0,84,30],[43,0,84,30],[44,0,84,30],[45,0,84,30],[46,0,84,30],[47,0,84,30],[48,0,84,30],[49,0,84,30],[50,0,84,42],[51,0,84,43],[52,0,84,43],[53,0,84,43],[54,0,84,43],[55,0,84,47],[56,0,84,48]],[[16,0,85,8],[17,0,85,8],[18,0,85,8],[19,0,85,8],[20,0,85,12],[21,0,85,13],[22,0,85,13],[23,0,85,13],[24,0,85,13],[25,0,85,13],[26,0,85,13],[27,0,85,13],[28,0,85,13],[29,0,85,13],[30,0,85,13],[31,0,85,13],[32,0,85,13],[33,0,85,13],[34,0,85,26]],[[20,0,85,28],[21,0,85,28],[22,0,85,28],[23,0,85,28],[24,0,85,28],[25,0,85,28],[26,0,85,28],[27,0,85,35],[28,0,85,35],[29,0,85,35],[30,0,85,35],[31,0,85,39]],[[16,0,86,8],[17,0,86,8],[18,0,86,8],[19,0,86,8],[20,0,86,8],[21,0,86,8],[22,0,86,14],[23,0,86,14],[24,0,86,14],[25,0,86,14],[26,0,86,18],[27,0,86,18],[28,0,86,18],[29,0,86,21],[30,0,86,21],[31,0,86,21],[32,0,86,21],[33,0,86,25],[34,0,86,25],[35,0,86,25],[36,0,86,28],[37,0,86,29],[38,0,86,29],[39,0,86,29],[40,0,86,29],[41,0,86,29],[42,0,86,29],[43,0,86,29],[44,0,86,29],[45,0,86,29],[46,0,86,29],[47,0,86,29],[48,0,86,29],[49,0,86,29],[50,0,86,42],[51,0,86,43],[52,0,86,43],[53,0,86,43],[54,0,86,46],[55,0,86,47],[56,0,86,47],[57,0,86,47],[58,0,86,50],[59,0,86,51],[60,0,86,51],[61,0,86,53],[62,0,86,54],[63,0,86,54],[64,0,86,54],[65,0,86,54],[66,0,86,54],[67,0,86,54],[68,0,86,54],[69,0,86,54],[70,0,86,54],[71,0,86,54],[72,0,86,54],[73,0,86,54],[74,0,86,54],[75,0,86,54],[76,0,86,54],[77,0,86,54],[78,0,86,54],[79,0,86,54],[80,0,86,54],[81,0,86,54],[82,0,86,54],[83,0,86,54],[84,0,86,54],[85,0,86,54],[86,0,86,54],[87,0,86,54],[88,0,86,54],[89,0,86,54],[90,0,86,54],[91,0,86,54],[92,0,86,54],[93,0,86,54],[94,0,86,54],[95,0,86,54],[96,0,86,71],[97,0,86,71],[98,0,86,72],[99,0,86,72],[100,0,86,72],[101,0,86,75],[102,0,86,76],[103,0,86,77],[104,0,86,78]],[[16,0,87,8],[17,0,87,8],[18,0,87,8],[19,0,87,8],[20,0,87,8],[21,0,87,8],[22,0,87,14],[23,0,87,14],[24,0,87,14],[25,0,87,14],[26,0,87,14],[27,0,87,14],[28,0,87,14],[29,0,87,14],[30,0,87,14],[31,0,87,23],[32,0,87,23],[33,0,87,23],[34,0,87,48],[35,0,87,49],[36,0,87,49],[37,0,87,49],[38,0,87,52],[39,0,87,52],[40,0,87,52],[41,0,87,52],[42,0,87,52],[43,0,87,52],[44,0,87,52],[45,0,87,52],[46,0,87,52],[47,0,87,52],[48,0,87,52],[49,0,87,52],[50,0,87,52],[51,0,87,65],[52,0,87,66]],[[16,0,89,8],[17,0,89,8],[18,0,89,8],[19,0,89,8],[20,0,89,8],[21,0,89,13],[22,0,89,13],[23,0,89,13],[24,0,89,13],[25,0,89,13],[26,0,89,13],[27,0,89,19],[28,0,89,19],[29,0,89,19],[30,0,89,19],[31,0,89,19],[32,0,89,19],[33,0,89,19],[34,0,89,19],[35,0,89,27],[36,0,89,27],[37,0,89,27],[38,0,89,27],[39,0,89,31],[40,0,89,31],[41,0,89,31],[42,0,89,31],[43,0,89,31],[44,0,89,31],[45,0,89,31],[46,0,89,31],[47,0,89,31],[48,0,89,31],[49,0,89,31],[50,0,89,31],[51,0,89,31],[52,0,89,44],[53,0,89,44],[54,0,89,46]],[[20,0,90,10],[21,0,90,10],[22,0,90,10],[23,0,90,10],[24,0,90,10],[25,0,90,10],[26,0,90,16],[27,0,90,16],[28,0,90,18],[29,0,90,18],[30,0,90,18],[31,0,90,18],[32,0,90,18],[33,0,90,18],[34,0,90,18],[35,0,90,18],[36,0,90,26],[37,0,90,26],[38,0,90,28],[39,0,90,28],[40,0,90,28],[41,0,90,28],[42,0,90,28],[43,0,90,28],[44,0,90,28],[45,0,90,28],[46,0,90,28],[47,0,90,28],[48,0,90,28],[49,0,90,28],[50,0,90,28],[51,0,90,28],[52,0,90,42],[53,0,90,42],[54,0,90,44],[55,0,90,44],[56,0,90,44],[57,0,90,44],[58,0,90,44],[59,0,90,44],[60,0,90,44],[61,0,90,51],[62,0,90,51],[63,0,90,53],[64,0,90,53],[65,0,90,53],[66,0,90,56],[67,0,90,56],[68,0,90,56],[69,0,90,56],[70,0,90,56],[71,0,90,56],[72,0,90,56],[73,0,90,56],[74,0,90,56],[75,0,90,56],[76,0,90,56],[77,0,90,56],[78,0,90,56],[79,0,90,56],[80,0,90,56],[81,0,90,56],[82,0,90,56],[83,0,90,73],[84,0,91,12],[85,0,91,12],[86,0,91,12],[87,0,91,12],[88,0,91,12],[89,0,91,12],[90,0,91,12],[91,0,91,12],[92,0,91,20],[93,0,91,20],[94,0,92,12],[95,0,92,12],[96,0,92,12],[97,0,92,12],[98,0,92,12],[99,0,92,12],[100,0,92,18],[101,0,93,11]],[[20,0,94,10],[21,0,94,10],[22,0,94,10],[23,0,94,10],[24,0,94,14],[25,0,94,15],[26,0,94,15],[27,0,94,15],[28,0,94,15],[29,0,94,15],[30,0,94,15],[31,0,94,15],[32,0,94,22]],[[24,0,94,24],[25,0,94,24],[26,0,94,24],[27,0,94,24],[28,0,94,24],[29,0,94,24],[30,0,94,24],[31,0,94,24],[32,0,94,24]],[[20,0,95,10],[21,0,95,10],[22,0,95,10],[23,0,95,10],[24,0,95,10],[25,0,95,10],[26,0,95,16],[27,0,95,16],[28,0,95,16],[29,0,95,19],[30,0,95,19],[31,0,95,19],[32,0,95,22],[33,0,95,22],[34,0,95,22],[35,0,95,22],[36,0,95,22],[37,0,95,22],[38,0,95,22],[39,0,95,22],[40,0,95,22],[41,0,95,22],[42,0,95,22],[43,0,95,22],[44,0,95,22],[45,0,95,22],[46,0,95,22],[47,0,95,22],[48,0,95,22],[49,0,95,22],[50,0,95,22],[51,0,95,22],[52,0,95,22],[53,0,95,22],[54,0,95,22],[55,0,95,22],[56,0,95,22],[57,0,95,22],[58,0,95,22],[59,0,95,22],[60,0,95,22],[61,0,95,22],[62,0,95,22],[63,0,95,22],[64,0,95,22],[65,0,95,22],[66,0,95,39],[67,0,95,39],[68,0,95,40],[69,0,95,40],[70,0,95,40],[71,0,95,40],[72,0,95,40],[73,0,95,40],[74,0,95,40],[75,0,95,40],[76,0,95,40],[77,0,95,40],[78,0,95,40],[79,0,95,40],[80,0,95,40],[81,0,95,40],[82,0,95,54],[83,0,95,55]],[[20,0,96,10],[21,0,96,10],[22,0,96,10],[23,0,96,10],[24,0,96,14],[25,0,96,14],[26,0,96,14],[27,0,96,14],[28,0,96,18],[29,0,96,19],[30,0,96,19],[31,0,96,19],[32,0,96,22],[33,0,96,23],[34,0,96,23],[35,0,96,23],[36,0,96,26],[37,0,96,27]],[[24,0,96,29],[25,0,96,29],[26,0,96,29],[27,0,96,29],[28,0,96,29],[29,0,96,29],[30,0,96,29],[31,0,96,29],[32,0,96,29]],[[20,0,97,10],[21,0,97,10],[22,0,97,10],[23,0,97,10],[24,0,97,14],[25,0,97,15],[26,0,97,15],[27,0,97,15],[28,0,97,18],[29,0,97,19],[30,0,97,19],[31,0,97,19],[32,0,97,22],[33,0,97,23]],[[20,0,98,10],[21,0,98,10],[22,0,98,10],[23,0,98,10],[24,0,98,10],[25,0,98,10],[26,0,98,10],[27,0,98,10],[28,0,98,10],[29,0,98,19],[30,0,98,20],[31,0,98,20],[32,0,98,20],[33,0,98,20],[34,0,98,24],[35,0,98,25],[36,0,98,25],[37,0,98,25],[38,0,98,25],[39,0,98,25],[40,0,98,25],[41,0,98,25],[42,0,98,25],[43,0,98,25],[44,0,98,25],[45,0,98,25],[46,0,98,25],[47,0,98,25],[48,0,98,25],[49,0,98,39],[50,0,98,40]],[[16,0,99,8]],[[16,0,101,8],[17,0,101,8],[18,0,101,8],[19,0,101,8],[20,0,101,8],[21,0,101,8],[22,0,101,8],[23,0,101,15],[24,0,101,15],[25,0,101,15],[26,0,101,15],[27,0,101,15],[28,0,101,15],[29,0,101,15],[30,0,101,15],[31,0,101,15],[32,0,101,15],[33,0,101,15],[34,0,101,15],[35,0,101,27],[36,0,101,28],[37,0,101,28],[38,0,101,28],[39,0,101,28],[40,0,101,32],[41,0,101,32],[42,0,101,34],[43,0,101,34],[44,0,101,34],[45,0,101,34],[46,0,101,34],[47,0,101,34],[48,0,101,34],[49,0,101,34],[50,0,101,34],[51,0,101,43],[52,0,101,44]],[[12,0,102,6],[13,0,102,7]],[[9,0,103,5]],[[5,0,104,3]],[[4,0,106,2],[5,0,106,2],[6,0,106,2],[7,0,106,2],[8,0,106,2],[9,0,106,2],[10,0,106,2],[11,0,106,9],[12,0,106,9],[13,0,106,9],[14,0,106,9],[15,0,106,9],[16,0,106,9],[17,0,106,9],[18,0,106,16]],[[0,0,107,0]],[[0,0,109,0],[1,0,109,0],[2,0,109,0],[3,0,109,0],[4,0,109,0],[5,0,109,0],[6,0,109,0],[7,0,109,0],[8,0,109,0],[9,0,109,9],[10,0,109,9],[11,0,109,9],[12,0,109,9],[13,0,109,9],[14,0,109,9],[15,0,109,9],[16,0,109,9],[17,0,109,9],[18,0,109,9],[19,0,109,9],[20,0,109,9],[21,0,109,9],[22,0,109,9],[23,0,109,9],[24,0,109,9],[25,0,109,9],[26,0,109,26],[27,0,110,2],[28,0,110,2],[29,0,110,2],[30,0,110,2],[31,0,110,2],[32,0,110,2],[33,0,110,2],[34,0,110,2],[35,0,110,20],[36,0,110,20],[37,0,111,2],[38,0,111,2],[39,0,111,2],[40,0,111,2],[41,0,111,2],[42,0,111,2],[43,0,111,26],[44,0,111,26],[45,0,111,26]],[[4,0,113,2],[5,0,113,2],[6,0,113,2],[7,0,113,2],[8,0,113,6],[9,0,113,6],[10,0,113,6],[11,0,113,6],[12,0,113,6],[13,0,113,6],[14,0,113,6],[15,0,113,13],[16,0,113,13],[17,0,113,13],[18,0,113,16],[19,0,113,16],[20,0,113,16],[21,0,113,16],[22,0,113,16],[23,0,113,21]],[[4,0,114,2],[5,0,114,2],[6,0,114,2],[7,0,114,2],[8,0,114,2],[9,0,114,2],[10,0,114,8],[11,0,114,8],[12,0,114,8],[13,0,114,8],[14,0,114,12],[15,0,114,12],[16,0,114,12],[17,0,114,15],[18,0,114,15],[19,0,114,15],[20,0,114,15],[21,0,114,15],[22,0,114,15],[23,0,114,15],[24,0,114,15],[25,0,114,23],[26,0,114,24],[27,0,114,24],[28,0,114,24],[29,0,114,27],[30,0,114,28],[31,0,114,28],[32,0,114,28],[33,0,114,28],[34,0,114,32],[35,0,114,33],[36,0,114,33],[37,0,114,35],[38,0,114,36],[39,0,114,36],[40,0,114,36],[41,0,114,36],[42,0,114,36],[43,0,114,36],[44,0,114,36],[45,0,114,36],[46,0,114,36],[47,0,114,36],[48,0,114,36],[49,0,114,36],[50,0,114,36],[51,0,114,49],[52,0,114,50],[53,0,114,50],[54,0,114,50],[55,0,114,50],[56,0,114,54],[57,0,114,54],[58,0,114,56],[59,0,114,56],[60,0,114,56],[61,0,114,56],[62,0,114,56],[63,0,114,56],[64,0,114,62],[65,0,114,62],[66,0,114,64],[67,0,114,64],[68,0,114,64],[69,0,114,67],[70,0,114,67],[71,0,114,69],[72,0,114,70],[73,0,114,71],[74,0,114,71],[75,0,114,71],[76,0,114,71],[77,0,114,71],[78,0,114,71],[79,0,114,71],[80,0,114,78],[81,0,114,78],[82,0,114,78],[83,0,114,81],[84,0,114,81],[85,0,114,81],[86,0,114,81],[87,0,114,85],[88,0,114,86],[89,0,114,87],[90,0,114,88]],[[4,0,115,2],[5,0,115,2],[6,0,115,2],[7,0,115,2],[8,0,115,2],[9,0,115,2],[10,0,115,2],[11,0,115,9],[12,0,115,9],[13,0,115,11],[14,0,115,11],[15,0,115,11],[16,0,115,11],[17,0,115,11],[18,0,115,11],[19,0,115,11],[20,0,115,11],[21,0,115,19],[22,0,115,19],[23,0,115,21],[24,0,115,21],[25,0,115,21],[26,0,115,21],[27,0,115,25],[28,0,115,25],[29,0,115,27],[30,0,115,27],[31,0,115,27],[32,0,115,27],[33,0,115,27],[34,0,115,27],[35,0,115,27],[36,0,115,34],[37,0,115,34],[38,0,115,36]],[[0,0,116,0]],[[0,0,118,0],[1,0,118,0],[2,0,118,0],[3,0,118,0],[4,0,118,0],[5,0,118,0],[6,0,118,0],[7,0,118,0],[8,0,118,0],[9,0,118,9],[10,0,118,9],[11,0,118,9],[12,0,118,9],[13,0,118,9],[14,0,118,9],[15,0,118,9],[16,0,118,9],[17,0,118,9],[18,0,118,9],[19,0,118,9],[20,0,118,9],[21,0,118,9],[22,0,118,22],[23,0,119,2],[24,0,119,2],[25,0,119,2],[26,0,119,2],[27,0,119,20],[28,0,119,20],[29,0,120,2],[30,0,120,2],[31,0,120,2],[32,0,120,2],[33,0,120,2],[34,0,120,2],[35,0,120,26],[36,0,120,26],[37,0,121,2],[38,0,121,2],[39,0,121,2],[40,0,121,2],[41,0,121,2],[42,0,121,2],[43,0,121,2],[44,0,121,2],[45,0,121,2],[46,0,121,2],[47,0,121,2],[48,0,121,25],[49,0,121,25],[50,0,121,25]],[[4,0,123,2],[5,0,123,2],[6,0,123,2],[7,0,123,2],[8,0,123,6],[9,0,123,7],[10,0,123,7],[11,0,123,7],[12,0,123,7],[13,0,123,11],[14,0,123,11],[15,0,123,11],[16,0,123,11],[17,0,123,15],[18,0,123,15],[19,0,123,15],[20,0,123,15],[21,0,123,15],[22,0,123,15],[23,0,123,15],[24,0,123,22],[25,0,123,22],[26,0,123,22],[27,0,123,22],[28,0,123,26],[29,0,123,26],[30,0,123,26],[31,0,123,26],[32,0,123,26],[33,0,123,31],[34,0,123,31],[35,0,123,31],[36,0,123,31],[37,0,123,31],[38,0,123,31],[39,0,123,31],[40,0,123,31],[41,0,123,39]],[[8,0,123,41],[9,0,123,41],[10,0,123,41],[11,0,123,41],[12,0,123,41],[13,0,123,41],[14,0,123,41],[15,0,123,48],[16,0,123,48],[17,0,123,48],[18,0,123,48],[19,0,123,52]],[[4,0,125,2],[5,0,125,2],[6,0,125,2],[7,0,125,2],[8,0,125,2],[9,0,125,2],[10,0,125,2],[11,0,125,2],[12,0,125,2],[13,0,125,2],[14,0,125,2],[15,0,125,2],[16,0,125,2],[17,0,125,2],[18,0,125,2],[19,0,125,2],[20,0,125,2],[21,0,125,2],[22,0,125,2],[23,0,125,2],[24,0,125,2],[25,0,125,2],[26,0,125,2],[27,0,125,2],[28,0,125,2],[29,0,125,2],[30,0,125,2],[31,0,125,2],[32,0,125,2],[33,0,125,2],[34,0,125,2],[35,0,125,2],[36,0,125,2],[37,0,125,2],[38,0,125,2],[39,0,125,2],[40,0,125,2],[41,0,125,2],[42,0,125,2],[43,0,125,2],[44,0,125,2],[45,0,125,2],[46,0,125,2],[47,0,125,2],[48,0,125,2],[49,0,125,2],[50,0,125,2],[51,0,125,2],[52,0,125,2],[53,0,125,2],[54,0,125,2],[55,0,125,2],[56,0,125,2],[57,0,125,2],[58,0,125,2],[59,0,125,2],[60,0,125,2]],[[4,0,126,2],[5,0,126,2],[6,0,126,2],[7,0,126,2],[8,0,126,6],[9,0,126,6],[10,0,126,6],[11,0,126,6],[12,0,126,10],[13,0,126,11],[14,0,126,11],[15,0,126,11],[16,0,126,11],[17,0,126,15],[18,0,126,15],[19,0,126,15],[20,0,126,15],[21,0,126,15],[22,0,126,20],[23,0,126,20],[24,0,126,20],[25,0,126,20],[26,0,126,20],[27,0,126,20],[28,0,126,20],[29,0,126,20],[30,0,126,20],[31,0,126,20],[32,0,126,20],[33,0,126,20],[34,0,126,20],[35,0,126,20],[36,0,126,34],[37,0,126,34],[38,0,126,34],[39,0,126,34],[40,0,126,38],[41,0,126,38],[42,0,126,38],[43,0,126,38],[44,0,126,42],[45,0,126,43],[46,0,126,43],[47,0,126,43],[48,0,126,43],[49,0,126,47],[50,0,126,47],[51,0,126,47],[52,0,126,47],[53,0,126,47],[54,0,126,52],[55,0,126,52],[56,0,126,52],[57,0,126,52],[58,0,126,52],[59,0,126,52],[60,0,126,52],[61,0,126,52],[62,0,126,60],[63,0,126,60],[64,0,126,62]],[[8,0,127,4],[9,0,127,4],[10,0,127,4],[11,0,127,4],[12,0,127,4],[13,0,127,4],[14,0,127,4],[15,0,127,11],[16,0,127,11],[17,0,127,11],[18,0,127,11],[19,0,127,15]],[[4,0,128,2]],[[4,0,130,2],[5,0,130,2],[6,0,130,2],[7,0,130,2],[8,0,130,6],[9,0,130,6],[10,0,130,6],[11,0,130,6],[12,0,130,10],[13,0,130,11],[14,0,130,11],[15,0,130,11],[16,0,130,11],[17,0,130,15],[18,0,130,15],[19,0,130,15],[20,0,130,15],[21,0,130,15],[22,0,130,20],[23,0,130,20],[24,0,130,20],[25,0,130,20],[26,0,130,20],[27,0,130,20],[28,0,130,20],[29,0,130,27],[30,0,130,27],[31,0,130,29]],[[8,0,131,4],[9,0,131,4],[10,0,131,4],[11,0,131,4],[12,0,131,4],[13,0,131,4],[14,0,131,10],[15,0,131,10],[16,0,131,10],[17,0,131,10],[18,0,131,10],[19,0,131,15],[20,0,131,15],[21,0,131,15],[22,0,131,18],[23,0,131,18],[24,0,131,18],[25,0,131,18],[26,0,131,22],[27,0,131,23],[28,0,131,23],[29,0,131,23],[30,0,131,23],[31,0,131,23],[32,0,131,28],[33,0,131,28],[34,0,131,28],[35,0,131,28],[36,0,131,32],[37,0,131,32],[38,0,131,32],[39,0,131,32],[40,0,131,36],[41,0,131,37],[42,0,131,37],[43,0,131,37],[44,0,131,37],[45,0,131,41],[46,0,131,41],[47,0,131,41],[48,0,131,41],[49,0,131,45],[50,0,131,45],[51,0,131,47]],[[8,0,132,4],[9,0,132,4],[10,0,132,4],[11,0,132,4],[12,0,132,8],[13,0,132,9],[14,0,132,9],[15,0,132,9],[16,0,132,9],[17,0,132,9],[18,0,132,9],[19,0,132,9],[20,0,132,9],[21,0,132,9],[22,0,132,9],[23,0,132,9],[24,0,132,9],[25,0,132,9],[26,0,132,9],[27,0,132,9],[28,0,132,24],[29,0,132,25],[30,0,132,25],[31,0,132,25],[32,0,132,25],[33,0,132,25],[34,0,132,30],[35,0,132,30],[36,0,132,32],[37,0,132,32],[38,0,132,32],[39,0,132,32],[40,0,132,32],[41,0,132,32],[42,0,132,38],[43,0,132,39],[44,0,132,39],[45,0,132,41]],[[12,0,133,6],[13,0,133,6],[14,0,133,6],[15,0,133,6],[16,0,133,6],[17,0,133,6],[18,0,133,6],[19,0,133,13],[20,0,133,13],[21,0,133,13],[22,0,133,13],[23,0,133,17]],[[8,0,134,4]],[[8,0,135,4],[9,0,135,4],[10,0,135,4],[11,0,135,4],[12,0,135,4],[13,0,135,4],[14,0,135,10],[15,0,135,10],[16,0,135,10],[17,0,135,10],[18,0,135,10],[19,0,135,10],[20,0,135,16],[21,0,135,16],[22,0,135,16],[23,0,135,19],[24,0,135,19],[25,0,135,19],[26,0,135,19],[27,0,135,19],[28,0,135,19],[29,0,135,19],[30,0,135,19],[31,0,135,19],[32,0,135,19],[33,0,135,19],[34,0,135,19],[35,0,135,19],[36,0,135,19],[37,0,135,19],[38,0,135,19],[39,0,135,19],[40,0,135,19],[41,0,135,19],[42,0,135,19],[43,0,135,19],[44,0,135,19],[45,0,135,19],[46,0,135,19],[47,0,135,19],[48,0,135,19],[49,0,135,19],[50,0,135,19],[51,0,135,19],[52,0,135,19],[53,0,135,19],[54,0,135,19],[55,0,135,19],[56,0,135,19],[57,0,135,19],[58,0,135,19],[59,0,135,30],[60,0,135,30],[61,0,135,31],[62,0,135,31],[63,0,135,31],[64,0,135,31],[65,0,135,31],[66,0,135,36],[67,0,135,36],[68,0,135,38],[69,0,135,38],[70,0,135,40],[71,0,135,40],[72,0,135,40],[73,0,135,40],[74,0,135,40],[75,0,135,40],[76,0,135,40],[77,0,135,40],[78,0,135,40],[79,0,135,49],[80,0,135,49],[81,0,135,51],[82,0,135,51],[83,0,135,51],[84,0,135,51],[85,0,135,51],[86,0,135,51],[87,0,135,57],[88,0,135,58],[89,0,135,58],[90,0,135,58],[91,0,135,58],[92,0,135,58],[93,0,135,58],[94,0,135,58],[95,0,135,58],[96,0,135,58],[97,0,135,67],[98,0,135,67],[99,0,135,69],[100,0,135,70]],[[8,0,136,4],[9,0,136,4],[10,0,136,4],[11,0,136,4],[12,0,136,8],[13,0,136,9],[14,0,136,9],[15,0,136,9],[16,0,136,9],[17,0,136,9],[18,0,136,9],[19,0,136,15],[20,0,136,15],[21,0,136,15],[22,0,136,15],[23,0,136,19],[24,0,136,19],[25,0,136,19],[26,0,136,19],[27,0,136,19],[28,0,136,19],[29,0,136,25],[30,0,136,25],[31,0,136,25],[32,0,136,25],[33,0,136,25],[34,0,136,30],[35,0,136,30],[36,0,136,30],[37,0,136,30],[38,0,136,30],[39,0,136,35],[40,0,136,35],[41,0,136,37]],[[12,0,137,6],[13,0,137,6],[14,0,137,6],[15,0,137,6],[16,0,137,6],[17,0,137,6],[18,0,137,6],[19,0,137,13],[20,0,137,13],[21,0,137,13],[22,0,137,13],[23,0,137,17]],[[8,0,138,4]],[[8,0,139,4],[9,0,139,4],[10,0,139,4],[11,0,139,4],[12,0,139,4],[13,0,139,4],[14,0,139,4],[15,0,139,4],[16,0,139,4],[17,0,139,4],[18,0,139,4],[19,0,139,15],[20,0,139,15],[21,0,139,17]],[[8,0,140,4],[9,0,140,4],[10,0,140,4],[11,0,140,4],[12,0,140,4],[13,0,140,4],[14,0,140,4],[15,0,140,11],[16,0,140,11],[17,0,140,13],[18,0,140,13],[19,0,140,13],[20,0,140,16],[21,0,140,16],[22,0,140,16],[23,0,140,16],[24,0,140,20],[25,0,140,20],[26,0,140,22],[27,0,140,22],[28,0,140,22],[29,0,140,22],[30,0,140,22],[31,0,140,27],[32,0,140,27],[33,0,140,29],[34,0,140,29],[35,0,140,29],[36,0,140,29],[37,0,140,29],[38,0,140,29],[39,0,140,35],[40,0,140,35],[41,0,140,37],[42,0,140,37],[43,0,140,37],[44,0,140,37],[45,0,140,41],[46,0,140,41],[47,0,140,43],[48,0,140,43],[49,0,140,43],[50,0,140,43],[51,0,140,43],[52,0,140,43],[53,0,140,49],[54,0,140,49],[55,0,140,51]],[[4,0,141,2]],[[4,0,143,2],[5,0,143,2],[6,0,143,2],[7,0,143,2],[8,0,143,6],[9,0,143,6],[10,0,143,6],[11,0,143,6],[12,0,143,6],[13,0,143,6],[14,0,143,6],[15,0,143,6],[16,0,143,6],[17,0,143,6],[18,0,143,6],[19,0,143,6],[20,0,143,18],[21,0,143,19],[22,0,143,19],[23,0,143,19],[24,0,143,19],[25,0,143,23],[26,0,143,24],[27,0,143,24],[28,0,143,26]],[[8,0,144,4],[9,0,144,4],[10,0,144,4],[11,0,144,4],[12,0,144,4],[13,0,144,4],[14,0,144,10],[15,0,144,10],[16,0,144,10],[17,0,144,10],[18,0,144,10],[19,0,144,10],[20,0,144,10],[21,0,144,10],[22,0,144,10],[23,0,144,10],[24,0,144,10],[25,0,144,10],[26,0,144,10],[27,0,144,10],[28,0,144,10],[29,0,144,25],[30,0,144,25],[31,0,144,25],[32,0,144,28],[33,0,144,28],[34,0,144,28],[35,0,144,28],[36,0,144,32],[37,0,144,33],[38,0,144,33],[39,0,144,33],[40,0,144,33],[41,0,144,33],[42,0,144,33],[43,0,144,33],[44,0,144,33],[45,0,144,33],[46,0,144,42],[47,0,144,43],[48,0,144,43],[49,0,144,43],[50,0,144,46],[51,0,144,47],[52,0,144,47],[53,0,144,47],[54,0,144,50],[55,0,144,51],[56,0,144,51],[57,0,144,53],[58,0,144,53]],[[12,0,145,6],[13,0,145,6],[14,0,145,6],[15,0,145,6],[16,0,145,6],[17,0,145,6],[18,0,145,12],[19,0,145,12],[20,0,145,12],[21,0,145,12],[22,0,145,12],[23,0,145,12],[24,0,145,18],[25,0,145,18],[26,0,145,18],[27,0,145,21],[28,0,145,21],[29,0,145,21],[30,0,145,21],[31,0,145,21],[32,0,145,21],[33,0,145,21],[34,0,145,21],[35,0,145,21],[36,0,145,21],[37,0,145,21],[38,0,145,21],[39,0,145,21],[40,0,145,21],[41,0,145,21],[42,0,145,21],[43,0,145,21],[44,0,145,38],[45,0,145,39],[46,0,145,39],[47,0,145,39],[48,0,145,42],[49,0,145,42],[50,0,145,44],[51,0,145,44],[52,0,145,44],[53,0,145,44],[54,0,145,44],[55,0,145,44],[56,0,145,50],[57,0,145,51]],[[12,0,146,6],[13,0,146,6],[14,0,146,6],[15,0,146,6],[16,0,146,10],[17,0,146,10],[18,0,146,10],[19,0,146,10],[20,0,146,10],[21,0,146,10],[22,0,146,16],[23,0,146,17],[24,0,146,17],[25,0,146,17],[26,0,146,17],[27,0,146,17],[28,0,146,17],[29,0,146,17],[30,0,146,24],[31,0,146,24],[32,0,146,26]],[[16,0,147,8],[17,0,147,8],[18,0,147,8],[19,0,147,8],[20,0,147,8],[21,0,147,8],[22,0,147,8],[23,0,147,8],[24,0,147,8],[25,0,147,8],[26,0,147,8],[27,0,147,19],[28,0,147,19],[29,0,147,21]],[[12,0,148,6]],[[12,0,149,6],[13,0,149,6],[14,0,149,6],[15,0,149,6],[16,0,149,6],[17,0,149,6],[18,0,149,6],[19,0,149,13],[20,0,149,13],[21,0,149,13],[22,0,149,13],[23,0,149,13],[24,0,149,13],[25,0,149,19],[26,0,149,20],[27,0,149,20],[28,0,149,20],[29,0,149,20],[30,0,149,20],[31,0,149,20],[32,0,149,20],[33,0,149,20],[34,0,149,28]],[[8,0,150,4],[9,0,150,5],[10,0,150,6]],[[8,0,151,4],[9,0,151,4],[10,0,151,4],[11,0,151,4],[12,0,151,4],[13,0,151,4],[14,0,151,4],[15,0,151,11],[16,0,151,11],[17,0,151,13],[18,0,151,13],[19,0,151,13],[20,0,151,16],[21,0,151,16],[22,0,151,16],[23,0,151,16],[24,0,151,20],[25,0,151,20],[26,0,151,22],[27,0,151,22],[28,0,151,22],[29,0,151,22],[30,0,151,22],[31,0,151,22],[32,0,151,22],[33,0,151,22],[34,0,151,22],[35,0,151,31],[36,0,151,31],[37,0,151,33],[38,0,151,33],[39,0,151,33],[40,0,151,33],[41,0,151,33],[42,0,151,33],[43,0,151,33],[44,0,151,33],[45,0,151,33],[46,0,151,33],[47,0,151,33],[48,0,151,33],[49,0,151,33],[50,0,151,33],[51,0,151,33],[52,0,151,48],[53,0,151,48],[54,0,151,50]],[[4,0,152,2]],[[4,0,154,2],[5,0,154,2],[6,0,154,2],[7,0,154,2],[8,0,154,2],[9,0,154,2],[10,0,154,2],[11,0,154,9],[12,0,154,9],[13,0,154,9],[14,0,154,9],[15,0,154,13]],[[0,0,155,0]],[[0,0,157,0],[1,0,157,0],[2,0,157,0],[3,0,157,0],[4,0,157,0],[5,0,157,0],[6,0,157,0],[7,0,157,0],[8,0,157,0],[9,0,157,9],[10,0,157,9],[11,0,157,9],[12,0,157,9],[13,0,157,9],[14,0,157,9],[15,0,157,9],[16,0,157,9],[17,0,157,9],[18,0,157,9],[19,0,157,9],[20,0,157,9],[21,0,157,21],[22,0,158,2],[23,0,158,2],[24,0,158,2],[25,0,158,2],[26,0,158,20],[27,0,158,20],[28,0,158,20]],[[4,0,160,2],[5,0,160,2],[6,0,160,2],[7,0,160,2],[8,0,160,2],[9,0,160,2],[10,0,160,2],[11,0,160,9],[12,0,160,9],[13,0,160,9],[14,0,160,9],[15,0,160,9],[16,0,160,14],[17,0,160,15],[18,0,160,15],[19,0,160,15],[20,0,160,15],[21,0,160,15],[22,0,160,15],[23,0,160,15],[24,0,160,22],[25,0,160,23],[26,0,160,23],[27,0,160,23],[28,0,160,23],[29,0,160,27],[30,0,160,28],[31,0,160,28],[32,0,160,28],[33,0,160,28],[34,0,160,28],[35,0,160,28],[36,0,160,28],[37,0,160,28],[38,0,160,28],[39,0,160,37],[40,0,160,38]],[[0,0,161,0]],[[0,0,163,0],[1,0,163,0],[2,0,163,0],[3,0,163,0],[4,0,163,0],[5,0,163,0],[6,0,163,0],[7,0,163,0],[8,0,163,0],[9,0,163,9],[10,0,163,9],[11,0,163,9],[12,0,163,9],[13,0,163,9],[14,0,163,9],[15,0,163,9],[16,0,163,9],[17,0,163,9],[18,0,163,9],[19,0,163,9],[20,0,163,9],[21,0,163,9],[22,0,163,9],[23,0,163,9],[24,0,163,24],[25,0,163,25],[26,0,163,25],[27,0,163,25],[28,0,163,25],[29,0,163,25],[30,0,163,38],[31,0,163,38],[32,0,163,40],[33,0,163,40],[34,0,163,40],[35,0,163,40],[36,0,163,40],[37,0,163,40],[38,0,163,64],[39,0,163,64],[40,0,163,64]],[[4,0,164,2],[5,0,164,2],[6,0,164,2],[7,0,164,2],[8,0,164,6],[9,0,164,6],[10,0,164,6],[11,0,164,6],[12,0,164,6],[13,0,164,6],[14,0,164,12],[15,0,164,13],[16,0,164,13],[17,0,164,13],[18,0,164,13],[19,0,164,13],[20,0,164,13],[21,0,164,13],[22,0,164,20],[23,0,164,20],[24,0,164,20],[25,0,164,20],[26,0,164,24],[27,0,164,24],[28,0,164,24],[29,0,164,24],[30,0,164,24],[31,0,164,24],[32,0,164,30],[33,0,164,31],[34,0,164,31],[35,0,164,31],[36,0,164,31],[37,0,164,31],[38,0,164,31],[39,0,164,31],[40,0,164,38],[41,0,164,39],[42,0,164,39],[43,0,164,39],[44,0,164,39],[45,0,164,43],[46,0,164,44],[47,0,164,44],[48,0,164,44],[49,0,164,44],[50,0,164,44],[51,0,164,49],[52,0,164,50],[53,0,164,50],[54,0,164,52]],[[8,0,165,4],[9,0,165,4],[10,0,165,4],[11,0,165,4],[12,0,165,4],[13,0,165,4],[14,0,165,4],[15,0,165,11],[16,0,165,11],[17,0,165,11],[18,0,165,11],[19,0,165,11],[20,0,165,16]],[[4,0,166,2]],[[4,0,167,2],[5,0,167,2],[6,0,167,2],[7,0,167,2],[8,0,167,6],[9,0,167,6],[10,0,167,6],[11,0,167,6],[12,0,167,6],[13,0,167,6],[14,0,167,12],[15,0,167,13],[16,0,167,13],[17,0,167,13],[18,0,167,13],[19,0,167,13],[20,0,167,13],[21,0,167,13],[22,0,167,20],[23,0,167,20],[24,0,167,20],[25,0,167,20],[26,0,167,24],[27,0,167,25],[28,0,167,25],[29,0,167,25],[30,0,167,25],[31,0,167,25],[32,0,167,25],[33,0,167,31],[34,0,167,32],[35,0,167,32],[36,0,167,32],[37,0,167,32],[38,0,167,32],[39,0,167,32],[40,0,167,32],[41,0,167,39],[42,0,167,40],[43,0,167,40],[44,0,167,40],[45,0,167,40],[46,0,167,44],[47,0,167,45],[48,0,167,45],[49,0,167,45],[50,0,167,45],[51,0,167,45],[52,0,167,50],[53,0,167,51],[54,0,167,51],[55,0,167,53]],[[8,0,168,4],[9,0,168,4],[10,0,168,4],[11,0,168,4],[12,0,168,4],[13,0,168,4],[14,0,168,4],[15,0,168,11],[16,0,168,11],[17,0,168,11],[18,0,168,11],[19,0,168,11],[20,0,168,16]],[[4,0,169,2]],[[4,0,170,2],[5,0,170,2],[6,0,170,2],[7,0,170,2],[8,0,170,2],[9,0,170,2],[10,0,170,2],[11,0,170,9],[12,0,170,9],[13,0,170,9],[14,0,170,9],[15,0,170,13]],[[0,0,171,0]]],"ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import type { LightningVisitor } from './helpers.cjs';
2
+ export interface AutoStableConfig {
3
+ namespace?: string;
4
+ include?: RegExp;
5
+ exclude?: RegExp;
6
+ }
7
+ export type AutoStableOption = boolean | AutoStableConfig;
8
+ export type AutoStableVisitor = LightningVisitor;
9
+ export declare function normalizeAutoStableOption(option?: AutoStableOption): AutoStableConfig | undefined;
10
+ export declare function buildAutoStableVisitor(option?: AutoStableOption): import("lightningcss").Visitor<Record<string, never>> | undefined;
package/dist/cjs/css.cjs CHANGED
@@ -11,9 +11,37 @@ const node_path_1 = __importDefault(require("node:path"));
11
11
  const node_fs_1 = require("node:fs");
12
12
  const lightningcss_1 = require("lightningcss");
13
13
  const helpers_js_1 = require("./helpers.cjs");
14
+ const autoStableSelectors_js_1 = require("./autoStableSelectors.cjs");
15
+ const stableSelectors_js_1 = require("./stableSelectors.cjs");
14
16
  const moduleGraph_js_1 = require("./moduleGraph.cjs");
15
17
  const sassInternals_js_1 = require("./sassInternals.cjs");
16
18
  exports.DEFAULT_EXTENSIONS = ['.css', '.scss', '.sass', '.less', '.css.ts'];
19
+ const isVisitor = (value) => Boolean(value);
20
+ function appendStableSelectorsFromExports(css, exportsMap, config) {
21
+ let output = css;
22
+ for (const [token, value] of Object.entries(exportsMap)) {
23
+ const hashed = Array.isArray(value)
24
+ ? value.join(' ')
25
+ : typeof value === 'object' && value !== null && 'name' in value
26
+ ? value.name
27
+ : String(value);
28
+ const hashedClasses = hashed.split(/\s+/).filter(Boolean);
29
+ if (hashedClasses.length === 0)
30
+ continue;
31
+ const stable = (0, stableSelectors_js_1.stableClass)(token, {
32
+ namespace: typeof config === 'object' && config?.namespace ? config.namespace : undefined,
33
+ });
34
+ const stableAlreadyPresent = output.includes(`.${stable}`);
35
+ const hashedAlreadyIncludesStable = hashedClasses.includes(stable);
36
+ if (stableAlreadyPresent || hashedAlreadyIncludesStable)
37
+ continue;
38
+ for (const hashedClass of hashedClasses) {
39
+ const rx = new RegExp(`\\.${(0, helpers_js_1.escapeRegex)(hashedClass)}(?![\\w-])`, 'g');
40
+ output = output.replace(rx, `.${hashedClass}, .${stable}`);
41
+ }
42
+ }
43
+ return output;
44
+ }
17
45
  async function css(entry, options = {}) {
18
46
  const { css: output } = await cssWithMeta(entry, options);
19
47
  return output;
@@ -44,26 +72,49 @@ async function cssWithMeta(entry, options = {}) {
44
72
  }
45
73
  }
46
74
  let output = chunks.join('\n');
47
- if (options.lightningcss) {
48
- const lightningOptions = normalizeLightningOptions(options.lightningcss);
75
+ const autoStableConfig = (0, autoStableSelectors_js_1.normalizeAutoStableOption)(options.autoStable);
76
+ const shouldForceLightning = Boolean(autoStableConfig);
77
+ const shouldRunLightning = Boolean(options.lightningcss || shouldForceLightning);
78
+ let lightningExports;
79
+ if (shouldRunLightning) {
80
+ const lightningOptions = normalizeLightningOptions(options.lightningcss ?? {});
49
81
  const boostVisitor = (0, helpers_js_1.buildSpecificityVisitor)(options.specificityBoost);
50
- const combinedVisitor = boostVisitor && lightningOptions.visitor
51
- ? (0, lightningcss_1.composeVisitors)([boostVisitor, lightningOptions.visitor])
52
- : (boostVisitor ?? lightningOptions.visitor);
53
- if (combinedVisitor) {
54
- lightningOptions.visitor = combinedVisitor;
82
+ const shouldUseVisitor = Boolean(autoStableConfig) && !lightningOptions.cssModules;
83
+ const autoStableVisitor = shouldUseVisitor && autoStableConfig
84
+ ? (0, autoStableSelectors_js_1.buildAutoStableVisitor)(autoStableConfig)
85
+ : undefined;
86
+ const composedVisitors = [
87
+ boostVisitor,
88
+ autoStableVisitor,
89
+ lightningOptions.visitor,
90
+ ].filter(isVisitor);
91
+ if (composedVisitors.length === 1) {
92
+ lightningOptions.visitor = composedVisitors[0];
93
+ }
94
+ else if (composedVisitors.length > 1) {
95
+ lightningOptions.visitor = (0, lightningcss_1.composeVisitors)(composedVisitors);
55
96
  }
56
- const { code } = (0, lightningcss_1.transform)({
97
+ const result = (0, lightningcss_1.transform)({
57
98
  ...lightningOptions,
58
99
  filename: lightningOptions.filename ?? 'extracted.css',
59
100
  code: Buffer.from(output),
60
101
  });
61
- output = code.toString();
102
+ output = result.code.toString();
103
+ if (autoStableConfig && lightningOptions.cssModules && result.exports) {
104
+ output = appendStableSelectorsFromExports(output, result.exports, autoStableConfig);
105
+ }
106
+ if (result.exports) {
107
+ lightningExports = result.exports;
108
+ }
62
109
  }
63
110
  if (options.specificityBoost?.strategy && !options.specificityBoost.visitor) {
64
111
  output = (0, helpers_js_1.applyStringSpecificityBoost)(output, options.specificityBoost);
65
112
  }
66
- return { css: output, files: files.map(file => file.path) };
113
+ return {
114
+ css: output,
115
+ files: files.map(file => file.path),
116
+ exports: lightningExports,
117
+ };
67
118
  }
68
119
  async function resolveEntry(entry, cwd, resolver) {
69
120
  if (typeof resolver === 'function') {